欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    ARP请求.docx

    • 资源ID:5728102       资源大小:40.99KB        全文页数:10页
    • 资源格式: DOCX        下载积分:12金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要12金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    ARP请求.docx

    1、ARP请求从下面的文章我们了解到,对于一个设备用的ARP协议而言,重要的东西包括三方面:1. 一个本地的IP与MAC地址的缓存表.以有对应的更新和查询操作. 2. 一个发送ARP请求的函数. 3. 一个处理ARP回复的函数.下面我们来看uIP中是如何实现的(代码见uip_arp.c:首先,定义一个缓存表的数据结构,99行起:struct arp_entry u16_t ipaddr2;struct uip_eth_addr ethaddr;u8_t time;只有三个项,很简单第一项是ip地址,16*2=4*8位的,保存四个八位组.第二项是MAC地址.第三项是缓存更新时间.下来是ARP请求发送

    2、函数:/*-*/* Prepend Ethernet header to an outbound IP packet and see if we need* to send out an ARP request.*为传出的IP包添加以太网头并看是否需要发送ARP请求.* This function should be called before sending out an IP packet. The* function checks the destination IP address of the IP packet to see* what Ethernet MAC address t

    3、hat should be used as a destination MAC* address on the Ethernet.*此函数应该在发送IP包时调用,它会检查IP包的目的IP地址,看看以太网应该使用什么目的MAC地址.* If the destination IP address is in the local network (determined* by logical ANDing of netmask and our IP address), the function* checks the ARP cache to see if an entry for the dest

    4、ination IP* address is found. If so, an Ethernet header is prepended and the* function returns. If no ARP cache entry is found for the* destination IP address, the packet in the uip_buf is replaced by* an ARP request packet for the IP address. The IP packet is dropped* and it is assumed that they hi

    5、gher level protocols (e.g., TCP)* eventually will retransmit the dropped packet.*如果目的IP地址是在局域网中(由IP地址与子网掩码的与逻辑决定),函数就会从ARP缓存表中查找有*无对应项.若有,就取对应的MAC地址,加上以太网头,并返回,否则uip_buf中的数据包会被替换成一个*目的IP在址的ARP请求.原来的IP包会被简单的仍掉,此函数假设高层协议(如TCP)会最终重传扔掉的包.* If the destination IP address is not on the local network, the I

    6、P* address of the default router is used instead.*如果目标IP地址并非一个局域网IP,则会使用默认路由的IP地址.* When the function returns, a packet is present in the uip_buf* buffer, and the length of the packet is in the global variable* uip_len.函数返回时,uip_buf中已经有了一个包,其长度由uip_len指定.*/*-*/voiduip_arp_out(void)struct arp_entry *

    7、tabptr;/* Find the destination IP address in the ARP table and constructthe Ethernet header. If the destination IP addres isnt on thelocal network, we use the default routers IP address instead./在ARP表中找到目的IP地址,构成以太网头.如果目的IP地址不在局域网中,则使用默认路由的IP.If not ARP table entry is found, we overwrite the origina

    8、l IPpacket with an ARP request for the IP address. */如果ARP表中找不到,则将原来的IP包替换成一个ARP请求./* First check if destination is a local broadcast. 首先检查目标是不是广播*/if(uip_ipaddr_cmp(IPBUF-destipaddr, broadcast_ipaddr) memcpy(IPBUF-ethhdr.dest.addr, broadcast_ethaddr.addr, 6); else /* Check if the destination addres

    9、s is on the local network. 检查目标地址是否在局域网内 */if(!uip_ipaddr_maskcmp(IPBUF-destipaddr, uip_hostaddr, uip_netmask) /* Destination address was not on the local network, so we need touse the default routers IP address instead of the destinationaddress when determining the MAC address. 目的地址不在局域网内,所以保用默认路由器

    10、的地址来确在MAC地址*/uip_ipaddr_copy(ipaddr, uip_draddr); else /* Else, we use the destination IP address. 否则,使用目标IP地址*/uip_ipaddr_copy(ipaddr, IPBUF-destipaddr);for(i = 0; i ipaddr) break;if(i = UIP_ARPTAB_SIZE) /* The destination address was not in our ARP table, so weoverwrite the IP packet with an ARP r

    11、equest. 如果遍历到头没找到,将原IP包替换为ARP请求并返回*/memset(BUF-ethhdr.dest.addr, 0xff, 6);memset(BUF-dhwaddr.addr, 0x00, 6);memcpy(BUF-ethhdr.src.addr, uip_ethaddr.addr, 6);memcpy(BUF-shwaddr.addr, uip_ethaddr.addr, 6);uip_ipaddr_copy(BUF-dipaddr, ipaddr);uip_ipaddr_copy(BUF-sipaddr, uip_hostaddr);BUF-opcode = HTON

    12、S(ARP_REQUEST); /* ARP request. */BUF-hwtype = HTONS(ARP_HWTYPE_ETH);BUF-protocol = HTONS(UIP_ETHTYPE_IP);BUF-hwlen = 6;BUF-protolen = 4;BUF-ethhdr.type = HTONS(UIP_ETHTYPE_ARP);uip_appdata = &uip_bufUIP_TCPIP_HLEN + UIP_LLH_LEN;uip_len = sizeof(struct arp_hdr);return;/* Build an ethernet header. 如果

    13、是在局域网中,且在ARP缓存中找到了(如果没找到进行不到这一步,在上面就返回了),则构建以太网头*/memcpy(IPBUF-ethhdr.dest.addr, tabptr-ethaddr.addr, 6);memcpy(IPBUF-ethhdr.src.addr, uip_ethaddr.addr, 6);IPBUF-ethhdr.type = HTONS(UIP_ETHTYPE_IP);uip_len += sizeof(struct uip_eth_hdr);以上内容自325行起.下面再总结一下其基本顺序:用IPBUF-ethhdr.dest.addr来存储目的IP地址,它有可能是局域

    14、网内一主机,也可能是路由器(如果是发往外网,即原来的目的IP不在局域网内),还有可能是广播专用的MAC:broadcast_ethaddr.addr.先看是不是在广播:如果是广播,将IPBUF-ethhdr.dest.addr设为广播MAC.再看是不是在局域网内:如果不是,则将IPBUF-ethhdr.dest.addr设为路由器MAC.如果在局域网内,查看是否已经存在于ARP缓存表中:如果不在,将要发送的换成ARP请求,返回.如果已存在,则查找使用查找到的MAC地址为IP包添加以太网头.这里还要解释一些细节问题,主要是:1. 如何在IP包上添加以太网头 2. 如果将IP包替换成ARP请求,A

    15、RP请求的格式是什么. 3. 广播地址将IP包替换成ARP请求部分代码(实际上IP包是放在uip_buf里的,这里只是将uip_buf填充上ARP请求即可),于uip_arp.c的388行:1. /* The destination address was not in our ARP table, so we2. overwrite the IP packet with an ARP request. */3. 4. memset(BUF-ethhdr.dest.addr, 0xff, 6);5. memset(BUF-dhwaddr.addr, 0x00, 6);6. memcpy(BUF

    16、-ethhdr.src.addr, uip_ethaddr.addr, 6);7. memcpy(BUF-shwaddr.addr, uip_ethaddr.addr, 6);8. 9. uip_ipaddr_copy(BUF-dipaddr, ipaddr);10. uip_ipaddr_copy(BUF-sipaddr, uip_hostaddr);11. BUF-opcode = HTONS(ARP_REQUEST); /* ARP request. */12. BUF-hwtype = HTONS(ARP_HWTYPE_ETH);13. BUF-protocol = HTONS(UIP

    17、_ETHTYPE_IP);14. BUF-hwlen = 6;15. BUF-protolen = 4;16. BUF-ethhdr.type = HTONS(UIP_ETHTYPE_ARP);17. uip_appdata = &uip_bufUIP_TCPIP_HLEN + UIP_LLH_LEN;18. 19. uip_len = sizeof(struct arp_hdr);20. return;复制代码首先解释这里的BUF(于uip_arp.c的116行):1. #define BUF (struct arp_hdr *)&uip_buf0)复制代码可见这里的BUF就是uip_buf

    18、,只不过这里将它取做一个struct arp_hdr的结构体:1. struct arp_hdr 2. struct uip_eth_hdr ethhdr;3. u16_t hwtype;/硬件类型4. u16_t protocol; /协议类型5. u8_t hwlen;6. u8_t protolen;7. u16_t opcode;/操作码8. struct uip_eth_addr shwaddr; /源以太网地址9. u16_t sipaddr2; /源IP地址10. struct uip_eth_addr dhwaddr; /目的以太网地址11. u16_t dipaddr2; /

    19、目的IP地址12. ;复制代码这里需要了解一下ARP的帧格式(【相关资料】ARP分组格式(帧格式,报文格式):1. struct uip_eth_hdr 2. struct uip_eth_addr dest;3. struct uip_eth_addr src;4. u16_t type;5. ;复制代码这是arp_hdr的第一个成员ethhdr的类型定义,对应图片中的前三项:6+6+2,目的以太网地址,源以太网地址,2字节数据类型(ARP请求和应答为0x0806).struct arp_hdr的第二个成员u16_t hwtype,对应图片中第三项,2字节硬件类型(值为1表示以太网).str

    20、uct arp_hdr的第三个成员u16_t protocol,对应图片中第四项,2字节要映射的协议地址类型(ip地址为0x0800).struct arp_hdr的第四个成员u8_t hwlen,对应图片中第五项,1字节硬件地址长度(对MAC地址来说为6).struct arp_hdr的第五个成员u8_t protolen,对应图片中第六项,1字节协议地址长度(对IP地址来说为4).struct arp_hdr的第六个成员u16_t opcode,对应图片中第七项,2字节操作码(1 ARP请求,2 ARP应答,3 RARP请求,4 RARP应答,必须字段).struct arp_hdr的第七

    21、个成员struct uip_eth_addr shwaddr,对应图片中第八项,6字节源以太网地址.struct arp_hdr的第八个成员u16_t sipaddr2;,对应图片中第九项,2字节源IP地址.struct arp_hdr的第九个成员struct uip_eth_addr dhwaddr,对应图片中第十项,6字节目标以太网地址.struct arp_hdr的第十个成员u16_t dipaddr2;,对应图片中第十一项,2字节目标IP地址.上面绿色的表示已经详解的,红字的表示要进一步说明的.这就是一个ARP帧的结构,可以看到,里面的源和目的以太网地址都是重复的.我们再看函数中的代码

    22、:1. memset(BUF-ethhdr.dest.addr, 0xff, 6);2. memset(BUF-dhwaddr.addr, 0x00, 6);3. memcpy(BUF-ethhdr.src.addr, uip_ethaddr.addr, 6);4. memcpy(BUF-shwaddr.addr, uip_ethaddr.addr, 6);复制代码这里四个memset,重复的源和目的以太网地址一起设置了,四个memset对应图片中的1,10,2,8项.但是:对1和10两项,都是源以太网地址,但置的值是不同的,分别为0xff*6和0x00*6.为什么会这样呢?因为他们的用处不一

    23、样,见:【相关资料】ARP分组格式(帧格式,报文格式)6+6 以太网的源地址和目的地址,目的地址为全1的为广播地址注意这里说,目的地址为全为1的广播地址.什么意思?当你发送一个ARP请求是,你是想知道一个IP对应的以太网地址(即MAC地址),但是你现在不知道目的主机的以太网地址,你问谁啊?不知道问谁,这种情况下,只能是广播一下了,0xff*6就是广播地址.从图片中可以看到,ARP包是分成两部分的,前6+6+2叫做以太网首部,它的意义就是分组是从谁(源地址)发给谁(目的地址)的什么类型(帧类型,请求和应答为0x0806),第二部分则是内容.来看这个例子:请求帧如下(为了清晰在每行的前面加了字节计

    24、数,每行16个字节):以太网首部(14字节)0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06ARP帧(28字节)0000: 00 010010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 370020: 00 00 00 00 00 00 c0 a8 00 02填充位(18字节)0020: 00 77 31 d2 50 100030: fd 78 41 d3 00 00 00 00 00 00 00 00以太网首部: 目的主机采用广播地址,源主机的MAC地址是00:05:5d:61:58:a8,上层协

    25、议类型0x0806表示ARP。ARP帧: 硬件类型0x0001表示以太网, 协议类型0x0800表示IP协议, 硬件地址(MAC地址)长度为6, 协议地址(IP地址)长度为4, op为0x0001表示请求目的主机的MAC地址, 源主机MAC地址为00:05:5d:61:58:a8,源主机IP地址为c0 a8 00 37(192.168.0.55), 目的主机MAC地址全0待填写,目的主机IP地址为c0 a8 00 02(192.168.0.2)。由于以太网规定最小数据长度为46字节,ARP帧长度只有28字节,因此有18字节填充位,填充位的内容没有定义,与具体实现相关。上面是一个ARP请求,它由

    26、MAC地址为00:05:5d:61:58:a8,IP地址为c0 a8 00 37(192.168.0.55)的主机发出,将以太网首部的源太网地址设为自己的MAC地址,目的以太网址设为全1,即广播. 将最后四项中的源以太网地址和IP地址分别设为自己的MAC地址和IP地址,将目的IP地址,设为自己想到查询的IP地址,将目的以太网地址设为全0.应答帧如下:以太网首部0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06ARP帧0000: 00 010010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 020020

    27、: 00 05 5d 61 58 a8 c0 a8 00 37填充位0020: 00 77 31 d2 50 100030: fd 78 41 d3 00 00 00 00 00 00 00 00以太网首部: 目的主机的MAC地址是00:05:5d:61:58:a8,源主机的MAC地址是00:05:5d:a1:b8:40,上层协议类型0x0806表示ARP。ARP帧: 硬件类型0x0001表示以太网, 协议类型0x0800表示IP协议 硬件地址(MAC地址)长度为6, 协议地址(IP地址)长度为4, op为0x0002表示应答, 源主机MAC地址为00:05:5d:a1:b8:40,源主机IP

    28、地址为c0 a8 00 02(192.168.0.2), 目的主机MAC地址为00:05:5d:61:58:a8,目的主机IP地址为c0 a8 00 37(192.168.0.55)。上面是一个针对前面的ARP请求的应答,应答者是MAC地址为00:05:5d:a1:b8:40,IP地址为c0 a8 00 02(192.168.0.2)的主机.它将应答中的源主机地址设为自己的MAC地址,目的主机地址设为发出请求的主机的MAC地址.将最后四项中的源主机地址和IP地址设为自己的MAC地址和IP地址,目的主机地址和IP地址设为发出请求的主机的MAC地址和IP地址.可见,一个ARP的请求的应答帧很多域的

    29、值都是固定的,只有: 以太网首部6+6(目的MAC,源MAC) 最后四项6+4+6+4(源MAC,源IP,目的MAC,目的IP) opcode(1 ARP请求,2 ARP应答,3 RARP请求,4 RARP应答,必须字段)需要按需填写.其中不知道的真全0,ARP请求的目的MAC在以太网首部为广播MAC,即全0.按着看函数:1. uip_ipaddr_copy(BUF-dipaddr, ipaddr);2. uip_ipaddr_copy(BUF-sipaddr, uip_hostaddr);3. BUF-opcode = HTONS(ARP_REQUEST); /* ARP request. */4. BUF-hwtype = HTONS(ARP_HWTYPE_ETH);5. BUF-protoco


    注意事项

    本文(ARP请求.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开