Установка поля флагов заголовка IP - PullRequest
5 голосов
/ 24 июня 2009

У меня есть простой скрипт Python, который использует модуль сокета для отправки пакета UDP. Сценарий отлично работает на моем компьютере с Windows, но на моем ПК с Ubuntu Linux пакет, который он отправляет, немного отличается. В Windows поле флагов в заголовке IP равно нулю, но при использовании того же кода в Linux был создан пакет с полем флагов, установленным в 4. Я хотел бы изменить свой сценарий, чтобы он работал согласованно в Windows и Linux. *

Есть ли способ управления полем флагов в модуле сокета? Или это настройка, которую я должен изменить в Linux?

Ответы [ 3 ]

6 голосов
/ 25 июня 2009

Вот маршрут, по которому я закончил. Я проследовал по ссылке, размещенной SashaN в комментариях к ответу Д.Швили, и узнал немного о том, почему бит «не фрагментировать» установлен в UDP-пакетах Linux. Оказывается, это как-то связано с открытием PMTU. Короче говоря, вы можете очистить бит «не фрагментировать» из своих пакетов UDP в Python, используя функцию setsockopts в объекте сокета.

import socket
IP_MTU_DISCOVER   = 10
IP_PMTUDISC_DONT  =  0  # Never send DF frames.
IP_PMTUDISC_WANT  =  1  # Use per route hints.
IP_PMTUDISC_DO    =  2  # Always DF.
IP_PMTUDISC_PROBE =  3  # Ignore dst pmtu.
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("10.0.0.1", 8000))
s.send("Hello World!") # DF bit is set in this packet
s.setsockopt(socket.SOL_IP, IP_MTU_DISCOVER, IP_PMTUDISC_DONT)
s.send("Hello World!") # DF bit is cleared in this packet
2 голосов
/ 24 июня 2009

Я предполагаю, что поле flags фактически установлено в 2 = b010 вместо 4 - flags, равное 4, является недопустимым IP-пакетом. Помните, что флаг является 3-битным значением в IP Header . Я ожидал бы увидеть дейтаграммы UDP со значением флагов 2, что означает «Не фрагментировать».

Что касается вашего вопроса, я не верю, что есть способ установить IP-флаги напрямую, без использования raw sockets . Я не стал бы беспокоиться об этом, так как у большинства приложений нет веских причин использовать IP или даже заголовки UDP / TCP напрямую.

1 голос
/ 24 июня 2009

конструкция может сделать работу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...