互联网普及之后,软件的形态变了:从「装在本机」变成「跑在别处、用网络连」。 证据很好找:一台普通电脑上,正在监听的端口有几十个。
1.2.5 讲的是「名字怎么被翻译」,这一节讲「翻译通了之后软件怎么变」。 1.2.7 会把焦点收到一个具体问题上:连接建立了,但它是明文——这不行。
一、软件形态的三次搬家
每一次搬家的驱动力都一样:把重的东西放到少数几台机器上。
| 阶段 | 程序在哪跑 | 数据在哪 | 靠什么连 |
|---|---|---|---|
| 单机软件 | 本机 | 本机硬盘 | 不需要 |
| C/S | 本机 + 服务器 | 服务器 | 自定义协议 |
| B/S | 浏览器 | 服务器 | HTTP |
第三行那个「HTTP」是互联网成为中心的真正原因:浏览器只认一种协议,所有服务都得按它来。 这看起来是限制,实际是统一——统一之后,「装一个客户端」这件事就消失了。 代价也很明确:浏览器成了新的操作系统,谁控制浏览器,谁就控制了入口。
二、端口是「互联网化」的痕迹
判断一个软件是不是「联网软件」,最直接的办法是看它开没开端口。 一台普通 Windows 机器上的常态是这样:
| 端口 | 典型进程 | 干什么 |
|---|---|---|
| 135 | svchost | RPC,Windows 内部调用 |
| 445 | System | SMB 文件共享 |
| 5040 | svchost | 设备配对 |
| 随机高位 | 各种客户端 | 本地回环服务 |
第一行与第二行是最需要留意的两个:135 与 445 是历史上被利用最多的端口,
不该暴露在公网上。
第四行那些随机高位端口常常被忽视:它们是各种客户端开的本地服务(更新检查、设备发现、
推送通道),只绑 127.0.0.1 是安全的,绑 0.0.0.0 就麻烦了。
三、这个时代的两个副作用
中心化与依赖,是同一件事的两面:
| 副作用 | 表现 | 应对 |
|---|---|---|
| 服务不可用 | 服务器挂了全挂 | 冗余、多活 |
| 隐私外流 | 数据都在别人机器上 | 加密、本地化 |
| 入口垄断 | 浏览器与应用商店 | 标准与开源 |
第二行那个「数据在别人机器上」是这一节的现实注脚: B/S 架构把计算搬到了服务器,也把数据搬了过去。 所以「隐私」在网络时代不是一个附加功能,是架构问题——数据在哪,控制权就在哪。 这一点在选技术方案时值得先想清楚:能本地算的别上云,能少传的别多传。
四、动手 Demo:本机到底开了多少扇门
用 psutil 列出本机所有 TCP/UDP 连接,筛出处于 LISTEN 的那些,
按「地址 + 端口」去重,看有多少扇门开着、分别是谁开的。
注意监听地址那一列:127.0.0.1 与 0.0.0.0 安全性差一个量级。
import psutil
conns = psutil.net_connections(kind='inet')
listen = [c for c in conns if c.status == 'LISTEN']
print('连接记录 %d 条,其中监听 %d 条' % (len(conns), len(listen)))
seen = set()
for c in sorted(listen, key=lambda x: x.laddr.port):
key = (c.laddr.ip, c.laddr.port)
if key in seen:
continue
seen.add(key)
try:
who = psutil.Process(c.pid).name() if c.pid else '-'
except Exception:
who = '-'
print('%-16s %-6d %s' % (c.laddr.ip, c.laddr.port, who))
实跑输出:
--------------------------------------------------------------------
本机到底开了多少扇门
--------------------------------------------------------------------
**「以互联网技术为中心」的一个副作用**:**每装一个软件,机器上就多几个监听端口。**数一下就知道。
**这台机器当前有 269 条网络连接记录,其中 47 条在监听。**
监听地址 端口 进程
----------------------------------------------
:: 135 svchost.exe
0.0.0.0 135 svchost.exe
192.168.3.152 139 System
:: 445 System
0.0.0.0 445 System
127.0.0.1 1971 QyClient.exe
127.0.0.1 1981 QyClient.exe
127.0.0.1 1991 QyClient.exe
0.0.0.0 5040 svchost.exe
127.0.0.1 5283 SOGOUSmartAssistan
127.0.0.1 8890 dgservice.exe
127.0.0.1 8901 douyin_widget.exe
**表里只放前 12 条,去重后一共 45 个「地址 + 端口」组合**(47 条监听记录里有重复,
同一个端口在 IPv4 与 IPv6 上各占一条)。
**注意「监听地址」那一列**:`127.0.0.1` 只有本机能连,`0.0.0.0` 是所有网卡都能连。
**这两个写法差一个字,安全性差一个数量级。**
监听记录条数比去重后的组合数多,因为同一个端口在 IPv4 与 IPv6 上各占一条。
这台机器上有 47 条监听记录、去重后 45 个组合——只差两条,说明双栈监听的端口并不多。
127.0.0.1 与 0.0.0.0 的区别要记牢:前者只有本机能连,后者所有网卡都接受。
一个开发服务器绑错地址,就可能把调试接口暴露到整个局域网。
30 秒实验
- 把
kind='inet'改成kind='tcp',看数量少了多少——少掉的是 UDP。 - 统计
127.0.0.1与0.0.0.0各有多少个,想想哪些是必须对外开的。 - 关掉一个你认识的软件,再跑一次,看哪个端口消失了。
常见误区
- 以为端口开得多就是中毒了。 现代系统开几十个监听端口是常态,关键看是哪些端口、 绑的什么地址。
- 以为
0.0.0.0比127.0.0.1更方便所以更好。 方便是对方的方便,代价是暴露面。 能本地就别对外。 - 以为 B/S 架构只是「不用装客户端」。 它改变了数据归属,数据从你的硬盘搬到了别人机房。 这是架构问题,不是体验问题。
自测三问(点开对答案)
1. 为什么浏览器统一用 HTTP 是「互联网成为中心」的关键? —— **统一协议意味着「装客户端」这件事消失了**,任何服务只要说 HTTP 就能被访问。 **统一带来普及,也带来入口垄断。** 2. 监听地址 `127.0.0.1` 与 `0.0.0.0` 有什么本质区别? —— **前者只接受本机连接,后者接受所有网卡的连接。**开发时绑错地址, 等于把调试接口暴露给整个局域网。 3. 为什么说「隐私是架构问题,不是附加功能」? —— **因为数据存在哪里由架构决定**。B/S 架构把数据放到服务器,控制权随之转移。 **要在架构层面减少外传,而不是事后加密补救。**下一节收窄到一个具体问题:连接建起来了,但路上跑的是明文——这在今天不可接受。
- ☐ (本节完,下一节 1.2.7 从【单纯建立连接】到【安全建立连接】)