常见协议图解

数据链路层Mac帧:

 

 

网络层IP数据报:

 

 

网络层ARP/RARP数据报(Address Resolution Protocol/Reverse Address Resolution Protocol)

ARP的基本工作原理如下:

(1)每台主机都会根据以往在网络中与其他节点的通信,在自己的ARP缓存区(ARP Cache)中建立一个ARP列表,以表示网络中节点IP地址和MAC地址的对应关系。

【说明】ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用(Windows系统的这个时间为2分钟,而Cisco路由器的这个时间为5分钟),就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。

(2)当源节点需要将一个数据包发送到目标节点时,会首先检查自己ARP列表中是否存在该包中所包含的目标节点IP地址对应的MAC地址。如果有,则直接将数据包发送到这个MAC地址节点上;如果没有,就向本地网段发起一个ARP请求的广播包,查询此IP地址目标节点对应的MAC地址。此ARP请求数据包里包括源节点的IP地址、硬件地址,以及目标节点的IP地址。

(3)网络中所有的节点在收到这个ARP请求后,会检查数据包中的目标IP地址是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该节点首先将源端的MAC地址和IP地址的对应表项添加到自己的ARP列表中。如果发现ARP表中已经存在该IP地址所对应的MAC地址表项信息,则将其覆盖,然后给源节点发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址节点。

(4)源节点在收到这个ARP响应数据包后,将得到的目标节点的IP地址和MAC地址对应表项添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源节点一直没有收到ARP响应数据包,则表示ARP查询失败。

RARP的基本工作原理如下:

(1)发送端发送一个本地的RARP广播包,在此广播包中声明自己的MAC地址,并且请求任何收到此请求的RARP服务器分配一个IP地址。

(2)本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址。如果存在,RARP服务器就给源主机发送一个响应数据包,并将此IP地址提供给对方主机使用;如果不存在,RARP服务器对此不做任何响应。

(3)源端在收到从RARP服务器来的响应信息后,利用得到的IP地址进行通信;如果一直没有收到RARP服务器的响应信息,则表示初始化失败。

 

 

 

介于网络层与传输层之间的ICMP(internet control mesage protocol)数据报

它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。它介于网络层和传输层之间。它所利用的原理是这样的:网络上 的机器都有唯一确定的 IP 地址,我们给目标 IP 地址发送一个数据包,对方就要返回一个同样大小的数据包, 根据返回的数据包我们可以确定目标主机的存在。

 从以上示意图可以看出,整个ICMP的报文都包含在IP数据报的数据部分。这点与ARP协议不同,ARP协议整个数据报文将替换IP协议整个数据报文,而不是将ARP整个报文嵌入到IP协议数据报文的数据部分。从这方面讲,我们可以参考《Windows网络与通信程序设计》P121页的原始套接字部分,其规定原始套接字可以使用ICMP、IGMP、UDP、IP或原始TCP(Windows XP SP2已经不再支持原始TCP数据的发送了),但确实没有ARP。

关于IGMP和RARP协议这里不再说明,使用IGMP可以多播发送,可参考《Windows网络与通信程序设计P105,RARP应用案例不多

 

传输层的TCP数据包:

 

传输层的UDP数据包:

 

 

 

关于发送原始TCP封包和UDP封包:

原始TCP封包的发送上述已作了说明,WinXp Sp2上已受限制不能发送,但可以接受。原始UDP封包的发送和接受,原始TCP封包的接受以及上述ICMP封包的发送和接受,都可以通过原始套接字来进行(创建socket时指定类型):

ICMP

SOCKET sRaw = ::socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)

《Window网络与通信程序设计》P124

 

UDP

SOCKET sRaw = ::socket(AF_INET, SOCK_RAW, IPPROTO_UDP)

BOOL bIncl = TRUE;

::setsockopt(sRaw, IPPROTO_IP, IP_HDRINCL, (char*)&bIncl, sizeof(bIncl)); // 有效IP头包含选项(IPPROTO_UDP、IPPROTO_IP和IPPROTO_RAW需要有效IP_HDRINCL选项,所以发送包时还要构建IP头)

《Window网络与通信程序设计》P133

 

TCP

由于WinXP SP2不支持了,所以在这里不介绍如何构建发送包了,但对于接受包必须明确的一点事,不管TCP还是UDP或ICMP,只要是原始套接字,都将接受完整的IP封包。

SOCKET sRaw = ::socket(AF_INET, SOCK_RAW, IPPROTO_IP);

《Window网络与通信程序设计》P136  (在那实例中还包括了如何解析IP封包和TCP封包,自己还可以添加解析UDP封包函数或ICMP封包函数)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值