当前位置: 首页 > news >正文

计算机网络笔记(二十九)——5.1运输层协议概述

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 对比总结

特性TCPUDP
连接方式面向连接(三次握手)无连接
可靠性可靠传输(确认应答、重传机制)尽力而为交付(不保证可靠)
流量控制滑动窗口动态调整
拥塞控制慢启动、拥塞避免等复杂算法
首部大小20~60 字节8 字节
传输效率低(需额外开销)高(几乎无额外开销)
典型应用HTTP、FTP、SSHDNS、实时音视频、在线游戏

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的接口差异

特性TCPUDP
连接类型面向连接(需三次握手)无连接
可靠性可靠(确认、重传、排序)不可靠
流量控制滑动窗口机制无流量控制
拥塞控制慢启动、拥塞避免等策略无拥塞控制

四、运输层接口流程图

以下是TCP通信的接口流程示例:

在这里插入图片描述

五、关键机制详解

  1. 可靠传输(TCP)

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

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

六、常见问题

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

相关文章:

  • QT线程同步 QReadWriteLock并发访问
  • xtp+ctp 交易系统接口简介
  • DAX权威指南9:DAX 查询分析与优化1
  • leetcode 386. 字典序排数 中等
  • Python爬虫实战:研究demiurge框架相关技术
  • 从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(十)
  • pgsql batch insert optimization (reWriteBatchedInserts )
  • Digital IC Design Flow
  • vue3:十六、个人中心-修改密码
  • bugku 网络安全事件应急响应
  • 02.管理数据库
  • CCPC guangdongjiangsu 2025 F
  • 【创新算法】改进深度优先搜索算法配合二进制粒子群的配电网故障恢复重构研究
  • 食养有方:进行性核上性麻痹患者的健康饮食指南
  • 解决SQL Server SQL语句性能问题(9)——SQL语句改写(2)
  • Linux系统防火墙之iptables
  • 工作记录 2017-08-01
  • 若依框架项目前缀配置
  • 如何在最短时间内提升打ctf(web)的水平?
  • Python安装使用教程
  • 实验三:VGA显示实验
  • JavaScript 数据类型详解
  • Razor编程中@Html的方法使用大全
  • Day25 异常处理
  • sizeof 与strlen的区别
  • Puppeteer测试框架 - Node.js
  • 解决transformers.adapters import AdapterConfig 报错的问题
  • Java中的抽象类
  • 【Redis】持久化
  • Redis知识体系