模块二 · 运输层
端口与 UDP
IP 地址只能把数据送到设备,但设备上同时跑着几十个程序 —— 谁来决定这份数据该交给哪个程序?答案是端口。本章还会讲清 UDP 这个"不要连接"的传输层协议,以及一个惊人的实测数字:本机收到过 412 万个"没人要"的 UDP 数据报。
本章要解决的问题:IP 地址只能把数据送到设备,但设备上同时跑着几十个程序 —— 谁来决定这份数据该交给哪个程序?答案是端口。本章还会讲清 UDP 这个"不要连接"的传输层协议,以及一个惊人的实测数字:本机收到过 412 万个"没人要"的 UDP 数据报。
本章的证据来源:历史实测记录(端口监听列表、端口区间分布、UDP 统计数据、真实连接四元组)。端口划分出自 RFC 6335;UDP 报文格式出自 RFC 768。
先从一个例子理解概念
同一台电脑既开浏览器又打游戏,收到的数据该交给谁?端口和程序使用的通信端点解决这个分配问题。
送到主机之后交给谁:端口
TCP/UDP端口是0–65535的传输层编号,参与把数据分配给通信端点。它不是网线插口,也不是某个程序永久独占的房间号。
程序使用的通信端点:socket
socket(套接字)是程序与网络通信使用的端点/接口。程序可以创建多个socket;同一服务端口也可对应许多不同连接。
直接发送一份消息:UDP
UDP(用户数据报协议)提供一份份数据报,不需要先做TCP式握手,不内建送达、顺序或去重保证。需要这些能力时,由使用它的上层协议补充。
怎样区分TCP连接:四元组
在普通TCP语境中,源IP、源端口、目的IP、目的端口合称四元组,用于区分连接。源与目的是相对这次数据发送方向说的。
下面再用这些概念看原理、命令和结果。规范与官方资料列在本章末尾,类比只帮助理解,不代替协议规则。
为什么需要端口
一台电脑上同时发生的事情:
- 浏览器开着 20 个标签页
- 微信在收发消息
- 后台在下载系统更新
- 你在看视频
数据从网线进来,操作系统必须知道这一份该交给哪个程序。
IP 地址做不到这件事 —— 它只能定位到"这台设备"。所以需要一个更细的标识:端口。
端口是个 16 位数字,范围 0 ~ 65535。 因为 16 位最多表示 65536 个值。
端口被分成三段
65536 个端口不是随便用的,标准(RFC 6335)把它分成三段:
| 范围 | 名称 | 谁用 | 例子 |
|---|---|---|---|
| 0 ~ 1023 | 知名端口(Well-Known) | 系统服务,固定分配 | 22 SSH、53 DNS、80 HTTP、443 HTTPS |
| 1024 ~ 49151 | 注册端口(Registered) | 普通应用向 IANA 注册 | 3306 MySQL、7890 代理、8080 备用 HTTP |
| 49152 ~ 65535 | 动态端口(Dynamic / 临时端口) | 系统临时分配给客户端 | 本教程历史查询到Windows客户端动态范围为16384个;不是路由器PAT容量 |
Get-NetTCPConnection -State Listen | Select-Object -ExpandProperty LocalPort -Unique知名端口 (0-1023) : 3 个
注册端口 (1024-49151) : 28 个
动态端口 (49152-65535) : 23 个实测:本机在监听哪些端口
Get-NetTCPConnection -State Listen | Sort-Object LocalPort |
Select-Object -First 15 LocalPort, @{n='进程';e={(Get-Process -Id $_.OwningProcess).ProcessName}}实测结果(TCP):
| 端口 | 进程 | 是什么 |
|---|---|---|
| 135 | svchost | Windows RPC |
| 139 | System | NetBIOS 会话服务 |
| 445 | System | SMB 文件共享 |
| 1053 | verge-mihomo | 代理软件 |
| 3201 | node | (另一个项目的 dev server) |
| 5173 / 5174 | node | (前端项目的 dev server) |
| 5357 | System | Web 服务发现 |
| 7680 | svchost | Windows 更新投递优化 |
UDP 侧:
| 端口 | 进程 | 是什么 |
|---|---|---|
| 53 | svchost | DNS 客户端服务(《应用层》模块讲过:本机没有监听 198.18.0.2:53,代理是从 TUN 网卡截包的) |
| 137 / 138 | System | NetBIOS 名称服务与数据报服务 |
| 500 | svchost | IKE(IPsec 密钥交换) |
| 1900 | svchost | SSDP(即插即用设备发现,会往多播地址发通知) |
| 1053 | verge-mihomo | 代理软件 |
四元组:一条连接的唯一标识
一个端口号本身不能唯一确定一条连接。真正的标识是四元组:
源 IP 地址 + 源端口 + 目的 IP 地址 + 目的端口实测:本机一条真实的外出连接
LocalAddress LocalPort RemoteAddress RemotePort
192.168.31.215 65339 154.29.154.3 443解读:
- 本机用
192.168.31.215,源端口 65339(落在动态端口区间 49152~65535,是系统临时分配的) - 目标是
154.29.154.3的 443 端口(HTTPS)
为什么必须是四元组? 因为同一台机器可能同时:
- 用不同的源端口连同一个服务器(开多个页面)
- 用同一个源端口范围连不同的服务器
只有四元组才能唯一区分每一条连接。这也是 PAT(《网络层》模块)能工作的前提 —— 路由器改的就是四元组里的"源 IP + 源端口"两个字段。
UDP:不要连接,也能传数据
TCP 要先握手、要确认、要重传。这些机制都要花时间。 有些场景不需要这些 —— 于是有了 UDP。
UDP 报文头只有 8 个字节(对比 TCP 的 20 字节起):
| 字段 | 长度 | 作用 |
|---|---|---|
| 源端口 | 2 | 谁发的 |
| 目的端口 | 2 | 给谁 |
| 长度 | 2 | 整个 UDP 报文多长 |
| 校验和 | 2 | 校验 |
只有四个字段,仅此而已。 没有序号、没有确认号、没有窗口、没有标志位。
| TCP | UDP | |
|---|---|---|
| 要不要先建立连接 | 要(三次握手) | 不要 |
| 有没有序号和确认 | 有 | 没有 |
| 丢包会不会重传 | 会 | 不会 |
| 会不会保证顺序 | 会 | 不会 |
| 头部大小 | 20 字节起 | 8 字节 |
| 性能 | 取决于RTT、丢包、实现和业务 | 少了内建握手/恢复,但不保证总吞吐更高 |
UDP 用在哪些地方
| 场景 | 为什么用 UDP |
|---|---|
| DNS 查询 | 一次一问一答,建立连接的开销比查询本身还大 |
| 视频 / 语音通话 | 丢一帧画面无所谓,但不能等重传(等到了也过时了) |
| 在线游戏 | 要的是"最新位置",重传一个 200ms 前的坐标毫无意义 |
| DHCP | 设备还没有 IP 地址,根本没法建立 TCP 连接(见《DHCP》那一章) |
| QUIC / HTTP/3 | 在 UDP 之上自己实现了一套可靠传输(《应用层》模块会讲) |
共同特点:要么"丢了也没关系",要么"要快要省",要么"来不及等重传"。
实测:412 万个无人要的 UDP 数据报
这是本章最有意思的一个数字。看本机的 UDP 统计:
netstat -s -p udp实测输出:
UDP Statistics for IPv4
Datagrams Received = 134218107 收到 1.34 亿个数据报
No Ports = 4123543 其中 412 万个"没有对应端口"
Receive Errors = 0
Datagrams Sent = 261515295 发出 2.6 亿个No Ports = 4,123,543,占收到总数的 3.07%。
它的含义是:收到了一个 UDP 数据报,但本机没有任何程序在监听那个端口。
UDP 遇到"没人监听"会怎样
对比一下 TCP 和 UDP 在同样情况下的行为:
| 行为 | |
|---|---|
| TCP | 内核回一个 RST 报文(《运输层》模块后面会讲),发起方收到"连接被拒绝" |
| UDP | 内核丢弃无人接收的数据报;IPv4单播通常可回ICMP类型3代码3,但受禁止对广播/多播产生差错、过滤与限速等规则限制 |
注意这里的一个细节:《网络层》模块讲 ICMP 时说"ICMP 类型 3 代码 3 = 端口不可达" —— 那个报文的触发场景正是这里。你现在看到了它的来源:UDP 数据报打到了一个没人监听的端口。
为什么这个数字这么大(412 万)? 合理的原因有几类:
- 发现类协议的广播/多播:比如 SSDP(1900 端口)、NetBIOS(137/138)、mDNS(5353)—— 这些协议会定期往多播地址发包,本机也可能收到别家设备发的,但对应服务没开
- 扫描器和探测流量:互联网上永远有大量机器在扫描端口
- 应用退出后残留的连接:程序关了,但对方不知道,还在继续发
- 我的实验本身:本教程跑过多次网络测试
"UDP 不可靠"到底指什么
初学者容易把这个词理解成"UDP 经常丢包"。这是误解。
"不可靠"是一个协议层的表述,意思是:
注意"不提供保证"和"实际会丢"是两件事:
| 实际情况 | |
|---|---|
| 局域网内 UDP | 丢包率通常极低(线路质量好、没有拥塞) |
| 公网 UDP | 可能丢,尤其在拥塞或不稳定链路上 |
| 协议的责任 | 无论丢不丢,UDP 都不会管 —— 要可靠就在应用层自己实现 |
QUIC 就是最典型的例子:它是在UDP之上实现可靠传输、流和拥塞控制的传输协议,不能把QUIC简单归为应用层或等同于TCP机制原样搬家。这是 HTTP/3 的基础,《应用层》模块会讲。
常见误解
误解一:"端口是设备的一部分,像 IP 一样固定"
端口是传输层标识,不要求处于监听状态才有端口。客户端连接也有本地端口,可以由系统分配或应用显式绑定;关闭后还可能有TIME_WAIT等状态,下一次是否复用取决于系统和socket设置。RFC 9293 §3.3、§3.9
误解二:"UDP 比 TCP 快是因为协议更简单"
协议简单确实省开销,但真正的大头是省掉了握手、确认和重传的等待时间。对于一次只有一问一答的 DNS 查询,TCP 光握手就要一个往返(几十毫秒),而 UDP 直接发。
误解三:"用 UDP 就一定丢包"
不一定。 局域网里 UDP 可能一个都不丢。"不可靠"指的是协议不给你保证,不是"实际一定会丢"。要判断实际丢不丢,得看应用层的统计。
误解四:"No Ports 这么多说明机器有问题"
不一定是问题。 这些计数可以来自正常业务,也可能包含异常流量 —— 广播、多播、扫描流量都会造成这类计数。TCP 侧对应的数字是"Reset Connections",也是同理。
本章小结
| 结论 | 类型 |
|---|---|
| 端口是 16 位数字(0~65535),用来区分同一设备上的不同程序 | 标准 |
| 三段划分:0-1023 知名、1024-49151 注册、49152-65535 动态 | 标准 |
| 实测:本机监听端口分布为知名 3 / 注册 28 / 动态 23 | 实测 |
| 实测:本机 445(SMB)、139、137/138(NetBIOS)在监听,暴露到公网有风险 | 实测 |
| 一条连接由四元组唯一标识:源 IP + 源端口 + 目的 IP + 目的端口 | 标准 |
实测:本机一条外出连接为 192.168.31.215:65339 → 154.29.154.3:443 | 实测 |
| UDP 头仅 8 字节,无连接、无确认、不重传、不保序 | 标准 |
| IPv4单播UDP无人监听时可触发ICMP端口不可达;广播/多播等有例外 | RFC 1122 |
| 实测:本机收到 1.34 亿个 UDP 数据报,其中 412 万个无人监听(3.07%) | 实测 |
| "UDP 不可靠"指协议不提供保证,不等于实际一定丢包 | 标准 |
自测题
7 题 · 先自己答,再展开对照
你的电脑同时打开了 5 个网页,都连到同一台服务器的 443 端口。操作系统怎么区分这 5 条连接?
靠四元组区分 —— 源 IP、源端口、目的 IP、目的端口。这 5 条连接的目的部分完全一样(同一台服务器、同一个 443 端口),所以操作系统会给每条连接分配不同的本地源端口(落在 49152~65535 的动态区间),靠源端口把它们区分开。这也是《网络层》模块里 PAT 能工作的同一个原理。知名端口、注册端口、动态端口分别是哪几段?客户端发起连接时用的端口属于哪一段?
知名端口 0~1023,注册端口 1024~49151,动态端口 49152~65535。 客户端发起连接时用的是动态端口(由系统临时分配)—— 《网络层》模块实测过 Windows 的动态范围是 49152~65535,共 16384 个。注意:虽然叫"动态",但程序也可以主动绑定动态区间的端口来监听(历史实测记录就有 23 个)。UDP 报文头有几个字节?比 TCP 少掉了哪些字段?
8 个字节。 只有源端口、目的端口、长度、校验和四个字段。相比 TCP,它少掉了序号、确认号、标志位(SYN/ACK/FIN/RST)、窗口大小、紧急指针、以及可选项(如 MSS、SACK、窗口缩放)。少了这些,就没有可靠传输和流量控制的能力。一个 UDP 数据报打到了本机没人监听的端口,会发生什么?
IPv4单播UDP发到无人监听的端口,系统可返回ICMP类型3代码3并丢弃;广播/多播、过滤或限速等情况下未必返回。TCP端口拒绝通常使用RST。本机
No Ports计数有 412 万,占收到 UDP 数据报的 3%。这说明机器有问题吗?不能仅凭累计数判断健康或故障。应看时间窗口的增长、流量来源、进程和业务影响;广播/多播等情况也不是每次都返回ICMP差错。既然 UDP 不保证送达,为什么 DNS 查询和视频通话还用它?
因为对这两类场景来说,"快"比"绝对可靠"更重要。
- DNS:一次一问一答。用 TCP 的话光三次握手就要一个往返(几十毫秒),比查询本身还慢。丢了就重发一次查询,代价很小。
- 视频通话:丢一帧画面用户基本察觉不到,但等重传就完蛋了 —— 等 200 毫秒后收到一个"上一秒的画面",对实时通话毫无意义。宁可丢,也不要等。"UDP 不可靠"和"UDP 会丢包"是同一件事吗?
不是同一件事。 "不可靠"是协议层面的表述:UDP 不提供任何保证(不保证送达、顺序、去重)。而"实际会不会丢"取决于链路质量 —— 在局域网里 UDP 可能一个都不丢。协议不给保证,和实际一定出问题,是两回事。 需要可靠性的话,可以在应用层自己实现(QUIC 就是这么做的)。
参考资料与适用范围
- RFC 6335 §6:端口区间与分配
- RFC 768:UDP数据报格式
- RFC 1122 §1.1.3、§2–4:TCP/IP分层与主机要求
- RFC 9293 §3.3–3.10:TCP状态、建立关闭、字节流与接口
修订核对日期:2026-10-13。规则按所列协议与实现范围理解;文中的原始命令输出是历史观察,不表示本次重新实测。跨版本、代理/隧道及不同捕获位置需要另行核对。