Комбинатор с фиксированной точкой (или оператор с фиксированной точкой) - это функция высшего порядка, которая вычисляет фиксированную точку других функций. Эта операция актуальна в теории языка программирования, потому что она позволяет реализовать рекурсию в форме правила перезаписи, без явной поддержки со стороны движка языка. (Википедия)
Я предполагаю, что в поле флагов фактически установлено значение 2 = b010 вместо 4 - флаги, равные 4, являются недопустимым IP-пакетом. Помните, что флаги - это 3-битное значение в IP-заголовке . Я ожидал увидеть датаграммы UDP со значением флагов 2, что означает «Не фрагментировать».
Что касается вашего вопроса, я не верю, что есть способ установить флаги IP напрямую, не используя все способ использования сырых сокетов . Я бы не стал беспокоиться об этом, поскольку у большинства приложений действительно нет веских причин напрямую гадить с заголовками IP или даже UDP / TCP.
Вот маршрут, который я выбрал. Я перешел по ссылке, опубликованной 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