C语言核心概念复习——网络协议与TCP/IP

网络协议与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粘包原因

  1. 有连接特性 :发送端和接收端建立连接后形成链路

  2. 缓冲区机制:数据先放在缓冲区,一次性发送

  3. 数据流传输 :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 可靠传输原理

  1. 发送方:发送数据并记录序列号

  2. 接收方:接收数据并回复确认号

  3. 发送方:收到确认后继续发送

  4. 超时重传:未收到确认则重发数据

十一、关键概念对比

11.1 TCP vs UDP 特性对比

特性 TCP UDP
连接 有连接 无连接
可靠性 高(有确认) 低(无确认)
速度
数据边界 数据流(可能粘包) 数据报(无粘包)
头部大小 20-60字节 8字节
适用场景 文件传输、网页浏览 视频流、DNS查询

11.2 网络模型对比

OSI七层模型 TCP/IP四层模型 主要功能
应用层 应用层 用户接口、应用程序
表示层 (合并到应用层) 数据格式转换、加密
会话层 (合并到应用层) 建立和管理会话
传输层 传输层 端到端连接、可靠性
网络层 网络层 路由选择、IP寻址
数据链路层 网络接口层 帧传输、MAC地址
物理层 (合并到网络接口层) 比特流传输

核心要点总结

  1. OSI七层是理论,TCP/IP四层是实际

  2. TCP可靠但慢,UDP快但不可靠

  3. IP地址分类看前几位,子网掩码区分网络和主机

  4. TCP粘包是因为数据流传输,有缓冲区

  5. TCP三次握手建立连接,四次挥手断开连接

  6. 串口通信没有传输层,需要自定义协议

  7. RST请求重连,URG紧急数据,PSH控制拥塞

相关推荐
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
十日十行2 天前
Linux和window共享文件夹
linux
Sinclair2 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
木心月转码ing2 天前
WSL+Cpp开发环境配置
linux
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉