计算机网络笔记(二十九)——5.1运输层协议概述
5.1.1进程之间的通信
一、进程间通信(IPC)的核心概念
进程 是操作系统资源分配和调度的基本单位。每个进程有独立的地址空间,进程间通信(IPC) 是不同进程之间交换数据和信息的方式。通信需要跨越进程地址空间的隔离,通常由操作系统(内核)提供的机制实现。
二、进程间通信的常见方式
以下是 5 种典型的 IPC 机制:
1. 管道(Pipe)
-
原理:单工通信(单向),基于内存缓冲区,数据以字节流形式传输。
-
分类:
- 匿名管道:仅用于父子进程或兄弟进程间通信。
- 命名管道(FIFO):任意进程可通过文件系统中的命名文件访问。
-
流程图:
-
特点:
- 简单但容量有限(默认 64KB)。
- 匿名管道只能在有亲缘关系的进程间使用。
- 命名管道通过文件路径访问。
2. 消息队列(Message Queue)
-
原理:内核维护的消息链表,允许发送结构化的消息。
-
关键步骤:
- 创建消息队列(
msgget
)。 - 发送消息(
msgsnd
)。 - 接收消息(
msgrcv
)。
- 创建消息队列(
-
流程图:
-
特点:
- 支持不同进程间通信。
- 消息类型可选择性地接收。
- 开销较大(需内核介入)。
3. 共享内存(Shared Memory)
-
原理:多个进程映射同一块物理内存到各自的地址空间,直接读写。
-
步骤:
- 创建共享内存段(
shmget
)。 - 映射到进程地址空间(
shmat
)。 - 读写共享内存后分离(
shmdt
)。
- 创建共享内存段(
-
流程图:
-
特点:
- 最快的 IPC 方式(无需数据拷贝)。
- 需配合信号量等同步机制避免冲突。
4. 信号量(Semaphore)
-
原理:整型计数器,提供进程同步机制(P/V 操作保证临界区互斥)。
-
典型用途:
- 共享资源访问的互斥。
- 线程/进程同步。
-
操作:
sem_wait(sem); // P: sem -= 1(若 sem < 0 则阻塞) sem_post(sem); // V: sem += 1(唤醒等待进程)
5. Socket(套接字)
-
原理:跨网络或本机的全双工通信端点,支持 TCP/UDP。
-
步骤(以 TCP 为例):
- 服务器调用
socket()
创建套接字。 bind()
绑定 IP 和端口。listen()
监听请求。- 客户端
connect()
连接服务器。 - 通过
read()
/write()
通信。
- 服务器调用
-
流程图:
-
特点:
- 支持跨网络通信。
- TCP 保证可靠性,UDP 提供低延迟。
三、关键对比与适用场景
机制 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
管道 | 父子进程简单通信 | 简单、轻量 | 单向、容量有限 |
消息队列 | 异步或结构化数据传递 | 灵活、不依赖进程关系 | 内核操作有开销 |
共享内存 | 高频数据交换(如视频处理) | 高速、无数据拷贝 | 需同步机制(如信号量) |
信号量 | 共享资源的互斥/同步 | 高效解决同步问题 | 不直接传递数据 |
Socket | 跨网络或本机进程通信 | 支持分布式场景 | 协议复杂、开销较大 |
四、总结
- 选择原则:
- 同设备进程优先用共享内存或消息队列。
- 跨网络必须使用 Socket。
- 简单任务可用管道或信号。
- 演进趋势:基于共享内存的机制(如 RDMA)在高性能计算中愈发重要。
5.1.2运输层的两个主要协议
运输层的核心功能是为应用进程提供端到端的逻辑通信。在互联网中,两种主要的运输层协议是 TCP(传输控制协议) 和 UDP(用户数据报协议)。它们的区别主要体现在连接方式、可靠性、流量控制等方面。
1. TCP(Transmission Control Protocol)
核心特性
- 面向连接:通信前需通过“三次握手”建立连接,通信后需“四次挥手”释放连接。
- 可靠传输:通过确认应答、超时重传、序列号/确认号机制保证数据无丢失、无重复、按序到达。
- 流量控制:接收方通过滑动窗口动态调整发送速率,防止数据淹没接收缓冲区。
- 拥塞控制:通过慢启动、拥塞避免、快速重传、快速恢复等算法避免网络过载。
- 全双工通信:通信双方可同时发送和接收数据。
首部格式
TCP 首部较复杂,包含 20 字节固定部分+可选字段:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options (可选) | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
适用场景
- 需可靠传输:HTTP、FTP、SMTP 等。
- 大数据量传输:文件下载、邮件发送。
- 需流量/拥塞控制:防止网络阻塞。
流程图示例(TCP三次握手与四次挥手)
2. UDP(User Datagram Protocol)
核心特性
- 无连接:通信前无需建立连接,直接发送数据。
- 尽力而为交付:不保证数据可靠性(可能丢失、乱序、重复)。
- 简单高效:首部仅 8 字节,无流量/拥塞控制,适用于低延迟场景。
- 支持多播/广播:支持一对多、多对多通信模式。
首部格式
UDP 首部简洁,仅包含 8 字节:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data (可变长度) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
适用场景
- 实时性要求高:视频会议(如 Zoom)、实时游戏(如王者荣耀)。
- 简单查询/响应:DNS 域名解析、SNMP 网络管理。
- 多播/广播应用:IPTV 直播、局域网广播。
流程图(UDP数据传输)
3. TCP vs UDP 对比总结
特性 | TCP | UDP |
---|---|---|
连接方式 | 面向连接(三次握手) | 无连接 |
可靠性 | 可靠传输(确认应答、重传机制) | 尽力而为交付(不保证可靠) |
流量控制 | 滑动窗口动态调整 | 无 |
拥塞控制 | 慢启动、拥塞避免等复杂算法 | 无 |
首部大小 | 20~60 字节 | 8 字节 |
传输效率 | 低(需额外开销) | 高(几乎无额外开销) |
典型应用 | HTTP、FTP、SSH | DNS、实时音视频、在线游戏 |
5.1.3运输层的接口
运输层的接口是网络协议栈中连接应用程序与网络通信的重要环节,主要通过套接字(Socket)实现进程间端到端的通信。
一、运输层接口的核心功能
-
进程间通信
运输层通过套接字为应用进程提供逻辑通信通道,隐藏底层网络细节。 -
端口管理
- 每个应用进程通过端口号唯一标识。
- 端口范围:
- 周知端口(0-1023):预留给常用服务(如HTTP-80、FTP-21)。
- 注册端口(1024-49151):用户程序可申请使用。
- 动态端口(49152-65535):临时分配给客户端应用。
-
协议支持
- TCP:面向连接,提供可靠传输、流量控制、拥塞控制。
- UDP:无连接,提供高效但不可靠的传输。
二、运输层接口的关键操作
1. 套接字(Socket)API
应用程序通过以下系统调用与运输层交互:
函数 | 作用 |
---|---|
socket() | 创建套接字,指定协议(TCP/UDP) |
bind() | 绑定套接字到特定IP和端口 |
listen() | (TCP)服务器开启监听连接请求 |
accept() | (TCP)接受客户端连接请求 |
connect() | (TCP)客户端发起连接 |
send() /recv() | 发送/接收数据 |
close() | 关闭套接字 |
2. 多路复用与多路分解
- 多路复用(Multiplexing)
将多个应用进程的数据封装为报文段,添加目标端口/IP。 - 多路分解(Demultiplexing)
根据报文段头部信息(端口/IP)分发给正确进程。
三、TCP与UDP的接口差异
特性 | TCP | UDP |
---|---|---|
连接类型 | 面向连接(需三次握手) | 无连接 |
可靠性 | 可靠(确认、重传、排序) | 不可靠 |
流量控制 | 滑动窗口机制 | 无流量控制 |
拥塞控制 | 慢启动、拥塞避免等策略 | 无拥塞控制 |
四、运输层接口流程图
以下是TCP通信的接口流程示例:
五、关键机制详解
-
可靠传输(TCP)
- 序列号与确认号:确保数据有序到达。
- 超时重传:丢失报文自动重发。
- 滑动窗口:动态调整发送速率以匹配接收方处理能力。
-
流量控制与拥塞控制
- 接收窗口(RWND):通知发送方可接收的数据量。
- 拥塞窗口(CWND):根据网络状况动态调整,避免拥塞崩溃。
六、常见问题
- 端口冲突如何处理?
若端口已被占用,bind()
系统调用会返回错误,需选择其他端口。 - 如何应对UDP丢包?
需在应用层实现确认机制(如QUIC协议在用户空间实现可靠性)。