网络面试精选

聊聊面试中的网络

2021-03-10  本文已影响0人  lucasgao

TCP

image.png

三次握手都干了什么

  1. 双方都交换了自己的序列号
  2. 双方都确认了各自的消息都可以成功被处理
  3. 初始化各自的sockets,窗口大小和初始系列号

三次握手的设计目的

  1. 防止历史的重复连接初始化造成混乱,也就算说防止简历错误的连接

    如果只有2次连接

    因为网络的不稳定性,client可能会重复发送sync,接收方在收到后 只能默默的创建,但是有可能这个连接已经是过期的了。

    所以需要有三次

    在接收方server收到之后,会对seq进行确认发送ack,这时候发送方会判断这次的ack是否有效,如果有效则确认,如果无效是会直接发送rst中止这一次连接

    那么四次可不可以

    可以,但是没必要。不要增加无谓的负担。

    三次握手把控制权交给了发起方,因为他们有足够的上下文来确定当前要建立的连接是否有效。

  2. 初始化序列号

    在一个不可靠的网络上,我们的tcp报文可能出现以下的情况

    • 数据包重复发送
    • 数据包中间丢失
    • 数据包无序到达

    因为,tcp协议中加入了序列号的字段,通过序列号,我们可以

    • 对重复的数据包进行去重
    • 对丢失的数据包(未被ack)进行补发
    • 对乱序的数据包进行排序

拥塞控制

慢启动

最开始的时候,没收到一个ack 则 窗口+1

拥塞避免

当达到一定阈值的时候,没经过一个rtt则+1,如果出现丢包,窗口减少为1,阈值减少为当前的一半。

快重传

对于未被确认的,发送连续确认ack,触发快速重传,不再等待超时。

快恢复

丢包的时候,窗口减少为阈值

流量控制

目的是为了点对点之间不要过分暴力

sender: 需要维持一个滑动窗口,代表的是接收端的一个消费能力

receiver:需要维持一个滑动窗口

如果接收端最大能力是10,但是因为已经确认了10个了,那个窗口大小就会变为0。

四次挥手

image.png

TIME_WAIT设计的目的

阻止延迟数据段

image.png

对于上图,如果在close之后,又启了一个tcp链接。这个时候之前迷路的 seq301 到了,就会被错误的接收。

保证TCP连接的远程被正确关闭

在server没有收到确认的情况下,会再次发送fin,这个时候需要重新ack。或者rst。

UDP

这次,当我想到UDP的时候,我想到的是:如果他不提供任何可靠性保障,那么我为什么还需要它呢。

查找资料发现,它再ip数据报的上面封装了 源端口、目标端口、长度和校验和。其中源端口和校验和也是可选的。

所以它对比ip来说,它仅仅是新增了端口的信息。提供了一个应用程序层面的多路复用。

虽然这样,但是后续http3确实基于udp实现的。

HTTP2

http2.0 使用的是二进制编码传输,而不是之前的文本编码传输。

解决了什么问题

提供了什么特性

带来了什么问题

HTTP3

http2虽然做了很多优化,(二进制消息帧,头压缩,消息多路复用,服务器推送,流量控制等)。

但是由于其是基于tcp实现的,tcp上的问题还是没有解决(队首阻塞,重初始化)

此外tls的队首阻塞也是一个性能瓶颈

Image

提供了哪些特性

所以QUIC使用packet传输,tls加密也是基于packet,不会跨packet,也就不会存在则塞的现象。

解决了哪些问题

再谈0RTT

0RTT并不是银弹,他需要client保存服务端的config(这个config是基于证书的)。

如果是首次交互

  1. C发起请求

  2. S首次回应C

    S将config封装成数据包给C,其中包含{p,g,k_pub}

  3. C发送加密的数据

    C收到config,生成k_c_pir,根据g,p计算出公钥,和对称秘钥

    然后利用对称秘钥加密数据进行传输

  4. S得到对称C的公钥,为了向前安全性,计算出一对新的公私钥进行通信。

  5. C收到S的包,解析出新的公钥,计算出新的对称秘钥,后续保持通信。

如果非首次交互

因为C中已经保存了config,所以可以直接从3开始,这次也是同理会生成一个新的对称秘钥。

下图是交互的一个过程:

这里写图片描述

带来了哪些问题

  1. 0-RTT 连接恢复是不提供前向安全的forwardsecrecy,上面的过程大家可以看到,他复用的是之前的config。但是如果恢复的请求被中间人攻击,进行多次发送,那如果在没有幂等的情况下就会出现很多问题。
Image
  1. 安全问题,也就是反射攻击,即伪造原地址。这个指发送数据包时的原地址是伪造的,不是真正的地址,会引起放大攻击。原因是 QUIC 握手过程是不对称的,特别是第一次请求时,客户端只需要发送几个字节的信息到服务器,而服务器则需要把证书等很多东西返还给客户端,这个不对称的机会造成了放大。草案 27 定义了两个规则和机制来限制反射攻击:客户端发送Initial包,即第一个数据包时,其长度必须在 1200 bytes以上,不足部分用 Padding 帧填充,同时,当服务端不确定客户端可靠性时,可以发送 Retry 包要求客户端再次提供验证信息。
  2. 兼容问题,UDP的443端口可能会被封杀,一些激进的安全策略对外只暴露80端口
  3. UDP包过多,可能导致误判为攻击。
  4. 针对UDP的优化太少了,无论是防火墙还是路由器。

感悟

花了多半天时间大概了解了下http的发展历程,脑海里飘过这样一句话:一个人可以跑的很快,一群人可以跑的很远。

这么多年我们的很多应用都是基于tcp的,tcp给我们提供了很多特性,就行我们目前的中台,提供各种丰富的功能,但是因为是中台,他变的笨重,因为兼容,它变的不敏捷。于是有了QUIC,quic说你提供的这些功能我自己也可以实现,并且结合自己的场景实现的更好,于是又了QUIC。有了更快的网络。就行我们说的go协程,不依赖于CPU线程调度一样。

常见名词

RTT

往返时延,round-trip time.

即在网络中,从发送方发送数据开始到收到数据的确认直接的时间。

MSL

TTL

参考:

  1. https://draveness.me/whys-the-design-tcp-three-way-handshake/
  2. https://mp.weixin.qq.com/s/vpz6bp3PT1IDzZervyOfqw
  3. https://mp.weixin.qq.com/s/W5NbSOpspEPlA9y8gebNbw
  4. https://blog.csdn.net/dog250/article/details/80935534
  5. https://cloud.tencent.com/developer/article/1594468
上一篇 下一篇

猜你喜欢

热点阅读