面试-网络
TCP协议
握手挥手

TCP重传(原始包或ACK包丢失导致)
- 超时重传(RTT, RTO)
![]()
- 快速重传(3次同样ACK)
![]()
- 选择重传SACK(TCP optional SACK)
Kind: 5 (SACK选项类型)
Length: 可变(取决于报告的块数)
SACK Blocks: 每个块包含[左边缘, 右边缘]表示已接收的非连续数据范围
![]()
- DSACK(Duplicate SACK)
告诉发送方有哪些数据被重复接收了。DSACK通过第一个SACK块报告重复接收的数据范围(其他SACK块报告正常的不连续数据),使发送方能明确知道哪些重传是不必要的。
![]()
![]()
滑动窗口
- 窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值
![]()
![]()
流量控制(发送方关心接收方)
- TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。
- 发送窗口和接收窗口不变,接收方通过ACK来控制发送方发送窗口大小:
![]()
- 发送窗口和接收窗口改变,通告接收窗口大小。发送窗口和接收窗口中所存放的字节数,都是放在操作系统内存缓冲区中的,而操作系统的缓冲区,会被操作系统调整。
![]()
- 为了防止丢包发生,TCP 规定是不允许同时减少缓存又收缩窗口的,而是采用先收缩窗口,过段时间再减少缓存,这样就可以避免了丢包情况。
![]()
窗口关闭
- 接收方向发送方通告窗口大小时,是通过 ACK 报文来通告的。那么,当发生窗口关闭时,接收方处理完数据后,会向发送方通告一个窗口非 0 的 ACK 报文,如果这个通告窗口的 ACK 报文在网络中丢失了,那麻烦就大了。
![]()
- 解决办法:只要 TCP 连接一方收到对方的零窗口通知,就启动持续计时器。之后通过发生窗口探测报文检测。
![]()
Nagle算法(发送方,sockopt设置TCP_NODELAY)
使用 Nagle 算法,该算法的思路是延时处理,它满足以下两个条件中的一条才可以发送数据:
- 要等到窗口大小 >= MSS 或是 数据大小 >= MSS
- 收到之前发送数据的 ack 回包
![]()
Delayed-ACK(接收方,setsockopt设置TCP_QUICKACK)
- 延迟确认是TCP协议中一项重要的优化机制,它通过减少确认(ACK)数据包的数量来提高网络效率,会增加端到端延迟。
拥塞控制(发送方关心整个网络)
TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。
- 慢启动
![]()
- 拥塞避免
![]()
- 拥塞发生
- 发生超时重传
![]()
- 发生快速重传(快速恢复)
![]()
- 发生超时重传
- 拥塞算法
![]()



















浙公网安备 33010602011771号