DIY TCP/IP IP模块和ICMP模块的实现0

上一篇:DIY TCP/IP ARP模块3
8. IP模块和ICMP模块的实现
本章介绍DIY TCP/IP的IP模块和ICMP模块的实现,ARP模块的目标是在与本机处于同一局域网的另外一台主机上建立DIY TCP/IP的虚拟IP地址和本机网络接口的硬件地址的映射。本章的目标是同一局域网的另外一台主机上能够PING通DIY TCP/IP的虚拟IP地址。达到这个目标需要实现ICMP Echo数据帧的接收和ICMP Reply数据帧的发送,ICMP数据帧是基于IP数据帧实现的,所以首先要实现IP数据帧的接收和发送,另外ICMP Echo数据帧可以超过MTU的大小,这种情况就要求IP模块能够重组IP分片,并能够发送IP分片。仅仅实现IP模块无法验证实现的代码,所以需要ICMP模块配合实现,这是本人实现IP模块和ICMP模块时的做法,所以将这两个模块合并为同一章介绍,方便实现和验证。
测试方法:便于描述,运行DIY TCP/IP的主机记为A,与A处于同一局域网的另外一台主机记为B。在B主机上PING一个局域网中不存在的IP地址,当然这个不存在的IP地址就是DIY TCP/IP的虚拟IP地址,上一章也是在B主机向A主机发送ICMP Echo数据帧,由于主机B没有虚拟IP和A主机的网络接口的硬件地址的映射,所以会先发送ARP Request数据帧,在上一章ARP模块正确回复ARP Reply数据帧的基础上,主机B得到ARP Reply之后,会发送目标IP地址为虚拟IP地址的ICMP Echo数据帧,该数据帧由DIY TCP/IP的IP模块和ICMP模块处理,如果能够回复正确的ICMP Reply数据帧,主机B上将打印出PING的结果,显示ICMP Reply是由虚拟IP地址回复的,ICMP Reply的有效载荷包含的字节数,以及往返时延TTL的具体数值。
8.1 IP头部结构和ICMP头部结构
首先通过wireshark抓包查看IP头部和ICMP头部。在主机B上PING主机A的IP地址,注意此时PING的是主机A的IP地址,并不是A上运行的DIY TCP/IP的虚拟IP地址。
DIY TCP/IP Ping Sample
主机B是本人的华为手机,主机A是与主机B处于同一局域网的WIN7笔记本,可以看到B先发送ARP Request请求与192.168.0.105对应的A的MAC地址,A回复ARP Reply后,主机B发送Echo Ping,主机A回复Echo Reply。将Echo Ping数据帧展开,先来看IP数据帧的头部。
DIY TCP/IP IP Header Sample
IP头部

DIY TCP/IP IP Header Table0DIY TCP/IP IP Header table1
Wireshark的raw 字节显示中可以看出IP头部共20个字节。将IP头部展开,可以看到IP头部的各个成员,IP Payload的协议类型为0x01,表示IP封装的上层数据帧是ICMP数据帧。上表给出了IP头部成员的描述,DIY TCP/IP的IP模块实现IP数据帧的接收,发送,IP头部校验和的计算和检验,以及IP分片的重组和发送,暂不涉及DSCP和ECN的实现,感兴趣的朋友可以参考上表中的RFC文档查看DSCP和ECN的细节。
ICMP 头部
DIY TCP/IP ICMP Sample
Wireshark展开IP数据帧的payload是ICMP数据帧,type为8,表示ICMP数据帧是Echo (ping) Request,如果type为0,则是Echo (ping) Reply数据帧。上表给出了ICMP头部的成员描述。 DIY TCP/IP的ICMP模块实现,ICMP Echo Request数据帧的接收,和ICMP Echo Reply数据帧的发送,ICMP数据帧校验和的计算和检验,使同一局域网中的另外一台主机可以PING通DIY TCP/IP的虚拟IP地址。ICMP其他细节的实现,感兴趣的朋友可以参考RFC792查看ICMP协议的细节内容。
下一篇:DIY TCP/IP IP模块和ICMP模块的实现1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值