我可以为IP数据包的总长度设置任意值吗?

时间:2016-04-24 09:19:25

标签: sockets networking network-programming

当我使用原始套接字伪造IP数据包时,似乎我可以为其总长度设置任意值,而不考虑IP数据包的真实大小。

然而,当我使用Wireshark来捕获数据包时,我发现总长度已被更正为真实大小。这让我很困惑。

有人可以解释这个问题吗?我将非常感谢你的帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

当发送大于其实际大小的数据包时,有效负载中的附加数据是一大块零。理论上,在使用Wireshark(或tcpdump)检查它时,您应该在捕获的此类数据包上看到什么。例如:

IP 192.168.0.3.17664 > 178.60.128.48.1: tcp 32
        0x0000:  4500 0064 f0d0 4000 4006 56ab c0a8 0003  E..d..@.@.V.....
        0x0010:  b23c 8030 4500 0001 0000 0000 ff06 dbe4  .<.0E...........
        0x0020:  c0a8 0003 b23c 8030 04d2 0050 0000 0000  .....<.0...P....
        0x0030:  0000 0000 5002 16d0 b3c4 0000 4142 4344  ....P.......ABCD
        0x0040:  4546 4748 494a 4b4c 4d4e 4f50 5152 5354  EFGHIJKLMNOPQRST
        0x0050:  5556 5758 595a 0000 0000 0000 0000 0000  UVWXYZ..........
        0x0060:  0000 0000                                ....

这是google.com的TCP数据包(178.60.128.48)。有效载荷是&#34; ABC ... XYZ&#34;,但IP total_length已被手动增加。结果是有效负载中的填充为零,直到完成数据包的总长度。

那就是说,我的赌注是问题出在sendto系统调用中。这是实际在套接字上发送数据包的调用。但是这个调用还设置了数据包的total_length

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
               const struct sockaddr *dest_addr, socklen_t addrlen);

我怀疑您已经调整了IPv4标头中的数据包total_length字段,但len调用上的sendto参数尚未修改,因此数据包&# 39;发送时,总长度会被覆盖到原来的大小。

这是我的怀疑,但如果不检查代码就很难说清楚。