尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

IP/MAC帧/ARP协议

IP/MAC帧/ARP协议 目录IP协议IP报头网段划分IP划分私有IP路由IP报文拆分MAC帧协议MAC帧报头局域网通信原理MTU与MSSARP协议ARP协议报头ARP缓存表RARPARP欺骗ICMPIP协议传输层并不直接将数据传输到网络上而是向下层交付到网络层(IP)IP协议具有定位主机将数据包从A主机跨网络传输到B主机的能力而仅有能力也不够IP提供的是行动而TCP提供策略超时重传、拥塞控制等等的策略就可以顺利将数据包送达IP协议负责路径选择通过多个路由器转发最终到达目标主机IP报头IP报文格式4位首部长度用于表示IP报头的长度。它的单位是4字节由于4位比特位最多可以表示到15【选项】字段一般来说没有因此IP报头的标准长度就是20字节即4位首部长度为5。IP报头长度的范围在[20,60]16位总长度用于表示IP报文报头有效载荷的长度。它的单位是1字节最大值到65535。通过该公式将报头与有效载荷分离有效载荷长度 16位总长度 - 4位首部长度*48位协议用于表示IP数据报携带的上层数据应该交给哪个协议处理向上交付。通过协议号确定要向上交付给哪个协议。例如TCP6、UDP17且传输层不只有这俩协议DCCP、SCTP等。而且IP之上也不只有传输层例如还有网络层/控制协议ICMP、IGMP等等16位首部校验和用于校验报头的完整性。校验失败时接收方会直接丢弃报文若传输层是TCP协议就会触发超时重传8位生存时间数据是通过路由器转发接力才能顺利到达但如果中间有路由器发生故障从而造成了例如环路问题等原因让数据包不停的在路由器中转发。8位生存时间用于表示该数据包的转发跳数每转发一个路由器该值-1当为0时丢弃该数据包。它的默认值并不是固定255而是根据设备的不同来选择例如Linux默认64Windows默认128路由器/交换机等默认2554位版本号用于标识该IP报文的IP协议版本号目前只有两个值IPv44IPv66该字段是IP报头第一个被读取的字段8位区分服务用来告诉路由器该数据包的优先级例如是紧急件还是普通件从而决定优先处理和转发策略该字段在公网效果有限主要用于企业内网或Qos网段划分IP地址由两部分组成IP地址 目标网络 目标主机当路由器转发数据包时先根据网络号找到目标网络再根据主机号在该网络中找到具体的主机。因为查找的本质也是排除而这样只要查找到目标网络就相当于排除了大部分的主机举个例子203.0.113.56假设属于203.0.113.0网络要发数据给203.0.117.100假设属于203.0.117.0网络。当数据包到公网上后会先找到该IP属于的子网即203.0.117.0再由该子网的路由负责找到具体主机IP地址并不是随机划分的而是有规律的例如运营商在规划一块IP时会按照省市来划分子网中国电信内部的规划可能是113.64.x.x分配给广东电信113.65.x.x分配给贵州电信113.66.x.x分配给北京电信广东电信再往下分113.64.1.x给广州113.64.2.x给深圳......子网内的IP都由路由器所管理它通过DHCP技术自动给子网内新增主机分配IP地址IP划分在过去曾经提出一种划分网络号和主机号的方案把所有IP 地址分为五类A类 0.0.0.0到127.255.255.255B类 128.0.0.0到191.255.255.255C类 192.0.0.0到223.255.255.255D类 224.0.0.0到239.255.255.255E类 240.0.0.0到247.255.255.255这种分类方法过于浪费IP例如一个B类地址可以容纳6w多主机A类则更多但一个子网内不会存在这么多主机的情况因此现在的IP划分方案一般为CIDR它引入子网掩码来区分网络号和主机号将IP与子网掩码 按位与 得到的结果即 网络号例如当IP为140.252.20.68子网掩码为255.255.255.0时网络号即为它们二进制的按位与结果为了更简洁可以将该IP和子网掩码合并表示为140.252.20.68/24后面的24意为子网掩码的前24位为1子网掩码是在路由器内配置的私有IP若真的给每个主机都设定一个唯一的IP地址就代表全球只有43亿台主机可以入网这是远远不够的因此一般来说我们的主机都没有公网IP,而只有内网IP局域网当转发数据时路由器会将该数据转发到公网私有IP的范围10.*,前8位是网络号,共16,777,216个地址172.16.到172.31.,前12位是网络号,共1,048,576个地址192.168.*,前16位是网络号,共65,536个地址一般192.168.*用作于家用路由器其余用作企业路由器私有IP意味着只要在该局域网内IP不重复即可但其他局域网中可能会有相同的IP由于IP紧张问题光122.77.241.0/24这个网络号就可以下发到254台路由器.0为网络号.255为广播地址而这每台路由器由可以连接254个家用路由器以此缓解IP地址紧张问题NAT技术假设192.168.1.201/24要给122.77.241.3/24发数据该主机的家用路由器会先转发数据包到它上层的运营商路由器再由运营商路由器转发到公网的路由器由公网路由器转发给指定公网IP一个路由器内至少有两个IP地址LAN口IP该路由器管理的内网的IP用于内部通信。例如192.168.1.1就代表这是192.168.1.0网络内的第一台主机因此*.1的IP一般是分给路由器的。当局域网内的主机想与外部通信时需要先经过LAN口到达路由器再从WAN口出去到达外部网路WAN口IP该路由器所连接的上层子网的IP用于外部通信属于上层网络的主机。当外部主机要与局域网内主机通信时需要先经过WAN口到达路由器再通过LAN口到达目标主机在转发数据时源IP会不断被替换成路由器的WAN口IP因为私有地址可以重复目标主机不知道该转发给谁。当数据要转给内网的设备时NAT技术会将目的IP转成指定内网IP当源IP被替换成公网地址时就可以在公网上转发了路由器的功能有转发数据DHCP(组建局域网)NAT路由每个路由器都有自己的路由表主机也有路由器的功能因此主机也有自己的路由表查看路由表可以用route命令LinuxDestination代表目标网络即本机知道如何到达的目标网络若目标Ip是这些网段的其中一个就可以直接转发给网段无需向上层路由器转发例如局域网内部通信default即默认网关Gateway代表网关即下一跳的地址。*代表不需要网关Genmask代表子网掩码当要转发数据包时会先遍历路由表中的Genmask和Destination找到目标网段Flags表示路由的状态和类型。例如U代表up路由已启用/可用G代表Gateway下一跳地址为路由器地址Iface代表网络接口lo代表local本地Metric/Ref/Use这里不介绍例如现在有一个数据包的目的IP是192.168.56.3遍历路由表中的子网掩码依次与目标IP 按位与 再将结果与目标网络对比若有相同的就直接转发到该网络。该数据包就会转发给192.168.56.0网段若数据包的目标IP是202.10.1.2遍历路由表中的子网掩码后也没有找到相同网段就会转发给默认网关让该网关继续查找路由表。只要路由器不认识该网段就向上转发默认网关直到转发到认识该网段的路由器例如公网路由器在不断转发时网络号会不会变化会不断变化。例如一个数据包的目的IP是8.8.8.8在国际骨干网路由器路由表中可能是这样的DestinationGenmask含义8.0.0.0255.0.0.0/8只看前8 位匹配到8.x.x.x就往下一个方向扔即为8.8.8.8/8它的网段是8.0.0.0到国内骨干网路由器后会更精确DestinationGenmask含义8.8.0.0255.255.0.0/16看前 16 位更精确地转发即为8.8.8.8/16它的网段是8.8.0.0到内部网络路由器后子网掩码就变为24位DestinationGenmask含义8.8.8.0255.255.255.0/24看前 24 位精确定位到具体子网到目标主机所在局域网后子网掩码变为32位DestinationGenmask含义8.8.8.8255.255.255.255/32精确匹配到这一台主机IP报文拆分IP层网络层的下层是MAC帧层数据链路层而以太网标准规定一个MAC帧中数据部分不能超过1500字节MTU也不能小于46字节决定网络中报文大小是TCP因此在TCP层的滑动窗口中会根据MSS大小将数据拆分成多个报文以确保符合MAC帧的要求MSSMTUMSSTCP报头IP报头MTU但如果传输层用的是UDP协议就会发生大于1500字节报文的情况就需要IP层出面拆分报文若是TCP协议IP层报文99%的情况都不需要拆分若是IP层拆分了报文MAC帧层并不知道拆分了报文只负责将报文发出去当对方的MAC层收到报文后也只负责将报文向上交付给IP层由对方的IP层负责组装报文并交给上层。可以说IP层负责MAC帧层与TCP/UDP层的解耦工作在IP报头中有3个字段上面没有讲这三个字段用于解决IP的分片与重组16位标识长度标记同一个原始 IP 数据报的所有分片。发送端每产生一个新的 IP 数据报这个计数器就加 1。当这个数据报被分片后所有的分片都会复制并携带这个相同的标识值。3位标志这三个比特位每个位都代表不同的意义第一位是保留位目前没有用始终为0第二位如果为1代表禁止分片即使报文大小超过了MTU也不会被分片而是直接丢弃第三位如果为1代表这只是其中一片后面还有其他分片如果为0代表这是最后一个分片或这个数据包没有分片13位页偏移指出当前这个分片的数据在原始 IP 数据报数据部分中的起始位置。它的单位为8字节因此除了最后一个分片外每个分片的数据部分长度必须是 8 的整数倍否则无法让后一个分片精确表示页偏移当【还有更多分片】 1时就证明该【16位标识】的报文分片了但如果最先收到的是源报文的最后一个分片【还有更多分片】 0但只要判断页偏移0,也可以代表该【16位标识】的报文分片了【16位标识】字段就可以确保同一个报文的分片都能被识别出来而【更多分片】 1、【16位页偏移】 0 的分片就是起始分片【更多分片】 0【16位页偏移】 0 的分片就是末尾分片。当报文开始重组时可以用当前分片的【16位页偏移】 自身长度 算出下一个分片的页偏移应该是多少这样就可以确保分片被收全也可以确保分片被正确组装而重组完成并交给传输层时TCP/UDP报头的【16位校验和】就可以确保分片被正确重组其实在这之前数据链路层的FCS就校验过一次了如果FCS没查出来才会轮到TCP/UDP出场当一个报文被分片成了多个任意一个分片丢失都会导致对整个源报文进行重传因此分片会增加丢包概率MAC帧协议IP提供的是从主机A到主机B的能力但从主机A到主机B需要经过多个路由器路由器可以直接转发的都是在一个子网里的因此网络传输的本质是通过一系列的子网转发实现的在局域网中是通过MAC帧协议通信的每个主机的网卡都有一个唯一的sn码该码称之为MAC地址在全球范围内具有唯一性MAC帧报头MAC帧报文格式如下MAC帧协议采用定长的策略报头和报尾固定字节数以此分离报头与有效载荷通过目的地址与源地址各6字节即48位的MAC地址两个字段让路由器在局域网内转发数据标识唯一的主机路由器就可以根据目的MAC地址找到唯一主机类型字段指示数据载荷里封装的是什么上层协议不同的值代表不同的协议例如0x0800代表IPv4数据报0x0806代表ARP请求/应答......通过判断类型字段中的值决定向上交付给什么协议分用FCS处于报文尾部4字节为帧校验序列用于检测帧在传输过程中是否发生了比特错误采用CRC-32算法局域网通信原理在早期以太网同一局域网内的主机中任何一个主机发消息所有主机都可以收到主机会查看该MAC帧的目的地址若不是自己就会丢弃在上图中主机A给主机D发送MAC帧就只有主机D会交付给上层但是由于它们是用一条线连起来的同一时间只能一个人发否则会发生碰撞此时用的是CSMA/CD算法用于碰撞检测先听后发边发边听冲突停发随机重发。可以将局域网看作临界资源任何时刻只有一个主机可以向临界资源中写入数据为了减少碰撞概率引入了交换机将一个局域网划分为两个网段左侧为网段A右侧为网段B同一网段内的通信依旧是转发给所有主机例如主机A发消息给主机E但如果主机A要发消息给主机D即为跨网段转发需要先转发给交换机再由交换机根据目的MAC地址精准转发给主机D若M1和M5是同时发消息发生了碰撞交换机也可以识别出来不将碰撞数据做转发此时将一个局域网划分为了两个碰撞域在现代以太网每个主机各独用一个网段就不会发生碰撞所有消息都先转发给交换机再由交换机精确转发给目标主机广播消息时仍然是所有主机都会收到例如当主机A获取主机B的MAC地址时需要广播转发IP地址负责描述数据传输的起点和终点而MAC地址用于局域网内节点间的通信MTU与MSSMAC帧报文的数据字段的大小称为MTUMaximum Transmission Unit一般为1500字节但也可以调整MAC帧报文的数据字段即为IP报文报头有效载荷的大小若 IP 报头为标准报头20字节有效载荷最大即为1480字节IP有效载荷即为TCP报文报头有效载荷的大小若 TCP 报头为标准报头 20 字节那么有效载荷最大即为 1460 字节省略UDPTCP滑动窗口中要分成一段一段的小报文发送的原因就在于此要考虑数据链路层的MTU大小而TCP中有效载荷的最大长度称为MSS该值在三次握手时就会协商好例如取两者MSS最小值TCP会尽量让滑动窗口中的每一片报文长度等于MSS实际长度为Min(剩余数据, 滑动窗口大小, MSS由于每个路由器的MTU可能不同若在网络通信的路上路由器MTU小于报文的实际数据长度IP层也会分片但这并不影响由接收端主机重组IP报文如果发送端发送的报文将不可分片标记位设为 1那么中途当轮到MTU小于该报文的数据长度的路由器收到该报文后就会丢弃报文并向发送端回传一个 ICMP 报文并附上自己的MTU值。发送端重发时就会主动将报文切小以符合路由器的 MTU 值ARP协议当数据经过层层转发终于到达目标主机所在网络时要转发给目标主机用的不是IP地址而是MAC地址要封装成MAC帧。但在发送方封装的报文中只有目标主机的 IP 地址。因此需要有一个过程让路由器知道目标主机的MAC地址这个过程就是ARP协议ARP协议可以通过IP地址获取MAC地址它处于数据链路层和网络层之间在IP与MAC帧之间可以看作在数据链路层IP 层完成路由选择后将数据下发给数据链路层数据链路层在封装 MAC 帧时发现缺少目标 MAC 地址从而触发 ARP 协议ARP协议报头硬件类型表示数据链路层的物理网络类型以太网为1现在网络几乎都为以太网协议类型表示要映射的上层协议地址类型几乎都为IPv4值为0x0800。虽然0x08DD表示IPv6但IPv6用的是NDP硬件地址长度指明MAC 地址的长度字节值一般为6协议地址长度指明上层协议地址的长度字节因为上层协议几乎都为IPv4因此协议地址长度一般为4op表明该报文是请求还是应答1为请求2为应答发送端硬件/IP地址填发送方的信息硬件地址为MAC地址目的硬件/IP地址填接收方的信息如果是请求由于不知道目标主机的MAC地址目的以太网地址填全000:00:00:00:00:00即前四个字段一般是固定值由于数据链路层不知道目标主机的MAC地址就交给ARP层ARP将报文字段填充好后交给下层MAC帧协议并发送ARP请求是以广播的形式发送即发送给该局域网内的所有主机广播MAC地址是FF:FF:FF:FF:FF:FF假设主机A发起ARP请求寻找IP3的MAC地址主机A将ARP报文封装成MAC帧后转发给交换机由于目的MAC地址是全F即广播转发给除发送方的所有主机主机BCD收到后由于帧类型是0806所以分用交给 ARP 层ARP 层会先看 OP 类型因为是请求直接看目的 IP 地址不是自己的直接丢弃因此最后只有主机C处理ARP请求并构建ARP应答由于主机C已经知道是谁发来的ARP请求ARP 应答报文的源 MAC、IP 和目的 MAC、IP 就可以直接填写封装MAC帧报文时直接填填写自己和对方的MAC地址转发给交换机后交换机会根据报文内的目的 MAC 地址直接转发给主机 A主机A收到MAC帧后由于帧类型是0806直接交付给ARP层ARP层先看op类型发现是应答将源MAC/IP地址的映射存入本地ARP表此时再取出被挂起的 IP 数据包封装目的 MAC正式发送ARP缓存表并不是每次局域网转发都需要发起ARP请求例如上面例子当主机A收到ARP应答后它会将该IP与MAC的映射关系存在本地的ARP缓存表中短时间内再转发该IP时就可以直接查看ARP缓存表中的对应MAC地址不同操作系统的ARP缓存表项的生存时间不同并且当主机 C 收到主机 A 的 ARP 请求后也会顺手将主机A的映射关系记录到本地ARP缓存表中为什么ARP缓存表要有TTL生存时间当局域网内设备断开重连等操作时它的IP 与 MAC 地址会发生变化因此TTL的存在可以防止无用记录长期占用内存既然局域网中通信会用到 ARP 协议由于整个的网络传输就是路由器在一个一个的子网中转发而完成的那么当路由器转发给下一跳路由器时也会需要ARP协议获取MAC地址RARPARP 协议用于通过 IP 地址获取 MAC 地址,在调试环境中可能会出现知道MAC但不知道IP的情况而RARP 协议是通过 MAC 地址获取 IP 地址的现在早已被淘汰被DHCP所取代ARP欺骗ARP缓存表默认遵循后来居上最新覆盖旧有动态ARP例如原本有映射关系IP1 : MAC1 后面来了一个ARP应答IP1 : MAC2就会将原先的映射覆盖掉那么如果有黑客疯狂发送ARP应答就会将正常ARP应答的映射关系覆盖掉例如上图在这之后主机A和网关在互相通信时都会先将数据包转发给攻击者若攻击者转发给真正要通信的主机就可以窃听未加密的敏感流量如 HTTP 明文密码、FTP 传输等、篡改数据包内容、甚至进行会话劫持中间人攻击若不转发就会让双方断网ARP断网。这就是ARP欺骗想防治 ARP 欺骗可以用静态 ARP 表默认为动态ARPICMPICMP协议处于网络层与传输层之间标准来说是网络层用于测试网络连通性、丢包原因ICMP报头ICMP 会直接将报文交给 IP 协议封装完全不经过 TCP 或 UDP例如ping、traceroute命令就是通过ICMP实现的telnet是23端口, ssh是22端口, 那么ping是什么端口?ping命令基于ICMP,在网络层而端口号是传输层TCP/UDP的内容. 在ICMP中根本就不关注端口号这样的信息.
返回列表