欢迎光临
我们一直在努力

【Linux】网络层协议IP

目录

  • 一、网络层协议IP
    • 1.1 基础概念
    • 1.2 协议格式
    • 1.3 关于网段划分
      • 为什么要进行网段划分呢?
      • 如何进行网段划分的?
    • 1.4 特殊的IP地址
    • 1.5 IP地址的数量限制
    • 1.6 公网IP地址和私有IP地址
    • 1.7 尝试理解公网
    • 1.8 IP的分片与组装
      • 组装
      • 分片

在这里插入图片描述

个人主页:矢望 个人专栏:C++、Linux系统编程、Linux网络编程、C语言、数据结构、Coze-AI、MySQL

一、网络层协议IP

1.1 基础概念

在这里插入图片描述 主机:配有IP地址,也要进行路由控制的设备;路由器:既配有IP地址,又能进行路由控制;节点:主机和路由器的统称。 所以路由器本质上也是主机。

上图种数据从主机B要到达主机C,需要经过一个个路上节点进行路由转发。要能够转发就要求两台设备同时处于同一个子网(局域网)中,只有在同一个子网中的设备才能直接进行转发。所以数据从B到C需要经历无数个子网转发!

那么为什么上面的数据要从这条路径走呢?它为什么不走别的路径呢?因为主机是根据报文中的目的IP地址进行路由选择的。 IP地址=目标网络+目标主机,想要找到目标主机首先需要到达目标网络,然后再在目标网络中寻找目标主机。 因此IP给协议提供了一种能力:把数据报从主机A跨网络经过路径选择、路由转发发送到主机B的能力。而传输层协议有了IP这种能力之后,又在很大程度上的保证可靠性,因此TCP+IP有极大的概率保证了数据跨网络发送到目标主机。 由于在协议栈中TCP和IP协议显得尤为重要!所以才叫做TCP/IP协议!

1.2 协议格式

在这里插入图片描述 和之前一样,收到一个协议之后,首先需要解决两个问题,第一个问题:IP报头和有效载荷如何分离?第二个问题:有效载荷如何分用的问题。

首先IP协议报头中存在一个字段叫做4位首部长度,它和TCP协议报头中的4位首部长度作用完全相同。4位首部长度取值[20/4, 15],4位首部长度*4就是报头的大小。此外IP协议报头中还有16位总长度字段,它表示的是IP协议报文的总长度。有了报文总长度和报文的报头长度,自然可以实现IP报头和有效载荷分离。

注意:标准IP报头(不含选项)固定为 20字节,所以4位首部长度值为 20/4 = 5。如果包含选项字段,报头会变长,该值会相应增加。

那么如何解决有效载荷分用的问题呢? 在IP协议报头中还有一个8位协议的字段,它表示上层协议的类型。

协议名称协议号
ICMP (Internet控制报文协议) 1
IGMP (Internet组管理协议) 2
TCP (传输控制协议) 6
UDP (用户数据报协议) 17
IPv6 逐跳选项 0
EGP (外部网关协议) 8

上面只列举了几个协议,实际还有很多。 IP协议层携带的有效载荷是上层,如TCP/UDP等协议传下来的报文,所以根据这个8位协议字段就能知道IP协议层的有效载荷应该交给上层的哪个协议。也就解决了有效载荷分用的问题。

那么这个8位协议字段由谁来填写呢?当然由报文的发送端来填写,它知道有效载荷是上层的哪个协议传给它的。


在这里插入图片描述 4位版本号用于标识IP协议的版本(如IPv4值为0100,IPv6值为0110),确保通信双方及沿途路由器使用相同的IP协议版本进行解析和处理,版本不匹配时数据包会被丢弃。 我们国家的IPv6技术搞得非常好。

8位服务类型(TOS) 用于指示IP数据包的优先级和服务质量(QoS)要求,让路由器在拥塞时优先处理关键流量。8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。

16位首部校验和用于只校验IP报头(不含数据),确保路由器转发时头部信息(如源/目的IP、协议号等)在传输中未被损坏。如果校验失败,路由器会直接丢弃该数据包。 IP报文不怕被丢弃,如果上层使用的是UDP它不怕被丢弃。如果上层使用的是TCP,它会对报文进行重传。

8位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数,一般是64。每次经过一个路由,该值减一,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止数据包在网络中无限循环。

32位源IP地址和32位目的IP地址分别用于标识数据包的发送端和接收端,是路由器进行路径选择(路由转发)和主机判断“这个包是不是给我的”的根本依据。

1.3 关于网段划分

IP地址其实由两个部分组成,网络号和主机号。 网络号:保证相互连接的两个网段具有不同的标识; 主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;

在这里插入图片描述 当你的主机没有联网的时候,其实你的主机是没有一个可用的IP地址用于通信的,当你联网时,其实是在向路由器要一个IP地址。 所以路由器有一个核心能力叫做构建子网(局域网)!

路由器的主机号一般是1,表示它是该子网中的第一台主机。区分子网就是靠网络号区分的,人们在网络号后带一个0号主机号代表整个网段,它不会分配给任何设备,例如192.168.128.0。

一个子网其实是把网络号相同的主机放在一起组成的。如果在子网中新增一台主机,那么这台主机的网络号必须和子网的网络号相同,但是主机号不能和子网中的其它主机重复。两个不同子网中的主机,它们的主机号可能相同,但网络号肯定不同。 不同子网的主机之间不能直接通信。

通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。 那么问题来了,手动管理子网内的IP,是一个相当麻烦的事情。因此有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便。一般的路由器都带有DHCP功能。因此路由器也可以看做一个DHCP服务器。

网段划分就是利用子网掩码,将一个大的IP地址空间切分成多个更小的、逻辑上独立的广播域(即子网),以便于管理、提升安全性和优化路由。

为什么要进行网段划分呢?

主机之间在进行网络通信时会发送报文,把报文交给目标主机的本质是一个查找工作,他需要先找到目标主机。查找是一种变相的淘汰工作,只要淘汰的越快越多,找到目标主机的速度就越快。 当IP由网络号和主机号构成时,发送报文时就可以先判断目标主机和自己的网络号相不相同,如果相同,就相当于淘汰了其它所有子网的主机,直接发给自己子网的目标主机号的主机即可。如果不同,源主机就断定目标主机不在自己所在的子网中,它就把报文发给路由器,让路由器筛选到相符的网络号,路由器就把报文转发给目标子网的路由器,这个过程可能会经过很多个路由器转发。

所以进行网段划分时为了支持在查找目标网络的过程中快速淘汰!提高查找目标主机的效率!

如何进行网段划分的?

  • 分类划分法
  • 过去曾经提出一种划分网络号和主机号的方案,把所有IP地址分为五类。 在这里插入图片描述 如上,这种划分方式是先在所有的IP地址中砍下一半,比如首位为0的为A类网络,其余一半再劈一半,第二位为0的为B类网络。一半一半的划分成五类网络。 在这里插入图片描述 如上,我们可以看到,按照这种划分方式,A类网络占据了所有地址的一半,但A类网络只可以分出27个子网,而每个子网可以有224台主机,数量巨大。

    随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请A、B类网络地址,导致A、B类地址很快就分配完了,却浪费了大量地址;例如,申请了一个A类地址,理论上一个子网内能允许2^24个主机。然而实际网络架设中,不会存在一个子网内有这么多的情况。因此大量的IP地址都被浪费掉了。

  • CIDR表示法
  • 针对上面这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)(无类别域间路由):

    • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
    • 子网掩码也是一个32位的正整数。通常用一串 “0” 来结尾;
    • 将IP地址和子网掩码进行 “按位与” 操作,得到的结果就是网络号;
    • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关。

    子网掩码是一个**32位的二进制数**,用于标识IP地址中哪些位属于网络号、哪些位属于主机号,对应网络号的位设为1,对应主机号的位设为0。它能帮设备判断目标IP是否在同一个网段。 子网掩码的表示形式:CIDR斜线表示法:/24(表示前24位为网络号,全为1,之后全为0,即子网掩码是255.255.255.0)假设一个IP地址为192.168.124.176,那么它所处的子网是(192.168.124.176)&(255.255.255.0)=192.168.124.0。

    使用这种方式就可以对A类、B类等子网的IP地址进行更加细化的使用。 例如一个A类子网首位是0,之后七位表示网络地址,当一个组织申请到A类网络之后,如果它的子网中不可能有那么多的主机,他可以使用CIDR对IP地址进行细分。 假设它分到的A类网络号是XXX.0.0.0。他可以采用255.255.255.0,也就是/24的方式划分子网。由于申请到的A类网络号是XXX.0.0.0,前8位不能改变了,但是采用/24的方式划分,就多出来了24-8=16位网络号,这样就可以在他申请的A类网络中多增加2^16个子网!这样IP地址就得到了充分的利用。 在这里插入图片描述

    如下是两个计算的例子: 在这里插入图片描述

    • 例子1:可用主机数为 2⁸ – 2 = 254 个
    • 例子2:可用主机数为 2⁴ – 2 = 14 个

    所以子网掩码表示的是左边全为1,右边全为0的一串二进制序列。 /XX表示前XX位是网络号,后32-XX位是主机号。主机号从全0到全1就是子网的地址范围。当主机号全为0时表示网络号,当主机号全为1时表示广播地址,所以这两种主机号一般不能分配IP地址,所以可用的分配IP地址的一共有232-XX-2个。

    IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0。

    1.4 特殊的IP地址

    • 将IP地址中的主机地址全部设为0,就成为网络号,代表这个局域网;
    • 将IP地址中的主机地址全部设为1,就成为广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
    • 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。 在这里插入图片描述

    1.5 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技术;
    • IPv6:IPv6并不是IPv4的简单升级版。这是互不相干的两个协议,彼此并不兼容;IPv6用16字节128位来表示一个IP地址;但是目前IPv6还没有普及。

    IPv6在内网中早已普及,但是在公网中没有普及。

    1.6 公网IP地址和私有IP地址

    如果一个组织内部要组建局域网,IP地址只用于局域网内的通信,而不连到公网上,理论上可以使用任意的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)。 在这里插入图片描述 内网是由路由器或者类似路由器的设备组建的。

    在向下说之前需要谈一谈网络背景。 有没有发现一个问题,假设你是一个白嫖主义者,你上网浏览视频软件的视频,花费了流量,明面上你没有给这些软件厂商的钱,你到时候是把钱交给了运营商,是不是很奇怪? 在互联网兴起初期,会有大量的基础工作要做,比如拉光纤、建基站等,我们国家在疯狂的提升网民数量,甚至花钱也要让你上网。向我们熟知的互联网大公司,这些基础工作它们是不愿意做的,它们的目的一般就是赚快钱,它们想快速盈利,不希望还没开始赚钱,先亏钱。 但这些基础工作总得有人做,不然网都没有,这些互联网公司也孵化不出来。运营商就站出来了,他们劝说人们光纤入户,在各个地方建立基站等等,建设了很长时间,他们要建设这些基础工作背后还有供应商等完整的生产链。最后2G、3G逐渐出现,直到现在的5G,每一次基础工作的升级比如2G->3G,都会有新型的互联网公司诞生。政府搭台子,私企当演员。五年前,谁又会想到大模型能够发展到今天这样呢? 所以互联网是一个系统工程!

    回到前面的问题,在你上网的时候,你的主机和公司之间进行网络通信,运营商在中间当了十分重要的角色,如果没有那些基础工作你的数据就到不了那些公司,你也就看不了视频了。所以你的钱最终交给了运营商。 你会发现,当你的网络、手机欠费的时候,你上不了各种网站,打不了电话,但是你可以联系到运营商,因为你的设备与运营商直接相连。 运营商既然可以在你欠费的时候掐掉你和互联网公司之间的联系。另一方面当你访问的网站“姿势不对”,网站区域不对时,运营商自然也是可以掐掉你的!这就是“神秘的墙”。而科学上网就是在欺骗运营商,“运营商,我可是大大滴良民!让我过去吧!”。 说的有点多了,回归正题。

    在这里插入图片描述 如上图,家用路由器会组建一个局域网,除此之外,为了能够让你访问其它IP的主机,家用路由器除了使用和你的网络号相同的IP(子网IP)外。还有一个WAN口IP,这个IP是运营商的路由器提供的。你的主机属于你家路由器的子网,你家的路由器属于运营商路由器的子网。 所以我们经常听到各个地级市的联通、移动等运营商,这些地方的运营商都会组建自己的子网,他们会给你们家的路由器分配IP地址。

    运营商的路由器也是有两个IP除了自己组建的IP地址之外,还有一个WAN口IP,这个IP就是它在公网中的IP。因此常见的家用路由器的网络号是192.168.*因为主机数量少,而运营商路由器的子网网络号是10.*,因为运营商组建的是一个区域地方的子网。

    另外只有运营商的路由器有公网IP,也就是我们所有人都不可能直接连接公网,我们都是先连接到家用路由器的局域网,再让家用路由器连接到运营商路由器组建的局域网,然后通过运营商路由器入的公网!

    在这里插入图片描述 如上图,局域网使用的私有IP可以相同,也就是不同局域网内的私有IP可以重复。而公网IP具有唯一性! 由于私有IP可以重复,所以IP地址的不足问题,就被大大缓解了。

    此时你在看网络通信,假如你的主机要和一个公网中的设备发消息,源IP肯定是你的主机的IP,目的IP是公网IP,你的主机知道这个目的IP不是本子网的,它就把报文交给路由器,路由器发现这个目的IP也不是给它所在的子网的,它就继续交付,最终会交付到运营商路由器上,运营商把它交给公网中的目标主机,很丝滑。但是,目标主机收到消息后,要给你回消息时,它一看源IP是192.168.X.X,什么鬼,这世界上这么多的192.168.X.X的主机,因为私有IP可以重复啊,我怎么知道交给哪个局域网。所以报文可以交给目标主机,但是回不来了。

    这就很奇怪,这种情况下通信都通不了,为什么要允许私有IP重复呢?那是因为有了一种技术,才允许的私有IP重复,就是NAT技术,这里做简单了解。 NAT(网络地址转换) 是一种将内网IP地址转换为外网IP地址的技术,使多个设备能共享一个公网IP访问互联网。 在网络通信过程中,报文每经过一个路由器,路由器都会自动把报文的源IP替换成自己的WAN口IP。假设你的主机想要和公网中的设备通信,那么过程是这样的: 在这里插入图片描述 如上图,内网到公网的过程中,每经过一个路由器,都会将源IP替换成自己的WAN口IP。而到了公网就不进行替换了,这个替换工作只在内网转发时进行,因为公网IP具有唯一性。

    在公网设备向我们的主机发消息的时候,也就是上面的蓝色字体,源IP会一步步再替换回来,最终变成我们主机的内网IP。因为路由器内部对源IP到WAN口IP的替换工作做了维护。

    我们所有人都在局域网中,使用的都是私有IP,正因为有了NAT技术,我们在局域网中使用的IP并不消耗IP地址,因为私有IP可重复。真正消耗IP地址的的是在公网中。

    IPv6主要在内网中使用,它也主要借助于NAT技术,公网使用的是IPv4。IPv6的IP地址十分庞大,能给地球上的每一粒沙子都分配一个IP地址,等到“内网”经济比公网经济还发达时,那么“内网”经济发达的国家就有了定标准的权力,到时候公网IP使用IPv4还是IPv6还说不准。

    1.7 尝试理解公网

    全球公网由国家与国家之间的陆地光缆、海底光缆、卫星等全球骨干网络错综复杂的建设而成。

    简单把公网抽象成3层结构,一层是全球各个国家组成的公网,第二层是一个国家内各省份组成的公网,第三层是省份内各市组成的局域网。

    在这里插入图片描述

    如上图,各个国家在公网中都有自己的出入公网路由器,并且这个路由器有两个IP地址,一个是在全球公网中的IP,另一个是在国家内的公网中的IP。所以国家出入全球公网的路由器会记录映射全球国家的IP对应关系,还会记录映射国内各省份的IP地址映射。国内各省份的路由器也有两个IP地址,一个是在国内公网中使用的IP地址,另一个是在自己省内局域网中使用的IP地址。各个市的路由器也是一样。

    当西安市的一个主机想要给其它国家的主机发消息时,会经过市级路由器、省级路由器、国家出入国际公网路由器,然后到达目标国家的路由器,最终路由到目标主机。在这个过程中需要进行多次的源IP地址切换(NAT),也要进行多次的网络号比对找到匹配的网络号。具体流程和下图一样: 在这里插入图片描述

    在路由器内部会有一个路由表,它就是根据路由表对比目的IP地址,进行路由转发的。 路由表可以使用route命令查看。 在这里插入图片描述 在这里插入图片描述 如上图,Genmask就是子网掩码,它是设置在路由器内部的。所以子网划分是通过路由器完成的。

    如果你要去一个目的IP地址,路由器就会根据你的目的IP与它的子网掩码列进行按位与&操作,如果发现你的目的IP地址的网络号等于某一行的网络号,它就会把报文转发给这个路由IP,如果发现都对不上,就会把报文转发给默认路由。

    如上图,如果目的IP是201.19.86.123的话,由于和子网掩码列表按位与后,上面的网络号都和这个不一样,它就会被转发给默认路由192.168.10.1。

    1.8 IP的分片与组装

    在谈IP的分片与组装之前,需要聊一个问题。 在这里插入图片描述 如上是上期博客讲过的传输层TCP滑动窗口机制的图片。 如果在进行TCP三次握手建立连接之后,接收方告诉发送方它的接受能力是4000,那么发送方为什么不直接发送长为4000的报文,而需要把报文拆分成如上图的一小段一小段的呢?

    它为什么要进行拆分呢?这个问题的答案在数据链路层。下图是数据链路层的协议格式: 在这里插入图片描述 数据链路层存在一个MTU。MTU(最大传输单元) 是指网络接口在发送数据时,单个数据帧所能承载的最大有效载荷(IP数据包)大小,它定义了网络层向数据链路层传递的数据包大小上限。MTU只控制发的数据大小,不控制收。

    也就是说数据链路层的有效载荷不能超过MTU大小,通常是1500字节。 数据链路层收到的有效载荷是网络层发来的报文。如果网络层的报文太大了,那么就需要网络层对报文进行分片,将来收到分片的报文后,还需要由网络层组装。

    在这里插入图片描述 由于是以TCP引出的问题,所以我们就以TCP协议开始。 网络层负责报文的分片和组装的工作,但是并不建议进行分片和组装工作。第一个就是效率降低了,很明显的,做的工作多了嘛。第二个就是容易增加丢包的概率。分片越多,丢失的概率就越高,只要有一个分片丢失,传输层发现报文的校验和不对就把报文丢弃了。

    所以可靠的方式就是尽量不要进行报文的分片和组装工作。但是这个问题网络层说了不算,报文是传输层发送给网络层的,所以需要传输层在发送报文时不要发的太大。 因此传输层在发送数据时就是一小段一小段的发送了!这样可以尽量避免在网络层进行分片和组装的工作。

    那么传输层给网络层的数据多大才不会产生分片问题呢?假设TCP和IP都采用标准报头20字节,MTU一般是1500,数据链路层的有效载荷是网络层给的,这个有效载荷中包含网络层IP和传输层TCP的报头一共40字节(按标准报头计算),所以TCP发送的数据应该是1500-40=1460字节,它叫做MSS。 MSS(最大报文段大小) 是TCP协议在建立连接时协商的、单个TCP报文段中有效载荷(应用层数据)的最大字节数,它通过排除IP和TCP头部开销,确保数据在经过网络路径时不会因超过MTU而被分片。

    由于各主机的数据链路层MTU的值是不同的,所以就会导致MSS的值也不同,在TCP三次握手建立连接期间,双方会互相交换自己的MSS,以最大程度确保报文不会被分片和组装。

    不过报文还是有概率被分片和组装。因为报文在发出去之后需要经过很多个路由器的路由转发工作。可能报文经过某个路由器时,路由器把报文收了上来,等到发送的时候发现它的数据链路层的MTU很小,所以这时候就需要进行报文的分片工作了。

    组装

    关于IP报文的分片和组装,只要把组装搞懂,分片自然就懂了。

    在这里插入图片描述 如上,在IP协议报头存在以上的三个字段,它们可以确保分片和组装。

    IP报文不一定被分片,有的IP报文没有被分片,有的分片了。

    16位标识(id):唯一的标识主机发送的报文。如果IP报文在网络层被分片了,那么每一个分片的这个id都是相同的。 3位标志字段:第一位保留不用。第二位置DF为1表示禁止分片,这时候如果报文长度超过MTU,数据链路层就会丢弃报文。第三位MF表示"更多分片",如果分片了的话,最后一个分片置为0,其它分片是1。类似于一个结束标记。 13位分片偏移(fragment offset):是分片相对于原始IP报文有效载荷开始处的偏移。其实就是在表示当前分片在原报文有效载荷中处在哪个位置。实际偏移的字节数是这个值除以8得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(二进制数低3位为0),否则报文就不连续了。 在记录片偏移的时候为什么要除以8,也就是二进制数右移3位呢?因为IP报文的总长度可以达到16位,所以13位的片偏移不能表示16位的总长度,所以就需要除以8保存,这样实际的存储就是213*23=216了。在取出的时候直接二进制数左移三位即可。

    这三个字段协同工作,用于标识分片归属、控制分片行为并指示分片在原始包中的位置,确保接收端能准确重组。

    IP报文值得分片的是有效载荷部分,所以会对有效载荷部分进行分片,然后每个分片的有效载荷都需要加上IP协议报头。

    接收端网络层在收到网络层之后,需要识别报文是否被分片了。接收端会通过一个报文进行检查,如果 片偏移==0&&MF==0 说明没有被分片,如果 片偏移!=0||MF!=0 说明一定被分片了。 接下来如果报文被分片了还要保证把所有分片报文收全。通过16位标识把所有标识一样的收集在一起即可收全所有已收到的分片报文。将分片报文聚合到一起后,把所有的分片报文按照片偏移升序排列。然后根据片偏移为0找出开头报文,根据MF=0&&片偏移!=0找出结尾报文。在根据当前分片片偏移 + 当前分片数据长度 == 下一个分片的片偏移的规则,遍历所有升序报文,保证都符合这个公式,这样就确保报文收全了,然后组装即可。 如果没有收全就继续等待,或者丢弃所有报文等待对方重发。

    简化为以下步骤: 归集:通过16位标识收集属于同一原始报文的所有分片。 排序:将收集到的分片按片偏移升序排列。 定位首尾:片偏移为0的是首片,MF=0&&片偏移!=0的是尾片。 校验与重组:用连续性公式当前分片片偏移 + 当前分片数据长度 == 下一个分片的片偏移遍历检查所有分片。如果全部通过,则将数据部分按偏移拼接,交给上层协议;如果校验失败或超时未收全,则丢弃所有分片,等待上层(如TCP)触发重传。

    分片

    假设在网络层有一个大小为3000字节的报文,IP协议报头长度为20字节,MTU为1500,如何进行分片呢? 在这里插入图片描述

    如上图,

  • 计算每片最大数据长度:由于MTU是1500,减去IP头部20字节,每片能携带的最大有效载荷为 1480字节。
  • 确定分片数量:有效载荷2980字节,除以1480,得到2个满片(1480字节)和1个剩余片(20字节),共3个分片。
  • 填充分片报头:每个分片都需要加上一个独立的20字节IP协议报头。
  • 把2980字节的有效载荷拆分成3份,在给每一份加上IP协议报头即可。

    总结: 以上就是本期博客分享的全部内容啦!如果觉得文章还不错的话可以三连支持一下,你的支持就是我前进最大的动力! 技术的探索永无止境! 道阻且长,行则将至!后续我会给大家带来更多优质博客内容,欢迎关注我的CSDN账号,我们一同成长! (~ ̄▽ ̄)~

    赞(0)
    未经允许不得转载:171主机测评 » 【Linux】网络层协议IP
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址