/usr/include/netinet/udp.h 中定义的UDP头结构如下:
struct udphdr
{
u_int16_t source;
u_int16_t dest;
u_int16_t len;
u_int16_t check;
};
头部的检查字段中存储了什么值?如何验证校验和是否正确?我的意思是校验和是根据哪些数据计算出来的?(是仅仅基于UDP头部还是包括跟随其后的有效负载?)
谢谢。
/usr/include/netinet/udp.h 中定义的UDP头结构如下:
struct udphdr
{
u_int16_t source;
u_int16_t dest;
u_int16_t len;
u_int16_t check;
};
头部的检查字段中存储了什么值?如何验证校验和是否正确?我的意思是校验和是根据哪些数据计算出来的?(是仅仅基于UDP头部还是包括跟随其后的有效负载?)
谢谢。
ADC
的进位为2的情况)时,您永远不必担心进位问题,因为两个最大的16位值相加会得到(从0x1fffe
截断)0xfffe
- 对其加一永远不会导致另一个进位。0xffff
,当然前提是没有传输错误。https://gist.github.com/fxlv/81209bbd150abfeaceb1f85ff076c9f3
你可以使用net_checksum_tcpudp
函数,将UDP负载长度、协议、源IP和目的IP以及UDP负载本身传递给它,然后它会自动处理。最后需要调用htons()
函数对校验和进行转换即可。我在网上搜索一些代码,用于计算UDP头(带有上述伪IP头)。
最后我找到了Open-BSD的dhclient packet.c文件:
https://github.com/openbsd/src/blob/master/sbin/dhclient/packet.c
请查看函数assemble_udp_ip_header()