ping命令中ICMP协议包的分析

北华大学oa网
ping命令中ICMP协议包的分析
UDP收发以及所需要的ARP协议已经全部实现,接下来让咱们的协议栈⽀持ping,俗称能ping通。
ping的请求和发送实际是ICMP协议的⼀个⼦集,ICMP可以参考
在IP头中ICMP协议的标识是01,其ICMP头结构是⽤C语⾔表⽰为:
// ICMP header
typedef struct _tagX_icmphdr
{
unsigned char i_type;    //类型
unsigned char i_code;    //代码
unsigned short i_cksum;  //检验和
unsigned short i_id;      //标识符
unsigned short i_seq;    //序列号
unsigned long i_timestamp; //当前时间  =(unsigned long)::GetTickCount();
}XIcmpHeader;
其中单向板肋梁楼盖设计
unsigned char 是8位的字节 1个字节
unsigned short 是16位的字 2个字节
unsigned long 是32位的字 4个字节
看见整个ICMP头部是1+1+2+2+2+4 = 12 字节。
我们每个字段过滤⼀下:
第⼀字节type:8代表ping request ,0 代表ping reply。我们收到的是type=8的ping请求包,我们回复type=0的ping回复包。第⼆字节code:ping request实际抓包数据是0.
第三双字节字chksum,需要进⼀步资料或者例⼦看看都是哪写内容的chksum。
第四个双字节字id,我觉得这应该是ping_request端任意写的,⽽我们回应ping就要把这个原封不动回应回去。
第5个双字节字sequence,应该跟ID⼀样需要在ping reply中直接返回去就好。
后续的32个字节,需要原封不动的回传就好(我看到这些字节都是依次+1,是否可以考虑不⽤数组保存呢,算了吧不差那点ram,因为那
些数据的顺序+1肯定不是协议规定的,我们既然做就得兼容尽量)。
海德堡cp2000这⾥有个问题,就是后续字节长度没有被明确字段标注出来,只能数完了得到结果。卡茨
这样其实基本明了了:
id和sequence以及后⾯的字节,我们直接拷贝发回去就好,type=0,code=0(需要抓包确认下),再确认以下checksum是那些字节参与
2010ema的加。
这个⽂章明确给出了icmp的check sum计算的(12-2)字节的头部除去check sum的其他字段以及携带的数据。这样就很明确了。
解析出来的接⼝内容要包含type,code.之后check sum我们就不检验了,直接按照检验通过处理。其余剩下的字段(id ,seq以及data)就我爱读书网
原封不动的发回去。我们⽤⼀个FIFO来保存上述三部分,在写⼊bram的时候,计算出来这些数据的check sum,再加上确定的id和type。
check sum就是确定的了。
上述分析基本⽐较全⾯,代码也呼之欲出。这就开始撸代码。
{{aAxvOXMOIvVUoXMxvoxiowMwWV8xxWTxoxOIOVIUUOvwVOUiIoUvvTMMVMwovWHWX8vOUOVUViOXUWTvUViUWWXWmVoT8HIOHwTVTiiWIX88ioVomHM

本文发布于:2024-09-22 09:50:32,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/530070.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字节   协议   需要   数据   出来   后续   考虑   保存
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议