1.影响发送方数据包分片主要有:MTU值限制、握手时协商MSS值、拥塞控制(或者流量控制)算法设置的发送窗口大小
MTU(Maximum Transmission Unit),即最大传输单元,是数据链路层的一个概念。它指的是在网络通信中,能够传输的最大数据包的大小。由于不同的数据链路层设备和协议,其最大传输单元有所不同,因此MTU也有所区别。在TCP/IP协议中,IP层拆分发送的数据包时,通常要把较大的数据包分割成多个较小的数据包。而MTU就是指在将一个较大的IP数据包分割成多个更小的IP数据包时,每个数据包可以承载的Payload数据的最大长度。 需要注意的是,MTU的大小通常是会限制数据包大小的,如果超过了MTU的大小,数据包就会被分片,这会增加传输的时间和网络负担。因此,在进行网络传输时,需要考虑业务需求和网络状况,合理设置MTU的大小,以获得更好的网络性能。
MSS值(Maximum Segment Size)是TCP协议中的一个参数,用于指定发送端发送的最大分段大小。它表示每个TCP分段(segment)所包含的数据部分(即payload)的最大长度,不包括TCP头部和IP头部等协议头部。在TCP连接建立握手时,双方会进行MSS协商,以确定双方可以支持的最大分段大小,从而在整个数据传输过程中都使用这个MSS值。如果接收方在TCP建立连接时没有明确指定MSS值,那么发送方自己就会选择一个合适的MSS值,并将其包含在SYN数据包中发送给接收方。接收方收到该SYN数据包后,就可以根据这个MSS值来设置自己的接收缓冲区大小,从而避免数据包过大而导致缓冲区溢出。需要注意的是,MSS值通常不包括TCP协议头和IP协议头的长度,因此实际发送的TCP分段大小可能比MSS值要大一些。另外,在实际应用中,由于MTU的限制,MSS值可能会被限制在一定的范围内,因此在进行网络传输时需要针对具体情况进行合理的设置。
TCP流量控制主要是为了避免发送方发送速率过快而导致接收方无法及时处理,从而产生数据丢失或者缓存溢出等问题。它通过使用滑动窗口机制来限制发送方发送数据的速率。接收方每次处理完一个数据包后,会给发送方返回一个ACK确认,其中也会告诉发送方当前接收窗口的大小,即还能接收多少数据。发送方会根据接收窗口的大小来调整自己的发送速率,以确保发送的数据不会超过接收方的处理能力。TCP拥塞控制则是为了避免在网络拥塞的情况下,发送方继续发送数据而导致网络更加拥堵,进而导致丢包等问题。TCP拥塞控制采用了一系列算法,例如慢启动、拥塞避免、快速重传和快速恢复等,来尽可能地适应网络状况,控制发送速率。这些算法包括:当出现丢包的情况时,发送方通过快速重传和快速恢复来快速获取新的ACK确认并降低发送速率;当网络出现拥塞时,发送方通过慢启动和拥塞避免算法来逐渐增加发送速率,以最大化利用网络带宽,并且尽可能地避免网络拥塞情况的出现。需要注意的是,TCP拥塞控制和流量控制都是通过发送方和接收方之间交换信息、相互协作来完成的,以达到合理的发送速率和传输质量,并避免对网络造成额外的压力。主要涉及滑动窗口(接收窗口rwnd和拥塞窗口cwnd)、慢开始门限(ssthresh)、SMSS(发送者的MSS值)等
2.MTU值的设置,一般以太网网卡的默认值都是1500(单位Byte),可以使用下面的命令进行配置
ifconfig eth0 mtu 1500
ifconfig 命令可以查看到MTU值
如果在TCP链路已经建立完成,修改接收方MTU值(单位Byte),但发送方发来的数据包大于接收方的MTU值,可能会被接收方的网络设备丢弃,接收方上层应用表现为丢包。
3.MSS值一般是MSS=MTU-40,握手时双方会发出。
MSS值可以使用以下命令修改,一般握手前修改才有效:
增加(OUTPUT):
sudo iptables -t mangle -A OUTPUT -p tcp -o ens35u1i5 -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1460
删除(OUTPUT):
sudo iptables -t mangle -D OUTPUT -p tcp -o ens35u1i5 -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1460
增加(INPUT):
sudo iptables -t mangle -A INPUT -p tcp -i ens35u1i5 -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1460
删除(INPUT):
sudo iptables -t mangle -D INPUT -p tcp -i ens35u1i5 -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1460
4.流量控制与拥塞控制
流量控制是为了让发送方发送速率不要太快,接收方来得及接收。一般使用滑动窗口缓存机制,当接受乱序的ACK或者乱序的分片包,可以通过缓存机制增加的效率,滑动窗口的单位是字节。如下图
拥塞算法包括有 :
(1)Tahoe 拥塞控制算法:组合了慢启动、拥塞避免、快速重传和超时重传四种算法。
(2)Reno 拥塞控制算法:在 Tahoe 算法的基础上,加入了快速恢复算法。
(3)Cubic 拥塞控制算法:适合高带宽长距离网络(High Speed Long Distance network, HSLD)的拥塞控制算法。
(4)BBR(Bottleneck Bandwidth and Round-trip propagation time)拥塞控制算法:针对高延迟和高带宽网络优化设计的一种新型拥塞控制算法。
一般在传输启动时会使用慢启动算法,传输到达慢开始门限后进行拥塞避免,当出现拥塞时会快速回复,当数据包
慢启动(Slow Start):发送方在开始传输数据时,先把拥塞窗口设为一个较小的值,然后每收到一个 ACK 就把窗口值加倍,直到达到一个阈值。如果MSS值比较小,一般拥塞窗口的值会按2的倍数增加
实际中拥塞窗口cwnd与SMSS(发送者的MSS值)有关:
拥塞避免(Congestion Avoidance):在慢启动阶段结束后,拥塞窗口的大小变化变得缓慢。每经过一个往返时间 RTT(Round-Trip Time),拥塞窗口就增加 1 个 MSS 的值。
慢开始门限ssthresh=拥塞时cwnd/2
快速重传(Fast Retransmit):如果发送方连续发送了多个分组,但只收到了一个 ACK,则说明其中某个分组被丢失了,此时发送方不等待超时再重传,而是立即重传这个丢失的分组。
快速恢复(Fast Recovery):在快速重传后,发送方进入快速恢复状态,使得拥塞窗口减半,并采用拥塞避免算法来控制拥塞窗口的增长。
而发送滑动窗口是如下:
所以当发送窗口小于发送方设定的MSS值时,发送方实际分片的数据包有效数据长度会比设定的MSS值,也就是分片长度(单位Byte)会动态改变。
cwnd不能在wireshark抓包中看到,而rwnd可以在接收方所回复的ACK中看到:
实际的window size还有与一个系数有关,这个系数在握手时协商,实际的接受窗口是scaling * Window