【发布时间】:2018-11-06 03:18:19
【问题描述】:
众所周知,MTU是1500,TCP的MSS是1460。所以当recv函数中使用的buf大于1460字节时,TCP会被拆分成很多部分。
我写了一个简单的 echo prog,想用 tcpdump 来检查碎片。但是在buf很小的时候不显示碎片,而是在buf在20K左右的时候显示。
代码如下:
服务器:
import socket
import sys
import os
addr = ('10.0.0.2',10086)
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(addr)
server.listen(5)
while True:
connfd, addr= server.accept()
print 'connection ip:', addr
data = connfd.recv(8192);
客户:
import socket
import os
import sys
addr = ('10.0.0.2', 10086)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(addr)
data = '';
for num in range(0,8192):
data += '1'
client.sendall(bytes(data))
这是我使用的 tcpdump cmd:
sudo tcpdump -i lo 端口 10086 -s 1514 -v
从代码看,buf是8192,MSS是1460。所以,在我看来,数据包会被分成1460、1460、1460、1460、1460、892。但在截图中不是。
另外,我不确定这是否是由 [DF] 标志引起的。 prog使用python,所以内置sockopt [DF]设置为默认?天知道。
【问题讨论】:
标签: tcp tcpdump fragmentation