← 网络基础学习第 16 / 55 章基础35 分钟

模块二 · 运输层

端口与 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容量
实测:本机监听端口的区间分布powershell
Get-NetTCPConnection -State Listen | Select-Object -ExpandProperty LocalPort -Unique
知名端口 (0-1023)      :  3 个
注册端口 (1024-49151)  : 28 个
动态端口 (49152-65535) : 23 个

实测:本机在监听哪些端口

示例powershell
Get-NetTCPConnection -State Listen | Sort-Object LocalPort |
  Select-Object -First 15 LocalPort, @{n='进程';e={(Get-Process -Id $_.OwningProcess).ProcessName}}

实测结果(TCP):

端口进程是什么
135svchostWindows RPC
139SystemNetBIOS 会话服务
445SystemSMB 文件共享
1053verge-mihomo代理软件
3201node(另一个项目的 dev server)
5173 / 5174node(前端项目的 dev server)
5357SystemWeb 服务发现
7680svchostWindows 更新投递优化

UDP 侧:

端口进程是什么
53svchostDNS 客户端服务(《应用层》模块讲过:本机没有监听 198.18.0.2:53,代理是从 TUN 网卡截包的)
137 / 138SystemNetBIOS 名称服务与数据报服务
500svchostIKE(IPsec 密钥交换)
1900svchostSSDP(即插即用设备发现,会往多播地址发通知)
1053verge-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校验

只有四个字段,仅此而已。 没有序号、没有确认号、没有窗口、没有标志位。

TCPUDP
要不要先建立连接要(三次握手)不要
有没有序号和确认有没有
丢包会不会重传会不会
会不会保证顺序会不会
头部大小20 字节起8 字节
性能取决于RTT、丢包、实现和业务少了内建握手/恢复,但不保证总吞吐更高

UDP 用在哪些地方

场景为什么用 UDP
DNS 查询一次一问一答,建立连接的开销比查询本身还大
视频 / 语音通话丢一帧画面无所谓,但不能等重传(等到了也过时了)
在线游戏要的是"最新位置",重传一个 200ms 前的坐标毫无意义
DHCP设备还没有 IP 地址,根本没法建立 TCP 连接(见《DHCP》那一章)
QUIC / HTTP/3在 UDP 之上自己实现了一套可靠传输(《应用层》模块会讲)

共同特点:要么"丢了也没关系",要么"要快要省",要么"来不及等重传"。

实测:412 万个无人要的 UDP 数据报

这是本章最有意思的一个数字。看本机的 UDP 统计:

示例powershell
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 题 · 先自己答,再展开对照

  1. 你的电脑同时打开了 5 个网页,都连到同一台服务器的 443 端口。操作系统怎么区分这 5 条连接?
    靠四元组区分 —— 源 IP、源端口、目的 IP、目的端口。这 5 条连接的目的部分完全一样(同一台服务器、同一个 443 端口),所以操作系统会给每条连接分配不同的本地源端口(落在 49152~65535 的动态区间),靠源端口把它们区分开。这也是《网络层》模块里 PAT 能工作的同一个原理。
  2. 知名端口、注册端口、动态端口分别是哪几段?客户端发起连接时用的端口属于哪一段?
    知名端口 0~1023,注册端口 1024~49151,动态端口 49152~65535。 客户端发起连接时用的是动态端口(由系统临时分配)—— 《网络层》模块实测过 Windows 的动态范围是 49152~65535,共 16384 个。注意:虽然叫"动态",但程序也可以主动绑定动态区间的端口来监听(历史实测记录就有 23 个)。
  3. UDP 报文头有几个字节?比 TCP 少掉了哪些字段?
    8 个字节。 只有源端口、目的端口、长度、校验和四个字段。相比 TCP,它少掉了序号、确认号、标志位(SYN/ACK/FIN/RST)、窗口大小、紧急指针、以及可选项(如 MSS、SACK、窗口缩放)。少了这些,就没有可靠传输和流量控制的能力。
  4. 一个 UDP 数据报打到了本机没人监听的端口,会发生什么?
    IPv4单播UDP发到无人监听的端口,系统可返回ICMP类型3代码3并丢弃;广播/多播、过滤或限速等情况下未必返回。TCP端口拒绝通常使用RST。
  5. 本机 No Ports 计数有 412 万,占收到 UDP 数据报的 3%。这说明机器有问题吗?
    不能仅凭累计数判断健康或故障。应看时间窗口的增长、流量来源、进程和业务影响;广播/多播等情况也不是每次都返回ICMP差错。
  6. 既然 UDP 不保证送达,为什么 DNS 查询和视频通话还用它?
    因为对这两类场景来说,"快"比"绝对可靠"更重要。
    - DNS:一次一问一答。用 TCP 的话光三次握手就要一个往返(几十毫秒),比查询本身还慢。丢了就重发一次查询,代价很小。
    - 视频通话:丢一帧画面用户基本察觉不到,但等重传就完蛋了 —— 等 200 毫秒后收到一个"上一秒的画面",对实时通话毫无意义。宁可丢,也不要等。
  7. "UDP 不可靠"和"UDP 会丢包"是同一件事吗?
    不是同一件事。 "不可靠"是协议层面的表述:UDP 不提供任何保证(不保证送达、顺序、去重)。而"实际会不会丢"取决于链路质量 —— 在局域网里 UDP 可能一个都不丢。协议不给保证,和实际一定出问题,是两回事。 需要可靠性的话,可以在应用层自己实现(QUIC 就是这么做的)。

参考资料与适用范围

修订核对日期:2026-10-13。规则按所列协议与实现范围理解;文中的原始命令输出是历史观察,不表示本次重新实测。跨版本、代理/隧道及不同捕获位置需要另行核对。

正文源自 m2-01-端口与UDP.md · 共 12 节 · 7 道自测题