Плохая контрольная сумма UDP не влияет: почему? - PullRequest
2 голосов
/ 22 апреля 2019

Я пытаюсь протестировать программу UDP на предмет того, что происходит, если она получает данные с неверной контрольной суммой UDP. Как ни странно, это, кажется, не имеет никакого эффекта, и полезные данные получены успешно, по крайней мере на OS X через интерфейс обратной связи.

Ниже приведен пример, в котором данные отправляются с использованием SOCK_RAW + IPPROTO_UDP, с указанием контрольной суммы вручную на что-то неверное, и принимаются с использованием SOCK_DGRAM.

import asyncio
import socket
import struct

async def server():
    with \
        socket.socket(
                socket.AF_INET, socket.SOCK_DGRAM
    ) as sock:
        sock.setblocking(False)
        sock.bind(('', 4567))
        payload = await loop.sock_recv(sock, 512)
        print(payload)  # Prints b'somedata'

async def main():
    asyncio.ensure_future(server())
    await asyncio.sleep(0)

    with socket.socket(
            family=socket.AF_INET, type=socket.SOCK_RAW, proto=socket.IPPROTO_UDP,
    ) as sock:

        local_ip = '127.0.0.1'
        src_port = 4566
        dest_port = 4567

        payload = b'somedata'
        length = 8 + len(payload)
        checksum = 3  # 3 is not the right checksum
        header_bad_checksum = struct.pack('!4H', src_port, dest_port, length, checksum)
        sock.sendto(header_bad_checksum + payload, (local_ip, 4567))

        await asyncio.sleep(1)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

Почему это? Я ожидал, что полезная нагрузка будет проигнорирована.


Ниже приведен дамп Wireshark этого UDP-сообщения, показывающий, что (в данном случае) контрольная сумма равна 3.

enter image description here

...