Roxy's Library

Back

传输层基本概念#

定位与功能#

  • 位置:传输层位于应用层和网络层之间
  • 核心功能
    • 向下:利用网络层提供的服务,为不同主机上的应用程序提供通信服务
    • 向上:屏蔽底层网络的复杂性(如多跳路由、网络拓扑),让应用程序感觉像是在两个终端进程之间直接建立了一条“虚拟管道”
  • 通信抽象
    • 网络层提供的是主机到主机 (Host-to-Host)的通信
    • 传输层提供的是进程到进程 (Process-to-Process)的通信(逻辑上的端到端通信)
  • 套接字 (Socket):应用层和传输层的接口,也是应用程序和网络之间的 API

传输层的服务限制#

  • 网络层现实:Internet 的网络层提供的是“尽力而为 (Best-effort)”的服务
    • 不保证:交付成功、按序交付、数据完整性、延迟和带宽
  • 传输层能做的:通过差错恢复、重排序等手段提供可靠、按序的交付(如 TCP)
  • 传输层做不到的:无法提供的延迟保证和带宽保证

复用与分用#

这是传输层实现“进程到进程”交付的核心机制。

基本定义#

  • 复用 (Multiplexing) [发送端]:传输层从多个套接字收集数据,封装头部信息(如端口号),交给网络层发送
  • 分用 (Demultiplexing) [接收端]:传输层从网络层收到数据后,根据报文段头部的信息,将数据交付给正确的套接字

标识机制:端口号 (Port)#

  • 作用:用于标识主机上的不同进程(套接字)
  • 长度:16比特(取值范围 00 ~ 6553565535
  • 分类
    • 熟知端口 (0~1023):公共协议使用(如 HTTP 80, FTP 21)。
    • 注册端口 (1024~49151):需注册使用。
    • 动态/私有端口 (49152~65535):客户端通常使用系统自动分配的这类端口。

UDP 与 TCP 分用的区别#

特性UDP 分用TCP 分用
标识依据二元组 <目的IP, 目的端口>四元组 <源IP, 源端口, 目的IP, 目的端口>
套接字行为不同源 IP/Port 发往同一个目的端口的数据,进入同一个套接字每个连接(不同的源客户端)都有独立的连接套接字处理
服务器结构通常只用一个套接字服务所有客户使用一个监听套接字等待请求,为每个客户创建新的连接套接字
源信息作用仅用于发送响应,不用于分用导航用于区分不同的连接,决定交付给哪个套接字

UDP#

UDP 是一种“躺平”的协议,提供最低限度的传输服务

UDP 特点#

  1. 无连接:发送数据前不需要建立连接,没有握手延迟
  2. 尽力而为:不保证可靠性(丢包不重传)、不保证顺序
  3. 面向报文
    • 保留应用层报文的边界。
    • 应用给多少,UDP 发多少;接收方每次 recv 一个完整的报文
    • 对比 TCP:TCP 是字节流,应用层感知不到报文边界
  4. 无速率控制:不进行拥塞控制和流量控制,应用层可以让 UDP 尽可能快地发送

UDP 报文结构#

UDP 头部非常简单,只有 8 字节

  • 源端口号 (Source Port):16 bits,可选,用于回信
  • 目的端口号 (Destination Port):16 bits,用于分用
  • 长度 (Length):16 bits,UDP 头部 + 数据的总字节数
  • 校验和 (Checksum):16 bits,用于检测报文在传输中是否出错(可选)

UDP 报文格式

Checksum 计算与原理#

  • 计算范围伪头部 (Pseudo-header) + UDP 头部 + 数据
    • 伪头部:取自 IP 头部(源IP、目的IP、协议号、UDP长度),目的是防止 IP 地址错误导致的误投递

UDP 伪头部

  • 计算算法
    1. 将内容划分为一系列 16-bit 的整数。
    2. 将所有整数相加。
    3. 回卷:如果相加结果溢出(最高位有进位),将进位加到最低位。
    4. 最后结果取反,填入 Checksum 字段。
  • 接收方验证
    • 对收到的报文段(包含 Checksum)进行相同的求和计算。
    • 如果结果为 全 1 (0xFFFF),则认为无错;否则丢弃
  • 局限性:无法检测出所有错误(如两个 16 位整数同一位置同时翻转)
  • 为什么还需要 Checksum?
    • 虽然链路层有检错,但在路由器内存或主机内部传输时仍可能出错,checksum 足以应付这些小概率事件
    • 计算开销小
    • 更高级的差错检验可以由应用层实现

UDP 的实现细节#

  • 缓冲区
    • 发送方:通常无缓冲区。数据组装好头部后直接交给网络层
    • 接收方有缓冲区。每个 Socket 一个缓冲区,存储来自不同发送方的报文

为什么/何时使用 UDP?#

  • 适用场景
    • 流媒体:对延迟敏感,容忍少量丢包(TCP 的重传会导致延迟)。
    • DNS/SNMP:单次请求/响应模式,建立连接的开销占比太大。
    • 广播/多播:TCP 只能点对点。
  • 如果在 UDP 上需要可靠性:必须由应用层自己实现(如验证、重传)

总结与对比#

维度UDPTCP
连接性无连接面向连接
传输单位报文 (保留边界)字节流 (无边界)
可靠性不可靠 (尽力而为)可靠传输 (重传、排序)
控制机制无 (发多快由应用决定)流量控制、拥塞控制
分用标识二元组 (目的IP, 端口)四元组 (源IP, 源端口, 目的IP, 目的端口)
首部开销小 (8 字节)大 (20 字节以上)
传输层基本概念&UDP
https://astro-pure.js.org/blog/csnet_trans_chap1
Author GreyRat
Published at December 8, 2025
Comment seems to stuck. Try to refresh?✨