TCP

← 返回 MOC | ← 主页


1774320520205


面向连接,可靠交付,全双工,面相字节流(就是不管那个进程,就按顺序发不分片,UDP面向报文段)

TCP报文段格式

🟢3次握手:前两次是为了确保发送接收双方的发送和接收功能没问题,增加第3次是因为网络延迟,这是传输层独有的

如果一开始请求的握手后来到了,但是请求方早就完成了交流,而被请求方却觉得又要交流了,就会浪费被请求方的资源

🟢滑动窗口,看数据链路层的滑动窗口但因为要考虑网络环境,不同点在于:

  1. TCP的窗口大小根据拥塞程度随时变大变小

  2. 字节流确认而不是一帧一帧

    在早期的不可靠链路上(比如早期的无线电或电话线),数据链路层必须严格搞滑动窗口来保证每一段路都不丢包。

但在现在的**以太网(Ethernet)**或 Wi-Fi 中,数据链路层往往变得非常“简单粗暴”:如果校验出错了,直接丢弃,把重传的重任交给上层的 TCP。

🟢零窗口:接收方窗口满了,window=0,发送,如果窗口又不满了但是说明窗口空了的报文丢了,所以发送方要定时发探测报文

那为什么不接收方发需要接受报文呢,因为如果信息死锁,那么就会一直等下去,

发送方探测可以确保是接受方没处理完而不是网络不畅通

🟢4次挥手:前两次就双方告诉要结束了,中间的等待时间是2MSL,1确保握手信息从网络中消失,并且能接受到握手信息不然又建立新的连接,然后受延迟的关闭信息来了给你建立的链接莫名其妙关掉了2把没传完的信息传完


拥塞控制:

上面的流量控制的发送窗口受拥塞窗口控制:

swnd (发送窗口, Send Window)

rwnd (接收窗口, Receive Window)

cwnd (拥塞窗口, Congestion Window)

1. 慢开始 (Slow Start) —— “指数级起步”

不要被“慢”字骗了,它的意思是 起步基数小,但增长极其迅猛

  • 规则: 一开始,cwnd = 1(个最大报文段 MSS)。每收到一个对新报文段的确认(经历一个往返时间 RTT),cwnd翻倍 (1 → 2 → 4 → 8…)。
  • 停止条件:cwnd 增长到达到或超过 ssthresh 时,停止慢开始,切换到“拥塞避免”阶段。

2. 拥塞避免 (Congestion Avoidance) —— “线性试探”

既然已经达到了门限,说明网络可能快要拥堵了,不能再瞎踩油门了。

  • 规则: 每次经历一个 RTT,cwnd 不再翻倍,而是 加 1 (按线性规律缓慢增长)。
  • 目的: 小心翼翼地试探网络的极限容量,直到真的发生拥塞(丢包)。

3. 超时重传 (Timeout) —— “遭遇大堵车,重头再来”

如果发送方迟迟收不到 ACK,触发了 超时计时器 (RTO),TCP 会认为网络出现了严重的拥塞(大堵车,数据包完全过不去)。

  • 惩罚措施(极其严厉):
    1. 把新的 ssthresh 降为当前 cwnd一半 (即 ssthresh = cwnd / 2)。
    2. cwnd 直接 打回原形 ,重置为 1
    3. 重新进入慢开始阶段。

4. 快重传与快恢复 (Fast Retransmit & Fast Recovery) —— “轻微剐蹭,快速调整”

这是 TCP 后期加入的优化(TCP Reno 版本)。有时候只是偶尔丢了一个包,网络并没有彻底堵死(后续的包还能到达接收方)。

  • 快重传触发条件: 发送方连续收到 3 个重复的 ACK 。这说明接收方一直在催促同一个丢失的包,此时发送方不傻等超时, 立刻重传

  • 快恢复规则(相对温和):

    1. 既然还能收到连续的 ACK,说明网络还有流通能力。新的 ssthresh 降为当前 cwnd一半ssthresh = cwnd / 2)。
    2. 核心区别: cwnd 不重置为 1,而是直接设置为新的 ssthresh 的值(有些教材会写 ssthresh + 3,以考研指定教材为准,通常按设置回 ssthresh 计算)。
    3. 直接跳过慢开始,进入拥塞避免阶段(线性加 1)。

本章小结