IP 地址只能把数据送到哪台电脑,可电脑里同时跑着几十个程序(浏览器、微信、游戏、下载工具),数据到了之后该交给哪一个?答案是 端口号——一个 0~65535 的编号,相当于给电脑里的每个网络程序分一个"房间号"。本节讲的就是这套编号制度:范围怎么划、哪些号是"公家"的、谁守号谁借号。
3.3 说"IP 找楼、端口找房"但只给了个名册开头;3.12 的 DHCP 四步其实就跑在 67/68 这两个号上;3.14 的 NAT 会话表内网侧那一列就是本节的主角;3.15 说的"差错报文带原包前 8 字节(里面是端口)"——本节把端口的身份彻底讲清。
一、要解决的问题:数据到了电脑,给谁?
先看一个场景。你的电脑上此刻大概同时开着:
| 程序 | 在干什么 |
|---|---|
| 浏览器 | 正在请求 www.baidu.com 的网页 |
| 微信 | 正在收消息 |
| 音乐软件 | 正在拉在线歌曲 |
| 系统更新 | 正在偷偷下载补丁 |
这四条数据流全都涌向你这一个 IP 地址。IP 层把它们送达你的电脑就交差了——可接下来呢?哪个包该给浏览器、哪个该给微信?
这就是 3.3 那句话的完整意思:
IP 地址负责"送到哪台电脑",端口号负责"送给电脑里的哪个程序"。
一台电脑只有一个 IP,但要靠端口号分辨出成百上千条并发通信——这就是端口号存在的全部理由。
端口号住在传输层(TCP/UDP 的头部里),但它服务的是应用层的程序——所以端口号是"上两层之间的接口"。
准确说:端口是给"程序"分配的,不是给"电脑"分配的。 同一个程序换个端口号,通信对象就要重新找它。
二、编号空间:为什么是 0~65535
端口号是 16 位——这个信息来自 3.3 提到的 TCP/UDP 头部结构:
2¹⁶ = 65536 个编号 → 0 ~ 65535
光有数量还不够,还得分类管理——否则人人都去占 80,天下大乱。于是这 65536 个号被切成三段。
三、三段划分(本节第一张图)
| 段 | 范围 | 数量 | 谁在用 |
|---|---|---|---|
| 已知端口(Well-Known Ports) | 0 ~ 1023 |
1024 个 | 固定分给知名服务,写死在标准里,谁也不能改 |
| 注册端口(Registered Ports) | 1024 ~ 49151 |
48128 个 | 厂商给自己软件登记用,靠约定不靠强制 |
| 动态端口(Private / Dynamic Ports) | 49152 ~ 65535 |
16384 个 | 客户端临时借用,用完就还 |
几句话把三段的脾气说清:
- 已知端口是"公家号":全世界统一。你打开任何一台服务器,
443一定在说 HTTPS。这是互联网能互通的前提——不然你想访问一个网站,得先问对方"你家网页在哪个号上"。 - 注册端口是"登记号":不像已知端口那样全球强制,但大家都自觉遵守。
3306是 MySQL、3389是远程桌面、8080常被程序员拿来当"网页测试口"。 - 动态端口是"散客号":客户端的出口号。你的电脑去访问百度,系统会从这一段随手借一个(比如
52001),这条连接用完就还回去。3.14 里netstat看到的高位端口就是它们。
53 号 TCP 和 53 号 UDP 是两个不同的门——DNS 查询平时走 UDP 53,遇到大数据或区域传送时切到 TCP 53。
所以端口的完整身份是三件套:IP + 协议(TCP/UDP) + 端口号。只说"53 号"是不够的。
四、已知端口号名册(本节核心)
会认级别,但下面这张表值得存下来——平时排障、看日志、配防火墙全靠它:
| 端口 | 协议 | 服务 | 说明 |
|---|---|---|---|
| 20 / 21 | TCP | FTP | 20 传数据、21 发命令(3.14 说的"FTP 主动模式撞 NAT"就发生在这两个号上) |
| 22 | TCP | SSH | 加密远程登录(服务器运维的日常入口) |
| 23 | TCP | Telnet | 明文远程登录,已淘汰(内容全裸奔) |
| 25 | TCP | SMTP | 发邮件 |
| 53 | TCP / UDP | DNS | 域名翻译。查询走 UDP、大响应和区域传送走 TCP |
| 67 / 68 | UDP | DHCP | 67 是服务器、68 是客户端——3.12 的 DORA 四步就跑在这两个号上 |
| 80 | TCP | HTTP | 普通网页 |
| 110 | TCP | POP3 | 收邮件(老式,下载即删) |
| 143 | TCP | IMAP | 收邮件(邮件留在服务器,多设备同步) |
| 161 | UDP | SNMP | 网络设备监控(交换机、路由器上报状态) |
| 443 | TCP | HTTPS | 加密网页(现在的默认) |
| 445 | TCP | SMB | Windows 文件共享——也是勒索病毒最爱的入口,公网上务必关掉 |
| 3389 | TCP | RDP | Windows 远程桌面——暴露在公网上会被暴力破解,需谨慎 |
读这张表的三个抓手:
- 网页双雄
80/443:80是明文(现在浏览器输入网址默认已经跳到443),443是加密。所以你在 3.12 Demo 里看到的一堆:443连接,全是加密网页。 - DNS 双协议
53:这一条解释了为什么 2.4 起就有的"ping 不通先查 DNS"会有两种表现——UDP 查询不通和 TCP 查询不通,可能是同一个端口被不同原因挡住。 - DHCP 的
67/68:这是对 3.12 的正式补票。当时讲的"Discover 广播找人",具体就是客户端从68号发广播、目标67号。也正因为此刻客户端还没有 IP(源地址写0.0.0.0),才必须用广播(3.9)。
不用背全表,记你天天在用的那五六个就够:80/443 网页、53 DNS、22 SSH、25 邮件、67/68 DHCP。
剩下的遇到再查——关键不是背下来,而是知道"有已知端口这么个制度",遇到陌生端口会去查表。
五、谁守号、谁借号(本节第二张图)
这是端口号在通信两端完全不同的两个角色,也是全节最实用的一条规矩:
| 服务端(服务器) | 客户端(你的电脑) | |
|---|---|---|
| 用什么号 | 已知端口(80、443…) |
动态端口(临时借一个) |
| 号是固定的吗 | 固定,24 小时守着 | 每次连接都换 |
| 谁定的 | 国际标准 + 程序写死 | 操作系统随手分配 |
| 状态 | 一直 Listening(在听) | 用的时候才占,用完就还 |
| 数量 | 一个服务一个号 | 一条连接占一个号 |
这两条合起来才是完整的一笔交易:你的电脑从 52001 出发,敲服务器的 443 门。服务器回包时,目标就写 52001——它靠这个号知道该把货退回给"你电脑上的那个浏览器"。
服务器守固定号(找得到),客户端借临时号(认得出)。
前者让全世界能统一找到服务,后者让回来的数据能分清是哪一条连接——两个角色缺一不可。
顺带解释一件事:客户端的动态端口只有 16384 个(49152~65535),所以一台电脑同时能发起的连接数是有限的。浏览器开几百个标签卡住,有一部分原因就在这里(大量连接还没释放,把临时号池占满了)。
六、"端口"这个词的三个意思(辨析)
这个词在计算机网络里被反复用在不完全一样的地方,容易串:
| 说法 | 指什么 | 出处 |
|---|---|---|
| 物理端口 | 设备身上的插座(RJ45 网口、光纤口) | 2.3 |
| 软件端口 / 端口号 | 0~65535 的编号,纯逻辑概念 |
本节 |
| 端口转发 / 端口映射 | 路由器里的一条转发规则,用到的还是软件端口号 | 3.14 |
判据:能用手摸到、能数出"这台交换机有 24 个端口"的 → 物理端口;写成数字、出现在 netstat 里的 → 软件端口号。
2.3 当时那句"物理端口 ≠ TCP 软件端口"的警示,到这里才算真正兑现。
七、几条实战规矩
1. 同一个端口,同一时刻只能被一个程序占
[Errno 98] Address already in use
写 Java 或 Python 网络程序时最常见的一个报错——你指定的那个号已经被别的程序占了。解决办法:要么关掉原程序,要么换个号。
这也解释了为什么程序员总爱用 8080、8081、3000 这些注册端口试手——80 号上有系统服务在守着,占不了。
2. 服务端"监听"和"连接"是两种状态
| 状态 | 含义 | 谁在 |
|---|---|---|
| LISTENING | 门开着,等客人来 | 服务器程序 |
| ESTABLISHED | 门通了,正在通话 | 双方 |
3.5 的 netstat 命令里,这两个词就是本节概念的实物。一台服务器上有多少 LISTENING,就说明它对外开了多少个服务。
3. 防火墙是按"端口"放行的
防火墙的规则几乎都是这个形状:
允许 / 拒绝 某个端口 某个方向
所以"网站打不开但 ping 得通"是最常见的一种故障形态——网络通(ICMP 过得去)、但 80/443 被拦或程序没起。这两个层面在防火墙里是分开管的。
4. 换端口 ≠ 更安全
有人想"我把管理后台从 80 改到 54321,别人就找不到了"——这是错的。端口扫描工具(如 nmap)几分钟就能把 65535 个号全试一遍。
安全性来自认证和加密,不来自"藏号码"。 这是本节最值得记住的安全观。
八、动手 Demo31:从端口号反查程序
本节标题叫"根据端口号分配数据到应用程序"——这个 Demo 就是让你亲手把这条链走通:从端口号 → 找到是哪个程序。
- 看谁在守号(含 PID)
netstat -ano | findstr LISTENING比 3.3 那次多了一个-o:最右列多出 PID(进程编号)。这一列就是通往"程序"的钥匙。
读法与 3.3 相同:0.0.0.0:端口 表示在所有网卡上守号,127.0.0.1:端口 表示只许本机访问。
- 本节最关键的一步:把端口号翻译成程序名
tasklist | findstr 1234(把1234换成上一步里你好奇的那个 PID)
输出这一行就是那个程序的名字——端口号 → PID → 程序,链条闭合。这一步真正做到"根据端口号找到应用程序"。
-
只挑自己关心的端口看
netstat -ano | findstr :443 netstat -ano | findstr :3389前者应该有一批"你正在访问的加密网站",后者如果有记录但你没在用远程桌面,那就要警惕了(445 / 3389 暴露在公网是常见的安全隐患)。 -
30 秒实验:找出一个"意外在守号"的程序
跑
netstat -ano | findstr LISTENING,挑一个你不认识的端口(比如135、445、5040这些 Windows 系统服务),照第 2 步查出它的进程名。你多半会发现:你的电脑一直在公开监听好几个端口,而你从来不知道。 这正是"端口是程序的房间号"最直观的证据——每个在守号的程序,都在网上开着一扇门。
-
(扩展)看临时端口池有多大
netsh int ipv4 show dynamicport tcp能看到系统给客户端留的动态端口范围(Windows 默认从49152起、共16384个)。这就是你今晚能同时发起的连接数上限。
- 有 IP 地址就够了,为什么还要端口号?
- 端口号的范围是多少?为什么是这个数?
- 三段划分各是什么,分别给谁用?
- 为什么客户端要用动态端口,而不固定用一个号?
ping命令能不能指定端口号?为什么?- TCP 的 53 号端口和 UDP 的 53 号端口,是同一个门吗?
- 为什么程序员试手爱用 8080 而不是 80?
- "把端口改成 54321 就更安全"这句话错在哪?
- 从
netstat的哪一列能一路查到程序名?
答案:
① 因为 IP 只能定位到电脑,而电脑里同时跑着几十个网络程序;端口号负责把数据分给正确的程序——"IP 找楼、端口找房"。
② 0 ~ 65535,共 65536 个。因为端口号字段是 16 位,2¹⁶ = 65536。
③ 已知端口 0~1023(固定分给知名服务,如 80/443/53)、注册端口 1024~49151(厂商登记使用,如 3306/3389/8080)、动态端口 49152~65535(客户端临时借用)。
④ 因为客户端数量海量、连接又是短时的——固定号会撞车,临时号才能"用完就还、自动回收"。同时回来的数据靠这个临时号分辨属于哪条连接。
⑤ 不能。ping 用的是 ICMP,而 ICMP 直接在网际层工作、不经过传输层,压根没有端口号这个概念。这也意味着:ping 通只说明网络通,不代表 80/443 上的程序在正常守着。
⑥ 不是。TCP 和 UDP 是两套独立的编号空间(各 0~65535),53/TCP 与 53/UDP 是两个不同的门。端口的完整身份是 IP + 协议 + 端口号。
⑦ 因为 80 属于已知端口,通常被系统服务或已有程序占据;8080 在注册端口段里,随便用,不跟系统抢号。
⑧ 因为端口扫描工具(nmap 之类)能把 65535 个号全试一遍,换号只是"藏",不是"防"。安全靠认证与加密,不靠隐藏。
⑨ PID 列(netstat -ano 的 -o 参数带出来的),再用 tasklist | findstr <PID> 查出进程名——端口号 → PID → 程序名。
九、常见误区
- ❌ "端口号可以随便用" →
0~1023是已知端口,属于公共资源不能乱占(Linux 下 1024 以下还要管理员权限);试手请用1024以上 - ❌ "ping 后面可以跟端口号" → ICMP 没有端口号(不进传输层)。所以
ping通 ≠ 网页服务正常,两件事要分开测 - ❌ "TCP 和 UDP 共用一个端口池" → 两套独立编号,
53/TCP与53/UDP是两个不同的门 - ❌ "客户端也固定用一个端口" → 客户端用动态端口,每条连接换一个;固定的是服务端
- ❌ "换个大端口号服务就藏起来了" → 端口扫描几分钟扫完全部 65535 个,藏不住。安全靠认证加密
- ❌ "端口就是设备上的插口" → 那是 2.3 的物理端口;本节的是
0~65535的编号 - ❌ "一个端口可以给多个程序同时用" → 同一端口同一时刻只能被一个程序监听(否则报
Address already in use)。想在一台机器上跑多个网站,靠的是虚拟主机或反向代理 - ❌ "网站打不开就是网络故障" → 先分清两层:
ping通(网络层没事)而端口不通(程序没起 / 防火墙拦)——这是最典型的"网络好、服务坏"
十、下一步学什么
- ☑ 3.18 对应用程序的数据进行可靠传输(TCP) ✅ 已完成 —— 对应用程序的数据进行可靠传输(TCP):本节那个"0~65535 的编号",就是它报文头里最前面那 32 位的出处;端口分完房之后,接下来的活是保证房里的数据一个字节都不少
- ☐ 3.19(按教材顺序) —— 报个标题接着走:按教材脉络,接下来大概率是 UDP(不可靠但快的那一半)、DNS 与域名,或 第三章小结。等你报标题。
相关笔记
- 对应用程序的数据进行可靠传输(TCP) —— 下一节:端口号就是 TCP 头里的源/目的端口两个字段;本节那个"临时号池只有 16384 个"的上限,到那里有了第二重解释(一条连接一本账)
- 为驱动应用程序而做准备的网络分层(传输层与应用层) —— "IP 找楼、端口找房"的最早出处,本节把它从一个比喻展开成一套完整制度
- 连接网络的过程(IP地址的设置) —— DHCP 的 DORA 四步具体跑在 67/68 这两个已知端口上,本节把它补全了
- 从私有网络到互联网间的通信(NAT) —— NAT 会话表"内网侧"那一列全是动态端口;NAPT 靠端口区分设备,用的正是本节的编号空间
- 数据是否成功传输给接收方(ICMP) —— 差错报文带的那"前 8 字节"里装的正是源端口与目的端口;也说明了为什么 ping 没有端口
- 接收和传输数据的规则(使用TCP/IP进行通信) ——
netstat里的 LISTENING / ESTABLISHED,就是"守号"与"通话中"两种状态 - 数据的称谓(信息、数据段、数据包、数据帧) —— 端口号印在"数据段"的头部里
- 是谁在负责收发数据(应用程序、P2P应用) —— "电脑本身不上网、程序才上网",端口号就是这句话的制度保证
- 网络的具体结构(接口(端口)、链路) —— 物理端口 vs 软件端口,本节把这条辨析彻底结清
- TCP通信 ——
ServerSocket(8080)里的 8080 就是注册端口,Address already in use报错的根源也在本节