【Linux】网络层协议 IP

网络层协议 IP

  • [一. 基本概念](#一. 基本概念)
  • [二. IP 协议格式](#二. IP 协议格式)
  • [三. 网段划分 (重点)](#三. 网段划分 (重点))
    • [1. 传统方法](#1. 传统方法)
    • [2. 子网掩码](#2. 子网掩码)
  • [四. 特殊 IP 地址](#四. 特殊 IP 地址)
  • [五. IP 地址的数量限制](#五. IP 地址的数量限制)
  • [六. 私有 IP 地址和公网 IP 地址](#六. 私有 IP 地址和公网 IP 地址)
  • [七. 运营商](#七. 运营商)
    • [1. 基本网络情况](#1. 基本网络情况)
    • [2. 全球网络情况](#2. 全球网络情况)
  • [八. 路由](#八. 路由)
  • [九. IP 报文的分片和组装](#九. IP 报文的分片和组装)

网络层:在复杂的网络环境中确定一个合适的路径。

IP 协议:负责在互联网上进行数据包的传输。它提供了无连接的数据报传输服务,但不保证数据包的可靠传输。

  • 无连接:每个数据报独立传输,不维护连接状态。
  • 不可靠:数据报可能会丢失、重复或乱序到达,这些情况需要由上层协议(如TCP)来处理。

一. 基本概念

以通信主机B和C为例,两个主机并不是直接连接的,通信需要解决两个问题:

  1. 为什么要交给先一个路由器 F (路径选择的问题):由网络层 (IP) 解决。
  2. 怎么把数据交给路由器 F (局域网通信问题):同一个局域网可以直接通信,由数据链路层 (MAC地址) 解决。

结论:网络通信的本质:无数个局域网通信,最终实现广域网通信。

IP 地址:全球具有唯一性的 IP (公网 IP),主要范围两类 IPV4 和 IPV6,用于表示主机的唯一性。

  • IP 地址= 目标网络 + 目标主机,通过网络号找到对应的子网,通过主机号找到对应的主机。
  • 路由器:配有 IP 地址,能进行路由控制。
  • 主机:配有 IP 地址,也能进行路由控制的设备。
  • 节点:主机和路由器的统称。

数据贯穿整个 TCP/IP 协议栈时,需要添加各自的报头,每一层都需要解决不同的问题:

  • 应用层报头:自身报文完整性,序列化和反序列化的问题。
  • 传输层报头:流量控制、拥塞控制、确认应答、超时重传... 可靠性问题。
  • 网络层报头:路径选择,数据报的转发问题。

重谈 TCP/IP 协议:

  • IP 的核心作用:将数据包跨网络转发到目标主机,但是可能存在丢包问题 (IP 不关心丢包问题,由 TCP 关心丢包问题)
  • TCP 的核心作用:进行各种策略,例如:超时重传、流量控制、拥塞控制、确认应答... 保证可靠性!

结论:TCP/IP 协议,提供一种可靠的能力,将数据从 A 主机跨网络,转发给 B 主机!解决的就是主机距离变远进行通信的问题!

二. IP 协议格式

  • 4 位版本号:指定 IP 协议的版本,存在 IPV4 和 IPV6,但是二者不兼容。
  • 4 位首部长度:最大值为 15 bit,单位是 4 字节,IP 头部的最大总长度为 60 字节,由标准报头长度 20 字节,计算得出最大选项长度就是 40 字节。
  • 8 位服务类型:3 位优先权字段(已经弃用),4 位服务类型字段(TOS),和 1 位保留字段(必须置为 0)。4 位 TOS 分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。 对于 ssh/telnet 这样的应用程序,最小延时比较重要。对于 ftp 这样的程序,最大吞吐量比较重要。
  • 16 位总长度:IP 数据报字节数,保证数据的完整性。
  • 8 位生存时间:数据报到达目的地的最大报文跳数。一般是 64,每次经过一个路由,TTL -= 1,一直减到 0 还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环。
  • 8 位协议:表示上层协议的类型 (例如:TCP/UDP)
  • 16 位首部校验和:使用 CRC 进行校验,来鉴别报头是否损坏。
  • 32 位源地址和 32 位目标地址:表示发送端和接收端 IP 地址。
  • 选项:最大 40 字节。
  • 16位标识、3 位标志字段、13 位分片偏移:在 IP 报文的分片和组装详细讲解!

IP 的解包和分用:

  1. IP 是如何做到解包的?通过读取 IP 协议的基本长度 -> 前 20 字节 -> 获取首部长度 -> 选项长度 = 首部长度 - 20 字节 -> 如果存在接着读取,最终完成解包。
  2. IP 是如何做到分用的(交给应用层的哪一个协议)?IP 协议格式存在 8 位协议 (TCP/UDP),交给上层协议,类似 TCP 协议的端口号。

三. 网段划分 (重点)

网段划分:将一个大的网络划分为多个较小的子网段 (网络),以便更有效地管理和利用网络资源。这种划分通常基于子网掩码来实现,通过子网掩码可以确定一个 IP 地址属于哪个子网络。

IP 地址 = 网络地址 + 主机地址

  • 网络号:保证相互连接的两个网段具有不同的标识。
  • 主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。

子网内的 IP 地址,都是从哪里来的?谁给它的?路由器是家中第一个入网设备,路由器具有构建子网的能力,为连接路由器的主机分配 IP 地址。子网其实就是把网络号相同的主机放到一起。如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。

发送数据时:先将目的 IP 地址的网络号与源 IP 地址的网络号进行对比,如果相同则在子网内部进行转发,如果不同则将数据报交给路由器进行转发。一个 IP 地址被转发:根据目标网络,先转发报文到目标网络,再将报文在内网中转发。

为什么要进行网段划分?网络通信最终是在公网上进行通信的,进行网段划分,可以淘汰与目的 IP 地址的网络号不同的公网,提高查找效率。报文在进行转发的过程中,在到达目标网络之前,路由只看 IP 地址中的目标网络号,

那么如何进行网段划分?

1. 传统方法

有一种技术叫做 DHCP,能够自动的给子网内新增主机节点分配 IP 地址,避免了手动管理 IP 的不便。一般的路由器都带有 DHCP 功能,因此路由器也可以看做一个 DHCP 服务器。过去曾经提出一种划分网络号和主机号的方案,把所有 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 地址都被浪费掉了。

2. 子网掩码

针对上述情况提出了 "CIDR" 划分方案:引入一个额外的子网掩码 (subnet mask) 来区分网络号和主机号。子网掩码也是一个 32 位的正整数,通常用一串 "0" 来结尾。将 IP 地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号。网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关。

IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/28

  1. IP 地址:140.252.20.68
  2. 子网掩码:255.255.255.240(高28位是1,其余是0)
  3. 网络号:IP & 子网掩码 = 140.252.20.64(140.252.20.01000000)
  4. 子网地址范围:140.252.20.64 ~ 140.252.20.79(140.252.20.01000000 ~ 140.252.20.01111111)

可见 IP 地址与子网掩码做按位与运算可以得到网络号,主机号从全 0 到全 1 就是子网的地址范围。

四. 特殊 IP 地址

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

五. IP 地址的数量限制

我们知道,IP 地址 (IPv4) 是一个 4 字节 32 位的正整数,那么一共只有 2 的 32 次方个 IP 地址,大概是 43 亿左右,而 TCP/IP 协议规定,每个主机都需要有一个 IP 地址,这意味着,一共只有 43 亿台主机能接入网络么?

实际上,由于一些特殊的 IP 地址的存在,数量远不足 43 亿,另外 IP 地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个 IP 地址,CIDR 在一定程度上缓解了 IP 地址不够用的问题 (提高了利用率,减少了浪费,但是 IP 地址的绝对上限并没有增加),仍然不是很够用,这时候有三种方式来解决:

  • NAT 技术:切分部分公网 IP 地址,用于搭建内网 IP 地址 (地址可以重复)
  • 动态分配 IP 地址:只给接入网络的设备分配 IP 地址,因此同一个 MAC 地址的设备,每次接入互联网中,得到的 IP 地址不一定是相同的。
  • 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 进行搭建的。

bash 复制代码
Linux: ifconfig
Windows: ipconfig
  1. 私有 IP,只能用来组建局域网,不能出现在公网中。
  2. 私有 IP,只能在内网中使用,所以不同的子网,IP 地址可以重复。
  3. 公网 IP,不能出现重复。
  4. 内网、公网,统一采用子网掩码的方式,进行网络建设。

七. 运营商

三大运营商:移动、电信、联通。

路由器:拥有构建子网的能力。

申请 IP,无论是公网 IP,内网 IP,网络建设的工作,都是由运营商做的!

网线 -> 调制解调器 -> 路由器 -> 本地设备 -> 通信

1. 基本网络情况

家用路由器与主机构成一个子网,运营商路由器与家用路由器构成另一个子网。家用路由器的 IP 地址是由更大的路由器分配 (例如:运营商路由器) 的。我们的报文必须经过家用路由器,再经过运营商路由器的转发,才能到达公网中。运营商可以根据你欠费/访问非法的目标地址而拦截你,想要科学上网可以使用代理服务器。

一个路由器可以配置两个 IP 地址,一个是 WAN 口 IP (连接子网/公网),一个是 LAN 口 IP (连接子网)

路由器 LAN 口连接的主机,都从属于当前这个路由器的子网中。不同的路由器,子网 IP 其实都是一样的 (通常都是 192.168.1.1),子网内的主机 IP 地址不能重复,但是子网之间的 IP 地址就可以重复了。每一个家用路由器,其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN 口 IP 就是一个公网 IP 了。

子网内的主机需要和外网进行通信时,路由器将 IP 首部中的 IP 地址进行替换 (替换成 WAN 口 IP),这样逐级替换,最终数据包中的 IP 地址成为一个公网 IP,防止子网 IP 地址出现在公网上。这种技术称为 NAT (Network Address Translation,网络地址转换)。如何缓解 IP 地址不足的问题?单独切分了部分公网 IP,只用它来搭建内网,这样 IP 地址可以被重复利用了!

如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网 IP 的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买。

2. 全球网络情况

公网 IP 地址,是以国家、组织、公司为单位,进行申请的。其中将部分公网 IP 地址用于搭建私有 IP 地址。

假设都以国家为单位进行申请,已知全球195个国家,需要为每一个国家分配网络,可以将 IP 地址通过子网掩码:255.0.0.0 将大的网络分配给不同的国家,接着又将大的网络进一步通过子网掩码:255.255.0.0 分配给不同地区,依次进行网段划分!

  • 内网发送报文到公网:如果目标 IP 地址 & 子网掩码 = 目标网络,将报文发送给下一跳路由器的 IP 地址,若遍历所有的路由表条目都不符合时,将报文发送交给默认路由器 (上一层路由器),直到运营商路由器 (公网),还存在 NAT 技术。
  • 公网发送报文到内网:数据链路层再讲解。

IP 报文转发过程的本质:就是在进行各个子网间进行转发。

IP 主要解决的核心问题:路径选择 -> 淘汰其它的子网。

两个局域网当中的主机必须通过公网进行通信,先将数据经过公网发送到了服务器,然后再由服务器将数据经过公网转发到了另一个局域网。存在一些技术能够使数据包在发送过程中不进行公网 IP 的替换,而将数据正确送到目标主机,这种技术叫做内网穿透,也叫做NAT穿透。

八. 路由

路由:在复杂的网络结构中,找出一条通往终点的路线。路由的过程,就是这样一跳一跳(Hop by Hop) "问路" 的过程,所谓 "一跳" 就是数据链路层中的一个区间,具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间。

IP 数据包的传输过程也和问路一样:

  • 当 IP 数据包到达路由器时,路由器会先查看目的 IP 地址。
  • 路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器。
  • 依次反复,一直到达目标 IP 地址。

那么如何判定当前这个数据包该发送到哪里呢?这个就依靠每个节点内部维护一个路由表!

  • 路由表可以使用 route 命令查看。
  • 如果目的 IP 命中了路由表,就直接转发即可。
  • 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

假设某主机上的网络接口配置和路由表如下:

  • 这台主机有两个网络接口,一个网络接口连到 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 路由器根据它的路由表决定下一跳地址。

路由表可以由网络管理员手动维护(静态路由),也可以通过一些算法自动生成(动态路由),路由相关的生成算法:距离向量算法,LS 算法,Dijkstra 算法等。

九. IP 报文的分片和组装

这里的传输层以 TCP 为例,UDP 同理

  • 问题:为什么不把滑动窗口里的数据,大成一个报文,而是分成一个个数据段?这不是增加了发送的次数?
  • 答案:如果传输层报文太长,导致 IP 报文太长,网络层需要将 IP 报文进行分片,因为在数据链路层,单次发送的数据帧的有效载荷长度不能超过 MTU 最大传输单元 (一般是1500),对方的网络层需要将分片的 IP 报文进行组装,这就导致任意一个分片的 IP 报文丢包,组装的 IP 报文是不完整的,不会将 IP 报文交给传输层,导致增加传输层丢包概率。

IP 分片对传输层是透明的,这意味着传输层无需关心数据是否被分片以及如何重新组装。分片不能作为网络发送的主流,如何进行不分片?传输层不要发送太大的报文。

问题:如果要进行分片和组装,网络层具体该如何做?

  • 16 位标识:唯一的标识主机发送的报文。如果 IP 报文在数据链路层被分片了,那么每一个片里面的这个 id 都是相同的。
  • 3 位标志字段:第一位保留字段 (现在不用),第二位置为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为 0,其他是 1,类似于一个结束标记。
  • 13 位分片偏移:相对于原始 IP 报文的有效载荷起始处的偏移量,实际写入的片偏移:偏移量 除8 得到的。因为总长度是 16 位的,但是片偏移只有 13 位。

注意:

问题:接收方如何得知自己收到的报文分片了?

答案:3 位标志字段等于000 || 13 位分片偏移等于0

问题:接收方如何得知自己收到的分片收全了?

答案:通过 16 位标识将所有的分片升序排序,起始分片:片偏移必须等于0、中间分片:片偏移等于上一个分片的片偏移+上一个分片报文的长度、结尾分片:3 位标志字必须等于000

问题:接收方如何组合形成完整的报文?

答案:解决了上面两个问题,将分片报文进行升序排序就行了。

下面具体看看 IP 报文大小为 3020 字节的分片过程:

分片和组装的过程不一定在发送方 (MTU = 1500),也可能存在于路由器 (例如:MTU = 1000),但是概率比较低,基本不考虑。

在同一个局域网中通信,不需要经过路由器,依赖数据链路层的 MAC 地址进行通信!为什么 MTU = 1500?也是数据链路层决定的!

相关推荐
达斯维达的大眼睛12 分钟前
Linux网络多进程并发服务器和多线程并发服务器
linux·服务器·网络
孟里啥都有.1 小时前
linux内核升级
linux·运维·服务器
Lilith的AI学习日记1 小时前
LangChain高阶技巧:动态配置Runnable组件的原理剖析与实战应用
大数据·网络·人工智能·架构·langchain
安科瑞刘鸿鹏1 小时前
智能配电保护:公共建筑安全的新 “防火墙”
运维·网络·物联网·算法·安全·能源
czhc11400756631 小时前
网络5 TCP/IP 虚拟机桥接模式、NAT、仅主机模式
网络·tcp/ip·桥接模式
逆水寻舟1 小时前
尚硅谷2019版Java网络编程笔记
java·网络·笔记
xyd陈宇阳1 小时前
Linux 入门八:Linux 多进程
linux·运维·服务器
tjsoft3 小时前
asm汇编源代码之文件操作相关
linux·运维·汇编
chian-ocean4 小时前
解密 Linux 线程:多线程编程与资源管理
java·linux·redis
邪恶的贝利亚10 小时前
FFMEPG常见命令查询
linux·运维·网络·ffmpeg