请教ip数据包头的解析!

SkywalkerZ 2003-08-20 09:23:25
偶试作了一个简单的ping程序,其ip数据包头的前固定20个字节和ip选项头定义分别如下

// Definition of IP header
typedef struct _ipheader
{
UINT headerLen : 4; // Length of the header
UINT version : 4; // Version of IP
UCHAR tos; // Type of service
USHORT totalLen; // Total length of the packet
USHORT id; // Unique identifier
USHORT flagsAndFrag; // Flags and Fragment Offset
UCHAR ttl; // Time to live
UCHAR proto; // Protocol (TCP, UDP etc)
USHORT checksum; // IP checksum
ULONG sourceIP;
ULONG destIP;
} IPHeader;
// Definition of IP options
typedef struct _ipoptions
{
UCHAR code; // Options type
UCHAR len; // Length of options
UCHAR ptr; // Offset into options
ULONG addr[9]; // List of IP addrs
} IPOptions;

当偶为ping设置记录记录路由选项,ping本地主机时,输出如下结果。
[output]
Destination host address: 172.18.3.52
Route hosts list: 18.3.52.0
Reply from 18.3.52.0, bytes: 104, ICMP seq: 1, time: 0 ms ttl: 172
Route hosts list: 18.3.52.0
Reply from 18.3.52.0, bytes: 104, ICMP seq: 2, time: 0 ms ttl: 172
Route hosts list: 18.3.52.0
Reply from 18.3.52.0, bytes: 104, ICMP seq: 3, time: 0 ms ttl: 172
Route hosts list: 18.3.52.0
Reply from 18.3.52.0, bytes: 104, ICMP seq: 4, time: 0 ms ttl: 172
[/output]
其中明显错误之处有两处:
1.Route hosts list中的地址18.3.52.0错误,应为172.18.3.52
2.ttl错误,应为64
偶还发现,ttl的输出值与Route hosts list的输出地址18.3.52.0前3段相连,恰好为172.18.3.52,即正确的路由地址。
若ping其他机器,也出现此种情况!
偶百思不得其解,ip数据包头的数据结构定义是约定俗成的,recvfrom到的数据包按此解析似乎没错!?
恳请热心的大侠们不吝赐教!
偶在此多谢了!
...全文
302 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicolas2001 2003-08-29
  • 打赏
  • 举报
回复
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Reply from 18.3.52.0, bytes: 104, ICMP seq: 1, time: 0 ms ttl: 172
这个18.3.52.0应该是源地址吧?!

从格式上看:TTL和源地址差一个字长。
而且楼上的bhw98兄说了:USHORT, ULONG中的字节排列顺序是高先低后,与Windows中VC的习惯正好相反

我们从中应该可以看出什么道道儿吧?!

nicolas2001 2003-08-29
  • 打赏
  • 举报
回复
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Reply from 18.3.52.0, bytes: 104, ICMP seq: 1, time: 0 ms ttl: 172
这个18.3.52.0应该是源地址吧?!

从格式上看:TTL和源地址差一个字长。
而且楼上的bhw98兄说了:USHORT, ULONG中的字节排列顺序是高先低后,与Windows中VC的习惯正好相反

我们从中应该可以看出什么道道儿吧?!

IThurricane 2003-08-28
  • 打赏
  • 举报
回复
to SkywalkerZ(贪杯的灵魂Z)
我想研究一下
我的mail:lipeng36@citiz.net
nicolas2001 2003-08-28
  • 打赏
  • 举报
回复
还是老样子,看《windows网络编程技术》,我有pdf版的,可以把第13章给你,你的邮箱地址?
SkywalkerZ 2003-08-21
  • 打赏
  • 举报
回复
to bhw98(bhw98):
很遗憾,还是不行!-_-
参照《tcp/ip详解》第一卷中的叙述和相关程序中ip选项头的定义,应该不含有“UCHAR reserved”域。

to all:
为了便于大家探讨,对此感兴趣的朋友可以告知偶e-mail地址,偶将源代码发给大家指正......
SkywalkerZ 2003-08-21
  • 打赏
  • 举报
回复
非常感谢楼上朋友的热心帮助!
第2个问题解决了!
可是记录路由选项中输出的路由地址还是有错,偶甚为困惑!-_-
大侠可否帮偶再略指一二!
偶在此谢过了!
bhw98 2003-08-21
  • 打赏
  • 举报
回复
还有,USHORT, ULONG中的字节排列顺序是高先低后,与Windows中VC的习惯正好相反,因为TCP/IP最早是应用于UNIX的
bhw98 2003-08-21
  • 打赏
  • 举报
回复
错误很明显嘛,是字节对位错误:前两个改为
UCHAR headerLen : 4; // Length of the header
UCHAR version : 4; // Version of IP
就行了!
nicolas2001 2003-08-21
  • 打赏
  • 举报
回复
《windows网络编程技术》(很老的一本书了啊!)
上面的第13章《原始套接字》关于这个问题讲的很经典,还有完整的程序代码,是学习的好材料,不妨参考一下!
bhw98 2003-08-21
  • 打赏
  • 举报
回复
typedef struct _ipoptions
{
UCHAR code; // Options type
UCHAR len; // Length of options
UCHAR ptr; // Offset into options
ULONG addr[9]; // List of IP addrs
} IPOptions;
中,前面是3个字节,后面是4个字节的ULONG,你是怎样取这些addr?补充一个字节试试:
typedef struct _ipoptions
{
UCHAR code; // Options type
UCHAR len; // Length of options
UCHAR ptr; // Offset into options
UCHAR reserved; // reserved
ULONG addr[9]; // List of IP addrs
} IPOptions;

bhw98 2003-08-21
  • 打赏
  • 举报
回复
typedef struct _ipoptions
{
UCHAR code; // Options type
UCHAR len; // Length of options
UCHAR ptr; // Offset into options
ULONG addr[9]; // List of IP addrs
} IPOptions;
中,前面是3个字节,后面是4个字节的ULONG,你是怎样取这些addr?补充一个字节试试:
typedef struct _ipoptions
{
UCHAR code; // Options type
UCHAR len; // Length of options
UCHAR ptr; // Offset into options
UCHAR reserved; // reserved
ULONG addr[9]; // List of IP addrs
} IPOptions;

mprogrammer 2003-08-20
  • 打赏
  • 举报
回复
172.18.3.52
18.3.52.0

有三段重叠,会不会是你处理地址是产生了错误。

我是个菜鸟,不过对TCP/IP协议比较感兴趣,有机会向你学习。
jiaolong1873@sina.com
SkywalkerZ 2003-08-20
  • 打赏
  • 举报
回复
不好意思,可能是偶对问题的表述不是很到位,再补充几句:
偶用recvfrom()得到返回数据包,并用char型指针pPacket指引。
接着用如下语句分别得到ip头和icmp头:

IPHeader * pIPHeader = (IPHeader *)pPacket;
// Number of 32-bit words * 4 = bytes
int ipHeaderLen = pIPHeader->headerLen * 4;
ICMPHeader * pIcmpHeader = (ICMPHeader *)(pPacket + ipHeaderLen);

然后即可根据ip头和icmp头的数据结构定义进行操作,比如要得到返回ip包中的ttl的值,
只需pIPHeader->ttl即可,不需考虑什么指针多走或少走了字节(偶是如此认为的,或许有误,恳请各位不吝指正)。
此外,数据包中数据是按网络字节组织,并不像偶想当然那样将指针随便移动几个字节就能解决问题!包中数据域的排列组织似乎并不是按照RFC791中的定义。这让偶很是困惑--怎样才能将接收数据包中的协议头完整无误的解析出来呢?!
郁闷!!!-_-
同志们,大家畅所欲言,相互探讨,携手共进阿!
cernet 2003-08-20
  • 打赏
  • 举报
回复
<<VC++网络高级编程>>里面有这样的ping程序.
借鉴一下子吧.
xiaoxx 2003-08-20
  • 打赏
  • 举报
回复
在付给IP结构指针的时候,指针多走了一个字节吧。
ExitWin 2003-08-20
  • 打赏
  • 举报
回复
指针移位处理错误?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧