在计算机网络通信中,从数据传输的方向定义,到分层协议的协作,再到 TCP 的可靠传输保障,每个环节都有明确的规则与机制。本文将系统梳理网络通信的核心概念,包括数据传输模式、协议分层、TCP/UDP 特性、数据同步机制等,帮助快速理解网络通信的底层逻辑。
一、数据传输基本模式:单工、半双工与全双工
数据传输方向是网络通信的基础属性,主要分为三种模式,常见于路由器交换机等设备的通信功能中:
- 单工:数据仅支持单向传输,同一时刻只能一方接收或发送(如早期的广播、打印机通信)。
- 半双工:数据支持双向传输,但同一时间只能一个方向传输。需先判断是否有数据接入,避免信号碰撞,需等一方传输完成后,另一方才能发送(如以太网早期的半双工模式)。
- 全双工:数据支持双向同时传输,同一时间可同时接收和发送(如现代以太网、手机通话)。
二、网络协议分层:OSI 七层与 TCP/IP 四层
协议分层是为了将复杂的网络通信拆解为独立模块,不同分层负责不同功能,上层依赖下层提供的服务。
2.1 OSI 七层协议(理论模型)
从顶层到下层,功能逐步贴近硬件:
- 应用层:提供应用接口与网络服务(如 HTTP、HTTPS、FTP、DNS)。
- 表示层:负责数据编码与转换,确保跨系统数据可识别(如 HTML、DOC 格式处理、数据加密解密)。
- 会话层:建立、管理、终止表示层实体间的通信会话(如会话连接的创建与释放)。
- 传输层:建立主机端到端连接,提供可靠 / 透明的数据传输(TCP、UDP,负责进程间通信)。
- 网络层:通过路由算法选择数据包传输路径(IP 协议,负责主机到主机的逻辑通信)。
- 数据链路层:定义电信号分组规则,处理帧的传输(如 MAC 地址相关操作)。
- 物理层:利用传输介质(网线、光缆)实现比特流(0 和 1)的透明传送。
通过下面图片,我们可以更生动的去了解这个过程,大致做了什么:
2.2 TCP/IP 四层协议(实际应用模型)
OSI 模型过于复杂,实际网络中常用 TCP/IP 四层模型,对应关系如下:
| TCP/IP 四层 | 核心功能 | 代表协议 |
|---|---|---|
| 应用层 | 提供用户级应用服务 | HTTP、FTP、DNS |
| 传输层 | 进程间数据传输 | TCP(可靠)、UDP(不可靠) |
| 网络层 | 主机间路由与数据包转发 | IP、ARP |
| 链路层 | 硬件设备间的帧传输 | 以太网协议、MAC |
大致流程如下:
三、核心协议解析:IP、TCP 与 UDP
3.1 IP 协议:网络层的 “地址与路由” 基础
IP 协议是网络层的核心,负责将数据包从源主机转发到目标主机,特点如下:
-
协议本质:“尽力而为” 的无连接协议,不保证数据包不丢失、不重复、按序到达(需依赖传输层 TCP 补充可靠性)。
-
核心依赖:IP 通信需通过 MAC 地址实现物理转发,通过 ARP 协议解析 “IP 地址→MAC 地址” 的映射。
-
子网掩码:32 位二进制值,用于分离 IP 中的 “网络部分” 与 “主机部分”,判断目标主机是否在同一子网(同子网直接通信,异子网需通过路由器转发)。
-
IP 报文头部关键字段:
- 源 / 目的 IP 地址:标识数据包的发送端与接收端。
- TTL(生存时间):数据包可经过的路由跳数,每过 1 个路由减 1,为 0 时丢弃(避免循环转发)。
- 协议字段:标识上层协议(如 6 代表 TCP,17 代表 UDP)。
IPv4 与 IPv6 的区别
- IPv4:32 位地址,最多支持约 42 亿台设备,地址已枯竭。
- IPv6:128 位地址(格式如
abcd:0000:1111:2222:1357:2468:5555:6789),可提供海量地址,同时优化了安全性、移动性等问题。
3.2 TCP 与 UDP:传输层的 “可靠与高效” 选择
TCP 和 UDP 均位于传输层,面向不同通信需求设计,核心差异如下:
| 特性 | TCP(传输控制协议) | UDP(用户数据包报协议) |
|---|---|---|
| 连接方式 | 面向连接(需三次握手建立连接) | 无连接(直接发送,无需建立连接) |
| 可靠性 | 可靠(确认应答、超时重传、错误校验) | 不可靠(无确认,丢包不重传) |
| 数据顺序 | 按序传输(通过序列号排序) | 无序(数据包独立,无顺序保证) |
| 速度 | 较慢(需握手、重传等开销) | 较快(无额外开销) |
| 头部大小 | 最小 20 字节(最大 60 字节) | 固定 8 字节 |
| 应用场景 | 需可靠传输(HTTP/HTTPS、FTP、文件传输) | 需高速传输(QQ 语音 / 视频、DNS 查询) |
TCP/UDP 头部关键字段
- TCP 头部:含源 / 目的端口、序列号(数据排序)、确认号(期望接收的下一字节)、窗口大小(流量控制)、标志位(SYN 建立连接、FIN 断开连接、ACK 确认)。
- UDP 头部:仅含源 / 目的端口、UDP 长度(数据包总长度)、校验和(检测数据错误)。
四、TCP 核心机制:连接建立、断开与可靠性保障
4.1 三次握手:建立可靠连接
TCP 通过三次握手确保双方 “发送 / 接收能力正常”,流程如下:
- 客户端→服务器:发送 SYN=1(请求建立连接),初始序列号 seq=x,进入 SYN_SENT 状态。
- 服务器→客户端:回复 SYN=1+ACK=1(确认请求 + 发起自身连接),序列号 seq=y,确认号 ack=x+1,进入 SYN_RCVD 状态。
- 客户端→服务器:回复 ACK=1(确认服务器连接),序列号 seq=x+1,确认号 ack=y+1,双方进入 ESTABLISHED 状态,连接建立。
核心作用:防止 “已失效的连接请求” 导致资源浪费(如旧请求延迟到达,三次握手可忽略无效请求)。
4.2 四次挥手:优雅断开连接
TCP 是全双工协议,断开连接需双方确认 “无数据残留”,流程如下:
- 客户端→服务器:发送 FIN=1(请求断开),序列号 seq=u,进入 FIN-WAIT-1 状态。
- 服务器→客户端:回复 ACK=1(确认收到断开请求),确认号 ack=u+1,进入 CLOSE-WAIT 状态(此时服务器可继续发送剩余数据)。
- 服务器→客户端:发送 FIN=1(服务器无数据可发,请求断开),序列号 seq=w,确认号 ack=u+1,进入 LAST-ACK 状态。
- 客户端→服务器:回复 ACK=1(确认服务器断开),确认号 ack=w+1,进入 TIME-WAIT 状态(等待 2MSL,确保服务器收到确认),之后关闭连接;服务器收到 ACK 后直接关闭。
关键状态作用:
- FIN-WAIT-1:等待服务器对 “客户端断开请求” 的确认。
- FIN-WAIT-2:等待服务器发送 “自身断开请求”(确保服务器无残留数据)。
- TIME-WAIT:等待 2MSL(报文最大生存时间),防止服务器未收到 ACK 而重发 FIN,避免数据残留。
4.3 TCP 可靠性保障机制
TCP 通过多机制确保数据可靠传输:
- 校验和:发送方计算数据校验值,接收方核对,不一致则丢弃。
- 确认应答:接收方收到数据后回复 ACK,携带 “期望接收的下一字节序号”,发送方未收到 ACK 则重传。
- 超时重传:发送方发送数据后启动定时器,超时未收到 ACK 则重传。
- 流量控制:通过 “窗口大小”(接收方告知发送方 “可接收的最大字节数”)控制发送速率,避免接收方缓存溢出。
- 拥塞控制:通过慢启动、拥塞避免、快重传、快恢复算法,避免网络拥塞(如慢启动阶段 cwnd 指数增长,拥塞避免阶段 cwnd 线性增长)。
五、TCP 粘包 / 拆包:问题与解决方案
TCP 基于 “字节流” 传输,无数据边界,易出现粘包(多请求合并)或拆包(大请求拆分)问题,UDP 基于 “报文” 传输(含长度字段),无此问题。
5.1 粘包 / 拆包原因
- 粘包:发送数据小于 TCP 发送缓冲区,TCP 合并多个请求一次发送。
- 拆包:发送数据大于 TCP 缓冲区或 MSS(最大报文长度),TCP 拆分多次发送。
- 接收方未及时读取缓存数据,导致多个数据包堆积,形成粘包。
5.2 解决方案
- 消息定长:每个数据包固定长度,接收方按固定长度读取(不足补 0)。
- 设置边界:包尾加特殊符号(如回车换行),接收方按符号分割消息(如 FTP 协议)。
- 消息头 + 消息体:消息头含 “消息总长度” 字段,接收方先读头再读对应长度的体。
六、TCP/IP 数据传输完整流程(以 HTTP 请求为例)
-
DNS 解析:将域名(如www.xxx.com)解析为目标服务器 IP 地址。
-
TCP 三次握手:客户端与服务器建立 TCP 连接。
-
HTTP 请求发送:
- 应用层:构造 HTTP 请求报文(如 GET/POST)。
- 传输层:添加 TCP 头部(源 / 目的端口、序列号),形成 TCP 段。
- 网络层:添加 IP 头部(源 / 目的 IP),形成 IP 数据包。
- 链路层:添加 MAC 头部(源 / 目的 MAC),形成数据帧,通过物理层传输。
-
服务器接收与响应:
- 物理层→链路层→网络层→传输层→应用层:逐层剥离头部,服务器处理 HTTP 请求。
- 按相反流程构造 HTTP 响应,通过 TCP 连接返回客户端。
-
TCP 四次挥手:数据传输完成,断开 TCP 连接。