5.1.1进程之间的通信

一、进程间通信(IPC)的核心概念

进程 是操作系统资源分配和调度的基本单位。每个进程有独立的地址空间,进程间通信(IPC) 是不同进程之间交换数据和信息的方式。通信需要跨越进程地址空间的隔离,通常由操作系统(内核)提供的机制实现。

二、进程间通信的常见方式

以下是 5 种典型的 IPC 机制:

1. 管道(Pipe)

  • 原理:单工通信(单向),基于内存缓冲区,数据以字节流形式传输。

  • 分类

    • 匿名管道:仅用于父子进程或兄弟进程间通信。
    • 命名管道(FIFO):任意进程可通过文件系统中的命名文件访问。
  • 流程图
    在这里插入图片描述

  • 特点

    • 简单但容量有限(默认 64KB)。
    • 匿名管道只能在有亲缘关系的进程间使用。
    • 命名管道通过文件路径访问。

2. 消息队列(Message Queue)

  • 原理:内核维护的消息链表,允许发送结构化的消息。

  • 关键步骤

    1. 创建消息队列(msgget)。
    2. 发送消息(msgsnd)。
    3. 接收消息(msgrcv)。
  • 流程图
    在这里插入图片描述

  • 特点

    • 支持不同进程间通信。
    • 消息类型可选择性地接收。
    • 开销较大(需内核介入)。

3. 共享内存(Shared Memory)

  • 原理:多个进程映射同一块物理内存到各自的地址空间,直接读写。

  • 步骤

    1. 创建共享内存段(shmget)。
    2. 映射到进程地址空间(shmat)。
    3. 读写共享内存后分离(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 为例):

    1. 服务器调用 socket() 创建套接字。
    2. bind() 绑定 IP 和端口。
    3. listen() 监听请求。
    4. 客户端 connect() 连接服务器。
    5. 通过 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)实现进程间端到端的通信。

一、运输层接口的核心功能

  1. 进程间通信
    运输层通过套接字为应用进程提供逻辑通信通道,隐藏底层网络细节。

  2. 端口管理

    • 每个应用进程通过端口号唯一标识。
    • 端口范围:
      • 周知端口(0-1023):预留给常用服务(如HTTP-80、FTP-21)。
      • 注册端口(1024-49151):用户程序可申请使用。
      • 动态端口(49152-65535):临时分配给客户端应用。
  3. 协议支持

    • 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通信的接口流程示例:

在这里插入图片描述

五、关键机制详解

  1. 可靠传输(TCP)

    • 序列号与确认号:确保数据有序到达。
    • 超时重传:丢失报文自动重发。
    • 滑动窗口:动态调整发送速率以匹配接收方处理能力。
  2. 流量控制与拥塞控制

    • 接收窗口(RWND):通知发送方可接收的数据量。
    • 拥塞窗口(CWND):根据网络状况动态调整,避免拥塞崩溃。

六、常见问题

  1. 端口冲突如何处理?
    若端口已被占用,bind()系统调用会返回错误,需选择其他端口。
  2. 如何应对UDP丢包?
    需在应用层实现确认机制(如QUIC协议在用户空间实现可靠性)。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐