【Linux 31】网络层协议 - IP
文章目录
- 🌈 一、IP 协议的基本概念
- ⭐ 1. TCP + IP 能保证数据的可靠传输
- ⭐ 2. 如何理解 IP地址
- ⭐ 3. 路由选择
- ⭐ 4. 主机 & 路由器 & 节点
- 🌈 二、IP 协议的报头格式
- ⭐ 1. IP 协议的报头格式
- ⭐ 2. 如何将 IP 报头和有效载荷分离
- ⭐ 3. 如何将有效载荷进行向上交付
- 🌈 三、IP 协议的网段划分
- ⭐ 1. 网段划分的相关概念
- ⭐ 2. IP 地址的构成 & 区分网络号和主机号
- ⭐ 3. DHCP 协议
- ⭐ 4. 使用五类 IP 地址的方式划分网段
- ⭐ 5. 使用子网掩码的方式划分网段
- ⭐ 6. 为什么会存在运营商
- 🌈 四、IP 协议的特殊地址
- ⭐ 1. 不能分配给主机的 IP 地址
- ⭐ 2. 本机环回基本原理
- 🌈 五、IP 地址的数量限制
- ⭐ 1. IP 地址数量不足
- ⭐ 2. 如何解决 IP 地址数量不足的问题
- 🌈 六、私网 & 公网的 IP 地址
- ⭐ 1. 私网 IP 地址的种类
- ⭐ 2. 私网 IP 地址的特点
- ⭐ 3. 查看私网 IP 地址
- ⭐ 4. 通过 NAT 让子网内的主机与外网通信
- 🌈 七、路由
- ⭐ 1. 路由选择的过程
- ⭐ 2. 路由表的功能
- ⭐ 3. 查看当前节点的路由表
- ⭐ 4. 路由的分类
- ⭐ 5. 生成路由表的算法
- 🌈 八、分片和组装
- ⭐ 1. 数据链路层所要解决的问题
- ⭐ 2. MAC 帧的最大传输单元 MTU
- ⭐ 3. 分片和组装的概念
- ⭐ 4. 不推荐进行分片
- ⭐ 5. 如何避免进行分片
🌈 一、IP 协议的基本概念
⭐ 1. TCP + IP 能保证数据的可靠传输
- 位于网络层的 IP 协议提供了一种将数据从一台主机跨网络送到另一台主机的能力,也就是进行数据路由选择的能力。
- IP 协议虽然负责数据传输,但无法保证一定能成功。IP 协议无法保证可靠性,这是由传输层的 TCP 协议干的活。
- 位于传输层的 TCP 协议提供的是保证数据传输时的可靠性和高效性的策略。而真正负责在网络中传输数据 (跑腿) 的是网络层和数据链路层。
- 在
TCP / IP
中,TCP 负责提供可靠策略,IP 负责数据传输。
- 在
- 那么 TCP + IP (策略 + 能力) 就能保证将数据从一台主机可靠的跨网络送到另一台主机。
⭐ 2. 如何理解 IP地址
- IP 地址用来唯一标识互连网中的一台主机。
- IP 地址分为源 IP 地址和目的 IP 地址,用来标识数据从哪台主机来,要到哪台主机去。
⭐ 3. 路由选择
- 一般而言,数据在进行网络传输时,都是需要跨网络进行的。路由器就负责连接这多个网络,因此数据在进行跨网络传输时,都需要经过多个路由器。
- 数据路由就像唐僧取经一样,当确定了目的地后,就需要寻找最短的到达路径。
- 例:唐僧的目的地是西天,会在途中所经过的每一站问路。每个站点的向导会告诉唐僧下一站该往哪里走能更接近西天。
- 目的地址决定了数据路由时的路径选择,这也是在跨网络通信时能够找到目标主机的根本。数据只有在经过正确的路由选择后,才能最后向目标主机靠近。
如何进行路由选择
- 网络中的路由器都使用路由表记录着其他路由器的地址,路由器可以通过查路由表来找到去特定地址的最短路径。
- 因此,数据在路由时,就会不断通过路由器来进行路径选择,从而逐渐接近目的地。
⭐ 4. 主机 & 路由器 & 节点
- 主机:配有 IP 地址,但不进行路由控制的设备。但实际上目前几乎找不到不支持路由控制的设备了,就连手上的笔记本也能作为大号路由器来进行路由控制。
- 路由器:既配由 IP 地址,又能进行路由控制。目前主流的路由器不止有路由的功能,甚至还具备某些应用层的功能。
- 节点:主机和路由器的统称。在网络中不管是主机还是路由器都统一叫节点。
🌈 二、IP 协议的报头格式
⭐ 1. IP 协议的报头格式
IP 报头中的字段 | 说明 |
---|---|
4 位版本号 | 用来指定 IP 协议的版本 (IPv4 / IPv6) |
4 位首部长度 | 用来标识 IP 报头的实际长度,以 4 字节为单位 |
8 位服务类型 | 3 位优先权字段 (已弃用),4 位 TOS 字段,和 1 位保留字段 (必须置为 0) |
16 位报文总长度 | 用来标识 IP 报文 (IP 报头 + 有效载荷) 的总长度,主要用来确定 IP 报文与报文之间的界限 |
16 位标识 (ID) | IP 报文的 ID,用来唯一标识 IP 报文。如果数据在 IP 层进行了分片,则每一个分片所对应的 ID 相同 |
3 位标志字段 | 保留第 1 位,表示暂时没有规定该字段的意义。第 2 位表示禁止分片,如果报文长度超过 MTU,则 IP 协议就会丢弃该报文。第 3 位表示更多分片,如果没有对 IP 报文进行分片,则将该字段的值置为 0,如果对 IP 报文进行了分片,则除了最后一个分片报文设置为 0 外,其余分片报文均置为 1 |
13 位片偏移 | 用来表示当前分片在原始数据中的相对偏移位置,实际偏移的字节数 = 13 位片偏移的值 * 8。因此,除了最后一个报文外,其余报文的长度都必须是 8 的整数倍,否则报文就会不连续。 |
8 位生存时间 (TTL) | 标识数据报到达目的地的最大报文跳数,一般为 64。每经过一个路由,TTL 的值就减 1,如果直到 TTL 的值为 0 时都还没有到达目的地,则直接丢弃该报文。该字段主要用于防止出现路由循环 |
8 位协议 | 用来标识上层协议的类型 |
16 位首部检验和 | 使用 CRC 进行校验,用来鉴别数据报的首部是否损坏,但不检验数据部分 |
32 位源 IP 地址 | 存储发送端的 IP 地址,表示该 IP 报文是从哪来的 |
32 位目的 IP 地址 | 存储接收端的 IP 地址,表示该 IP 报文要到哪里去 |
可选字段 | 不定长,最多 40 字节 |
⭐ 2. 如何将 IP 报头和有效载荷分离
- IP 协议的报头和 TCP 协议的报头相似度很高。因此,将 IP 报头与有效载荷分离的方式与 TCP 一样。
- 使用 IP 报文中的 4 位首部长度来记录整个 IP 报头的长度。IP 报头的长度和 TCP 一样都是以 4 字节为单位,即 IP 报头的最大长度为 15 * 4 = 60 字节。
- IP 报头中的 4 位首部长度的取值范围为 [0, 15];IP 报头大小的取值范围为 [0, 60] 字节。
- 当获取一个 IP 报文时,首先读取该报文的前 20 个字节,并从中提取出 4 位的首部长度。假设 4 位首部长度的值为 0110 (6),则说明 IP 报头的长度为 6 * 4 = 24 字节。那么从该报文的第 24 字节开始,就是该 IP 报文的有效载荷。
⭐ 3. 如何将有效载荷进行向上交付
- 当将 IP 报头和有效载荷分离完之后,还需要将分离出来的有效载荷进行分用 (将有效载荷向上交付)。
- IP 协议上层的传输层中不止有 TCP 一个协议,还有很多其他的协议。IP 协议需要判断出应该将分离出的有效载荷交给哪一个协议。如果交付错误,就没办法正确的在传输层中将报头和有效载荷分离。
IP 协议如何判断应该将分离出的有效载荷向上交付给传输层的哪个协议
- 在 IP 报头中,存在着一个8 位协议字段,该字段被用来标识上层协议的类型。
- IP 协议就是根据该字段的值来判断应该将分离出的有效载荷交给位于上层的传输层中的哪个协议。
- 该字段是发送方的 IP 层在从传输层获取到数据后填充的。如果 IP 从上层获取到的数据是由 TCP 交给 IP 的,那么 IP 协议就会在为该数据封装 IP 报头时填充 TCP 协议所对应的编号到 8 位协议字段中。
🌈 三、IP 协议的网段划分
⭐ 1. 网段划分的相关概念
1. 为什么要进行网段划分
- 由于 IP 地址是一种有用且有限的资源,那么就存在着对 IP 地址这个资源的竞争,需要将这种资源合理的划分给不同的地区、国家、组织、学校等。
- 大大提高查找目标主机的效率。通过 IP 地址中的网络号,能够快速定位到想要去的是哪个局域网。再通过 IP 地址中的主机号,能够快速定位到想要去的是该局域网中的哪台主机。
2. 网段划分的方式
- 网段划分的方式说白了就是分蛋糕的方式,目前主流的分蛋糕方式有以下两种:
- 使用分类的方式划分 IP 地址。
- 使用子网掩码的方式划分网段。
⭐ 2. IP 地址的构成 & 区分网络号和主机号
1. IP 地址 = 网络号 + 主机号
- 网络号:保证相互连接的两个网段具有不同的标识,用来找出唯一的局域网。
- 主机号:在同一局域网的主机都具有相同的网络号,但每台主机的主机号都必须不同。用来唯一标识同一网段内的主机。
2. 举个例子
- 对于唐僧来说,通过网络号能够找到西天,通过主机号能够找到大雷音寺,再通过端口号能够找到如来佛祖这个提供经文资源的进程。
- 唐僧在取经路上不停的问路,为的就是走到西天这个网段中。
- 然而走到西天还不算完,西天那么大,里面的地点 (主机) 那么多。还要找到大雷音寺这个特定的主机,此时就使用大雷音寺这个主机号进行问路。
3. 如何区分 IP 地址中的网络号和主机号
- 在 IP 地址的后面加上一个斜杠
/
,并在/
后面添加一个数字 n,表示该 IP 地址的前 n 位属于网络号,之后的都属于主机号。
如: 192.168.128.10/24
// 将 192.168.128.10 这个 IP 地址转换成 2 进制: 1100 0000 1010 1000 1000 0000 0000 1010
// 其中,前 24 位为网络号,后 8 位为主机号
- 不同的子网就是将网络号相同的主机放到一块。
- 如果想在子网中新增一台主机,则这台主机的网络号可以和该子网的网络号一致,但主机号绝对不能和该子网中的其他主机重复。
⭐ 3. DHCP 协议
- IP 地址的管理不可能由人来手动进行,当网络中新增了一台主机时,需要为其分配一个 IP 地址,此时就需要用上 DHCP 来动态分配 IP 地址了。
- DHCP 协议通常被应用于大型的局域网环境中,其主要作用是集中地址管理、分配 IP 地址等。它能使网络环境中的主机动态的获得 IP 地址、Gateway 地址、DNS 服务器地址等信息,并能够提升地址的使用率。
- DHCP 是一个基于 UDP 实现的应用层协议,一般的路由器都具备 DHCP 功能,因此可将路由器看作一个 DHCP 服务器。
⭐ 4. 使用五类 IP 地址的方式划分网段
- 曾经使用将所有的 IP 地址划分成 5 类来划分网络号和主机号。
1. 各类 IP 地址的取值范围
网络类别 | IP 地址的取值范围 | 子网中可存在的主机数 |
---|---|---|
A 类地址 | 0.0.0.0 ~ 127.255.255.255 | 224 台 |
B 类地址 | 128.0.0.0 ~ 191.255.255.255 | 216 台 |
C 类地址 | 192.0.0.0 ~ 223.255.255.255 | 28 台 |
D 类地址 | 224.0.0.0 ~ 239.255.255.255 | … |
E 类地址 | 240.0.0.0 ~ 247.255.255.255 | … |
2. 如何判断一个 IP 地址属于哪一类
- 当拿到一个 IP 地址时,只需要提取出该 IP 地址的前 5 个比特位。看看在第几个比特位最先出现 0,就说明它是哪类 IP 地址。
3. 该网段划分方式的局限性
- 随着互连网的发展,这种划分方案的局限性很快体现出来。
- 由于 A 类网络太稀少,很难申请到,即使申请到了也能很用完这 224 个主机号。而 C 类网络主机号又太少。因此,大多数组织都比较中意申请 B 类网络地址,导致 B 类地址很快就被划分完毕,而其他类地址却被大量浪费。
- 为了解决这种情况,又引入了 新的子网划分方案,CIDP (Classless Interdomain Routing) 。
⭐ 5. 使用子网掩码的方式划分网段
- CIDP 在原有的 5 类网络的基础上继续进行子网划分,这表示需要借用主机号中的若干位充当网络号。
- 此时,为了区分 IP 地址中的网络号和主机号,又引入了子网掩码的概念。
1. 子网掩码
- 子网掩码是一个 32 位的正整数,它默认会配置进路由器中。通常用一串 “0” 来作结尾,以一串 “1” 来作开头。
- 只要是 IP 地址,它就一定属于某个子网。
- 将 IP 地址与子网掩码进行 按位与 操作,所得到的就是网络号。
- 反过来讲,将子网掩码进行 按位取反,然后再用 IP 地址与子网掩码进行 按位与 就能获得主机号。
- 这样一来,网络号和主机号的划分就和这个 IP 地址是哪一类地址无关了。
2. 子网划分示例
- IP 地址与子网掩码按位与后获得网络号,该网络号后面的位数从全 0 ~ 全 1 就是该子网内主机号的范围。
3. 使用子网划分的优势
- 可以使得一个网络能够更细粒度的划分成若干个更小的字段。
- 通过不断的子网划分,子网中的 IP 地址所对应的主机号就会变得越来越短,使得子网中可用得 IP 个数越来越少,避免了 IP 地址被大量得浪费。
- 且可以对子网进行多次划分,可以在划分出来的子网的基础上继续进行子网划分。
- 一个数据在路由时,随着数据不断路由进入更小的子网,其网络号的位数是在不断变化的。准确来说其网络号的位数是在不断增加的,这也就意味着 IP 地址当中的主机号的位数在不断减少。最终当数据路由到达目标主机所在的网络时,就可以在该网络当中找到对应的目标主机并将数据交给该主机,此时该数据的路由也就结束了。
⭐ 6. 为什么会存在运营商
- 网络通信的基础设施都是运营商搭建的。在访问服务器时,并不是直接将数据发送到对应的服务器。而是需要经过运营商所建设的各种基站以及路由器,数据才能抵达对应的服务器。
- 由于互连网公司是诞生在网络通信的基础上的,如果没有运营商提供这些基础设施,就没有网络通信,也就不会有这些互联网公司。
🌈 四、IP 协议的特殊地址
⭐ 1. 不能分配给主机的 IP 地址
- 由于某些 IP 地址本身有其特殊用途,因此并不能作为主机的 IP 地址来使用。以下 3 种就是不能分配给主机的 IP 地址:
- 主机号为全 0 的 IP 地址:这是该网络的网络地址,代表着这个局域网。
- 主机号为全 1 的 IP 地址:这是该网络的广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
- 以 127 为开头的 IP 地址:这是用于本机环回 (loop back) 测试的地址,通常为 127.0.0.1
- 由于主机号为全 0 或全 1 的 IP 地址都不能使用,因此一个局域网中最多能存在的主机数为 2主机号位数 - 2,剩下的才是独立的 IP 地址。
⭐ 2. 本机环回基本原理
- 本机环回会将数据贯穿整个网络协议栈,但是最终并不会将数据发送网络中。
- 在进行本机环回时,不会将数据写到网卡上。
1. 本机环回的目的
- 本机环回就是将数据自顶向下贯穿协议栈,进行一次数据封装的过程。然后再自底向上贯穿协议栈,进行一次数据的解包和分用。
- 因此,进行本机环回的根本目的就是为了测试本地的网络功能是否正常。
2. 本机环回的原理
-
当数据到达 IP 层时,如果需要继续向下封装。IP 输出函数会将该数据放入到 IP 输入队列中,然后再由 IP 输入函数读取走。
-
而 IP 输入函数将数据读取上去的本应该是链路层交付上来的数据,因此该数据后续就会被当作从网络中读取上来的数据看待,各层协议会对该数据依次进行解包和分用。
-
如果不是环回程序的话,接下来就会判断该数据对应的目的 IP 地址是否为广播或多播地址,或者目的 IP 地址是否与本主机的IP地址相同,如果是则也会将该数据放入到 IP 输入队列当中,等待 IP 输入函数将其读走。
-
只有判断程序不是环回程序,并且也不是广播或多播,或发给本主机的数据后,才会用 ARP 获取该数据目的主机的以太网地址并进行后续数据发送的操作。
3. loopback 环回设备
🌈 五、IP 地址的数量限制
⭐ 1. IP 地址数量不足
- 由于 IPv4 的 IP 地址是一个 32 位的正整数,因此最多只有 232 (43 亿)个 IP 地址。
- 可能 IPv4 的设计者都没预料到,由于每一台主机都要有一个唯一的 IP 地址,但随着网络设备的增多,IP 地址开始不够用了。
- 像电脑、智能手表、路由器、智能冰箱等等,凡是要联网的设备都需要 IP 地址。
- 同时,由于 IP 地址并不是按照主机的数量来进行分配,一个主机可能会需要多个 IP 地址。
- 由于上述种种原因,43 亿个 IP 地址早就已经不够用了。
⭐ 2. 如何解决 IP 地址数量不足的问题
1. 动态分配 IP 地址
- 只给接入网络的设备分配地址。
- 同一个 MAC 地址的设备,每次接入互联网时,获得的 IP 地址不一定相同,避免了 IP 地址强绑定于某台设备。
2. 引入 NAT 技术 (最重要)
- 让不同的局域网中同时存在两个相同的 IP 地址。
- 该技术不仅能解决 IP 地址不足的问题,还能有效避免来自网络外部的攻击,隐藏并保护好内部的主机。
3. 引入 IPv6 技术
- IPv6 采用 128 位来表示一个 IP 地址,能够表示的 IP 地址有 2128 个那么多。
- 但由于 IPv6 不是 IPv4 的升级版,IPv6 并不能兼容 IPv4,导致目前还无法普及 IPv6。
- IPv6 和 IPv4 的报文格式有很大差异,等于重新设计了一个 IP 协议。
- 当前网络中,凡是用到网络的设备用的几乎都是 IPv4 的地址。
- IPv6 没法普及的根本原因,就是没办法一夜之间将这些网络设备用的地址都替换成 IPv6。
🌈 六、私网 & 公网的 IP 地址
- 在不同的局域网 (私网) 中,可以同时存在相同的私网 IP 地址。
- 虽然存在公网,但是想要上网,就必须先接入到指定的一个私网中。我们所有人都在各自的私网中。只有运营商能接到公网
⭐ 1. 私网 IP 地址的种类
- 如果一个组织内部自己组建局域网 (私网),IP 地址只用于该局域网内的通信。
- 从理论上讲,可以使用任意的 IP 地址。但是,RFC 1918 规定了哪些 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)。
⭐ 2. 私网 IP 地址的特点
- 私有 IP 只能用来组建局域网,不能出现在公网上。
- 私有 IP 地址可以重复使用在不同的私网中。
⭐ 3. 查看私网 IP 地址
- 打开 Windows 的 cmd 窗口,输入
ipconfig
指令可查看自己主机的私网 IP。- 可以看到,我个人的私网 IP 地址是以 10. 开头的。
⭐ 4. 通过 NAT 让子网内的主机与外网通信
- 路由器是用来连接网络的物理设备,分别有 LAN 口和 WAN 口两种网络接口。
LAN 口
:全称为 Local Area Network,用于连接本地网络的端口,主要与家庭网络中的交换机、集线器、PC 等相连。WAN 口
:全称为 Wide Area Network,用于连接广域网 (也叫互连网 / 公网) 的端口。
- 通常将 LAN 口的 IP 地址叫做 LAN 口 IP,也叫做子网 IP。而将 WAN 口的 IP 地址叫做 WAN 口 IP,也叫做外网 IP。
- 不同的路由器其子网 IP 其实都一样 (通常为 192.168.1.1),同一子网内的主机 IP 地址不能重复,但不同子网内的主机 IP 地址可以。
- 每一个家用路由器,都是运营商路由器的子网中的一个节点。这样的运营商路由器可能有很多级,最外层的运营商路由器的 WAN 口 IP 配的才是真正的公网 IP。这种负责连接公网和子网的路由器被称为出入口路由器。
- 出入口路由器和服务器都持有用于接入公网的公网 IP。网络世界由内网和公网构成。
- 当子网内的主机需要和外网进行通信时,路由器将 IP 首部中的 IP 地址进行替换 (替换成 WAN 口 IP)。通过这样逐级替换,最终数据包中的 IP 地址就成为一个公网 IP。这种技术被称为网络地址转换 NAT (Network Address Translation)。
子网内的主机如何通过 NAT 技术与外网进行通信
- 子网内的主机只知道与自己直连的路由器的 IP 地址,因此主机是先将自己的 IP 报文交给自己子网中的路由器。
- 路由器收到 IP 报文后,由于子网主机 IP 可能和其他子网的主机 IP 重复,不能直接将携带着子网 IP 的 IP 报文发出去。因此,路由器需要将报文中的源 IP 地址替换成自己的 WAN 口 IP。然后再将该 IP 报文交给上级路由器,由上级路由器重复该步骤。
- 直到 IP 报文被出入口路由器接收后,再将源 IP 地址替换成出入口路由器的 WAN 口 IP (公网 IP)。这样就可以直接接入到公网了,此时就能和处于公网中的服务器进行通信。
🌈 七、路由
⭐ 1. 路由选择的过程
- 数据进行路由选择的过程,实际上就是一跳一跳 (Hop by Hop)的问路过程。
- 这里的一跳指的是数据链路层中的一个区间,具体在以太网中指从源 MAC 地址到目的MAC 地址之间的帧传输区间。
- 在 IP 报文的传输过程中会遇到很多的路由器,这些路由器会帮助这个 IP 报文通过查路由表的方式进行路由转发。
- 每个路由器的路由表中,都记录着与该路由器直连的每个子网的网络号及子网掩码。
- 每当路由器在接收到一个 IP 数据包后,该路由器就会查看该数据包中携带的目的 IP 地址。
- 再通过查看路由表,来判断是应该将该数据包转发给某一个路由器 (下一跳该往哪跳),或者能够直接转发给当前子网中的某台主机。
⭐ 2. 路由表的功能
- 判定当前数据包该发送到哪里,这个就依靠每个节点内部维护的路由表来实现。
路由器查询完路由表后的三种情况
- 得知该 IP 报文下一跳应该跳到子网 X,直接将该 IP 报文转发到子网 X 所对应的路由器。
- 得知该 IP 报文的目标主机就处在当前网络,使用内网转发,直接将该 IP 报文转发给本网络中的对应主机。
- 没有发现匹配的子网,此时路由器就会将该 IP 报文转发给默认路由,由默认路由对该 IP 报文继续执行路由转发。
⭐ 3. 查看当前节点的路由表
- 每个网络节点 (主机 / 路由器) 都有着属于自己的路由表,在命令行中输入
route
指令,可以查看当前节点的路由表。
路由表各参数字段说明
Destination
:表示目标网络的网络地址。记录着通过当前节点进行路由转发的话,最终能到达的是哪个网络。Gateway
:表示下一跳地址。如果 Destination 的值为 dafault 则 Gateway 的值为 192.168.10.1 (默认路由)。Genmask
:表示当前所处子网的子网掩码。Flags
:U 表示此条目有效,可以禁用某些条目。G 表示此条目的下一跳地址是某个路由器的地址,如果没有该标志,则说明当前网络就是目标网络。Iface
:表示发送接口。
⭐ 4. 路由的分类
- 静态路由:由网络管理员手动配置路由信息,目前已经很少这么做了。
- 动态路由:路由器通过算法自动建立自己的路由表,并根据实际情况来调整。
⭐ 5. 生成路由表的算法
- 常见的路由表生成算法:距离向量算法、LS 算法、Dijkstra 算法等。
🌈 八、分片和组装
⭐ 1. 数据链路层所要解决的问题
-
IP 协议能够将数据从一台主机跨网络的传输到另一台主机。
数据在进行跨网络传输时,中间需要经过 N 个路由器进行路由转发,才能抵达目标主机。
-
IP 协议能够实现跨网络传输数据的前提是,需要先将数据从一个节点传输到和自己相连的下一个节点。而想要让两个节点相连,这两个节点就必须处在同一局域网中,实现的是局域网中的通信。
-
IP 协议实现的是跨网络的通信,局域网通信由位于网络层之下的数据链路层来实现的。
⭐ 2. MAC 帧的最大传输单元 MTU
- MAC 帧是数据传输层的协议,它可以对从 IP 层传下来的数据进行组帧,然后再发送到网络中。
- 然后,MAC 帧所能携带的有效载荷的最大长度有限,从 IP 层交给 MAC 帧的报文长度不能超过最大传输单元 MTU。
- MTU (Maximum Transmission Unit) 的值一般是 1500 字节。
查看当前主机的 MTU
- 在命令行中输入
ifconfig
可以查看当前主机的 MTU 的值,单位是字节。
⭐ 3. 分片和组装的概念
- 由于 MTU 的限制,MAC 帧不能无法接收 > 1500 字节的数据。
- IP 层既无法强行要求 MAC 帧必须接收超过 1500 字节的数据,也无法要求 TCP 层少传点数据下来。那就只能靠自己了。
1. IP 层的分片
- IP 层必须将超过 1500 字节的数据拆成若干部分数据,这每部分数据都得 < 1500 字节才能成功交给 MAC 帧。
- IP 层要对拆分出的每部分数据都添加上自己的 IP 报头,然后交给 MAC 帧。MAC 帧就将这些 IP 报文都当成独立的 IP 报文发送出去。
- 例:TCP 交给 IP 层 2000 个字节的数据,IP 层可将这部分数据拆成两个 1000 字节,再都添加上 IP 报头。
2. IP 层的组装
- 接收端的 IP 层在收到这一堆分片后的 IP 报文后,需要将它们重新组装成完整报文,才能交付给上层。
⭐ 4. 不推荐进行分片
- 会大大增加丢包的概率。
- 假设将一个完整的 IP 报文拆分成十个进行发送,这十个 IP 报文在路上哪怕丢了一个,其他 9 个也得丢弃。
⭐ 5. 如何避免进行分片
- 造成分片的主要原因就是传输层一次性交给了网络层过多的数据,从而导致 IP 层无法直接将数据向下交付给 MAC 帧。
- 只要能够控制传输层一行性交给网络层的数据大小,就可以有效的避免分片了。
- 为了解决这个问题,TCP 引入了最大报文长度 MSS (Maximum Segment Size)。
- 通信双方在建立 TCP 连接时,会协商之后通信时每一个报文端所能承载的 MSS。
- MAC 帧能够承载的有效载荷最多为 MTU (1500 字节),而 TCP 的最大有效载荷为 MSS。由于 TCP 和 IP 的报头在常规情况下都是 20 字节,因此在一般情况下,
MSS = MTU - 20 - 20
。 - 而由于 MTU 的值一般为 1500 字节,因此 MSS 的值一般也就是 1460 字节。
- 只要传输层一次性交给网络层的数据大小被控制在 1460 字节以内,就能有效的避免分片了。