网段划分
我们先来对 IP 地址下一个定义吧:
IP地址(Internet Protocol Address)是互联网协议中用于唯一标识和定位网络上设备(如计算机、路由器、服务器等)的数字标识。它是一个由32位(IPv4)或128位(IPv6)二进制数字组成的地址,通常以点分十进制(IPv4)或冒号十六进制(IPv6)的形式表示。我们这里主讲 IPv4 地址哈!
IP 地址分为两个部分:
- 网络号:在一个局域网中的设备网络号一定是相同的,网络号在直接相连的两个局域网中一定是不一样的!具体哪部分是网络号等会儿再讲哈!
- 主机号:在同一个局域网中,主机之间有相同的网络号,但是必须有不同的主机号!
我们再来看看局域网的概念吧:
局域网(LAN,Local Area Network)是指一个地理范围较小、局限于某一区域(例如办公室、学校、家庭等)的网络。局域网可以由一组相互连接的计算机、设备和网络设备组成,用于共享资源、数据和服务。
在几年前,国家鼓励光纤入户,你的家里接入光纤,安装上路由器。你的家就成为了一个典型的局域网!你使用你家的 wifi 上网的时候,将你的请求通过路由器进行转发!路由器转发之后,会收到服务器的响应,最后路由器将服务器的响应再转发给你!这就是你上网的大致过程啦!
我们不难理解,路由器也是一个局域网中的设备,既然路由器能够做到转发你的请求,说明路由器至少要连接 2 个局域网!这表明路由器同时在两个局域网之中,在不同的局域网,一台设备的 IP 地址是不相同的,这就说明路由器配置有多个 IP 地址!
如下图有两个局域网 A 和 B,假设局域网 A 的网络号是:192.168.128,局域网 B 的网络号是:192.168.144。因为直接相连的两个局域网的网络号一定不相同,那么连接两个局域网的路由器必须得有两个 IP 地址!对于常见的家庭或小型办公网络而言,路由器的 IP 地址通常是局域网的网关地址(流量出口地址),即局域网中其他设备将所有非本地流量发送到的目标地址。这个 IP 地址通常是局域网中的第一个可用地址,因此通常路由器的主机号是 0。例如,如果局域网的网络地址是 192.168.128.0,那么路由器的IP地址可能是 192.168.128.1。
我们平时在使用别人家的 wifi 时是不是要输入密码才能连上,那么这个输入密码连 wifi 的过程路由器在做什么呢?
我们忽略掉路由器对密码进行验证的过程,假设验证成功了,那么路由器就会给你的设备分配 IP 地址,这个 IP 地址网络号一定和这个局域网的网络号一致,但是主机号必须不能和局域网中的其他主机重复!
如上图,假设在局域网中又连接了一台主机 D,那么他的 IP 地址的网络号一定是 192.168.128,主机可能是 13,只要保证不在局域网中重复就行啦!
由此可见 路由器的功能 :
- 转发报文
- 构建局域网
- 管理局域网
- ··················
整个世界上这么多的入网设备,应该如何划分网络号和主机号呢?
过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示:
- A类 0.0.0.0到127.255.255.255
- B类 128.0.0.0到191.255.255.255
- C类 192.0.0.0到223.255.255.255
- D类 224.0.0.0到239.255.255.255
- E类 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 类无关。
子网是网络管理的概念,网段划分划分出来的就是子网。而局域网是网络连接的概念!
我们举两个例子帮助理解:
I P 地址: 140.252.20.68 按位与 子网掩码: 255.255.255.0 − − − − − − − − − − − − − − − 网络号: 140.152.20.0 \space IP地址:140.252.20.68\\按位与\qquad\qquad\qquad\qquad\qquad\qquad\qquad\\子网掩码:255.255.255.0\\---------------\\\space 网络号:140.152.20.0 IP地址:140.252.20.68按位与子网掩码:255.255.255.0−−−−−−−−−−−−−−− 网络号:140.152.20.0
得到了网络号,那么子网的地址范围自然就是: 140.152.20.0 到 140.152.20.255 140.152.20.0 ~~到~~ 140.152.20.255 140.152.20.0 到 140.152.20.255
这个例子和第一个例子差不多,只是数字没有这么凑巧,需要转换成二进制来计算,不过计算的方法都是一样的,这里就不算了!
CIDR 的网段划分策略的子网掩码一般这么写: i p / n ip/n ip/n。表示 IP 地址的前 n 为保留,作为网络号,后面的位全都是 0。例如: 122.133.144.155 / 24 122.133.144.155/24 122.133.144.155/24 表示的就是该 IP 地址的前 24 位保留,后面的 8 位为 0。即子网掩码: 122.133.144.0 122.133.144.0 122.133.144.0。
什么是网段划分呢?
网段划分指的是将一个大的 IP 地址范围分割成多个较小的子网,每个子网都有其自己的 IP 地址范围和子网掩码。
特殊的 IP 地址
- 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网
- 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包。
- 127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1 本地环回地址,数据包不经过网络发送。
IP地址的数量限制
我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数。那么一共只有 2 32 2^{32} 232 次方个 IP 地址,大概是 43 亿左右。而 TCP/IP 协议规定,每个主机都需要有一个 IP 地址。
这意味着,一共只有 43 亿台主机能接入网络么?
实际上,由于一些特殊的 IP 地址的存在,数量远不足43亿; 另外 IP 地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址。
CIDR 在一定程度上缓解了 IP 地址不够用的问题 (提高了利用率, 减少了浪费, 但是 IP 地址的绝对上限并没有增加),但是 IP 地址仍然不是很够用。 这时候有三种方式来解决:
- 动态分配IP地址:只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到 的IP地址不一定是相同的;
- NAT技术(后面会重点介绍);
- IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容。IPv6 用 16 字节 128 位来表 示一个IP地址; 但是目前 IPv6 还没有普及;
私有 IP 和 公网 IP
如果一个组织内部组建局域网, IP 地址只用于局域网内的通信, 而不直接连到 Internet 上, 理论上使用任意的 IP 地址都可以, 但是 RFC 1918 规定了用于组建局域网的私有 IP 地址
- 10. ∗ 10.* 10.∗, 前8位是网络号, 共 16,777,216 个地址
- 172.16. 172.16. 172.16. 到 172.31. 172.31. 172.31. , 前 12 位是网络号, 共 1,048,576 个地址
- 192.168. ∗ 192.168.* 192.168.∗ , 前 16 位是网络号, 共 65,536 个地址 包含在这个范围中的, 都称为私有 IP, 其余的则称为全局 IP(或公网IP)
在我们之前的上网生涯中,我们使用的其实 都是私有 IP 啦!
运营商的理解
运营商在网络通信中扮演着关键的角色,他们是提供互联网连接和通信服务的组织,负责构建、管理和维护通信基础设施,以及提供连接服务给终端用户、企业和其他组织。
- 网络基础设施建设和维护: 运营商负责建设和维护通信基础设施,包括光纤、电缆、移动网络基站等。他们不仅需要确保网络的覆盖范围和质量,还需要不断升级和优化网络设施,以应对不断增长的数据流量和新技术的发展。
- 互联网接入服务: 运营商提供互联网接入服务,允许终端用户通过各种方式(例如DSL、光纤、移动网络等)连接到互联网。他们提供的服务可能包括宽带接入、移动数据服务、企业专线等。
- 数据传输和路由: 运营商负责在其网络中传输数据,并将数据从源地址传输到目的地址。他们维护着庞大的路由器和交换机网络,通过路由协议(如BGP)实现互联网中不同网络之间的数据传输。
- IP地址分配和管理: 运营商管理分配给他们的 IP 地址资源,并负责将 IP 地址分配给终端用户和其他组织。他们也参与互联网编号机构(如ARIN、APNIC等)管理的活动,确保 IP 地址的有效使用和分配。
- 服务质量(QoS)管理: 运营商努力保证网络的性能和稳定性,通过实施服务质量(QoS)策略来优化网络流量,确保对关键应用(如实时音视频通话、在线游戏等)的高质量服务。
- 安全防护: 运营商负责保护其网络和用户免受网络攻击和威胁。他们实施各种安全措施,包括防火墙、入侵检测系统(IDS)、入侵防御系统(IPS)等,以保护网络免受恶意活动的影响。
网络基础设施建设和维护其实成本是非常高的,并且回馈周期长!绝大多数企业是不愿意做这种事情的!之所以我们现在的运营商,比如电信,联通,移动等原意做,其背后都是国家大力支持,强制要求的!正是因为运营商做好了网络基础设施的建设,我们老百姓才能上得了网,正是因为有越来越多的老百姓能够上网,才有了互联网公司的兴起,才有了电商的发展!国家收取互联网的税,又可以支持运营商网络基础设施的建设,如此形成了一个大的闭环!
因此,我们也要辩证地看待运营商!
NAT 与 NAPT
我们平时上网的过程报文是如何发送到服务器上的呢?
如上图,假设左上角的主机: 192.168.1.201 / 24 192.168.1.201/24 192.168.1.201/24 想要访问公网中的 122.77.241.3 / 24 122.77.241.3/24 122.77.241.3/24 这台主机:
- 首先,在应用层将数据按照一定的格式打包好之后,一路向下。依次经过传输层,网络层,数据链路层,物理层的封装,将数据发送到了源主机所在子网中的路由器,即上图中的家用路由器。其中网络层的封装中会包含两个字段:源 IP 地址和目标 IP 地址,表示数据从哪里来,要到哪里去!在这个例子中源 IP 地址就是: 192.168.1.201 192.168.1.201 192.168.1.201;目的 IP 地址就是: 122.77.241.3 122.77.241.3 122.77.241.3
- 家用路由器拿到数据之后,会去掉数据链路层封装的报头,将有效载荷交给路由器的网络层!没错,路由器也有层状结构:数据链路层和网络层,没有传输层,应用层啥的。
- 家用路由器的网络层收到你发的数据之后,首先会将在你的主机上网络层封装的报文的源 IP 地址进行修改:将源 IP 地址修改为: 10.1.1.2 10.1.1.2 10.1.1.2,目的 IP 地址不变。修改完源 IP 地址之后,就会将报文交给数据链路层再次封转,发送给运营商路由器。
- 运营商路由器收到报文之后,也会对报文进行解包,向上交付。然后再次替换掉源 IP 地址,将源 IP 地址替换为: 122.77.241.4 122.77.241.4 122.77.241.4;目的 IP 地址不变。替换完成之后交给数据链路层继续封转,发送!
- 数据到了运营商路由器的时候,路由器发现目的 IP 地址的网络号与自己的网络号是一样的,说明我们俩在同一个子网中啊!那么数据就能直接发送给目的 IP 地址的主机啦!(怎么发送的是数据链路层的事儿,这里没法讲)
在这个过程中,私有 IP 不断被替换的过程使用的技术就是 NAT 技术啦!
NAT 是一种网络通信协议,用于在不同网络之间转换 IP 地址。它通常用于在私有网络和公共网络之间进行通信时,使得私有网络内的多台设备可以共享单个公共 IP 地址。
NAT 的基本原理是,路由器或防火墙会在传输数据包时修改数据包的源 IP 地址和目的 IP 地址。对于从私有网络到公共网络的数据包,源 IP 地址会被替换为路由器的公共 IP 地址,而目的 IP 地址则保持不变;对于从公共网络到私有网络的数据包,则是相反的操作。
NAT 的作用主要有以下几点:
- IP 地址隐藏: NAT 可以隐藏私有网络内部设备的真实 IP 地址,使得外部网络无法直接访问这些设备,提高了网络的安全性。
- IP 地址映射: NAT 可以将私有网络内部设备的多个 IP 地址映射到单个公共 IP 地址上,实现多个设备共享同一个公共 IP 地址的功能。
- 地址转换: NAT 可以在私有网络和公共网络之间进行 IP 地址转换,使得私有网络内部使用的 IP 地址与公共网络的 IP 地址之间进行转换,以适应不同网络之间的通信需求。
数据发送到服务器的过程我理解了,但是服务器的数据又是怎么发到我的主机上的呢?
在向服务器发送数据的时候,源 IP 地址可是在路由器那里被替换了啊!既然被替换了,服务器收到报文的源 IP 地址就不是数据发送方的 IP 地址了啊!在上面的例子中,服务器收到报文的源 IP 地址就是那个运营商路由器的 IP 地址。
那么需要怎么做才能将服务器响应的数据返回给发送方主机呢?很简单,将目的 IP 地址一步一步地替换不就行了嘛?可是我不知道目的 IP 地址是啥哇!别慌,发送方主机发送数据的时候源 IP 地址不是一次一次被替换的嘛!我只要在替换的过程中将这个源 IP 地址和目标 IP 地址的映射关系存下来不就行啦!
传统的 NAT 只转换 IP 地址,不涉及端口号的转换。因此,当多个内部设备共享同一个公共 IP 地址时,NAT 无法区分这些数据包来自不同的设备。如果两个内部设备同时向同一目标发送数据包,则 NAT 可能会导致冲突,因为它无法区分数据包的源地址。
为了解决这个问题,就要引出 NAPT 啦!NAPT 是 Network Address Port Translation(网络地址端口转换)的缩写,也称为 PAT(Port Address Translation,端口地址转换)。NAPT 在进行地址转换时除了转换 IP 地址外,还会转换端口号。这样可以确保来自不同内部设备的数据包在转换后仍然具有唯一的标识,以避免冲突。
- NAPT 或 PAT 在将内部设备的私有 IP 地址映射到公共 IP 地址时,会将数据包的源端口号也进行转换。这样可以确保来自多个内部设备的数据包在传输到公共网络时,仍然可以唯一地标识,从而在公共网络上与其他数据包区分开来。
- NAPT 或 PAT 常用于家庭网络、企业网络和公共网络,以允许多个设备共享单个公共 IP 地址,并提高网络安全性。通过在转换过程中使用不同的源端口号,它还可以实现一定程度的端口复用和多路复用,提高了网络资源的利用率。
如下图:左侧的两台主机同时向服务器 163.221.120.9 163.221.120.9 163.221.120.9 发数据,经过路由器逐级转换,将数据能够发送到目标服务器!在转换的过程中,会在路由器内部形成一张转换表!可以理解就是一种 key-value 的结构。
- 在同一子网内,网络序号相同,但是主机号不同,能够做到区分子网中的两台主机。假设如果是一台主机上的两个进程同时访问相同的服务器,因为不同进程的端口号一定不相同!因此这个转换表左侧的内容一定是唯一的
- 转换表右侧是源 IP 地址被替换后的内容,假设两台主机向服务器发送请求的进程的端口号是一样的,会出现重复的源 IP 地址嘛!并不会,服务器会将端口号进行一并替换!没错不仅仅会替换 IP 地址,也会替换端口号!因此转换表右侧的内容也是唯一的!
- 当服务器响应的数据到达路由器的时候,就可以查询这个转换表,对目的 IP 地址进行替换,从而保证了数据能够到达数据发送方的主机!
这种关联关系也是由 NAT 路由器自动维护的。例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项。
NAPT 的优点:
- 提高了地址转换的精细度: 通过转换端口号,支持多个内部设备共享单个公共 IP 地址,并且可以支持多个数据流同时进行。
- 增加了地址资源的利用率: 通过端口地址转换,提高了 IPv4 地址资源的利用率,缓解了 IPv4 地址短缺问题。
NAPT 的缺点:
- 端口耗尽问题: 当同时存在大量的并发连接时,可能会导致端口耗尽问题,使得新的连接无法建立。
- 性能损耗: 需要对每个数据包进行端口转换,增加了 NAT 设备的处理负载和延迟,可能影响网络性能。
- 应用兼容性问题: 一些应用程序或服务可能不支持经过 NAPT 转换的 IP 地址和端口号,可能导致功能异常或无法正常工作。
- 追踪和管理困难: 在大型网络中,追踪和管理大量的端口转换记录可能会变得困难,特别是在故障排除和安全审计方面。
路由
路由(Routing)是计算机网络中的一项关键功能,用于确定数据包从源地址到目的地址的传输路径。在因特网中,路由是互联网中的核心功能之一,它使得数据包能够在网络中正确地传输,从发送方到接收方。
举个例子:假设你是大一新生,你到了你大学所在的城市,可是你并不知道你大学的具体位置。于是你开始问路,你问一个阿姨,你好,请问某某大学怎么走啊!这个阿姨说,我不知道,但是你可以问问旁边的那个叔叔,他应该知道!就这样,你问着问着就找到了你的大学啦!
IP 数据包的传输过程其实就和问路差不多。
- 当IP数据包, 到达路由器时, 路由器会先查看目的 IP
- 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
- 依次反复, 一直到达目标 IP 地址;
那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表。路由表可以使用 route 命令查看。
- Destination(目的地): 这个字段指定了路由的目的地网络或目标地址。它表示数据包要到达的目标网络或目标主机的地址范围。
- Gateway(网关): 这个字段指定了到达目的地网络或主机的下一跳路由器的 IP 地址。当数据包的目的地不在本地网络中时,路由器会将数据包转发给下一跳路由器,这个路由器就是网关。
- Genmask(子网掩码): 这个字段指定了目的地网络的子网掩码。它用于确定目的地网络的范围,即哪些 IP 地址属于目的地网络。
- Flags(标志): 这个字段指定了与路由相关的一些标志或特性。不同的操作系统或路由器可能使用不同的标志。一些常见的标志包括 U(up,路由为激活状态)、G(gateway,路由指定了网关)、H(host,目标是一个单独的主机)、R(reinstate route,路由需要重新激活)等。
- Metric(度量值): 这个字段指定了路由的度量值或优先级。当有多条路由到达同一个目的地时,度量值可以帮助路由器选择最佳的路径。通常,较小的度量值表示更优先的路径。
- Ref(引用数): 这个字段表示了路由的引用计数,即有多少个进程或应用程序正在使用该路由。
- Use(使用计数): 这个字段表示了该路由被使用的次数。每次数据包通过该路由时,使用计数会增加。
- Iface(接口): 这个字段指定了数据包将通过的网络接口。它表示了数据包将要通过的本地网络接口,例如eth0、eth1等。
查询路由表,我们可能会得到以下结果:
- 不知道,显然这是不可能的,即使路由器不知道目的 IP 所在的子网是哪个,也会进行默认路由!
- 给你具体的下一跳,也就是路由器知道要区目的 IP 下一步应该怎么走。
- 路由器也不清楚怎么走,但是会转入默认路由,将数据发给同网段的另一台路由器。
- 到达目的 IP 的入口路由器,如果是这种情况就可以将数据发送给目的 IP 的主机啦!
查找路由表的过程是怎样的呢?
- 将目标主机的 IP 地址按位与上主机上的 Genmask。
- 将得到的结果与 Destination 做对比,如果相等的话,就通过 Iface 将数据发送出去!
- 如果不相等就继续向下匹配,最终没有匹配的就会进行默认路由!
IP 协议报头
- 版本 (Version): 4 个比特位,这个字段指定了 IP 协议的版本号。IPv4协议中,该字段通常值为4。
- 首部长度 (Header Length): 4 个比特位,这个字段指定了 IP 报头的长度。你可能会有疑问,4 个比特位,表示的范围只有 [ 0 , 15 ] [0, 15] [0,15] 怎么能只能 IP 报头的长度呢?其实他的单位和 TCP 的那个首部长度一样,都是 4 字节。减去 IP 报头固定的 20 个字节,得出选项的范围就是: [ 0 , 40 ] [0, 40] [0,40] 字节。
- 服务类型 (Type of Service, TOS): 8 个比特位,3 位优先权字段(已经弃用),4 位 TOS 字段,和 1 位保留字段(必须置为0)。4 位 TOS 分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于 ssh/telnet 这样的应用程序,最小延时比较重要; 对于 ftp这样的程序,最大吞吐量比较重要。
- 总长度 (Total Length): 16 个比特位,这个字段指定了整个 IP 数据报的长度,包括 IP 报头和数据部分。以字节为单位。减去 4 位头部长度就能得到数据的长度。
- 标识 (Identification): 16 个比特位,这个字段用于唯一标识 IP 数据报的碎片,当数据报被分片传输时,每个分片都具有相同的标识号。
- **标志 (Flags):**第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到)。第二位置为 1 表示禁止分片,这时候如果报文长度超过 MTU, IP 模块就会丢弃报文。第三位表示 “更多分片”,如果这个 IP 报文不是分片的最后一个为 1,如果是分片的最后一个为 0。类似于一个结束标记。
- 片偏移 (Fragment Offset): 13 个比特位,这个字段指定了当前数据报分片相对于原始数据报的偏移量。以 8 字节为单位。
- 生存时间 (Time to Live, TTL): 8 个比特位,这个字段指定了数据报在网络中允许传输的最大跳数(跃点数)。每经过一个路由器,该字段值减 1,当 TTL 字段值为 0 时,数据报会被丢弃。
- 协议 (Protocol): 8 个比特位,这个字段指定了数据报中封装的上层协议类型。例如,如果该字段值为 6,则表示上层协议是 TCP;如果值为 17,则表示上层协议是 UDP。
- 首部校验和 (Header Checksum): 16 个比特位,这个字段用于校验 IP 报头的完整性,确保数据报在传输过程中没有被损坏或篡改。
- 源地址 (Source Address): 32 个比特位,这个字段指定了数据报的源 IP 地址,即发送方的 IP 地址。
- **目的地址 (Destination Address):**32 个比特位,这个字段指定了数据报的目标 IP 地址,即接收方的 IP 地址。
IP 分片
IP 分片是在 Internet Protocol (IP) 中一种处理数据包的技术。当数据包的大小超过网络的最大传输单元(MTU)时,路由器或者网络设备会将数据包分割成更小的片段进行传输。这些分片独立地在网络中传输,并在到达目的地之前重新组装成完整的数据包。IP 分片使得大型数据包可以在不同的网络环境中传输,因为不同的网络可能有不同的最大传输单元限制。
我们可以查看这个 MTU 在本机上是多大:
一个报文如何判断是否被分片呢?
- 如果收到的 IP 报文片偏移不为 0,那么该报文被分片过。
- 如果收到的 IP 报文片偏移为 0,且是被分片过的,那么他的 3 位标志的最后一位肯定是 1,表示还有更多分片。
- 如果收到的 IP 报文没有进行分片,那么他的片偏移为 0,3 位标志的最后一位也为 0。
因此:
if(片偏移 != 0 || 更多分片 == 1)
那么就一定就是被分片过的报文。
如何进行分片?
假设传输层交付了一个报文给网络层,IP 协议进行报头封转之后总共有 3000 字节,显然大于了 MTU,于是进行分片,分成了如下图的三个部分!每个分片都是有 IP 报头的,剩余的有效载荷(假设不携带选项),最大只能是 1480 啦!进行分片之后就要在 IP 报文的报头中填上相应的字段。
- 如下图 IP 报头中的片偏移,更多分片,标识在不同的分片中的填写规则!
- 13 位片偏移:分片之后的报文在原报文中的偏移量
- 3 位标志:第一位保留,第二位为 0 表示允许分片,第三位为 0 表示该分片是最后一个。第三位在下图中的三个分片中应该填: 1 1 0.
- 16 位标识:因为进行了分片,则这三个分片中的标识都是一样的,假设都是 111 哈!
如何进行组装?
- 将具有相同 16 位的标识的 IP 报文聚在一起。
- 按照片偏移进行排序组装。
如何判断分片之后的 IP 报文有没有出现丢失的情况呢?
- 如果丢了第一个,那么收到的报文中没有片偏移为 0 的 IP 报文。
- 如果丢了中间的,可以通过片偏移识别出来!
- 如果丢了最后一个,那么收到的报文中没有更多分片标志位位 0 的 IP 报文。
IP 分片的缺点:
- 增加开销: 分片处理会增加网络设备的处理负担和网络带宽的消耗,特别是在路由器上进行分片和重新组装会增加额外的处理开销。
- 安全风险: IP 分片可能会被利用进行分片攻击,例如通过发送大量的小分片来占用目标系统的资源,从而导致服务中断或拒绝服务攻击。
- 性能影响: IP 分片可能会导致数据包的延迟增加,因为重新组装分片需要额外的处理时间。
- 不同设备处理不同: 不同的网络设备和操作系统可能会以不同的方式处理 IP 分片,这可能会导致不一致的行为和网络配置问题。
- 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是 IP 层不会负责重新传输数据,只能 TCP 协议进行超时重传(假设使用的是 TCP 协议),可是超时重传传的是整个报文啊!相当于之前传送成功的 IP 报文都白白传送了!
因此在实际的通信过程中,应该尽可能减少出现 IP 分片的出现!
MTU对UDP协议的影响
让我们回顾一下UDP协议:
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
- 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果 UDP 数据报在 网络层被分片, 整个数据被丢失的概率就大大增加了.
MTU对于TCP协议的影响
让我们再回顾一下TCP协议:
- TCP的一个数据报也不能无限大, 还是受制于MTU.
- TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);
- TCP在建立连接的过程中, 通信双方会进行MSS协商.
- 最理想的情况下, MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU).
- 双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值.
- 然后双方得知对方的MSS值之后, 选择较小的作为最终 MSS。MSS 的值就是在 TCP首部的 40字节变长选项中。
现在我们就能明白为什么 TCP 滑动窗口中的数据为什么要分成一段一段地发送了吧!IP 报文是否分片是网络层无法决定的,在于上层给我网络层塞了多大的数据!
知识点总结
- 掌握网段划分
- 了解 IPv4 地址
- 掌握 NAT NAPPT 技术
- 掌握报文在互联网中路由的过程
- 了解 IP 报头的组成
- 掌握 IP 分片