第7章IP地址与ARP协议张建忠徐敬东南开大学计算机科学与技术系为什么需要IP地址?屏蔽各种物理网络的地址差异每种物理网络都有各自的技术特点,其物理地址也各不相同统一物理地址的表示方法不现实互联网对各种物理网络地址的“统一”通过IP地址在IP层完成IP地址的作用指定计算机到互联网的一个连接与互联网有多个物理连接的主机有多个IP地址多个IP地址可绑定到一条物理连接上互联网的层次结构IP地址的组成IP地址的长度为32位二进制数网络号netid:标识互联网中一个特定网络主机号hostid:标示网络中主机的一个特定连接IP编制的特点优点:IP编址方式携带了位置信息给出IP地址就能知道它位于哪个网络路由简单缺点:主机在网络间移动,IP地址须跟随变化IP地址的分类IP地址分类的优越性既能适应不同的网络规模又具有一定的灵活性IP地址的点分十进制标记法将4个字节的二进制数值转换成4个十进制数值每个十进制数值小于等于2554个十进制数值间用“.”隔开点分十进制标记法举例二进制IP地址:用点分十进制表示法表示:202.93.120.4411001010010111010111100000101100字节1字节4字节3字节2网络地址构成:一个有效的网络号和一个全“0”的主机号例:IP地址为202.93.120.44的主机所处的网络为202.93.120.0,主机号为44广播地址直接广播:主机向其他网络的所有节点广播信息构成:一个有效的网络号和一个全“1”的主机号例:202.93.120.255发送直接广播前需要知道目的网络的网络号有限广播:将广播限制在最小的范围内标准的IP编址:广播将被限制在本网络之中子网编址:广播被限制在本子网之中构成:255.255.255.255发送有限广播前不需要知道网络号回送地址回送地址:127.0.0.0作用:网络软件测试和本地机器进程间通信含有网络号127的数据报不可能出现在网络上编址实例IP分配需注意的问题小型网络使用C类地址,中型网络使用B类地址,大型网络使用A类地址主机连接到同一网络中所有主机的IP地址共享同一netid路由器路由器可以连接多个物理网络每个连接都拥有自己的IP地址每个连接IP地址的netid应与这个网络的netid相同子网编址IP地址可适应不同的网络规模个人电脑普及使小型网络(特别是小型局域网络)越来越多浪费IP地址(即使采用C类地址)子网编址:克服IP地址浪费子网编址方法IP地址具有层次结构:网络号和主机号子网编址方法将IP地址的主机号部分进一步划分成子网部分和主机部分从主机号部分“借”位并把它们指定为子网号部分在“借”用时必须给主机号部分剩余2位在“借”用时至少要借用2位子网编址方法举例子网地址和子网广播地址子网地址:以二进制全“0”结尾子网直接广播地址:以二进制全“1”结尾有限广播地址:32比特全为“1”(广播被限制在本子网内)RFC规定二进制全“0”或全“1”的子网号不应分配给实际的子网(但在实际应用中可以分配)C类网络的子网划分子网表示法—子网掩码法子网掩码采用32位二进制数值与IP地址的网络号和子网号相对应的位用“1”表示与IP地址的主机号相对应的位用“0”表示结合IP地址和其子网掩码可以判断IP地址的网络号、子网号和主机号子网掩码表示法举例(1)借用B类IP地址的8位表示子网子网掩码:255.255.255.0子网号:25子网掩码表示法举例(2)借用B类IP地址的4位表示子网子网掩码:255.255.240.0子网号:1子网表示法—斜杠标记表示法通过“IP地址/n”的方法表示,其中/n表示IP地址前n位为网络号和子网号例如IP:128.22.25.6、子网掩码:255.255.255.0128.22.25.6/24IP:128.22.25.6,子网掩码:255.255.240.0128.22.25.6/20无类别IP编址—子网编址的延伸无类别IP编址抛弃了分类IP地址的概念通过“网络前缀”指定网络号部分无类别IP编址可使用掩码或斜杠标记法表示无类别IP编址方式是一种通用的IP编址方式:分类IP编址、子网编址都可通过其表示优点:可按照网络的规模分配和申请IP地址、能在一定程度上减少路由表表项,提高路由转发速度例:将IP地址块202.113.48.0/20平均分给4个部门部门部门1部门2部门3部门4网络前缀202.113.48.0/22202.113.52.0/22202.113.56.0/22202.113.60.0/22掩码255.255.252.0255.255.252.0255.255.252.0255.255.252.0可分配IP地址.48.1~.51.254.52.1~.55.254.56.1~.59.254.60.1~.63.254可分配的IP地址数1022102210221022网络地址202.113.48.0202.113.52.0202.113.56.0202.113.60.0广播地址202.113.51.255202.113.55.255202.113.59.255202.113.63.255地址解析协议IP地址屏蔽物理网络地址的差异,为上层用户提供“统一”的地址形式IP地址屏蔽物理网络地址差异通过在物理网络上覆盖一层IP软件实现互联网不对物理地址做任何修改高层软件利用IP地址指定源地址和目的地址低层物理网络利用物理地址指定源地址和目的地址IP地址映射到物理地址的实现方法物理网络可以根据自身的特点选择适合的实现方法:静态表格、直接映射、动态映射等以太网采用的方法:地址解析协议ARPARP充分利用以太网的广播能力ARP协议的基本思想ARP协议的改进高速缓存技术主机使用cache保存已知的ARP表项主机获得其他IP地址与物理地址映射关系后存入该cache发送时先检索cache,若找不到再利用ARP解析利用计时器保证cache中ARP表项的“新鲜性”其他改进技术收到ARP请求后,目的主机将源主机的IP地址与物理地址的映射关系存入自己cache中广播发送的ARP请求,所有主机都会收到。这些主机可将该映射关系存入各自的cache主机启动时可主动广播自己IP地址与物理地址的映射关系完整的ARP工作过程以太网中ARP的报文格式ARP报文中各字段的意义硬件类型:以太网接口类型为1协议类型:IP协议类型为080016操作:ARP请求为1,ARP应答为2硬件地址长度:MAC地址长度为6B协议地址长度:IP地址长度为4B源MAC地址:发送方的MAC地址源IP地址:发送方的IP地址目的MAC地址:ARP请求中该字段没有意义;ARP响应中为接收方的MAC地址目的IP地址:ARP请求中为请求解析的IP地址;ARP响应中为接收方的IP地址ARP命令功能:查看、添加和删除高速缓存区中的ARP表项高速缓冲区中的ARP表项动态表项:随时间推移自动添加和删除静态表项:一直保留,直到人为删除或重新启动计算机Windows中ARP表项的潜在生命周期:10分钟新表项加入时定时器开始计时表项添加后两分钟内没有被再次使用:删除表项被再次使用:增加2分钟的生命周期表项始终在使用:最长生命周期为10分钟显示高速cache中的ARP表添加和删除ARP表项添加命令:arp–sinet_addreth_addr人为增加ARP表项一定要确保IP地址与MAC地址的对应关系是正确的删除命令:arp–dinet_addrInet_addr为“*”时删除所有表项利用WinPcap获取IP-MAC的对应关系获取本机网络接口的IP地址intpcap_findalldevs_ex(char*source,structpcap_rmtauthauth,pcap_if_t**alldevs,char*errbuf);Typedefstructpcap_ifpcap_if_t;structpcap_if{structpcap_if*next;char*name;char*description;structpcap_addr*addresses;u_intflags;};structpcap_addr{structpcap_addr*next;structsockaddr*addr;structsockaddr*netmask;structsockaddr*broadaddr;structsockaddr*dstaddr;};例:获取本机网络接口的IP地址pcap_if_t*alldevs;//指向设备链表首部的指针pcap_if_t*d;pcap_addr_t*a;charerrbuf[PCAP_ERRBUF_SIZE];//错误信息缓冲区if(pcap_findalldevs_ex(……)==-1){……}//获得本机的设备列表for(d=alldevs;d!=NULL;d=d-next)//显示接口列表{……//利用d-name获取该网络接口设备的名字……//利用d-description获取该网络接口设备的描述信息for(a=d-addresses;a!=NULL;a=addr-next)//获取IP地址{if(a-addr-sa_family==AF_INET)//该地址是否IP地址{……//利用a-addr获取IP地址……//利用a-netmask获取网络掩码……//利用a-broadaddr获取广播地址……//利用a-dstaddr)获取目的地址}}pcap_freealldevs(alldevs);//释放设备列表获取本机网卡的MAC(1/2)NetBIOS编程接口与winsock的gethostbyname函数(获取的MAC地址和IP地址很难与WinPcap获取的设备接口名对应)pcap_findalldevs_ex可获取本机的网络接口设备列表包含了本机所有网络接口和接口上绑定的IP地址不包含接口的物理地址获取本机网卡的MAC(2/2)获取本机网络接口和接口上绑定的IP地址发送ARP请求,请求本机网络接口上绑定的IP地址与MAC地址的对应关系:本地主机模拟一个远端主机,发送一个ARP请求报文,该请求报文请求本机网络接口上绑定的IP地址与MAC地址的对应关系捕获本机的ARP响应,获取本机网络接口的MAC地址发送数据包intpcap_sendpacket(pcap_t*p,u_charbuf,intsize};发送ARP请求的例子(1)#pragmapack(1)typedefstructFrameHeader_t{//帧首部BYTEDesMAC[6];BYTESrcMAC[6];WORDFrameType;}FrameHeader_t;typedefstructARPFrame_t{//ARP帧FrameHeader_tFrameHeader;WORDHardwareType;WORDProtocolType;BYTEHLen;BYTEPLen;WORDOperation;BYTESendHa[6];DWORDSendIP;BYTERecvHa[6];DWORDRecvIP;}ARPFrame_t;#pragmapack()发送ARP请求的例子(2)ARPFrame_tARPFrame;//将ARPFrame.FrameHeader.DesMAC设置为广播地址。//将ARPFrame.FrameHeader.SrcMAC设置为本机网卡的MAC地址。ARPFrame.FrameHeader.FrameType=htons(0x0806);//帧类型为ARPARPFrame.HardwareType=htons(0x0001);//硬件类型为以太网ARPFrame.ProtocolType=htons(0x0800);//协议类型为IPARPF