tcp socket, send一个超过mtu的数据包出去,网卡是发两个分片包出去,还是发两个独立的数据包出去呢?
不知道,那就做个实验吧。
TCP send
写一个tcp client 和 tcp server .
tcp client 一次调用send 10240 bytes的包
[root@node-3 tcpt]# ./a.out
========waiting for client's request========
recv msg from client: , 10240 bytes
tcp server一次recv 10240 bytes。
抓包查看
很明显,client一次性发出了8个包,每个包都是TCP segment, TCP分段。
而IP头里的是明确 Don't fragment的,说明这不是分片包。
这些包的关系是
1. 独立的IP包
2. 关联的TCP分段包
那为什么没有分片,而是TCP分段呢。
TCP三次握手,协商出mss, 确保每个分段的包长度不会超过mtu,从而避免了IP层的分片。
IP分片是在网络层(IP层)进行分片和重组
TCP分段是在传输层进行分段和重组
UDP send
所以发UDP大包,应该就会分片了,再做一个UDP的小实验。
用UDP client一次send 10240个bytes
[root@node-3 tcpt]# ./usrv 8888
select start......
select end..........ret=1.
recv client:, 10240 bytes
UDP server 一样一次收到10240bytes.
抓包查看
都是IP层的分片包。
总结
发送大包
TCP包分段(segment):传输层按照mss做的分段,从而避免了IP层分片
UDP包分片(fragment):传输层如若无物,全靠IP层自己分片