gpt4 book ai didi

c - 解析 IP header 时出错

转载 作者:太空宇宙 更新时间:2023-11-04 02:19:45 25 4
gpt4 key购买 nike

我有一个小函数试图打印 IP header 的片段偏移量。

ParseIpHeader(unsigned char *packet, int len)
{
struct ethhdr *ethernet_header;
struct iphdr *ip_header;

/* First Check if the packet contains an IP header using
the Ethernet header */

ethernet_header = (struct ethhdr *)packet;

if(ntohs(ethernet_header->h_proto) == ETH_P_IP)
{
/* The IP header is after the Ethernet header */

if(len >= (sizeof(struct ethhdr) + sizeof(struct iphdr)))
{
ip_header = (struct iphdr*)(packet + sizeof(struct ethhdr));

/* print the Source and Destination IP address */

//printf("Dest IP address: %s\n", inet_ntoa(ip_header->daddr));
//printf("Source IP address: %s\n", inet_ntoa(ip_header->saddr));
printf("protocol %d\n", ip_header->protocol);
printf("Fragment off is %d\n", ntohs(ip_header->frag_off));

}

}

我的数据包是 TCP(ip_header->protocol 总是 6。问题是 frag_off一直是16384,我发送了很多数据,为什么frag_off一直是常量?

谢谢。

最佳答案

片段偏移与标志共享。您设置了“DF”(不分段)位。

如果片段偏移量为 0,则整个 16 位字段为 16384。

看看 http://www.ietf.org/rfc/rfc791.txt , 从第 10 页开始。

编辑:

您正在接收的 TCP 段中的 DF 位由远程端设置,以执行 Path MTU discovery - 简而言之,尽量避免碎片化。在这种情况下,发送方了解整个路径可以处理的最大 MTU,并切分 TCP 段,使其在封装到 IP 后不超过它。

EDIT2:

关于 recvfrom() 和 TCP 的使用:TCP 是一个面向连接的协议(protocol),所有的分段/分片细节都已经由它处理(分片显然由下层处理,IP)——所以你这样做不需要处理它。您在发送端写入的任何内容()最终都会在另一端被读取() - 虽然可能在相同的 block 中 - 即两次 4K 写入有时可能会导致一次 8K 读取,有时在两次 4K 读取中 - 取决于介质在重新排序/丢失之间的行为。

IP 分片和重组由操作系统透明地处理,所以你不需要担心它,就像数据包乱序等一样(你只会看到性能下降对应用程序的影响) .

我可以推荐的一本好书是:UNIX network programming .鉴于 Steven 参与了 TCP,无论您使用哪种操作系统,这都是一本好书。

编辑 3:

如果您正在做某事是为了成为“中间人”(假设您这样做有正当理由 :-) - 那么您可以通过查看现有技术来评估即将开展的工作:chaosreader (适用于 pcap 文件的单脚本方法,但适用于其他文件),或 LibNIDS - 模拟 IP 碎片整理和 TCP 流重组;并且可能只是为了您的目的而重复使用它们。

关于c - 解析 IP header 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2307531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com