深入理解iputils网络工具-第5篇 arping:地址解析程序

来源:互联网 发布:amd游戏优化 编辑:程序博客网 时间:2024/06/07 06:38

5.1       引言

    ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在同一以太网中,通过地址解析协议,源主机可以通过目的主机的IP地址获得目的主机的MAC地址。arping程序就是完成上述过程的程序。

    ARP协议可以参看RFC 826。

5.2       arping程序的使用

    敲入命令:

[plain] view plaincopy
  1. lixi@lixi-desktop:~/temp/iputils/iputils-s20071127$ arping 210.45.74.29 -c 1 -D  
  2. ARPING 210.45.74.29 from 0.0.0.0 eth0  
  3. Unicast reply from 210.45.74.29 [00:40:D0:59:CD:D3]  0.684ms  
  4. Sent 1 probes (1 broadcast(s))  
  5. Received 1 response(s)  

    在本地主机的局域网内有一台IP地址为210.45.74.29的主机,所以会接到一个回复。

[plain] view plaincopy
  1. lixi@lixi-desktop:~$ arping 210.45.74.28 -c 1 -D  
  2. ARPING 210.45.74.28 from 0.0.0.0 eth0  
  3. Sent 1 probes (1 broadcast(s))  
  4. Received 0 response(s)  

    向一个不存在的IP发送报文不会接受到回复。

[plain] view plaincopy
  1. root@lixi-desktop:~# arping 210.45.74.25 –U  
  2. root@lixi-desktop:~# tcpdump arp -n | grep 210.45.74.25  

    得到输出结果如下:

[plain] view plaincopy
  1. 11:03:13.848653 arp who-has 210.45.74.25 (ff:ff:ff:ff:ff:ff) tell 210.45.74.25  

    这里就是一个免费ARP的例子。

    -A

        与-U选项类似,但是发送的是ARP 回复报文,而不是ARP请求报文。

    -b

        只发送MAC级别的广播。一般的arping开始时发送广播,在接受到回复后开始发送单播。

    -c <count>

        在发送count个ARP请求后就退出。在和deadline选项一起使用时,arping程序一直等到收到count个ARP回复报文或者时间消耗完毕时才退出。

   -D    

        重复地址检测模式(DAD,Duplicate  address detection  mode)。参见RFC2131,4.4.1。如果DAD成功,则返回0,即不会接受到没有任何回复。

    -f

        在接受到第一个确定目标主机存在的回复之后,就结束程序,否则一直发送ARP请求。

    -I <interface>

        设置网络设备的名字,这个名字就是发送ARP请求报文的设备名字。

    -h   

        打印帮助信息,然后退出。

    -q

        静默输出,不打印探测结果。

    -s <source>

        在ARP报文中使用的IP源地址。如果这个选项没有设置,则源地址设置方法为:

        1. DAD模式下(-D选项),设置为0.0.0.0。

        2. 在主动ARP模式(-U或者-A选项),设置为目的地址。

        3. 其他情况下,通过路由表得到。

    -U

        为了更新以太网邻居的ARP快速缓存而主动进行的ARP。也就是免费ARP(gratuitous ARP)。

    -V

        打印出版本信息,然后退出。

    -w deadline

        设定时间期限为<deadline>秒,不管已经发送和接到了多少包,只要达到时间期限就结束ping的过程。在这种情况下,这样arping程序只有在接受到cout个回复或者deadline的时间消耗完后才退出;而不是像只有-c选项的情况,在发送count个ARP请求的就退出。

5.3       arping程序的流程图

    arping程序的流程图如下所示:



5.4       ARP报文的分组格式

    ARP报文的分组格式如下图所示:

5.5       arping程序的全局变量的分析

    int quit_on_reply=0;

        标识是否在接受到一个回复之后,就马上退出程序。

        可以在-f选项和-D选项中设定为非0值(同时有-f、-D选项或者有多个同种选项)。     

    char *device="eth0";

        源主机的网络设备号。 

        可以通过-I参数设置。

        默认为eth0。

    (setsockopt(probe_fd, SOL_SOCKET,SO_BINDTODEVICE, device, strlen(device)+1)。

        不过好像只有超级用户这个才能执行。

    int ifindex;

        Interface number。

    char *source;

        存储-s设置的源地址。

        地址的形式可以是IPv4的标准数字和点组成的形式,如210.45.74.25;也可以是主机名字的形式,如www.ustc.edu.cn。

    struct in_addr src;

        存储源IP地址,即对ARP的回复报文所要发往的主机的IP地址,有可能是广播地址。

        可以通过-s选项设置。如果这个选项没有设置,则源地址设置方法为:

        1. DAD模式下(-D选项),设置为0.0.0.0。

        2. 在主动ARP模式(-U或者-A选项),设置为目的地址。

        3. 其他情况下,通过路由表得到。

    struct in_addr dst;

        存储目的IP地址,即ARP报文所要发往的主机的IP地址。

    char *target;

        存储用户设置的目的地址,地址的形式必须是IPv4的标准数字和点组成的形式。

    int dad;

        标识是不是DAD模式。

        如果是DAD模式,则原源主机地址一直没有设置,那么就意味着源地址为0.0.0.0。这样当目的主机接到之后,就会向0.0.0.0发送回复,就相当于广播给以太网中所有的主机。因为进行D重复地址检测模式的原因很可能是由于源主机的IP地址没有设置,从而想设置自身的IP地址。在IP地址没有设置的时候,主机只能接受到地址为0.0.0.0的广播信号。

        可以通过-D参数设置。

    int unsolicited;

        标识是不是发送免费ARP。

        在-A选项和-U选项中设置unsolicited为1。

    int advert;

        标识在免费ARP模式下发送的是ARP回复报文,而不是ARP请求报文。

        在-A选项中设置advert为1。

    int quiet;

        标识是否静默输出。

        可以通过-q选项设置。

    int count=-1;

        发送ARP的个数。

        可以通过-c选项设置,如果不设置,默认值为-1,即没有个数限制(回绕成0基本不可能)。

    int timeout;

        程序运行的时间限制。

        通过-w选项设置。

    int unicasting;

        标识是不是应该发送单播报文。

        在程序接受到一个ARP的回复之后,已经能够知道回复者的IP地址了,这时候就可以不广播,而设置传播地址。因此,在接受到ARP回复之后,如果broadcast_only没有被设置,unicasting就应该设置为1,以让下次进行单播。

    int s;

        ARP报文的套接字。

    int broadcast_only;

        标识是不是一直发送广播报文,而不在接受到一个回复以后就改成单播报文。

        通过-b选项可以设置broadcast_only为1。 

    struct sockaddr_ll me;

        存储本地主机的信息,包括本地主机的以太网地址、硬件地址的类型、硬件地址长度和协议地址长度等信息

    struct sockaddr_ll he;

        存储本地主机的信息。

    struct timeval start;

        程序发送第一个报文的系统时间。

        记录这个时间,可以用来判断程序是否超出时间限制。如果当前的系统时间减去start超过用户设置的时间限制有500毫秒,则程序退出。

    struct timeval last;

        程序发送上一个报文的系统时间。

        记录这个时间,可以用来判断是否应当发出下一个ARP请求。如果当前系统时间减去last超过500毫秒,则发出下一个ARP请求。

    int sent;

        程序发送的ARP报文数量。

        每次在发送ARP报文之后递加。

    int brd_sent;

        程序广播的ARP报文数量。

        每次在发送ARP报文之后,如果ARP报文是广播报文,则递加。

    int received;

        程序接受的ARP报文数量。

        每次在接受到正确的ARP报文之后,递加。

    int brd_recv;

        程序接受的ARP广播报文数量。

        每次在接受到正确的ARP报文之后,如果报文不是单播报文则递加。

    int req_recv;

        程序接受到ARP请求报文数量。

        每次在接受到正确的ARP报文之后,如果报文是ARP请求报文则递加。


本文章欢迎转载,请保留原始博客链接http://blog.csdn.net/fsdev/article

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 天猫还没收到货就确认收货了怎么办 支付宝红包抵扣被关了怎么办 水貂绒大衣白色过色了怎么办 双面羊绒大衣袖子洗短了怎么办 特殊类型订单销量评价删除后怎么办 淘宝上卖家发货发错了地址怎么办 买完保险想换保险代理人怎么办 怀孕内裤两边磨的好疼怎么办 露肩连体裤穿着卡裆怎么办 魅族手机恋与制作人换诺基亚怎么办 蚊子叮咬后擦风油精了红肿怎么办 机动车已转让没过户出了事情怎么办 签好的合同如果甲方违约怎么办? 饭店没签合同辞职不给工资怎么办 两家为了带孩子闹翻了怎么办啊? 抵押后租赁的房屋被法院拍卖怎么办 房子买20年了没有过户怎么办 二手车没过户行驶证丢了怎么办 买的二手车行驶证丢了怎么办 在京东仓库做事把东西损坏了怎么办 微信显示该账号登陆环境异常怎么办 干洗店把衣服洗坏了怎么办 千牛上怎么改淘宝密码忘记了怎么办 公司收了代理商押金到期不退怎么办 淘宝显示签收但是我没收到货怎么办 淘宝东西没收到显示签收了怎么办 开拼多多店铺的密码忘了怎么办 拼多多密码跟店铺名忘了怎么办 闲鱼上卖出的宝贝被调包了怎么办 上传身份证照片说格式错误该怎么办 我给厂里打的款不给发货怎么办 净值接近不定期份额折算阀值怎么办 有锁电信4g掉了怎么办 在电脑中找不到想作废的发票怎么办 科目三补考费发票丢了怎么办 母婴店飞鹤奶粉突然厂家撤货怎么办 澳门买的保健品感觉是假的怎么办 淘宝买东西提交需求时卡死了怎么办 天猫精灵显示为离线状态怎么办 退货多被淘宝店铺拉入黑名单怎么办 天猫订单3天不发货怎么办