Как все мы знаем, MTU равен 1500, а MSS для TCP - 1460. Поэтому, когда значение buf, используемое в функции recv, превышает 1460 байт, TCP будет разделен на множество частей.
Я пишу простую эхо-прогу и хочу использовать 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, которую я использовал:
sudo tcpdump -i lo port 10086 -s 1514 -v
Видите из кода, buf - 8192, MSS - 1460. Поэтому, на мой взгляд, пакет будет разбит на 1460, 1460, 1460, 1460,1460, 892. Но на скриншотах это не так.
Кроме того, я не уверен, вызвано ли это флагами [DF].В проге используется python, поэтому встроенный сокет [DF] установлен по умолчанию?Небеса знают.