TCP

面向连接,可靠交付,全双工,面相字节流(就是不管那个进程,就按顺序发不分片,UDP面向报文段)
🟢3次握手:前两次是为了确保发送接收双方的发送和接收功能没问题,增加第3次是因为网络延迟,这是传输层独有的
如果一开始请求的握手后来到了,但是请求方早就完成了交流,而被请求方却觉得又要交流了,就会浪费被请求方的资源
🟢滑动窗口,看数据链路层的滑动窗口但因为要考虑网络环境,不同点在于:
-
TCP的窗口大小根据拥塞程度随时变大变小
-
字节流确认而不是一帧一帧
在早期的不可靠链路上(比如早期的无线电或电话线),数据链路层必须严格搞滑动窗口来保证每一段路都不丢包。
但在现在的**以太网(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 会认为网络出现了严重的拥塞(大堵车,数据包完全过不去)。
- 惩罚措施(极其严厉):
- 把新的
ssthresh降为当前cwnd的 一半 (即ssthresh = cwnd / 2)。 - 把
cwnd直接 打回原形 ,重置为1。 - 重新进入慢开始阶段。
- 把新的
4. 快重传与快恢复 (Fast Retransmit & Fast Recovery) —— “轻微剐蹭,快速调整”
这是 TCP 后期加入的优化(TCP Reno 版本)。有时候只是偶尔丢了一个包,网络并没有彻底堵死(后续的包还能到达接收方)。
-
快重传触发条件: 发送方连续收到 3 个重复的 ACK 。这说明接收方一直在催促同一个丢失的包,此时发送方不傻等超时, 立刻重传 。
-
快恢复规则(相对温和):
- 既然还能收到连续的 ACK,说明网络还有流通能力。新的
ssthresh降为当前cwnd的 一半 (ssthresh = cwnd / 2)。 - 核心区别:
cwnd不重置为 1,而是直接设置为新的ssthresh的值(有些教材会写ssthresh + 3,以考研指定教材为准,通常按设置回ssthresh计算)。 - 直接跳过慢开始,进入拥塞避免阶段(线性加 1)。
- 既然还能收到连续的 ACK,说明网络还有流通能力。新的
本章小结