TCP 是一种字节流(byte-stream)协议,流的含义是没有固定的报文边界。
假设你调用 2 次 write 函数往 socket 里依次写 500 字节、800 字节。write 函数只是把字节拷贝到内核缓冲区,最终会以多少条报文发送出去是不确定的,如下图所示:
情况 1:分为两条报文依次发出去 500 字节 和 800 字节数据,也有
情况 2:两部分数据合并为一个长度为 1300 字节的报文,一次发送
情况 3:第一部分的 500 字节与第二部分的 500 字节合并为一个长度为 1000 字节的报文,第二部分剩下的 300 字节单独作为一个报文发送
情况 4:第一部分的 400 字节单独发送,剩下100字节与第二部分的 800 字节合并为一个 900 字节的包一起发送。
情况 N:还有更多可能的拆分组合
上面出现的情况取决于诸多因素:路径最大传输单元 MTU、发送窗口大小、拥塞窗口大小等。
当前mtu:node1:/root#ifconfig -a
eth1 Link encap:Ethernet HWaddr 00:0C:29:F2:0E:05
inet addr:192.168.137.2 Bcast:192.168.137.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:296 Metric:1
一次收到了257的长度:
node1:/root#tcpdump -S -i eth1 '((tcp) and (port 8080) )'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
01:01:20.
报文被拆分为多个分组发送
最新推荐文章于 2023-06-03 08:55:40 发布