我正在尝试测试 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()
为什么是这样?我本以为有效负载会被忽略。
此 UDP 消息的 Wireshark 转储如下,显示(在本例中)校验和为 3。
这是预期的行为。来自f5网站 https://support.f5.com/csp/article/K03325735
这是 Linux 上 tcpdump 工具的预期行为,因为校验和在 NIC 上卸载,但 tcpdump 会在 NIC 芯片组中发生实际校验和之前从 Linux 内核读取 IP 数据包。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)