Как перехватить фрагментацию TCP / IP в tcpdump? - PullRequest
0 голосов
/ 27 мая 2018

Как все мы знаем, 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

enter image description here

Видите из кода, buf - 8192, MSS - 1460. Поэтому, на мой взгляд, пакет будет разбит на 1460, 1460, 1460, 1460,1460, 892. Но на скриншотах это не так.

Кроме того, я не уверен, вызвано ли это флагами [DF].В проге используется python, поэтому встроенный сокет [DF] установлен по умолчанию?Небеса знают.

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Вы отправляете данные с локального хоста на локальный, внутри одного хоста.Таким образом, MTU ethernet (1500) не будет ограничивать размер MSS, поскольку данные не передаются по Ethernet.

Попробуйте повторить тест между двумя разными хостами.

0 голосов
/ 27 мая 2018

Как мы все знаем, MTU равен 1500, а MSS для TCP - 1460

Это не так.

MTU зависит от транспортной среды, а MTU 1500 зависит от Ethernet.Но, основываясь на вашем tcpdump, вы не используете интерфейс Ethernet (то есть проводное LAN-соединение между двумя машинами), но имеете клиент и сервер на одной машине и, таким образом, используете интерфейс lo (tcpdump -i lo ...).MTU для интерфейса localhost обычно намного выше:

  $ ifconfig lo
  lo: ...  mtu 65536

  $ ifconfig eth0
  eth0: ...  mtu 1500

Кроме того, вы, вероятно, вообще не увидите никакой фрагментации.Если пакеты больше, чем MTU, вы увидите сегментацию TCP (не фрагментацию), то есть то, что ОС разделит поток TCP на разные сегменты, где каждый, если не больше, чем MSS.Вместо этого фрагментация происходит на нижних уровнях, например, если IP-пакет необходимо разделить дальше, поскольку где-то на пути к цели находится устройство с меньшим MTU.

[DF] (не фрагментируйте), который вы видите, чтобы убедиться, что фрагментация на уровне IP не происходит, вместо этого пакет отбрасывается и отправитель уведомляется, так что MTU пути (минимальный MTU пути)может быть обнаружена, и сегментация TCP оптимизирована для этого, чтобы уменьшить накладные расходы доставки.См. Path MTU discovery для получения дополнительной информации.

...