我正在尝试测试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。