网络协议与TCP/IP
一、网络模型
1.1 OSI七层模型(理论模型)
从上到下:
7. 应用层 - Application Layer
6. 表示层 - Presentation Layer
5. 会话层 - Session Layer
4. 传输层 - Transport Layer
3. 网络层 - Network Layer
2. 数据链路层 - Data Link Layer
1. 物理层 - Physical Layer
1.2 TCP/IP四层模型(实际使用)
从上到下:
4. 应用层 - Application Layer
3. 传输层 - Transport Layer
2. 网络层 - Internet Layer
1. 网络接口层 - Network Interface Layer
二、传输层协议对比
2.1 TCP协议(传输控制协议)
-
头部大小:20-60个字节
-
连接特性 :有连接
-
通信方式 :一对一(如同打电话)
-
数据传输 :数据流(连续的数据)
-
可靠性 :有应答机制 (确认是否传输成功),可靠性高
-
效率 :效率低(占用带宽多)
-
其他特性:
-
拥塞控制:避免网络拥堵
-
重传机制:数据丢失时自动重传
-
2.2 UDP协议(用户数据报协议)
-
头部大小:8个字节
-
连接特性 :无连接
-
通信方式 :一(多)对多(如同发短信)
-
数据传输 :数据报(独立的数据包)
-
可靠性 :无应答机制 ,可靠性低
-
效率 :效率高
三、IP地址与子网掩码
3.1 IP地址作用
-
区分主机:每台网络设备有唯一的IP地址
-
路由寻址:用于数据包的路由选择
3.2 IP地址分类(ABC类)
A类:0XXXXXXX . XXXX XXXX . XXXX XXXX . XXXX XXXX
- 第一位为0
- 范围:0.0.0.0 - 127.255.255.255
- 子网掩码:255.0.0.0
B类:10XXXXXX . XXXX XXXX . XXXX XXXX . XXXX XXXX
- 前两位为10
- 范围:128.0.0.0 - 191.255.255.255
- 子网掩码:255.255.0.0
C类:110XXXXX . XXXX XXXX . XXXX XXXX . XXXX XXXX
- 前三位为110
- 范围:192.0.0.0 - 223.255.255.255
- 子网掩码:255.255.255.0
D类:1110XXXX . XXXX XXXX . XXXX XXXX . XXXX XXXX
- 前四位为1110
- 用于组播
E类:11110XXX . XXXX XXXX . XXXX XXXX . XXXX XXXX
- 前五位为11110
- 保留地址
四、数据封装过程
4.1 各层数据处理
发送端数据处理流程:
应用层数据 → [应用层]
↓ 添加应用层头部
TCP头 + 数据 → [传输层]
↓ 添加TCP头
IP头 + TCP头 + 数据 → [网络层]
↓ 添加IP头
以太网头 + IP头 + TCP头 + 数据 + 以太网校验 → [链路层]
↓ 添加以太网头和校验
物理信号传输 → [物理层]
接收端反向处理。
4.2 数据在以太网中的形式
| 以太网头 | IP头 | TCP头 | 数据 | 以太网校验 |
|----------|------|-------|------|------------|
14字节 20-60 20-60 可变 4字节
五、TCP粘包问题
5.1 TCP粘包现象
// 发送端
send("hello");
send("world");
// 接收端
recv(buf); // 可能收到 "helloworld" —— 这就是粘包
recv(buf); // 可能阻塞,因为数据已经一次性收到了
5.2 TCP粘包原因
-
有连接特性 :发送端和接收端建立连接后形成链路
-
缓冲区机制:数据先放在缓冲区,一次性发送
-
数据流传输 :TCP将数据视为连续的流,不是独立的数据包
5.3 粘包解决方海
5.3.1 方法一:发送定长数据
-
原理:每次发送固定长度的数据
-
优点:简单
-
缺点 :应用场合有限,浪费带宽
5.3.2 方法二:判断数据长度
-
原理:在数据前添加长度信息
-
实现:
// 发送端:先发长度,再发数据 send(数据长度); send(实际数据); // 接收端:先收长度,再按长度收数据 recv(长度信息); recv(长度对应的数据);
5.3.3 方法三:制定通信协议
-
使用Protocol Buffer(protobuf)等协议
-
定义明确的消息边界
-
自动处理数据序列化/反序列化
六、UDP无粘包特性
// UDP发送端
sendto("hello");
sendto("world");
// UDP接收端
recvfrom(buf); // 收到 "hello"
recvfrom(buf); // 收到 "world"
UDP特点:
-
无连接:每个数据包独立
-
数据报传输:每个sendto对应一个独立的数据包
-
无粘包问题:数据包边界清晰
七、串口通信特殊性
-
没有传输层:串口通信直接传输原始数据
-
需要应用层协议:自行定义数据格式和边界
-
无TCP/UDP的概念:是物理层/数据链路层的通信方式
八、TCP连接建立与终止
8.1 TCP三次握手(连接建立)
客户端(Client) 服务器(Server)
| |
|---- SYN(seq=x) ------>| # 第一次:客户端发送SYN包
| |
|<--- SYN+ACK(seq=y,ack=x+1) ---| # 第二次:服务器回复SYN+ACK
| |
|---- ACK(ack=y+1) ----->| # 第三次:客户端发送ACK确认
| |
报文说明:
-
SYN:同步序列编号(Synchronize Sequence Numbers)
-
ACK:确认(Acknowledgment)
-
seq:序列号(Sequence Number)
-
ack:确认号(Acknowledgment Number)
8.2 TCP四次挥手(连接终止)
客户端 服务器
| |
|---- FIN(seq=x) ------->| # 第一次:客户端发送FIN包
| |
|<--- ACK(ack=x+1) ------| # 第二次:服务器回复ACK确认
| |
|<--- FIN(seq=y) --------| # 第三次:服务器发送FIN包
| |
|---- ACK(ack=y+1) ----->| # 第四次:客户端回复ACK确认
| |
九、TCP控制位说明
9.1 常见TCP控制位
控制位(Flags):
- SYN:建立连接
- ACK:确认应答
- FIN:终止连接
- RST:重置连接(请求重连)
- URG:紧急数据
- PSH:推功能(Push Function)
9.2 特殊控制位详解
9.2.1 RST(Reset)
-
作用 :请求重连
-
触发条件:
-
收到不存在的端口的数据包
-
连接异常中断
-
收到非法序列号的数据
-
9.2.2 URG(Urgent)
-
作用 :标记紧急数据
-
特点:紧急指针指向紧急数据的末尾
-
应用:中断当前传输,优先处理紧急数据
9.2.3 PSH(Push)
-
作用 :拥塞控制相关
-
功能:要求接收方立即将数据交给应用层
-
避免:数据在缓冲区中等待
十、TCP确认机制
10.1 确认号计算
发送方:发送数据 seqnum = x;
接收方:回复确认 ack num = x + 数据长度 + 1;
简化理解:
发送:seq = 100, 发送10字节数据
接收:ack = 111 (100 + 10 + 1)
10.2 可靠传输原理
-
发送方:发送数据并记录序列号
-
接收方:接收数据并回复确认号
-
发送方:收到确认后继续发送
-
超时重传:未收到确认则重发数据
十一、关键概念对比
11.1 TCP vs UDP 特性对比
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 有连接 | 无连接 |
| 可靠性 | 高(有确认) | 低(无确认) |
| 速度 | 慢 | 快 |
| 数据边界 | 数据流(可能粘包) | 数据报(无粘包) |
| 头部大小 | 20-60字节 | 8字节 |
| 适用场景 | 文件传输、网页浏览 | 视频流、DNS查询 |
11.2 网络模型对比
| OSI七层模型 | TCP/IP四层模型 | 主要功能 |
|---|---|---|
| 应用层 | 应用层 | 用户接口、应用程序 |
| 表示层 | (合并到应用层) | 数据格式转换、加密 |
| 会话层 | (合并到应用层) | 建立和管理会话 |
| 传输层 | 传输层 | 端到端连接、可靠性 |
| 网络层 | 网络层 | 路由选择、IP寻址 |
| 数据链路层 | 网络接口层 | 帧传输、MAC地址 |
| 物理层 | (合并到网络接口层) | 比特流传输 |
核心要点总结:
-
OSI七层是理论,TCP/IP四层是实际
-
TCP可靠但慢,UDP快但不可靠
-
IP地址分类看前几位,子网掩码区分网络和主机
-
TCP粘包是因为数据流传输,有缓冲区
-
TCP三次握手建立连接,四次挥手断开连接
-
串口通信没有传输层,需要自定义协议
-
RST请求重连,URG紧急数据,PSH控制拥塞