文章目录IPv4IP协议的核心特性协议头格式 分片与组装过程分片组装网段划分特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址路由技术路由表路由匹配核心原则IP数据包完整转发流程NAT技术NAT核心原理标题NAT的三种实现类型两种核心NAT方向NAT的优缺点ICMP报文结构ICMP报文的两大分类IPv4IPInternet Protocol网际协议是TCP/IP 协议栈网络层的核心协议也是整个互联网互联互通的基础。它的核心职责是为每一台联网设备分配唯一标识IP 地址并通过路由寻址将数据包从源主机跨网段、跨路由器地逐跳转发到目的主机。TCP、UDP、ICMP 等所有上层协议的数据最终都会封装在 IP 报文中进行传输我们之前讲解的 TCP 可靠传输、滑动窗口、UDP 数据报等能力都建立在 IP 协议的寻址转发能力之上。IP协议的核心特性无连接发送数据前不需要和对端提前建立连接每个IP数据报独立路由同一条数据流的不同数据包可能经过完全不同的网络路径到达目的地。不可靠、尽力交付IP协议不保证数据包一定送达、不保证顺序不乱、不保证不重复、不保证数据完整。传输过程中出现丢包、乱序、数据错误时IP层只会直接丢弃报文不做重传、纠错、排序处理。这也是TCP存在的意义TCP在传输层弥补IP的不可靠缺陷通过确认应答、超时重传、乱序重排等机制实现端到端的可靠传输。面向数据报以独立的IP数据报为单位进行处理和转发每个报文独立寻址、独立路由。协议头格式 分片与组装过程IPv4头部最小20字节最大60字节可选选项部分最多40字节所有字段都有严格的长度定义结构如下字段长度核心作用版本4位标识IP协议版本IPv4固定为4IPv6固定为6首部长度4位单位为4字节最小值为5对应5×420字节无选项的标准头部最大值为15对应60字节服务类型(TOS/DSCP)8位标记报文的优先级、服务质量用于区分语音、视频、普通数据等不同流量的转发优先级总长度16位整个IP数据报的总字节数IP头部 数据载荷最大值为65535字节标识16位同一个原始IP数据报的所有分片标识值完全相同接收端依靠该字段将分片重组标志3位共3位第1位保留第2位为DF位不分片置1时路由器不能分片包过大直接丢弃第3位为MF位更多分片除最后一个分片置0其余分片都置1片偏移13位单位为8字节标记当前分片的数据在原始IP报文中的偏移位置用于接收端重组分片生存时间(TTL)8位数据包每经过一个路由器TTL值减1减到0时路由器直接丢弃报文并返回ICMP超时通知。作用是防止路由环路导致数据包在网络中无限循环协议8位标识上层承载的协议类型接收端靠这个字段将数据交给对应上层协议处理。常见值1ICMP6TCP17UDP首部校验和16位仅校验IP头部的完整性不校验数据部分。每经过一个路由器TTL变化校验和都会重新计算源IP地址32位发送方的IPv4地址目的IP地址32位接收方的IPv4地址选项 填充0~40字节可选字段用于路由记录、时间戳、安全控制等特殊场景填充位用于保证头部总长度是4字节的整数倍要谈论分片与组装的过程就需要先了解以下规则16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的.3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到).第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文.第三位表示更多分片, 如果分片了的话, 最后一个分片置为0, 其他是1. 类似于一个结束标记.13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 除以 8 得到的. 因此, 除了最后一个报文之外(之前如果都是8的整数倍最后一片的偏移量也一定是8的整数倍), 其他报文的长度必须是8的整数倍(否则报文就不连续了).注意片偏移(13位)表示本片数据在它所属的原始数据报数据区中的偏移量以8字节为单位分片检查MTU限制当一个IP数据报的大小超过了网络的MTU最大传输单元限制时就需要进行分片。MTU是数据链路层对IP层数据包进行封装时所能接受的最大数据长度。分割数据报IP层将原始的IP数据报分割成多个较小的片段。对于每个片段IP层会设置相应的标识Identification、偏移量Fragment Offset和标志位Flags等字段。标识字段用于标识属于同一个数据报的不同分片确保所有分片能够被正确地重新组装。偏移量字段指示了当前分片相对于原始数据报的起始位置以8字节为单位。标志位字段包含了3个位其中**MFMore Fragment**位用于指示是否还有更多的分片**DFDo Not Fragment**位用于指示数据报是否允许进行分片。添加IP头部每个分片都会加上自己的IP头部与完整IP报文拥有类似的IP头结构但MF和Fragment Offset等字段的值会有所不同。发送分片分片在传输过程中独立传输每个分片都有自己的IP头部并且各自独立地选择路由。组装接收分片当目的主机的IP层接收到这些分片后会根据标识字段将属于同一个数据报的所有分片挑选出来。排序与组装利用片偏移字段IP层会对属于同一个数据报的分片进行排序。当所有的分片都到达并正确排序后IP层会将这些分片重新组装成一个完整的IP数据报。传递给上层协议组装好的IP数据报会传递给上层的协议进行处理。网段划分IP地址分为两个部分,网络号和主机号网络号保证相互连接的两个网段具有不同的标识;主机号同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;不同的子网其实就是把网络号相同的主机放到一起.如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情.有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.过去曾经提出一种划分网络号和主机号的方案, 把所有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随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址;例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了.针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing)(无类别域间路由):引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;下面举两个例子可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0特殊的IP地址将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1IP地址的数量限制我们知道, IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址.这意味着, 一共只有43亿台主机能接入网络么?实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址.CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;NAT技术IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;私有IP地址和公网IP地址如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址10.*,前8位是网络号,共16,777,216个地址172.16.到172.31.,前12位是网络号,共1,048,576个地址192.168.*,前16位是网络号,共65,536个地址包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network AddressTranslation网络地址转换).如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.路由技术路由是IP网络层的核心功能负责为IP数据包选择从源主机到目的主机的传输路径由路由器设备执行采用「逐跳转发」的工作模式。通俗来说路由器就像网络世界的路口导航收到数据包后查询本地路由表决定下一站转发给哪个相邻路由器一步步把数据包接力送到目的网段最终交付给目标主机。路由表每个路由器都会维护一张路由表记录「去往哪个网段、该从哪个接口发出、下一跳发给谁」的核心信息关键字段如下字段含义目的网络/前缀目标IP网段用CIDR格式表示如192.168.1.0/24子网掩码标识网段的网络位长度与前缀作用一致下一跳地址下一个接收该数据包的相邻路由器IP出接口本机从哪个物理/逻辑接口转发数据包度量值/开销这条路径的传输成本值越小优先级越高用于多路径选优路由类型直连/静态/动态等标识路由的生成方式其中直连路由优先级最高路由器自身接口直接连接的网段会自动生成直连路由无需手动配置。路由匹配核心原则当数据包到达路由器时路由器会将目的IP与路由表所有条目逐一做按位与运算选择前缀最长网络位最多且匹配成功的条目执行转发。举个例子目的IP为202.10.1.10路由表中有3条可匹配条目0.0.0.0/0默认路由202.10.0.0/16202.10.1.0/24最终会选择第3条/24的路由转发因为它的前缀最长、匹配精度最高。只有所有明细路由都匹配失败时才会走默认路由0.0.0.0/0也就是我们常说的「默认网关」。路由的三大分类按生成方式可分为三类1静态路由由网络管理员手动写入路由器规则固定不变。优点配置简单、稳定可靠、无协议开销不占用路由器CPU资源。缺点网络拓扑变化时无法自动更新需手动修改仅适合小型、拓扑固定的网络。2动态路由路由器之间通过路由协议自动交换、学习路由信息拓扑故障或变化时自动更新路由表。优点自适应网络变化适合大型、结构复杂的网络。常见协议RIP距离矢量协议以「跳数」为度量值最多15跳适合小型网络。OSPF链路状态协议以「链路带宽/开销」为度量值属于内部网关协议广泛用于企业内网、园区网。BGP边界网关协议用于运营商之间、不同自治系统AS之间的路由交换是全球互联网的核心路由协议。3默认路由特殊的静态路由目的网段为0.0.0.0/0相当于「兜底路线」。当数据包匹配不到任何明细路由时按默认路由转发通常指向出口路由器的运营商网关。IP数据包完整转发流程结合之前的IP、ARP知识跨网段转发的完整步骤源主机网段判断源主机用目的IP和自身子网掩码做按位与判断是否同网段。同网段发送ARP请求获取目的主机MAC封装二层帧直接交付。不同网段发送ARP请求获取默认网关MAC封装二层帧发给本地网关路由器。路由器逐跳转发路由器收到包后剥离二层帧头读取IP头的目的IP查询路由表得到下一跳和出接口重新封装二层帧源MAC为出接口MAC目的MAC为下一跳MAC转发给下一跳路由器。目的网段交付数据包到达最后一跳路由器直连目的网段发送ARP获取目的主机MAC封装二层帧交付给终端主机。关键结论转发全程IP地址始终不变每经过一跳路由器二层MAC地址都会重新封装。NAT技术NATNetwork Address Translation网络地址转换是一种修改IP报文头中源/目的IP地址的技术核心作用是实现私网地址与公网地址的转换解决IPv4公网地址枯竭的问题。背景补充我们之前提到的私网IP段10.0.0.0/8、172.16.0.0/12、192.168.0.0/16仅能在内网使用公网路由器不转发私网地址的数据包。家庭、企业内网设备要访问互联网必须通过NAT把私网IP转换成合法公网IP。NAT核心原理NAT工作在路由器、防火墙等出口设备上维护一张NAT映射表记录私网地址与公网地址的对应关系内网访问外网出方向修改IP报文的源IP将私网源IP替换为公网IP同时记录映射关系。外网回包入方向修改IP报文的目的IP根据映射表把公网目的IP还原为私网IP转发给内网主机。标题NAT的三种实现类型1静态NATStatic NAT规则私网IP与公网IP一一固定绑定一个私网IP永久对应一个公网IP。场景企业内网服务器需要对外提供服务如网站、邮件服务让公网用户可通过固定公网IP访问内网服务器。特点不节省公网IP有多少台设备需要公网访问就要多少个公网IP。2动态NATDynamic NAT规则预先配置一个公网IP地址池内网主机访问外网时动态从地址池分配一个空闲公网IP连接断开后释放回地址池。特点比静态NAT节省公网IP但同一时间一个公网IP只能给一台内网主机使用公网IP数量决定了同时上网的主机数利用率依然有限。3NAPT网络地址端口转换又称PAT/端口多路复用目前最主流、应用最广的NAT方式家庭路由器、企业出口基本都采用该方案。规则不仅修改IP地址还修改TCP/UDP的源端口号让多台内网主机共用同一个公网IP通过不同端口号区分不同连接。映射表结构私网IP:私网端口 - 公网IP:公网端口示例内网主机A192.168.1.10:1025访问外网NAT转换为120.1.1.1:20001内网主机B192.168.1.11:1025访问外网NAT转换为120.1.1.1:20002两个连接共用同一个公网IP靠端口号区分回包时根据端口即可准确转发给对应内网主机。特点极大节省公网IP一个公网IP可承载上万条连接支撑上百台设备同时上网。两种核心NAT方向1SNAT源地址转换动作修改数据包的源IP地址。方向内网 → 外网。目的让内网设备以公网身份访问互联网。典型场景家庭、企业内网用户上网。2DNAT目的地址转换动作修改数据包的目的IP地址通常同步修改目的端口。方向外网 → 内网。目的让公网用户可以访问内网部署的服务器。典型场景端口映射、虚拟服务器。例如把公网IP的8080端口映射到内网服务器192.168.1.100的80端口公网用户访问公网IP:8080即可访问内网网站。NAT的优缺点优点缓解IPv4地址枯竭大量内网设备共享少量公网IP是目前解决IP地址不足最主流的方案。提升内网安全性隐藏内网真实IP和网络拓扑外网无法直接主动访问内网主机相当于一层天然的网络边界防护。降低成本企业无需为每台终端购买公网IP大幅缩减网络成本。缺点4.破坏IP端到端可达性外网主机无法主动直接连接内网主机P2P应用视频通话、大文件传输需要额外的NAT穿透打洞技术才能建立连接。5.部分协议适配困难部分应用层协议会在数据载荷中携带IP/端口信息如FTP、SIPNAT仅修改IP头会导致载荷地址不匹配需要ALG应用层网关额外处理。6.增加设备开销NAT设备需要维护映射表、修改报文头、重新计算校验和高并发场景下会消耗较多CPU和内存资源。7.溯源难度提升经过多层NAT后难以直接定位到具体内网终端增加了网络运维和安全溯源的复杂度。ICMPICMPInternet Control Message Protocol互联网控制报文协议是TCP/IP协议栈网络层的辅助协议与IP协议同层报文直接封装在IP数据报中传输IP首部协议字段值为1时代表承载ICMP。IP协议本身是无连接、尽力交付的既不保证报文可达也不会在传输出错时通知发送方。ICMP的核心价值就是弥补这一缺陷它专门负责在IP网络中传递差错报告、网络控制信息和探测查询信息把网络层的异常和状态反馈给源主机是IP协议的重要补充。注意ICMP只负责反馈问题不负责解决问题。比如它通知源主机“数据包丢了”但不会帮你重传重传纠错是TCP等传输层协议的工作。报文结构ICMP报文分为固定首部和数据部分首部最小8字节字段长度作用类型Type8位标识ICMP报文的大类如8回显请求、0回显应答、3目的不可达代码Code8位对类型的细分比如“目的不可达”下代码3代表“端口不可达”校验和Checksum16位校验整个ICMP报文的完整性可变字段32位不同类型报文内容不同如标识符、序列号、网关地址等数据部分可变长度差错类报文会携带原IP报文的首部数据前8字节用于定位出错的连接差错报文携带原IP数据前8字节是关键设计这8字节刚好覆盖TCP/UDP首部的源端口、目的端口源主机收到差错后可以精准定位到是哪个进程的哪条连接出了问题。ICMP报文的两大分类ICMP报文按功能分为差错报告报文和查询类报文两大类。而这两个类型又被细分为更多的类型在此我举例一部分终点不可达当主机或路由器不能交付数据报时就向源点发送终点不可达报文再根据代码字段来描述更加具体的原因。以上示例中路由器R1受到数据报后不知道如何转发于是丢弃数据报发送终点不可达。源点抑制当主机或路由器因为阻塞而丢弃数据报时就向源点发送源点抑制报文以上示例中主机H2发送拥塞丢弃报文后向源点发送源点抑制报文时间超过当IP数据报中的RTT减为0时丢弃该数据报向源点发送时间超过报文以上示例中数据报在经过R2时RTT 0丢弃该数据报向源点发送时间超过报文参数问题当主机或路由接收到IP数据报后会检测其中的校验和字段如果发现错误就丢弃该报文并向源点发送参数问题报文以上示例中当路由器R1收到IP数据报后检测其中的校验和字段如果发现首部出现错误就丢弃该报文并向源点发送参数问题报文改变路由当主机或路由收到数据报后发现可以通过更好的路线传送就丢弃该报文并向源点发送改变路由报文以上示例中当路由器R1收到IP数据报后发现可以通过R4更快传送就丢弃该报文并向源点发送改变路由报文。以上只是一部分示例, 以上全部示例中, 各个类型的 ICMP 差错报告报文 对应的 类型 字段的值如下:类型终点不可达源点抑制时间超过参数问题改变路由字段值3411125对于 ICMP 询问报文, 也有部分类型字段取值:类型回送请求/回答时间戳请求/回答字段值8 / 013 / 14对于询问报文, 就不再举例了。讲完了 ICMP 的首部, 再来看看 ICMP 的 数据部分, 其实 ICMP差错报告报文 的数据部分格式也是固定的。格式如下取出IP数据报的首部以及数据部分的前八个字节构成ICMP的数据部分。主要是要在ICMP报文中体现一些重要信息以便源点分析具体原因。而大部分重要信息都在首部中所以存储了IP数据报的首部。另外的IP数据报的数据部分的前八个字节还包含一些运输层端口相关信息也被纳入ICMP的数据部分。
网络层协议 IPv4 ICMP
文章目录IPv4IP协议的核心特性协议头格式 分片与组装过程分片组装网段划分特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址路由技术路由表路由匹配核心原则IP数据包完整转发流程NAT技术NAT核心原理标题NAT的三种实现类型两种核心NAT方向NAT的优缺点ICMP报文结构ICMP报文的两大分类IPv4IPInternet Protocol网际协议是TCP/IP 协议栈网络层的核心协议也是整个互联网互联互通的基础。它的核心职责是为每一台联网设备分配唯一标识IP 地址并通过路由寻址将数据包从源主机跨网段、跨路由器地逐跳转发到目的主机。TCP、UDP、ICMP 等所有上层协议的数据最终都会封装在 IP 报文中进行传输我们之前讲解的 TCP 可靠传输、滑动窗口、UDP 数据报等能力都建立在 IP 协议的寻址转发能力之上。IP协议的核心特性无连接发送数据前不需要和对端提前建立连接每个IP数据报独立路由同一条数据流的不同数据包可能经过完全不同的网络路径到达目的地。不可靠、尽力交付IP协议不保证数据包一定送达、不保证顺序不乱、不保证不重复、不保证数据完整。传输过程中出现丢包、乱序、数据错误时IP层只会直接丢弃报文不做重传、纠错、排序处理。这也是TCP存在的意义TCP在传输层弥补IP的不可靠缺陷通过确认应答、超时重传、乱序重排等机制实现端到端的可靠传输。面向数据报以独立的IP数据报为单位进行处理和转发每个报文独立寻址、独立路由。协议头格式 分片与组装过程IPv4头部最小20字节最大60字节可选选项部分最多40字节所有字段都有严格的长度定义结构如下字段长度核心作用版本4位标识IP协议版本IPv4固定为4IPv6固定为6首部长度4位单位为4字节最小值为5对应5×420字节无选项的标准头部最大值为15对应60字节服务类型(TOS/DSCP)8位标记报文的优先级、服务质量用于区分语音、视频、普通数据等不同流量的转发优先级总长度16位整个IP数据报的总字节数IP头部 数据载荷最大值为65535字节标识16位同一个原始IP数据报的所有分片标识值完全相同接收端依靠该字段将分片重组标志3位共3位第1位保留第2位为DF位不分片置1时路由器不能分片包过大直接丢弃第3位为MF位更多分片除最后一个分片置0其余分片都置1片偏移13位单位为8字节标记当前分片的数据在原始IP报文中的偏移位置用于接收端重组分片生存时间(TTL)8位数据包每经过一个路由器TTL值减1减到0时路由器直接丢弃报文并返回ICMP超时通知。作用是防止路由环路导致数据包在网络中无限循环协议8位标识上层承载的协议类型接收端靠这个字段将数据交给对应上层协议处理。常见值1ICMP6TCP17UDP首部校验和16位仅校验IP头部的完整性不校验数据部分。每经过一个路由器TTL变化校验和都会重新计算源IP地址32位发送方的IPv4地址目的IP地址32位接收方的IPv4地址选项 填充0~40字节可选字段用于路由记录、时间戳、安全控制等特殊场景填充位用于保证头部总长度是4字节的整数倍要谈论分片与组装的过程就需要先了解以下规则16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的.3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到).第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文.第三位表示更多分片, 如果分片了的话, 最后一个分片置为0, 其他是1. 类似于一个结束标记.13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 除以 8 得到的. 因此, 除了最后一个报文之外(之前如果都是8的整数倍最后一片的偏移量也一定是8的整数倍), 其他报文的长度必须是8的整数倍(否则报文就不连续了).注意片偏移(13位)表示本片数据在它所属的原始数据报数据区中的偏移量以8字节为单位分片检查MTU限制当一个IP数据报的大小超过了网络的MTU最大传输单元限制时就需要进行分片。MTU是数据链路层对IP层数据包进行封装时所能接受的最大数据长度。分割数据报IP层将原始的IP数据报分割成多个较小的片段。对于每个片段IP层会设置相应的标识Identification、偏移量Fragment Offset和标志位Flags等字段。标识字段用于标识属于同一个数据报的不同分片确保所有分片能够被正确地重新组装。偏移量字段指示了当前分片相对于原始数据报的起始位置以8字节为单位。标志位字段包含了3个位其中**MFMore Fragment**位用于指示是否还有更多的分片**DFDo Not Fragment**位用于指示数据报是否允许进行分片。添加IP头部每个分片都会加上自己的IP头部与完整IP报文拥有类似的IP头结构但MF和Fragment Offset等字段的值会有所不同。发送分片分片在传输过程中独立传输每个分片都有自己的IP头部并且各自独立地选择路由。组装接收分片当目的主机的IP层接收到这些分片后会根据标识字段将属于同一个数据报的所有分片挑选出来。排序与组装利用片偏移字段IP层会对属于同一个数据报的分片进行排序。当所有的分片都到达并正确排序后IP层会将这些分片重新组装成一个完整的IP数据报。传递给上层协议组装好的IP数据报会传递给上层的协议进行处理。网段划分IP地址分为两个部分,网络号和主机号网络号保证相互连接的两个网段具有不同的标识;主机号同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;不同的子网其实就是把网络号相同的主机放到一起.如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情.有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.过去曾经提出一种划分网络号和主机号的方案, 把所有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随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址;例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了.针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing)(无类别域间路由):引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;下面举两个例子可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0特殊的IP地址将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1IP地址的数量限制我们知道, IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址.这意味着, 一共只有43亿台主机能接入网络么?实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址.CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;NAT技术IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;私有IP地址和公网IP地址如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址10.*,前8位是网络号,共16,777,216个地址172.16.到172.31.,前12位是网络号,共1,048,576个地址192.168.*,前16位是网络号,共65,536个地址包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network AddressTranslation网络地址转换).如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.路由技术路由是IP网络层的核心功能负责为IP数据包选择从源主机到目的主机的传输路径由路由器设备执行采用「逐跳转发」的工作模式。通俗来说路由器就像网络世界的路口导航收到数据包后查询本地路由表决定下一站转发给哪个相邻路由器一步步把数据包接力送到目的网段最终交付给目标主机。路由表每个路由器都会维护一张路由表记录「去往哪个网段、该从哪个接口发出、下一跳发给谁」的核心信息关键字段如下字段含义目的网络/前缀目标IP网段用CIDR格式表示如192.168.1.0/24子网掩码标识网段的网络位长度与前缀作用一致下一跳地址下一个接收该数据包的相邻路由器IP出接口本机从哪个物理/逻辑接口转发数据包度量值/开销这条路径的传输成本值越小优先级越高用于多路径选优路由类型直连/静态/动态等标识路由的生成方式其中直连路由优先级最高路由器自身接口直接连接的网段会自动生成直连路由无需手动配置。路由匹配核心原则当数据包到达路由器时路由器会将目的IP与路由表所有条目逐一做按位与运算选择前缀最长网络位最多且匹配成功的条目执行转发。举个例子目的IP为202.10.1.10路由表中有3条可匹配条目0.0.0.0/0默认路由202.10.0.0/16202.10.1.0/24最终会选择第3条/24的路由转发因为它的前缀最长、匹配精度最高。只有所有明细路由都匹配失败时才会走默认路由0.0.0.0/0也就是我们常说的「默认网关」。路由的三大分类按生成方式可分为三类1静态路由由网络管理员手动写入路由器规则固定不变。优点配置简单、稳定可靠、无协议开销不占用路由器CPU资源。缺点网络拓扑变化时无法自动更新需手动修改仅适合小型、拓扑固定的网络。2动态路由路由器之间通过路由协议自动交换、学习路由信息拓扑故障或变化时自动更新路由表。优点自适应网络变化适合大型、结构复杂的网络。常见协议RIP距离矢量协议以「跳数」为度量值最多15跳适合小型网络。OSPF链路状态协议以「链路带宽/开销」为度量值属于内部网关协议广泛用于企业内网、园区网。BGP边界网关协议用于运营商之间、不同自治系统AS之间的路由交换是全球互联网的核心路由协议。3默认路由特殊的静态路由目的网段为0.0.0.0/0相当于「兜底路线」。当数据包匹配不到任何明细路由时按默认路由转发通常指向出口路由器的运营商网关。IP数据包完整转发流程结合之前的IP、ARP知识跨网段转发的完整步骤源主机网段判断源主机用目的IP和自身子网掩码做按位与判断是否同网段。同网段发送ARP请求获取目的主机MAC封装二层帧直接交付。不同网段发送ARP请求获取默认网关MAC封装二层帧发给本地网关路由器。路由器逐跳转发路由器收到包后剥离二层帧头读取IP头的目的IP查询路由表得到下一跳和出接口重新封装二层帧源MAC为出接口MAC目的MAC为下一跳MAC转发给下一跳路由器。目的网段交付数据包到达最后一跳路由器直连目的网段发送ARP获取目的主机MAC封装二层帧交付给终端主机。关键结论转发全程IP地址始终不变每经过一跳路由器二层MAC地址都会重新封装。NAT技术NATNetwork Address Translation网络地址转换是一种修改IP报文头中源/目的IP地址的技术核心作用是实现私网地址与公网地址的转换解决IPv4公网地址枯竭的问题。背景补充我们之前提到的私网IP段10.0.0.0/8、172.16.0.0/12、192.168.0.0/16仅能在内网使用公网路由器不转发私网地址的数据包。家庭、企业内网设备要访问互联网必须通过NAT把私网IP转换成合法公网IP。NAT核心原理NAT工作在路由器、防火墙等出口设备上维护一张NAT映射表记录私网地址与公网地址的对应关系内网访问外网出方向修改IP报文的源IP将私网源IP替换为公网IP同时记录映射关系。外网回包入方向修改IP报文的目的IP根据映射表把公网目的IP还原为私网IP转发给内网主机。标题NAT的三种实现类型1静态NATStatic NAT规则私网IP与公网IP一一固定绑定一个私网IP永久对应一个公网IP。场景企业内网服务器需要对外提供服务如网站、邮件服务让公网用户可通过固定公网IP访问内网服务器。特点不节省公网IP有多少台设备需要公网访问就要多少个公网IP。2动态NATDynamic NAT规则预先配置一个公网IP地址池内网主机访问外网时动态从地址池分配一个空闲公网IP连接断开后释放回地址池。特点比静态NAT节省公网IP但同一时间一个公网IP只能给一台内网主机使用公网IP数量决定了同时上网的主机数利用率依然有限。3NAPT网络地址端口转换又称PAT/端口多路复用目前最主流、应用最广的NAT方式家庭路由器、企业出口基本都采用该方案。规则不仅修改IP地址还修改TCP/UDP的源端口号让多台内网主机共用同一个公网IP通过不同端口号区分不同连接。映射表结构私网IP:私网端口 - 公网IP:公网端口示例内网主机A192.168.1.10:1025访问外网NAT转换为120.1.1.1:20001内网主机B192.168.1.11:1025访问外网NAT转换为120.1.1.1:20002两个连接共用同一个公网IP靠端口号区分回包时根据端口即可准确转发给对应内网主机。特点极大节省公网IP一个公网IP可承载上万条连接支撑上百台设备同时上网。两种核心NAT方向1SNAT源地址转换动作修改数据包的源IP地址。方向内网 → 外网。目的让内网设备以公网身份访问互联网。典型场景家庭、企业内网用户上网。2DNAT目的地址转换动作修改数据包的目的IP地址通常同步修改目的端口。方向外网 → 内网。目的让公网用户可以访问内网部署的服务器。典型场景端口映射、虚拟服务器。例如把公网IP的8080端口映射到内网服务器192.168.1.100的80端口公网用户访问公网IP:8080即可访问内网网站。NAT的优缺点优点缓解IPv4地址枯竭大量内网设备共享少量公网IP是目前解决IP地址不足最主流的方案。提升内网安全性隐藏内网真实IP和网络拓扑外网无法直接主动访问内网主机相当于一层天然的网络边界防护。降低成本企业无需为每台终端购买公网IP大幅缩减网络成本。缺点4.破坏IP端到端可达性外网主机无法主动直接连接内网主机P2P应用视频通话、大文件传输需要额外的NAT穿透打洞技术才能建立连接。5.部分协议适配困难部分应用层协议会在数据载荷中携带IP/端口信息如FTP、SIPNAT仅修改IP头会导致载荷地址不匹配需要ALG应用层网关额外处理。6.增加设备开销NAT设备需要维护映射表、修改报文头、重新计算校验和高并发场景下会消耗较多CPU和内存资源。7.溯源难度提升经过多层NAT后难以直接定位到具体内网终端增加了网络运维和安全溯源的复杂度。ICMPICMPInternet Control Message Protocol互联网控制报文协议是TCP/IP协议栈网络层的辅助协议与IP协议同层报文直接封装在IP数据报中传输IP首部协议字段值为1时代表承载ICMP。IP协议本身是无连接、尽力交付的既不保证报文可达也不会在传输出错时通知发送方。ICMP的核心价值就是弥补这一缺陷它专门负责在IP网络中传递差错报告、网络控制信息和探测查询信息把网络层的异常和状态反馈给源主机是IP协议的重要补充。注意ICMP只负责反馈问题不负责解决问题。比如它通知源主机“数据包丢了”但不会帮你重传重传纠错是TCP等传输层协议的工作。报文结构ICMP报文分为固定首部和数据部分首部最小8字节字段长度作用类型Type8位标识ICMP报文的大类如8回显请求、0回显应答、3目的不可达代码Code8位对类型的细分比如“目的不可达”下代码3代表“端口不可达”校验和Checksum16位校验整个ICMP报文的完整性可变字段32位不同类型报文内容不同如标识符、序列号、网关地址等数据部分可变长度差错类报文会携带原IP报文的首部数据前8字节用于定位出错的连接差错报文携带原IP数据前8字节是关键设计这8字节刚好覆盖TCP/UDP首部的源端口、目的端口源主机收到差错后可以精准定位到是哪个进程的哪条连接出了问题。ICMP报文的两大分类ICMP报文按功能分为差错报告报文和查询类报文两大类。而这两个类型又被细分为更多的类型在此我举例一部分终点不可达当主机或路由器不能交付数据报时就向源点发送终点不可达报文再根据代码字段来描述更加具体的原因。以上示例中路由器R1受到数据报后不知道如何转发于是丢弃数据报发送终点不可达。源点抑制当主机或路由器因为阻塞而丢弃数据报时就向源点发送源点抑制报文以上示例中主机H2发送拥塞丢弃报文后向源点发送源点抑制报文时间超过当IP数据报中的RTT减为0时丢弃该数据报向源点发送时间超过报文以上示例中数据报在经过R2时RTT 0丢弃该数据报向源点发送时间超过报文参数问题当主机或路由接收到IP数据报后会检测其中的校验和字段如果发现错误就丢弃该报文并向源点发送参数问题报文以上示例中当路由器R1收到IP数据报后检测其中的校验和字段如果发现首部出现错误就丢弃该报文并向源点发送参数问题报文改变路由当主机或路由收到数据报后发现可以通过更好的路线传送就丢弃该报文并向源点发送改变路由报文以上示例中当路由器R1收到IP数据报后发现可以通过R4更快传送就丢弃该报文并向源点发送改变路由报文。以上只是一部分示例, 以上全部示例中, 各个类型的 ICMP 差错报告报文 对应的 类型 字段的值如下:类型终点不可达源点抑制时间超过参数问题改变路由字段值3411125对于 ICMP 询问报文, 也有部分类型字段取值:类型回送请求/回答时间戳请求/回答字段值8 / 013 / 14对于询问报文, 就不再举例了。讲完了 ICMP 的首部, 再来看看 ICMP 的 数据部分, 其实 ICMP差错报告报文 的数据部分格式也是固定的。格式如下取出IP数据报的首部以及数据部分的前八个字节构成ICMP的数据部分。主要是要在ICMP报文中体现一些重要信息以便源点分析具体原因。而大部分重要信息都在首部中所以存储了IP数据报的首部。另外的IP数据报的数据部分的前八个字节还包含一些运输层端口相关信息也被纳入ICMP的数据部分。