TCP协议报文格式
MSS(最大段大小,Maximum Segment Size)的值存放在 TCP 报头的 选项字段(Options 中。
MSS 选项仅在 TCP 三次握手的SYN 报文段中出现。当通信双方建立连接时,会通过 SYN 报文中的 MSS 选项协商最大传输单元(MTU),以避免数据分片。
MTU和MSS的关系
重传机制
3种情况未收到ACK:
滑动窗口机制根据收方的接收窗口大小调整发送窗口,从而实现流量控制,而未考虑网络的负载情况,因此需要拥塞控制
拥塞控制的主要思路是防止过多的数据注入网络以避免网络出现负载过大.也就是说要根据网络的拥塞情况,对发送数据包的数量进行控制.为此TCP定义了一个拥塞窗口(cwnd) 变量,若网络拥堵就减小拥塞窗口畅通就增加拥塞窗口.拥塞窗口(cwnd)定义在发送端协议栈内部,用来控制发送速率,因为无需与接收端交互此字段值,故不属于TCP报文的部分.
拥塞控制算法:
Reno算法主思想: 慢启动:刚接入网络时,先发送少量的数据包以探测以下网络的情况,再一点点增大拥塞窗口大小
而拥塞窗口在慢启动阶段指数级别的增长不可能一直持续下去,那什么时候结束?
虽然拥塞避免阶段拥塞窗口增加缓慢(线性),但也不能一直增长下去,那么什么情况下会结束这种增长呢?和慢启动阶段一样,即网络发送拥堵的时候增长就会结束.
那如何感知到网络拥堵的呢? TCP是通过丢包感知的,丢包分两种情况:
1.超时丢包,即TCP发送数据包后,经过该数据包的计时器超时时间仍未收到对应的ACK,就会认为发生了超时丢包.这种情况下:通常说明网络拥塞比较严重,TCP会进入慢启动模式,将慢启动阈值更新为当前拥塞窗口大小的一半,并将拥塞窗口大小设置为1,开始慢启动过程.
2.收到3次重复的ACK,这种情况说明网络出现轻微拥堵,所以cwnd缩小的程度没必要像超时丢包那样大.会执行快重传 和快恢复算法,这两种算法一般同时使用.
UDP比TCP慢的情况
当需要传输一个特别大的数据包时,TCP内部会根据MSS大小分段,进入IP层后每个包大小都不会超过MTU,因此IP层一般不会再分片,这时候如果丢包只需要重传每个MSS分段即可.但对于UDP,其本身并不会分段,如果数据过大,到IP层会分片,此时如果丢包某个分片,重传时,UDP需要重传整个大数据包.
KCP
超时重传:KCP只需要1.5倍的RTO(RTO是重传超时时间), TCP需要2RTO.
快速重传:KCP可以配置收到2个重复的2ack就触发
拥塞控制:KCP可以关掉拥塞控制, 灵活配置
KCP如何解决qos丢包
网络环境越差,就可以考虑冗余越多数据.
极端例子:发送ABC数据包,每个数据包上直接携带另外两个数据包的全部信息.发生丢包时,3个数据包但凡收到一个就没问题.