
IP协议详解从IP协议头到网段划分、路由与NAT一、IP协议1. IP协议头1.1 如何将报头和有效数据分离1.2 怎么向上交付数据1.3 16位校验和1.4 8位生存时间TTL1.5 32位目标IP地址1.6 4位版本1.7 8位服务类型TOS1.8 16位总长度二、网段划分重要1. 形象例子2. 如何子网划分3. 网络号和主机号4. 五类IP地址5. CIDR6. 划分子网的例子三、特殊的IP地址四、IP地址的数量限制五、私有IP地址和公网IP地址六、路由七、IP分片与组装八、ICMP协议九、总结一、IP协议IP地址的核心作用定位主机具有将数据报从A主机跨网络发送到B主机的能力。但是有这能力不代表一定能成功就必须有上层TCP协议的支持TCP负责处理出现问题的情况。但是IP有能力传输体现在IP有很大概率成功传输。IP具有跨主机的能力。在网络中主机被称为主机路由器也可以被称为主机。在把数据从A主机发送到B主机时实际上是把数据通过路径选择选择一条路径经过多个路由器最后到达B主机。通信时往往有很多路径可以选择但是最终选择一条路径发送数据选择路径的过程就是路由选择。路径选择中目标IP非常重要决定了最终选择的路径。所以在路径上所有的路由器都需要知道目标IP的路由信息来确定下一步的路由最后就形成了一条路由路径。IP 目标网络 目标主机。比如IP有32位前半部分是目标网络后半部分是目标主机。所以在路径选择的时候只需要知道目标网络部分就可以了而不需要知道目标主机部分因为目标主机部分是在目标网络部分内的。1. IP协议头4位版本4位首部长度8位服务类型TOS16位总长度字节16位标识3位标志13位片偏移量字节8位TTL8位协议16位校验和32位源IP地址32位目标IP地址选项可选数据可变长度确定的报头大小为20字节。1.1 如何将报头和有效数据分离数据就是上层交付的含有TCP/UDP协议的数据。4位首部长度单位是4字节表示报头的字节数所以最大报头长度为60字节最小报头长度为20字节最大计算过程为1111 * 4 60字节。这个4位首部长度代表的是报头的字节数并不是报文的字节数。报文数据的字节数是由16位总长度字节- 报头的字节数来确定的。所以IP协议是通过16位总长度字节和4位首部长度来分离报头和有效数据的。1.2 怎么向上交付数据IP是怎么知道上层到底是TCP还是UDP协议的答案是通过8位协议字段来判断的。8位协议字段1-4位是保留位5-8位是协议类型。1.3 16位校验和用于检测数据报是否被修改过。IP校验不通过则会丢弃数据报因为发送方会超时重发所以直接丢弃数据报即可。因为TCP的滑动窗口机制会使发送的数据在发送后不会立刻删除所以IP协议不保证传输的可靠性可靠性只能靠TCP协议来保证。1.4 8位生存时间TTL因为没有人能保证网络的稳定性所以需要设置一个生存时间来限制数据报在网络中的传输时间。因为在数据从源主机发送到目标主机的过程中会经过多个路由器所以数据报在路由器之间传递时每一个路由器都有丢弃报文的权力本质就是一场接力。因为如果出现环路则会导致数据报无限在路由器循环。TTL就是在数据报中添加一个计数器用于记录数据报在路由器中传递的次数。这个计数器的数字就是在网络中传递的次数每个路由器会将TTL减1直到TTL为0则丢弃数据报即便这个数据没有问题和没有到达目标主机也会被丢弃因为TTL为0。1.5 32位目标IP地址用于指定数据报的接收主机。因为有了目标IP地址所以数据报才能被正确地发送到目标主机。每一个路由器都需要根据目标IP地址来确定下一步的路由。1.6 4位版本用于指定IP协议的版本。当前只有版本4也叫IPv4。未来可能会有版本5也叫IPv6IPv6会使用128位地址空间。因为IPv4和IPv6的地址是不兼容的所以一般不会在意版本号。1.7 8位服务类型TOS用于指定数据报的优先级。因为网络中有很多数据报有的数据报需要优先传输有的数据报需要后传输所以需要一个字段来指定数据报的优先级这个字段就是TOS字段。8位服务类型包括3位优先权字段已经弃用4位TOS字段和1位保留字段必须置为0。4位TOS分别表示最小延时最大吞吐量最高可靠性最小成本。这四者相互冲突只能选择一个。对于ssh/telnet这样的应用程序最小延时比较重要对于ftp这样的程序最大吞吐量比较重要。1.8 16位总长度IP数据报整体占多少个字节。16位标识id唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了那么每一个片里面的这个id都是相同的。3位标志字段第一位保留保留的意思是现在不用但是还没想好说不定以后要用到。第二位置为1表示禁止分片这时候如果报文长度超过MTUIP模块就会丢弃报文。第三位表示“更多分片”如果分片了的话最后一个分片置为0其他是1。类似于一个结束标记。13位分片偏移fragment offset是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此除了最后一个报文之外其他报文的长度必须是8的整数倍否则报文就不连续了。二、网段划分重要IP地址分为两个部分目标网络部分、目标主机部分。1. 形象例子在学校中学校可能有多个学院每个学院可能有多个系每个系可能有多个学生。所以需要学号来唯一标识每个学生每一个学号可以由学院号系号学生号来组成。学院号用于标识学院。系号用于标识系。学生号用于标识学生。一个系间可能有多个学生学生之间可能会维护一个大群系里面的学生可以相互通信。但是实际中可能不同系的学生也会相互通信所以需要院的群来让不同系的学生可以相互通信。但是实际上并不是所有的学生都能相互通信往往需要一个代理人来帮助学生相互通信通过这个代理人来实现学生之间的通信。发送数据给代理人代理人会将数据发送到院的群并指定给某系的代理人让这个代理人将数据发送给目标学生。所以是一个系的就可以在自己系内相互通信而不需要通过院的群来实现相互通信。但是不同系的学生就需要通过院的群来实现相互通信不同系的学生不能直接相互通信所以通过代理人来实现相互通信。对应IP地址的网段划分学生就是主机代理人就是路由器。每一个学生都有唯一的学号对应IP地址的主机部分。每一个同学都属于某一个学院的某一个系对应IP地址的目标网络部分。所以互联网中的每一个主机都要属于某一个子网为了方便定位这个主机因为这样效率高。因为在查找目标主机的时候只需要知道目标网络就可以排除绝大部分的主机这样排除效率非常高。所以要引入子网划分。2. 如何子网划分再举一个形象的例子。IP地址一共有32位。互联网身处于一个被设计过的世界在我们国家被设计过是被三大运营商设计的。实际上IP的划分是按照人口、网络设备接入到互联网的数量来划分的。但为了方便表述后面的例子使用国家和国家里面的不同地区来划分IP地址。假设使用8个位来表示国家8个位来表示不同省份。所以一个国家中的所有主机的前8位都是相同的一个省份中的所有主机的前16位都是相同的。在国家之间会维护一个类似于前一个例子的大群国际网用于让不同国家的主机可以相互通信。每一个国家都会有一个属于自己的可以链接到这个大群国际网的代理人——国际路由器。所以国际路由器在国际网可以通过前8位来区分这个报文是属于哪个国家的然后发送给对应的国家的国际路由器。在每一个省份之间会维护一个类似于前一个例子的大群国家网用于让不同省份的主机可以相互通信。每一个省份都会有一个属于自己的可以链接到这个大群国家网的代理人——国家路由器。所以国家路由器在国家网可以通过前16位来区分这个报文是属于哪个省份的然后发送给对应的省份的国家路由器。每一个省份又有自己省里面的不同市每一个市都有自己的省份路由器用于让不同市的主机可以相互通信等等一直这样划分直到每个主机都有自己的IP地址。国际路由器既属于国际网也属于国家网因为国家里面的主机要和国际网的主机相互通信所以国际路由器要属于国际网也属于国家网。因为要通过国家网找到国际路由器然后通过国际路由器发送数据给目标国家的国际路由器再进行数据的转发。但是实际上真实情况比这个复杂需要考虑很多因素比如路由器的配置、路由表的维护等等但是思想是一致的。这个是一个理念版的子网划分实际情况会更复杂。3. 网络号和主机号IP地址分为两个部分网络号和主机号。网络号保证相互连接的两个网段具有不同的标识。主机号同一网段内主机之间具有相同的网络号但是必须有不同的主机号。不同的子网其实就是把网络号相同的主机放到一起。如果在子网中新增一台主机则这台主机的网络号和这个子网的网络号一致但是主机号必须不能和子网中的其他主机重复。想要跨子网通信需要通过路由器来实现。那么就注定了路由器要属于不同的子网才能实现跨子网通信所以路由器的IP地址要属于不同的子网。所以路由器有两个IP地址一个属于当前子网一个属于下一个路由的子网。一般来说路由器的IP是末尾的主机号为1的IP地址。通过合理设置主机号和网络号就可以保证在相互连接的网络中每台主机的IP地址都不相同。那么问题来了手动管理子网内的IP是一个相当麻烦的事情。有一种技术叫做DHCP能够自动的给子网内新增主机节点分配IP地址避免了手动管理IP的不便。一般的路由器都带有DHCP功能。因此路由器也可以看做一个DHCP服务器。4. 五类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随着Internet的飞速发展这种划分方案的局限性很快显现出来大多数组织都申请B类网络地址导致B类地址很快就分配完了而A类却浪费了大量地址。例如申请了一个B类地址理论上一个子网内能允许6万5千多个主机。A类地址的子网内的主机数更多。然而实际网络架设中不会存在一个子网内有这么多的情况因此大量的IP地址都被浪费掉了。5. CIDR针对这种情况提出了新的划分方案称为CIDRClassless 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的设备通常是路由器。目标网络和子网掩码、子网中的主机都会被路由器管理。目标网络和子网掩码、子网中的主机都会被路由器配置好。6. 划分子网的例子例子1IP地址140.252.20.68十六进制8C FC 14 44子网掩码255.255.255.0十六进制FF FF FF 00网络号140.252.20.0子网IP和掩码的按位与操作的结果子网地址范围140.252.20.0 到 140.252.20.255一般来说每一个子网的主机号从1开始因为0是代表网络号的所以不能作为主机号使用255一般也不作为主机号使用。所以实际可以容纳的主机数为 1-254。例子2IP地址140.252.20.68十六进制8C FC 14 44子网掩码255.255.255.240十六进制FF FF FF F0网络号140.252.20.64子网IP和掩码的按位与操作的结果子网地址范围140.252.20.64 到 140.252.20.79先看IP地址140.252.20.68子网掩码255.255.255.240把两者做按位与运算先把IP最后一段68转二进制是01000100掩码最后一段240转二进制是11110000二者按位与得到01000000也就是十进制64所以网络号就是140.252.20.64掩码255.255.255.240二进制末尾有4位为主机位主机位全部置1就是广播地址主机位4位全1对应二进制01001111等于十进制79因此这个子网的地址范围就是140.252.20.64到140.252.20.79其中140.252.20.64是子网网络号140.252.20.79是广播地址可用主机IP是中间140.252.20.65至140.252.20.78。所以主机号能动的就是在子网掩码中不为1的位数掩码二进制为1的部分固定代表网络位主机位只能在掩码为0的比特上变化本例掩码255.255.255.240二进制最后4位是0这4位就是主机位可以从0000变化到1111对应地址范围140.252.20.64~140.252.20.79其中主机位全0是网络号主机位全1是广播地址这两个地址不能分配给主机使用。三、特殊的IP地址将IP地址中的主机地址全部设为0就成为了网络号代表这个局域网。将IP地址中的主机地址全部设为1就成为了广播地址用于给同一个链路中相互连接的所有主机发送数据包。127.* 的IP地址用于本机环回loopback测试通常是127.0.0.1。四、IP地址的数量限制IP地址IPv4是一个4字节32位的正整数。那么一共只有 2 的 32 次方个IP地址大概是43亿左右。而TCP/IP协议规定每个主机都需要有一个IP地址。这意味着一共只有43亿台主机能接入网络么实际上由于一些特殊的IP地址的存在数量远不足43亿另外IP地址并非是按照主机台数来配置的而是每一个网卡都需要配置一个或多个IP地址。CIDR在一定程度上缓解了IP地址不够用的问题提高了利用率减少了浪费但是IP地址的绝对上限并没有增加仍然不是很够用。这时候有三种方式来解决动态分配IP地址只给接入网络的设备分配IP地址。因此同一个MAC地址的设备每次接入互联网中得到的IP地址不一定是相同的。NAT技术后面会重点介绍。IPv6IPv6并不是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口连接的主机都从属于当前这个路由器的子网中。WAN口IP则用于连接到外网。也就是说LAN对内WAN对外。不同的路由器子网IP其实都是一样的通常都是192.168.1.1。子网内的主机IP地址不能重复。但是子网之间的IP地址就可以重复了。每一个家用路由器其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级最外层的运营商路由器WAN口IP就是一个公网IP了。子网内的主机需要和外网进行通信时路由器将IP首部中的IP地址进行替换替换成WAN口IP这样逐级替换最终数据包中的IP地址成为一个公网IP。这种技术称为NATNetwork Address Translation网络地址转换。如果希望我们自己实现的服务器程序能够在公网上被访问到就需要把程序部署在一台具有外网IP的服务器上。这样的服务器可以在阿里云/腾讯云上进行购买。假设我的IP为192.168.1.100我需要访问外网IP 122.77.241.3。一开始时我准备好了一个报文准备往外发送我们之前说过想要访问外网一定要通过路由器所以我需要把报文发送给路由器。路由器收到报文后会先判断报文的IP地址是否在自己的子网内如果不在就会把报文发送给自己的WAN口IP就交给了运营商路由器。运营商的路由器收到报文后会判断报文的IP地址是否在自己的子网内如果不在就会把报文发送给自己的WAN口IP这个WAN口IP就是公网IP了。也就是广域网通信了。因为在公网IP是唯一的所以在广域网内可以被访问到。在服务器拿到报文后会判断报文的IP地址是否是自己的IP地址如果是就会把报文发送给自己的进程然后进程会处理报文构造报文返回。那么就出现了服务器的报文的目的IP填的就不可能是我们的IP了因为我的IP是私有IP所以不能被访问到。所以就出现了NAT技术。在开始时我传给路由器的报文会把当前请求的源IP替换为WAN口IP假设家庭路由器的WAN口IP为10.1.1.2那么这个时候报文的源IP就是10.1.1.2了目的IP是122.77.241.3。然后在向上传递到运营商路由器路由器会识别到报文的源IP就是你的路由器的WAN口IP所以会做相似的工作把报文的源IP替换为运营商路由器的WAN口IP122.77.241.4了。这个时候源IP和目的IP都变成了一个子网内的IP地址所以就能实现通信了。这种不断替换源IP为WAN口IP的技术就称为NAT技术。在服务器处理好报文给我响应时会收到报文的源IP也就是122.77.241.4运营商路由器的WAN口IP作为目的IP返回到运营商路由器的入口了。这个返回的过程后面再说因为还有路由和一些转发的问题还没有解决。NAPT如果局域网内有多个主机都访问同一个外网服务器那么对于服务器返回的数据中目的IP都是相同的。那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机这时候NAPT来解决这个问题了使用IPport来建立这个关联关系。这种关联关系也是由NAT路由器自动维护的。例如在TCP的情况下建立连接时就会生成这个表项在断开连接后就会删除这个表项。NAT技术的缺陷由于NAT依赖这个转换表所以有诸多限制无法从NAT外部向内部服务器建立连接转换表的生成和销毁都需要额外开销通信过程中一旦NAT设备异常即使存在热备所有的TCP连接也都会断开。NAT和代理服务器的区别从应用上讲NAT设备是网络基础设备之一解决的是IP不足的问题。代理服务器则是更贴近具体应用比如通过代理服务器进行翻墙另外像迅游这样的加速器也是使用代理服务器。从底层实现上讲NAT是工作在网络层直接对IP地址进行替换。代理服务器往往工作在应用层。从使用范围上讲NAT一般在局域网的出口部署代理服务器可以在局域网做也可以在广域网做也可以跨网。从部署位置上看NAT一般集成在防火墙、路由器等硬件设备上代理服务器则是一个软件程序需要部署在服务器上。六、路由数据包在路由的时候一定要告诉路由目标的IP地址在IP报头就有一个字段就是目的IP地址。又知道IP可以分为两个部分一个是网络部分一个是主机部分。所以路由的过程就是根据网络部分去查找目标主机的子网。所以一定会有一张路由表来存储所有的路由信息。数据包里面就含有一个目的IP地址在进行路由的过程中会遇到非常多的路由器每个路由器都有自己的路由表来存储所有的路由信息。路由器选择下一跳路由器的过程就是查找路由表的过程。这个就类似于你去问路你就是主机你去问问路的人就是路由器。问的结果就会有几种情况我不知道。虽然我不知道但是我知道有人知道。你先到某个地方再问。已经到了。我在去问路的过程中就类似于在路由的过程中不断查找路由表然后根据路由表中的信息来选择下一跳路由器的过程。我不知道的情况在路由的过程中其实是不存在的。虽然我不知道但是我知道有人知道的情况就对应了路由表中一定会有默认路由我虽然不知道但是我会告诉你默认路由的IP地址你去默认路由找。你先到某个地方再问在路由的过程中会根据路由表中的信息来选择下一跳路由器直接转发到下一跳路由器的IP地址。已经到了的情况直接返回目的IP地址作为路由目标。但是实际上我们去一个地方的时候往往是一个具体的地方而不是一个区域所以实际上找到目标子网后还没有结束还要根据主机部分来确定具体的目标主机问入口路由器。路由的过程就是这样一跳一跳Hop by Hop“问路”的过程。所谓“一跳”就是数据链路层中的一个区间。具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。IP数据包的传输过程也和问路一样。当IP数据包到达路由器时路由器会先查看目的IP路由器决定这个数据包是能直接发送给目标主机还是需要发送给下一个路由器依次反复一直到达目标IP地址。那么如何判定当前这个数据包该发送到哪里呢这个就依靠每个节点内部维护一个路由表。路由表可以使用route命令查看。如果目的IP命中了路由表就直接转发即可。路由表中的最后一行主要由下一跳地址和发送接口两部分组成当目的地址与路由表中其它行都不匹配时就按缺省路由条目规定的接口发送到下一跳地址。假设某主机上的网络接口配置和路由表如下DestinationGatewayGenmaskFlagsMetricRefUseIface192.168.10.0*255.255.255.0U000eth0192.168.56.0*255.255.255.0U000eth1127.0.0.0*255.0.0.0U000lodefault192.168.10.10.0.0.0UG000eth0这台主机有两个网络接口一个网络接口连到192.168.10.0/24网络另一个网络接口连到192.168.56.0/24网络。路由表的Destination是目的网络地址Genmask是子网掩码Gateway是下一跳地址Iface是发送接口Flags中的U标志表示此条目有效可以禁用某些条目G标志表示此条目的下一跳地址是某个路由器的地址没有G标志的条目表示目的网络地址是与本机接口直接相连的网络不必经路由器转发。转发过程例1如果要发送的数据包的目的地址是192.168.56.3跟第一行的子网掩码做与运算与计算的过程就是查找路由表的过程得到192.168.56.0与第一行的目的网络地址不符再跟第二行的子网掩码做与运算得到192.168.56.0正是第二行的目的网络地址因此从eth1接口发送出去由于192.168.56.0/24正是与eth1接口直接相连的网络因此可以直接发到目的主机不需要经路由器转发。转发过程例2如果要发送的数据包的目的地址是202.10.1.2依次和路由表前几项进行对比发现都不匹配按缺省路由条目从eth0接口发出去发往192.168.10.1路由器由192.168.10.1路由器根据它的路由表决定下一跳路由器。所以实际上在路由的过程是越来越具体的过程子网掩码会越来越变成全1从而确定具体的目标主机地址。所以在路由的过程实际上目的IP地址是会变的网络号是会变的但是最终IP是不会改变的。路由表生成算法选学路由表可以由网络管理员手动维护静态路由也可以通过一些算法自动生成动态路由。例如距离向量算法、LS算法、Dijkstra算法等。七、IP分片与组装在路由器之间传输的是IP报文但是实际上在网线之间传输的是MAC帧。所以IP的下一层数据链路层的协议就是MAC帧协议。MAC帧协议规定自己的有效载荷的最大长度是1500字节MTUMaximum Transmission Unit。这个1500字节包括了IP的报头和有效载荷但是不包括MAC帧的报头。所以就会要求IP报文的总长度不能超过1500字节但是IP协议不能决定单个IP报文的长度但是TCP协议可以决定单个IP报文的长度。但是会有不正常的情况出现例如TCP报文的长度超过了1500字节。所以IP就要有临时处理机制例如分片组装机制注意分片和组装不是常规的处理机制。分片机制就是将一个IP报文分成多个IP报文每个IP报文的长度都不超过1500字节。组装机制就是将多个IP报文合并成一个IP报文。分片和组装是IP协议处理的不是MAC协议处理的MAC协议不关心是否分片和组装只关注是否符合MAC帧协议的长度要求。TCP的发送方和接收方都不关心是否分片和组装所以分片和组装是IP自己独立处理的所以要和TCP协议、MAC帧协议进行解耦。注意在进行分片后的IP报文也是含有IP报文的报头的只不过在组装的时候会丢弃这个报头只保留有效载荷。如何分片和组装你怎么知道这个报文是被分片了同一个IP报文的分片要能够识别出来。哪一个是第一个分片哪一个是最后一个分片有没有收全或者丢失分片。区分哪个在前哪个在后如何正确的进行组装。怎么保证合起来的报文是正确的。16位标识id唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了那么每一个片里面的这个id都是相同的。3位标志字段第一位保留保留的意思是现在不用但是还没想好说不定以后要用到。第二位置为1表示禁止分片这时候如果报文长度超过MTUIP模块就会丢弃报文。第三位表示“更多分片”如果分片了的话最后一个分片置为0其他是1。类似于一个结束标记。没有分片默认为0如果后面还有分片则为1反之为0。13位分片偏移fragment offset是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此除了最后一个报文之外其他报文的长度必须是8的整数倍否则报文就不连续了。对应回答0. 怎么知道这个报文是被分片了根据标志字段的值为1但是标志字段的值为0并且分片偏移量大于0说明是分片。同一个IP报文的分片要能够识别出来16位标识id是同一个。哪一个是第一个分片哪一个是最后一个分片有没有收全或者丢失分片根据标志字段的值为0和1。第一个分片的标志字段的值为1且分片偏移量为0最后一个分片的标志字段的值为0且分片偏移量大于0。我们不能保证一定收全了但是我们把偏移量排序一下就依次进行计算就可以保证正确的组装。当前分片起始位置 当前分片的长度 下一个分片的偏移量*8如果不是说明有丢失的分片。区分哪个在前哪个在后如何正确的进行组装根据分片偏移量的值。怎么保证合起来的报文是正确的根据IP的报头中的16位首部校验和来判断TCP的16位校验和来判断。思考分片好吗对TCP和UDP协议包括IP本身有什么影响吗回答特别不好原因是是否分片对于TCP和UDP协议和MAC帧协议都不在意。所以假设一个报文被分片了那么就有可能在传输过程中丢失分片就会导致拼接失败就会要求重新发送。但是补发不是只补发丢失的分片而是会补发所有的分片。丢失的分片补发不是问题问题是分片后丢失的机率会增加。例子当传输层产生3000字节数据加上20字节IP头部变成3020字节时由于链路层MTU限制为1500字节网络层必须将其拆分为了满足MTU每个分片都需携带20字节头部因此单次最大承载数据为1480字节原始数据被分为三个分片即两个1480字节数据的分片和一个40字节数据的分片。图底部引出的三个数字正是分片控制的关键字段第一个数字“1111”是16位标识符用于标记这些分片属于同一个原始数据包第二个数字“1”是3位标志中的MF位表示“后面还有分片”第三个数字“0”是13位片偏移表示该分片在原始数据中的位置此处为首个分片偏移量为0。接收端在收到所有标识符为1111的分片后会根据片偏移量0、185、370将它们排序并拼接数据最终在收到MF位为0的最后一个分片时完成组装还原出完整的3000字节数据。MTU对IP协议的影响由于数据链路层MTU的限制对于较大的IP数据包要进行分包。将较大的IP包分成多个小包并给每个小包打上标签每个小包IP协议头的16位标识id都是相同的每个小包的IP协议头的3位标志字段中第2位置为0表示允许分片第3位来表示结束标记当前是否是最后一个小包是的话置为1否则置为0到达对端时再将这些小包会按顺序重组拼装到一起返回给传输层一旦这些小包中任意一个小包丢失接收端的重组就会失败。但是IP层不会负责重新传输数据。MTU对UDP协议的影响一旦UDP携带的数据超过14721500 - 20(IP首部) - 8(UDP首部)那么就会在网络层分成多个IP数据报。这多个IP数据报有任意一个丢失都会引起接收端网络层重组失败。那么这就意味着如果UDP数据报在网络层被分片整个数据被丢失的概率就大大增加了。MTU对TCP协议的影响TCP的一个数据报也不能无限大还是受制于MTU。TCP的单个数据报的最大消息长度称为MSSMax Segment Size。TCP在建立连接的过程中通信双方会进行MSS协商。最理想的情况下MSS的值正好是在IP不会被分片处理的最大长度这个长度仍然是受制于数据链路层的MTU。双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。然后双方得知对方的MSS值之后选择较小的作为最终MSS。MSS的值就是在TCP首部的40字节变长选项中kind2。MSS和MTU的关系MTU MSS TCP首部 IP首部。八、ICMP协议ICMP协议是一个网络层协议。一个新搭建好的网络往往需要先进行一个简单的测试来验证网络是否畅通但是IP协议并不提供可靠传输。如果丢包了IP协议并不能通知传输层是否丢包以及丢包的原因。ICMP正是提供这种功能的协议。ICMP主要功能包括确认IP包是否成功到达目标地址。通知在发送过程中IP包被丢弃的原因。ICMP也是基于IP协议工作的。但是它并不是传输层的功能因此人们仍然把它归结为网络层协议。ICMP只能搭配IPv4使用。如果是IPv6的情况下需要是用ICMPv6。ICMP的报文格式ICMP大概分为两类报文一类是通知出错原因。一类是用于诊断查询。常见类型0回送应答Echo Reply3目标不可达Destination Unreachable4原点抑制Source Quench5重定向或改变路由Redirect8回送请求Echo Request9路由器公告Router Advertisement10路由器请求Router Solicitation11超时Time Exceeded17地址子网请求Address Mask Request18地址子网应答Address Mask Replyping命令ping命令基于ICMP是在网络层。而端口号是传输层的内容。在ICMP中根本就不关注端口号这样的信息。ping命令不光能验证网络的连通性同时也会统计响应时间和TTLIP包中的Time To Live生存周期。ping命令会先发送一个ICMP Echo Request给对端对端接收到之后会返回一个ICMP Echo Reply。注意此处ping的是域名而不是URL一个域名可以通过DNS解析成IP地址。traceroute命令也是基于ICMP协议实现能够打印出可执行程序主机一直到目标主机之前经历多少路由器。九、总结网络层网络层的作用在复杂的网络环境中确定一个合适的路径。理解IP地址理解IP地址和MAC地址的区别。理解IP协议格式。了解网段划分方法。理解如何解决IP数目不足的问题掌握网段划分的两种方案。理解私有IP和公网IP。理解网络层的IP地址路由过程。理解一个数据包如何跨越网段到达最终目的地。理解IP数据包分包的原因。了解ICMP协议。了解NAT设备的工作原理。