🌐 第三章 网络间的通用语言TCP/IP
📄 一句话概括

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 个 客户端临时借用,用完就还

几句话把三段的脾气说清:

⚠️ 一个小陷阱:TCP 和 UDP 是两套独立的编号空间

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 远程桌面——暴露在公网上会被暴力破解,需谨慎

读这张表的三个抓手:

  1. 网页双雄 80 / 443:80 是明文(现在浏览器输入网址默认已经跳到 443),443 是加密。所以你在 3.12 Demo 里看到的一堆 :443 连接,全是加密网页。
  2. DNS 双协议 53:这一条解释了为什么 2.4 起就有的"ping 不通先查 DNS"会有两种表现——UDP 查询不通和 TCP 查询不通,可能是同一个端口被不同原因挡住。
  3. 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 就是让你亲手把这条链走通:从端口号 → 找到是哪个程序。

  1. 看谁在守号(含 PID) netstat -ano | findstr LISTENING 比 3.3 那次多了一个 -o:最右列多出 PID(进程编号)。这一列就是通往"程序"的钥匙。

读法与 3.3 相同:0.0.0.0:端口 表示在所有网卡上守号,127.0.0.1:端口 表示只许本机访问。

  1. 本节最关键的一步:把端口号翻译成程序名 tasklist | findstr 1234 (把 1234 换成上一步里你好奇的那个 PID)

输出这一行就是那个程序的名字——端口号 → PID → 程序,链条闭合。这一步真正做到"根据端口号找到应用程序"。

  1. 只挑自己关心的端口看 netstat -ano | findstr :443 netstat -ano | findstr :3389 前者应该有一批"你正在访问的加密网站",后者如果有记录但你没在用远程桌面,那就要警惕了(445 / 3389 暴露在公网是常见的安全隐患)。

  2. 30 秒实验:找出一个"意外在守号"的程序

    跑 netstat -ano | findstr LISTENING,挑一个你不认识的端口(比如 135、445、5040 这些 Windows 系统服务),照第 2 步查出它的进程名。

    你多半会发现:你的电脑一直在公开监听好几个端口,而你从来不知道。 这正是"端口是程序的房间号"最直观的证据——每个在守号的程序,都在网上开着一扇门。

  3. (扩展)看临时端口池有多大 netsh int ipv4 show dynamicport tcp 能看到系统给客户端留的动态端口范围(Windows 默认从 49152 起、共 16384 个)。这就是你今晚能同时发起的连接数上限。

❓ 自测一下
  1. 有 IP 地址就够了,为什么还要端口号?
  2. 端口号的范围是多少?为什么是这个数?
  3. 三段划分各是什么,分别给谁用?
  4. 为什么客户端要用动态端口,而不固定用一个号?
  5. ping 命令能不能指定端口号?为什么?
  6. TCP 的 53 号端口和 UDP 的 53 号端口,是同一个门吗?
  7. 为什么程序员试手爱用 8080 而不是 80?
  8. "把端口改成 54321 就更安全"这句话错在哪?
  9. 从 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 → 程序名。

九、常见误区

  1. ❌ "端口号可以随便用" → 0~1023 是已知端口,属于公共资源不能乱占(Linux 下 1024 以下还要管理员权限);试手请用 1024 以上
  2. ❌ "ping 后面可以跟端口号" → ICMP 没有端口号(不进传输层)。所以 ping 通 ≠ 网页服务正常,两件事要分开测
  3. ❌ "TCP 和 UDP 共用一个端口池" → 两套独立编号,53/TCP 与 53/UDP 是两个不同的门
  4. ❌ "客户端也固定用一个端口" → 客户端用动态端口,每条连接换一个;固定的是服务端
  5. ❌ "换个大端口号服务就藏起来了" → 端口扫描几分钟扫完全部 65535 个,藏不住。安全靠认证加密
  6. ❌ "端口就是设备上的插口" → 那是 2.3 的物理端口;本节的是 0~65535 的编号
  7. ❌ "一个端口可以给多个程序同时用" → 同一端口同一时刻只能被一个程序监听(否则报 Address already in use)。想在一台机器上跑多个网站,靠的是虚拟主机或反向代理
  8. ❌ "网站打不开就是网络故障" → 先分清两层:ping 通(网络层没事)而端口不通(程序没起 / 防火墙拦)——这是最典型的"网络好、服务坏"

十、下一步学什么

相关笔记