摘记《Wireshark网络分析就这么简单》

  • A、B在不同子网,B向A发起请求,跨子网需要默认网关转发。先通过ARP广播获取默认网关的MAC地址。然后默认网关向A转发请求,最后A回复B,形成三角回路。
  • MTU:最大传输单元(决定每次传输多少,发包的大小由MTU较小一方决定)
  • MSS(Maximum Segment Size):每个TCP包所能携带的最大数据量。在TCP连接建立时(三次握手),双方会告知对方MSS。
MTU = MSS + TCP头 + IP头
TCP头:20字节
IP头:20字节
MTU:1500字节(以太网决定)采用巨帧(Jumbo Frame)能达到9000字节。
Seq:该数据段的序号
Len:该数据段的长度
Ack:接收方的确认号(各自维护)

Seq = 上一个Seq + Len
Ack = Seq + Len
理论上,接收方回复的Ack = 下一个发送方的Seq

SYN:正在发起连接请求(因为连接是双向的,所以双方都要发一个SYN)
FIN:正在请求终止连接
RST:重置混乱连接或拒绝无效请求

三次握手

A --> B: [SYN] Seq=x
B --> A: [SYN, ACK] Seq=y, Ack=x+1
A --> B: [ACK] Seq=x+1, Ack=y+1

窗口滑动机制

* 我们提到滑动窗口(slide window) 指的是发送方维护的窗口
    * 窗口的左侧是:“成功发送、并已经被接收方确认的字节序列号”
    * 窗口的右侧是:“发送方目前可以发送的最大字节序列号”
    * Window size = 窗口右侧 - 窗口左侧
    * 当滑动窗口的左侧与右侧完全重合,则意味着接收方通告发送方 window size = 0 ,发送方就要暂时停止数据的发送。直到对方TCP buffer有空余的空间,告诉发送方新的 window size,或者发送方主动去查询是否可以发送数据。

# window size:
    * 接收方向发送方声明自己的接收窗口(若接收方处理缓慢,缓存占满,此时WIN=0)
    * 接收方告诉发送方自己还有多少缓冲区可以接收数据
    * TCP传输速率不能大于应用的数据处理速率

重传

  • 拥塞点:导致网络拥塞的数据量
  • 拥塞窗口:发送方维护的虚拟的窗口
实际窗口的大小是接收窗口和拥塞窗口的较小值
  • RTO:从发送原始包(丢失,未到达接收方)到重传该包的这段时间

摘记《Wireshark网络分析就这么简单》

TCP引入了RTT——Round Trip Time,也就是一个数据包从发出去到回来的时间。这样发送端就大约知道需要多少的时间,从而可以方便地设置Timeout——RTO(Retransmission TimeOut),以让我们的重传机制更高效。
  • 慢启动:在拥塞窗口增大的初期,接收到N个确认,则将拥塞窗口增大N个MSS。即翻倍增加。
  • 临界窗口值:

    • 若之前未发生拥塞,可取相对较大值,比如和最大接收窗口相等。
    • 若之前发生了拥塞,RFC建议大小为之前发生拥塞时未确认包的一半,但 >= 2个MSS。
  • 拥塞避免:每个往返时间增加1个MSS(发送16个MSS全部被确认了,增加1个MSS)
  • 超时重传:发送方在发送后一段时间内没收到确认,则需要重新传输。

    • 超时重传后,拥塞窗口需要从慢启动重新开始。
    • 影响:1.期间不能传输数据。2.拥塞窗口急剧减少
    • RFC建议将之后的拥塞窗口变成1个MSS。
  • 快速重传:

    • 当单包丢失,后续包正常到达时,接收方发现其Seq大于期望值,所以没接收到一个包就Ack一次期望的Seq,提醒重传;
    • 发送方接到3个以上(Dup Ack)时,立即重传该包。(回复3个Ack是因为避免只是乱序原因导致重传)
Wireshark -> Analyze -> Expert Info Composite #可以查看重传包

丢包对小文件的影响大于大文件。小文件可能凑不到3个Dup Ack,导致超时重传。

超时重传

摘记《Wireshark网络分析就这么简单》

快速重传

摘记《Wireshark网络分析就这么简单》

拥塞控制

  • 慢启动 - 拥塞避免 - 拥塞发生(触发超时重传) - 慢启动
  • 慢启动 - 拥塞避免 - 快速重传 - 拥塞避免
  • SACK(RFC2018定义):

    • 接收到的包;在丢包时,通过接收方回复Ack+SACK,确认丢失的具体包
    • 可以通过tcp_sack参数打开这个功能(Linux 2.4后默认打开)。

延迟确认:

  1. TCP交互场景中,接收方在收到包后暂时无数据返回,则延迟一段时间确认,
  2. 若在这段时间内有数据需要返回,则确认信息和数据一起返回。
  3. 并没有提高性能,只是减少了确认包。

UDP

  • UDP头:端口号、包长度、校验码。共8个字节。
  • 没有Seq、Ack,无法维持一个连接。省去建立连接的负担。(例如:DNS)
  • 发送方的网络层会将数据包分片。接收方进行组装。
  • UDP没有重传机制,丢包由应用层来处理,丢包的话需要重传所有的包。
  • 接收方通过“More fragments”参数组装包;

    • 1.后续还有分片;
    • 0.这是最后一个分片,可以开始组装。
易遭受黑客攻击,黑客快速发送flag=1的UDP包,使发送方一直无法将包组装起来,导致内存耗尽。

摘记《Wireshark网络分析就这么简单》

相关推荐