%%
# 纲要
> 主干纲要、Hint/线索/路标
- IP 地址
- IPv4 编址
- IPv6 编址
- IP 数据报
- IPv4 数据报
- IPv6 数据报
- IP 分组与转发
# Q&A
#### 已明确
#### 待明确
> 当下仍存有的疑惑
**❓<font color="#c0504d"> 有什么问题?</font>**
%%
# Internet 协议——IP 协议
**==IP 协议==**(Internet Protocol,**==互联网协议==**)是 TCP/IP 协议族中的核心协议,也称 "**==网际协议==**",
其规定了以下几个方面的内容:
- **网络层寻址**——**路由转发**
- **IP 编址**——IPv4、IPv6 地址
- **IP 数据报**:**数据报格式**、**数据封装与解封装、分片与重组**
IP 协议位于 OSI 以及 TCP/IP 协议中的**网络层**,所有上层数据(TCP、UDP、ICMP、IGMP)均需要**通过 ==IP 数据报== 传输**(加上 IP 头部)。
#### IP 协议版本
IP 协议包括两个版本:**==IPv4==**、**==IPv6==**。
前者是**当前互联网使用最广泛的**,而 IPv6 是为了**应对 IPv4 地址耗尽问题**而设计的。
#### 配套协议
与 IP 协议配套使用的三个协议:
- ARP 地址解析协议
- ICMP 网际控制报文协议
- IGMP 网际组管理协议
<br><br>
# IP 地址
IP 地址用于**唯一地标识一个 "网络设备"**,**使得能够在整个互联网中==寻址、路由==数据包**,从而实现**设备之间的通信**。
IPv4、IPv6 具体编址方案参见 [[02-开发笔记/07-计算机网络/网络层/IPv4 编址|IPv4 编址]]、[[02-开发笔记/07-计算机网络/网络层/IPv6 编址|IPv6 编址]] 。
> [!NOTE] **网络设备**
>
> 指可联网的设备,例如**电脑、手机、路由器**或者**带联网功能的智能家具**等**网络终端设备**。
> [!NOTE] 数据包在互联网中的传播过程——路由器根据 "==目的 IP 地址==" 在不同网段间进行转发
>
> ![[_attachment/02-开发笔记/07-计算机网络/网络层/IP 协议.assets/IMG-IP 协议-DFAFEBFF333A915B808E8BE7DAC1B358.png|563]]
> 
>
<br>
## 公网地址与私网地址
IP 地址分为 "**公网地址**" 和 "**私网地址**" 两种类型:
- 公网地址**由互联网注册机构分配**,要求具有 "**全球唯一性**" 和 "**全球可达性**",用于**在==互联网==上进行通信**。
- 私网地址**由局域网管理自行分配**,只需要**在局域网内能够唯一标识一个网络设备接口即可**,用于**在==局域网内部==通信**。
公网地址间可以**直接在互联网上互相访问**,而**私网地址需要经由路由器进行 NAT 转换&转发才能访问公网 IP 地址**
> [!example] 校园网 IP 地址示例
>
> 
>
>
> 宿舍校园网给分配的信息如下:
>
> - IP 地址:222.201.191.161
> - 网关:222.201.191.254
> - 掩码:255.255.255.0
>
<br>
### 公网地址
公网地址也称 "**公共 IP 地址**",为 **==全球唯一== IP 地址**,用于**互联网上通信**,**可直接在 Internet 上被访问**。
公网地址通常用于**互联网上的服务器**、路由器等设备。
> [!info] 公网 IP 地址具有 "**==全球唯一性==**"
>
> 公网 IP 地址由**互联网注册机构 ICANN 管理和分配**,其向**各个 ISP 分配地址块** 并确保**每个公网 IP 地址在全球范围内唯一**。
> 即 **==不存在同一公网 IP 地址同时属于多个网段==的情况**,例如公网 IP 地址 `222.201.191.161`,其**只存在于某一确定网段下**。
>
> 正因如此,访问一个公网 IP 地址**不需要指出其网络前缀**,IP 数据包中也**不包含网络前缀 or 子网掩码** ,
> **互联网路由器中知道该唯一地址属于哪个网段**,从而能够正确转发。
### 私网地址
私网地址即 **局域网 IP 地址**,**只能在局域网内部使用**,不具有全球唯一性,但要求 "**==在局域网内唯一==**"
私网地址通常用于**组建局域网,例如家庭网络、企业内部网络、校园网络**等。
> [!NOTE]
>
> - 在局域网内部,**私网地址彼此间可进行通信**。
> - 若私网地址要访问**公网地址**,或**公网地址**要访问某个私网地址,则**必须通过路由器/网关==利用 NAT 网络地址转换功能==进行转发**。
>
#### 私网地址范围
最初在 "**分类编址**" 的背景下,**私有地址也按照 ABC 三类进行了划分**(RFC 1918),地址范围如下:

- 在 "**分类编址**" 方案中,各个私有地址的 "**==网络地址位数固定==**",遵循**其所属地址类的设置**
- A 类为 8 位,B 类 16 位,C 类 24 位。
- 在现代采用的 **CIDR 方案**中,仍 **==沿用上述私有地址==**,但**网络前缀位数==不再固定==**,**可任意设置**。
- 例如可设置局域网 `192.168.0.0/16`,该局域网内允许容纳 65534 台主机。
<br><br><br>
# IP 数据报
## IPv4 数据报格式
![[_attachment/02-开发笔记/07-计算机网络/网络层/IPv4 协议.assets/IMG-IPv4 协议-73CF0B2EB078DE6B3453CCD2AD55B794.png|524]]
> [!caution] IPv4 头部要求 "4 字节对齐"
##### 字段说明
| | 位宽 | 说明 |
| --------- | --- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **版本** | 4 | 指示 IP 协议版本,如 IPv4 或 IPv6 |
| **头部长度** | 4 | 指示 IP 头部的长度,单位为 **"4 字节 32 位"**。该字段值至少为 5,即**头部至少 20 字节**。 |
| **服务区分** | 8 | 用于区分数据报的优先级 |
| **总长度** | 16 | 指示**整个 IP 数据报**的总长度,单位为 "**字节**"。**最小值为 20 字节**(仅包含头部),最大值为 65535 字节 |
| **标识** | 16 | 标识 IP 该数据报的唯一值。**用于分片识别和重组**——当一个数据报被分片时,所有分片的标识相同。 |
| **标志** | 3 | **控制分片**的三个标志位,其中常用的有两个: <br>- **DF (Don't Fragment,1位)**: 为 1 表示**数据报不能被分片**。<br>- **MF(More Fragments,1 位)**:为 1 表示后面还有更多的片段;如果为 0,则表明这是最后一个分片。 |
| **片偏移** | 13 | 用于**标识某个片段在原始数据报中的位置**。<br>分片时,每个片段都包含该字段,以确保接收端可以将数据报的所有片段按正确的顺序重组。 |
| **生存时间** | 8 | 表示**数据报在网络中的最大跳数**。每经过一个路由器,该值会减1,当TTL减到0时,数据报会被丢弃。<br>TTL 用于防止数据报在网络中无限循环。 |
| **协议** | 8 | 指示数据报携带的**上层协议类型**,例如: <br>- **6**:TCP(传输控制协议)<br>- **17**:UDP(用户数据报协议)<br>- **1**:ICMP(Internet Control Message Protocol,互联网控制报文协议) |
| **头部校验和** | 16 | 用于**检验 IP 头部**数据的完整性。只验证 IP 头部,不包括数据部分。 |
| **源地址** | 32 | 发送方的 IP 地址 |
| **目的地址** | 32 | 接收方的 IP 地址 |
| **可选字段** | 可变 | 可选,主要用于指定数据报的路由、时间戳、记录路径等 |
| **填充** | 可变 | 当可选字段长度不是 4 字节整数倍时,进行填充,**确保 IP 头部长度始终为 4 字节整数倍**(对应 "**头部长度字段**") |
- 与 "分片" 有关的三个字段:**标识、标志、片偏移**
##### 报文说明
- **IPv4 数据报==总长==**:**理论**最大值为 65535 字节,受 16 位的总长度限制。
- 实际传输时,会受 MTU 限制而进行**分片**
- **IPv4 头部总长**:`[20, 60]` 字节
- **至少 20 字节**,即无 "**可选字段**" 的情况。
- **至多 60 字节**,受 4 位的 "**首部长度 IHL**" 字段限制——最多表示 **15 个 32 位**,即 60 字节。
- IPv4 数据报**有效载荷**:
- 可以为 0,即数据报中只包含头部
- 理论最大值为 65515 字节,即数据报理论最大值减去 20 字节头部(不含其他选项),实际受 MTU 限制;
<br><br><br>
## IPv6 数据报格式
IPv6 数据报由两大部分组成:
- **==基本首部==**(base header)
- **==有效载荷==**(payload)
- 有效载荷中允许有**零个或多个==扩展首部**== (extension header),再后面是**数据部分**
> [!info] IPv6 中的扩展首部属于 "有效载荷" 部分,不属于 "基本头部",基本头部固定为 40 字节。
>
> ![[_attachment/02-开发笔记/07-计算机网络/网络层/IPv6 协议.assets/IMG-IPv6 协议-1890106E64BD0C6B6D614171DD769C70.png|478]]
>
![[_attachment/02-开发笔记/07-计算机网络/网络层/IPv6 协议.assets/IMG-IPv6 协议-8E61683799C7922E998C1BA97CCA3EF6.png|680]]
> [!caution] IPv6 头部要求 "8 字节对齐"
##### 字段说明
| | 位宽 | 说明 |
| ------------------------- | --- | ------------------------------------------------------------------------------------------------------------ |
| **版本** Version | 4 | 指示 IP 协议版本,对 IPv6 该字段值为 6 |
| **通信量类** Traffic Class | 8 | 用以**区分不同 IPv6 数据报的类别或优先级**,类似于 IPv4 的 "服务类型" 字段。 |
| **流标号** Flow label | 20 | 标识 IPv6 数据报所属的 "**流**",同一个流的数据报具有相同的流标号。 |
| **有效载荷长度** Payload length | 16 | 指明 IPv6 数据报中**除 "基本首部" 以外的字节数(包括扩展头部)**,最大值为 65535,单位字节。 |
| **下一个首部** Next header | 8 | 相对于 IPv4 的 **"选项" 字段** 或 **"协议"字段**: <br>- 数据报没有扩展首部时,指示**上层协议类型**,例如 TCP 或 UPD <br>- 具有扩展首部时,指示**扩展首部类型** |
| **跳数限制** hop limit | 8 | 类似于 IPv4 的 TTL,用于标识数据报的**剩余跳数**,每经过一个路由器则减 1,为 0 时丢弃,防止在网络中无限循环。 |
| **源地址** | 128 | 发送方的 IP 地址 |
| **目的地址** | 128 | 接收方的 IP 地址 |
##### 报文说明
- **IPv6 数据报==总长==**:**理论**最大值为 65535 字节,受 16 位的总长度限制。
- **IPv6 "基本头部" 总长**:40 字节
<br><br>
## IPv4 与 IPv6 数据报对比
![[_attachment/02-开发笔记/07-计算机网络/网络层/IP 协议.assets/IMG-IP 协议-95F46399AD502300D61ED1E8F8E4344B.png|939]]
![[_attachment/02-开发笔记/07-计算机网络/网络层/IP 协议.assets/IMG-IP 协议-3C46843D8285D25F4347F8D204934653.png|564]]
<br><br>
# Buffer
## 闪念
> sudden idea
## 候选资料
> Read it later
# ♾️参考资料
# Footnotes