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控制拥塞

相关推荐
你真是饿了4 小时前
6.库制作与原理
linux·服务器
2301_763472465 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
枷锁—sha5 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
abluckyboy5 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
园小异5 小时前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展
m0_706653235 小时前
分布式系统安全通信
开发语言·c++·算法
Zach_yuan6 小时前
深入浅出 JSONCpp
linux·服务器·网络·c++
AtoposのCX3306 小时前
Docker运行hello-world镜像失败或超时
运维·docker
马猴烧酒.6 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库