zoukankan      html  css  js  c++  java
  • UNIX网络编程——利用ARP和ICMP协议解释ping命令

    一、MTU

           以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit)
           如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就要进行分片(Fragmentation),把数据报分成若干片,这样每一片都小于MTU。
           当网络上的两台主机互相进行通信时,两台主机之间要经过多个网络,每个网络的链路层可能有不同的MTU,其中两台通信主机路径中的最小MTU被称作路径MTU,Internet上标准MTU为576B。


    二、以太网帧格式

                         

           其中的源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。协议字段有三种值,分别对应IP、ARP、RARP。帧末尾是CRC校验码。
           以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。ifconfig命令的输出中也有“MTU:1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度


    三、ARP(address resolution protocol)

           在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用源主机发出ARP请求,询问“IP地址是10.0.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。如下图所示

                                                                  

           每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。

                              

           注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节),op字段为1表示ARP请求,op字段为2表示ARP应答。


           地址解析协议的处理流程如下图:

                                                                   


    四、RARP(Reverse Address Resolution Protocol)

           跟ARP相反的协议,主要用于获取无盘工作站的ip地址,如下图所示,不再赘述。

                                                           


    五、ICMP(Internet Control Message Protocol)

           ICMP协议用于传递差错信息、时间、回显、网络信息等控制数据,如下图所示。

                                                                      

           ICMP报文是封装在IP数据报文中进行传输的,如下图所示:

                                                                                                                                             

           具体的类型和代码见下图:

                                

                                


    六、利用ARP和ICMP协议解释ping程序

           先看下面的流程图,再来解释:

                     


    步骤a:应用程序ping会判断发送的是主机名还是IP地址,如果是主机名会调用函数gethostbyname()解析主机B,将主机名转换成一个32位的IP地址。这个过程叫做DNS域名解析。
    步骤b:ping程序向目的IP地址发送一个ICMP的ECHO包
    步骤c:将目标主机的IP地址转换为48位硬件地址,在局域网内发送ARP请求广播,查找主机B的硬件地址。
    步骤d:主机B的ARP协议层接收到主机A的ARP请求后,将本机的硬件地址填充到应答包,发送ARP应答到主机A。
    步骤e:发送ICMP数据包到主机B。
    步骤f:主机B接收到主机A的ICMP包,发送响应包。
    步骤g:主机A接收到主机B的ICMP包响应包。

  • 相关阅读:
    BZOJ1077 并查集
    linux(fedora) 第三课
    hdu 4513 吉哥系列故事——完美队形II(manacher)
    hdu 3294 Girls' research(manacher)
    FZU
    蓝桥杯试题 k倍区间(dp)
    蓝桥杯 带分数(全排列+枚举)
    天梯赛 L2-001 紧急救援
    蓝桥杯[2017年第八届真题]分考场 (图着色问题)
    hdu 3068 最长回文(manacher)
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332496.html
Copyright © 2011-2022 走看看