IP协议
IP 协议(Internet Protocol,互联网协议)是 TCP/IP 协议族的核心协议之一,负责在互联网中实现数据包的路由和转发,是计算机之间跨网络通信的基础。以
一、IP 协议的核心作用
IP 协议的核心功能是定义数据在网络中的传输方式,具体包括:
- 寻址:为网络中的设备分配唯一的 IP 地址,标识其在网络中的位置(类似现实中的 “地址”)。
- 路由:确定数据包从源设备到目标设备的传输路径(通过路由器选择最优路线)。
- 分片与重组:当数据包大小超过网络链路的最大传输单元(MTU)时,将其分割为小分片,到达目标后重组为完整数据。
二、IP 协议的版本:IPv4 与 IPv6
目前广泛使用的 IP 协议有两个版本,两者在地址格式、功能上有显著差异:
特性 | IPv4 | IPv6 |
---|---|---|
地址长度 | 32 位(4 个字节) | 128 位(16 个字节) |
地址格式 | 点分十进制(如192.168.1.1 ) | 冒分十六进制(如2001:db8::1 ) |
地址数量 | 约 43 亿个(已耗尽) | 约 3.4×10³⁸个(几乎无限) |
安全性 | 无内置安全机制 | 内置 IPsec 加密和认证 |
广播支持 | 支持广播地址 | 取消广播,用多播替代 |
配置复杂度 | 需手动或 DHCP 配置 | 支持自动配置(SLAAC) |
三、IP 数据包结构
IP 数据包由首部和数据两部分组成,首部包含控制信息,常见字段如下:
- 版本:标识 IPv4(4)或 IPv6(6)。
- 首部长度:表示首部占多少个 32 位字(最小值 5,最大值 15)。
- 总长度:数据包总大小(首部 + 数据),最大 65535 字节。
- TTL(生存时间):限制数据包在网络中的转发次数(每经过一个路由器减 1,为 0 则丢弃,防止环路)。
- 协议:标识上层协议(如 TCP=6,UDP=17,ICMP=1)。
- 源 IP 地址和目标 IP 地址:发送方和接收方的 IP 地址。
- 校验和:用于检测首部在传输中是否损坏。
下图是IPv4的包头结构
四、IP分片
IP 分片是指当 IP 数据包的大小超过传输路径中某个网络设备(如路由器)的最大传输单元(MTU)时,将数据包分割成多个较小片段进行传输的过程。到达目的地后,这些片段会被重新组合成原始数据包。
为什么需要 IP 分片?
不同网络链路(如以太网、PPP 链路等)有不同的MTU(最大传输单元),即该链路能传输的最大数据帧大小(包含帧头,通常 IP 数据报的最大长度受 MTU 限制)。例如:
- 以太网的 MTU 通常为 1500 字节(IP 数据报最大可包含 1500 字节,其中 IP 头占 20-60 字节,数据部分最大 1480-1440 字节)。
- 如果一个 IP 数据包(如 1600 字节)要通过 MTU 为 1500 的链路,就必须分片后才能传输,否则会被直接丢弃。
IP 分片的关键规则(以 IPv4 为例)
-
分片依据
发送方或中间路由器会根据路径中的最小 MTU(路径 MTU)对数据包分片,确保每个分片小于等于 MTU。 -
分片结构
每个分片都包含完整的 IP 头(部分字段调整),并添加分片相关字段:- 标识(Identification):所有分片使用相同的标识,用于接收方识别属于同一个原始数据包。
- 标志(Flags):
- 第 1 位(保留):必须为 0。
- 第 2 位(DF,Don't Fragment):
0
表示可分片,1
表示禁止分片(若超过 MTU 则丢弃并返回错误)。 - 第 3 位(MF,More Fragments):
1
表示后面还有分片,0
表示最后一个分片。
- 片偏移(Fragment Offset):每个分片的数据部分在原始数据包中的偏移量(以 8 字节为单位),用于接收方重组顺序。
-
分片大小限制
每个分片的总长度(IP 头 + 数据)必须≤MTU,且分片数据部分的长度必须是 8 字节的整数倍(除最后一个分片外),因为片偏移以 8 字节为单位。
分片重组(接收方)
- 接收方通过标识字段识别同一原始数据包的所有分片。
- 根据片偏移和MF 标志确定分片顺序,将数据部分按偏移量拼接。
- 当收到
MF=0
的最后一个分片,且所有分片都接收完整后,重组为原始 IP 数据包,再向上层协议(如 TCP、UDP)提交。
五、IP 路由过程
当一台设备向另一台设备发送数据时,IP 协议的路由流程如下:
- 发送方判断目标 IP 是否在同一局域网(通过子网掩码计算网络地址)。
- 若在同一局域网:直接通过 MAC 地址发送(ARP 协议获取 MAC)。
- 若不在同一局域网:将数据包发送到本地网关(路由器)。
- 路由器接收数据包后,根据路由表(记录网络地址与出口的映射)选择下一跳路由器。
- 数据包经过多台路由器转发,最终到达目标设备所在局域网的路由器。
- 目标局域网的路由器将数据包发送到目标设备。
六、IP 协议的局限性与补充协议
IP 协议本身是无连接、不可靠的:
- 无连接:发送方和接收方无需预先建立连接,直接发送数据。
- 不可靠:不保证数据包的顺序、完整性和到达性(可能丢失、重复或乱序)。
因此,需要其他协议补充:
- TCP 协议:提供可靠传输(重传丢失的包、按序重组),适用于对可靠性要求高的场景(如文件传输、网页访问)。
- UDP 协议:提供无可靠保证的快速传输,适用于实时性场景(如视频通话、游戏)。
- ICMP 协议:用于诊断网络问题(如
ping
命令通过 ICMP 检测主机可达性)。
IP 协议是互联网的 “交通规则”,通过寻址和路由确保数据在全球网络中准确传输。
TCP协议
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议,位于 IP 协议之上,为应用程序提供稳定的数据传输服务。它解决了 IP 协议的 “无连接” 和 “不可靠” 问题,广泛应用于对可靠性要求高的场景(如网页浏览、文件传输、电子邮件等)。
一、TCP 的核心特性
-
面向连接
通信前需通过 “三次握手” 建立连接,通信结束后通过 “四次挥手” 释放连接,确保双方状态同步。 -
可靠传输
- 通过序列号(Sequence Number)和确认号(Acknowledgment Number)保证数据按序到达。
- 超时重传机制:发送方在未收到确认时重新发送数据。
- 校验和(Checksum):检测数据在传输过程中是否损坏。
-
流量控制
接收方通过滑动窗口(Window Size)告知发送方自己的缓冲区大小,防止发送方发送过快导致接收方溢出。 -
拥塞控制
动态调整发送速率,避免网络拥塞。常见算法包括慢启动、拥塞避免、快速重传和快速恢复。 -
全双工通信
双方可同时发送和接收数据,通过独立的发送和接收缓冲区实现。
二、TCP 头部结构
TCP 数据包由头部和数据部分组成,头部最小 20 字节,最大 60 字节(包含可选字段):
字段 | 长度(位) | 作用描述 |
---|---|---|
源端口(Source Port) | 16 | 标识发送方应用程序的端口号 |
目标端口(Destination Port) | 16 | 标识接收方应用程序的端口号 |
序列号(Sequence Number) | 32 | 表示本报文段数据的第一个字节在整个数据流中的编号,用于按序重组 |
确认号(Acknowledgment Number) | 32 | 期望收到对方下一个报文段的第一个数据字节的序列号,即已成功接收数据的下一个序号 |
数据偏移(Data Offset) | 4 | 表示 TCP 头部长度(以 32 位字为单位),最小值 5(20 字节),最大值 15(60 字节) |
保留位(Reserved) | 6 | 保留字段,必须为 0 |
控制位(Flags) | 6 | - URG:紧急指针有效 - ACK:确认号有效 - PSH:尽快推送数据 - RST:重置连接 - SYN:建立连接 - FIN:关闭连接 |
窗口大小(Window Size) | 16 | 接收方的接收窗口大小(字节),用于流量控制 |
校验和(Checksum) | 16 | 覆盖 TCP 头部和数据部分,用于检测传输错误 |
紧急指针(Urgent Pointer) | 16 | 当 URG=1 时有效,表示紧急数据的末尾在数据流中的位置 |
选项(Options) | 可变 | 如 MSS(最大段大小)、窗口扩大因子、时间戳等可选参数 |
三、TCP 连接的建立与释放
1. 三次握手(Three-Way Handshake)建立连接
plaintext
客户端(Client) 服务器(Server)
┌───────────────┐ ┌───────────────┐
│ 1. SYN=1 │ │ │
│ Seq=x ├───────────►│ │
│ │ │ │
│ │ │ 2. SYN=1 │
│ │◄───────────┤ ACK=1 │
│ │ │ Seq=y │
│ 3. ACK=1 │ │ Ack=x+1 │
│ Seq=x+1 ├───────────►│ │
│ Ack=y+1 │ │ │
└───────────────┘ └───────────────┘
- 客户端向服务器发送 SYN 包(SYN=1,Seq=x),请求建立连接。
- 服务器收到后,返回 SYN+ACK 包(SYN=1,ACK=1,Seq=y,Ack=x+1),表示同意建立连接。
- 客户端发送 ACK 包(ACK=1,Seq=x+1,Ack=y+1),连接建立完成。
2. 四次挥手(Four-Way Handshake)释放连接
plaintext
客户端(Client) 服务器(Server)
┌───────────────┐ ┌───────────────┐
│ 1. FIN=1 │ │ │
│ Seq=u ├───────────►│ │
│ │ │ │
│ │ │ 2. ACK=1 │
│ │◄───────────┤ Seq=v │
│ │ │ Ack=u+1 │
│ 3. ACK=1 │ │ FIN=1 │
│ Seq=w │ │ Seq=v │
│ Ack=v+1 │◄───────────┤ │
│ │ │ │
│ 4. ACK=1 │ │ │
│ Seq=u+1 ├───────────►│ │
│ Ack=v+1 │ │ │
└───────────────┘ └───────────────┘
- 客户端向服务器发送 FIN 包(FIN=1,Seq=u),表示请求关闭连接。
- 服务器收到后,返回 ACK 包(ACK=1,Seq=v,Ack=u+1),表示同意关闭客户端到服务器的连接。
- 服务器向客户端发送 FIN 包(FIN=1,Seq=v),表示请求关闭服务器到客户端的连接。
- 客户端收到后,返回 ACK 包(ACK=1,Seq=u+1,Ack=v+1),连接彻底关闭。
四、TCP 可靠传输机制
-
序列号与确认应答
- 发送方为每个字节分配序列号,接收方通过确认号告知发送方已成功接收的数据位置。
- 例如:发送方发送 Seq=1000 的 100 字节数据,接收方返回 Ack=1100 表示已收到 1-1099 字节。
-
超时重传
- 发送方设置定时器,若在指定时间内未收到确认,重新发送未确认的数据。
- 超时时间动态调整,基于往返时间(RTT)估算。
-
滑动窗口
- 接收方通过窗口大小字段告知发送方自己的接收缓冲区剩余空间,发送方根据窗口大小调整发送速率。
- 窗口大小动态变化,避免接收方缓冲区溢出。
五、TCP 拥塞控制
TCP 通过拥塞窗口(cwnd)动态调整发送速率,避免网络拥塞:
- 慢启动:初始时 cwnd=1,每收到一个 ACK,cwnd 翻倍,直到达到慢启动阈值(ssthresh)。
- 拥塞避免:超过 ssthresh 后,每收到一个 ACK,cwnd 增加 1/cwnd,线性增长。
- 快速重传:当收到 3 个重复 ACK 时,立即重传丢失的数据包,无需等待超时。
- 快速恢复:重传后,将 ssthresh 减半,cwnd 设为 ssthresh,进入拥塞避免阶段。
六、TCP 的典型应用
- HTTP/HTTPS:网页浏览,依赖 TCP 的可靠性确保完整传输。
- FTP:文件传输协议,保证文件完整无误。
- SMTP/POP3/IMAP:电子邮件传输和接收。
- SSH/Telnet:远程登录,确保命令准确传输。
- 数据库连接:如 MySQL、PostgreSQL 依赖 TCP 保证数据完整性。
TCP 通过面向连接、可靠传输、流量控制和拥塞控制等机制,为应用层提供了稳定的数据传输服务,是互联网中最核心的协议之一。但其引入的连接建立、重传机制等也带来了一定的延迟和开销,因此在实时性要求高的场景(如音视频)中,UDP 更为适用。理解 TCP 的工作原理对网络编程、故障排查和性能优化至关重要。
UDP协议
UDP(User Datagram Protocol,用户数据报协议)是一种无连接、不可靠的传输层协议,与 TCP 相比,它更轻量、传输速度更快,但不保证数据的可靠性。UDP 适用于对实时性要求高、对少量数据丢失容忍度较高的场景,如音视频流、实时游戏、DNS 等。
一、UDP 的核心特性
-
无连接
通信前无需建立连接,发送方直接向接收方发送数据报(Datagram),接收方无需预先确认。 -
不可靠
- 不保证数据按序到达(可能乱序)。
- 不保证数据完整性(可能丢失)。
- 无重传机制,需应用层自行处理。
-
高效性
- 头部开销小(仅 8 字节,对比 TCP 的 20 字节)。
- 无需维护连接状态(如三次握手、四次挥手),减少系统资源消耗。
-
面向数据报
数据以独立的数据报为单位传输,接收方需按完整的数据报接收,不支持字节流。
二、UDP 头部结构
UDP 头部固定 8 字节,结构简单:
字段 | 长度(位) | 作用描述 |
---|---|---|
源端口(Source Port) | 16 | 标识发送方应用程序的端口号 |
目标端口(Destination Port) | 16 | 标识接收方应用程序的端口号 |
长度(Length) | 16 | UDP 数据报的总长度(头部 + 数据),最小值 8 字节(仅头部) |
校验和(Checksum) | 16 | 可选字段(某些实现可能忽略),覆盖 UDP 头部和数据部分,用于检测传输错误 |
三、UDP 的应用场景
-
实时音视频流
- 如视频会议、直播、语音通话(如 Zoom、抖音直播)。
- 少量丢包对用户体验影响较小,但延迟敏感。
-
实时游戏
- 如《王者荣耀》《CS:GO》。
- 需快速响应玩家操作,允许偶尔的画面抖动但不能接受高延迟。
-
DNS 查询
- DNS 请求通常使用 UDP(53 端口),单次查询数据量小,快速响应比可靠性更重要。
-
IoT(物联网)
- 传感器数据上报(如温度、湿度),数据量小且允许少量丢失。
-
广播 / 多播通信
- UDP 支持向多个目标发送数据(如 DHCP 发现、网络设备发现)。
四、UDP 的优缺点
优点
- 低延迟:无需连接建立和维护,适合实时性场景。
- 资源占用少:无需维护大量连接状态,适合轻量级应用。
- 简单灵活:协议设计简单,适合自定义应用层协议。
缺点
- 不可靠:可能丢包、乱序,需应用层自行处理。
- 无拥塞控制:可能导致网络拥塞(如 UDP 洪水攻击)。
- 数据报大小限制:受限于 IP 层 MTU(通常≤1500 字节)。
五、UDP 的可靠性增强方案
虽然 UDP 本身不可靠,但应用层可通过以下方式增强可靠性:
-
应用层重传
- 发送方记录已发送数据,超时未收到确认则重传(如 QUIC 协议)。
-
序列号与排序
- 为数据添加序列号,接收方按序重组(如视频播放器缓冲机制)。
-
确认机制
- 接收方返回 ACK 确认,类似 TCP 的确认应答(如实时游戏中的状态同步)。
-
丢包检测
- 通过序列号间隙或时间戳检测丢包(如 RTP 协议中的丢包统计)。
六、UDP 相关协议与技术
-
RTP(Real-time Transport Protocol)
- 用于实时音视频传输,基于 UDP,提供时间戳和序列号支持。
-
QUIC(Quick UDP Internet Connections)
- 基于 UDP 的新一代传输协议,谷歌开发,集成了 TCP 的可靠性和 UDP 的低延迟,被 HTTP/3 采用。
-
DHCP(Dynamic Host Configuration Protocol)
- 基于 UDP 实现,用于自动分配 IP 地址。
-
NTP(Network Time Protocol)
- 基于 UDP 实现,用于网络时钟同步。
UDP 以其轻量、高效的特性,成为实时性应用的首选协议。虽然不可靠,但在允许少量数据丢失的场景中(如音视频、游戏),UDP 的性能优势远超其不足。对于需要可靠性的场景,应用层可通过自定义协议弥补 UDP 的缺陷(如 QUIC 协议)。理解 UDP 的工作原理,有助于根据业务需求选择合适的传输层协议。
UDP 与 TCP 的对比
特性 | UDP | TCP |
---|---|---|
连接性 | 无连接 | 面向连接(三次握手) |
可靠性 | 不可靠(可能丢失、乱序) | 可靠(重传、排序、确认) |
头部开销 | 8 字节 | 最小 20 字节 |
传输效率 | 高(无连接建立 / 释放) | 低(需维护连接状态) |
流控与拥塞控制 | 不支持 | 支持滑动窗口、拥塞控制 |
应用场景 | 实时性要求高的场景 | 可靠性要求高的场景 |