📚 第一章 网络基础知识
📄 一句话概括

互联网普及之后,软件的形态变了:从「装在本机」变成「跑在别处、用网络连」。 证据很好找:一台普通电脑上,正在监听的端口有几十个。

📝 本节和前面几节的关系

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 秒实验

  1. 把 kind='inet' 改成 kind='tcp',看数量少了多少——少掉的是 UDP。
  2. 统计 127.0.0.1 与 0.0.0.0 各有多少个,想想哪些是必须对外开的。
  3. 关掉一个你认识的软件,再跑一次,看哪个端口消失了。

常见误区

  1. 以为端口开得多就是中毒了。 现代系统开几十个监听端口是常态,关键看是哪些端口、 绑的什么地址。
  2. 以为 0.0.0.0 比 127.0.0.1 更方便所以更好。 方便是对方的方便,代价是暴露面。 能本地就别对外。
  3. 以为 B/S 架构只是「不用装客户端」。 它改变了数据归属,数据从你的硬盘搬到了别人机房。 这是架构问题,不是体验问题。
自测三问(点开对答案) 1. 为什么浏览器统一用 HTTP 是「互联网成为中心」的关键? —— **统一协议意味着「装客户端」这件事消失了**,任何服务只要说 HTTP 就能被访问。 **统一带来普及,也带来入口垄断。** 2. 监听地址 `127.0.0.1` 与 `0.0.0.0` 有什么本质区别? —— **前者只接受本机连接,后者接受所有网卡的连接。**开发时绑错地址, 等于把调试接口暴露给整个局域网。 3. 为什么说「隐私是架构问题,不是附加功能」? —— **因为数据存在哪里由架构决定**。B/S 架构把数据放到服务器,控制权随之转移。 **要在架构层面减少外传,而不是事后加密补救。**

下一节收窄到一个具体问题:连接建起来了,但路上跑的是明文——这在今天不可接受。

相关笔记