把两台电脑用一根线连起来,它们并不会自动开始交流——就像把两个语言不通的人关在一个房间里。要通信,双方必须事先约定好一套共同的规则:先说什么、后说什么、出错了怎么办、怎么确认对方收到了。
这套约定好的规则,就叫 协议(protocol)。你听过的 HTTP、TCP、IP、DNS、Wi-Fi……全都是协议。计算机网络的本质,就是一大堆协议互相配合,让数据可靠地从一台机器搬到另一台机器。
网络通信很像寄快递:你写好信(数据),装进信封写上地址(加上头部信息),交给快递网络层层转运(路由器转发),对方收到后拆开信封读信(解析数据)。这个类比会贯穿整页。
问题来了:通信涉及的事情太多——电信号怎么传?地址怎么编?丢包了怎么补发?网页格式长什么样?把这些全塞进一个协议会复杂到无法维护。于是工程师们用了一招经典手法:分层。
每一层只解决一类问题,并且只依赖下一层提供的服务、为上一层提供服务。这样每层可以独立演化:换 Wi-Fi 还是网线,上面的 HTTP 完全不用知道。
经典教材讲 OSI 七层模型(理论参考),而现实世界跑的是更务实的 TCP/IP 四层模型。点击任意一层查看它的职责:
从上往下记四层的关键词:应用层管「内容长什么样」,传输层管「端到端送没送到」,网络层管「往哪个方向转发」,链路层管「这一跳怎么物理传过去」。
当你发送一个 HTTP 请求时,数据会自上而下穿过每一层。每经过一层,就被套上一个该层的「头部」(header)——就像信纸装进信封、信封再装进快递盒。这个过程叫 封装(encapsulation);接收方则反过来层层拆开,叫解封装。
注意每层打包后的名字会变:应用层叫数据,加上 TCP 头叫段(segment),加上 IP 头叫包(packet),加上帧头帧尾叫帧(frame),最后变成线缆上的比特流。面试和抓包工具里这些词会反复出现。
要把包送到对方手里,先得有地址。IPv4 地址本质上就是一个 32 位的二进制数,为了方便人读,按 8 位一组写成四段十进制,如 192.168.1.10。
地址被分成两部分:前面的网络位(标识「哪个小区」)和后面的主机位(标识「哪一户」)。斜杠后的数字(如 /24)叫前缀长度,表示前多少位是网络位。改一改下面的 IP 和前缀试试:
试着把前缀从 /24 拖到 /16:网络位变少、主机位变多,这个网络能容纳的设备从 254 台暴涨到 6 万多台。同一网络内的机器可以直接互相通信;跨网络则必须经过路由器转发。
32 位只有约 42.9 亿个地址,早就不够全人类用了。IPv6 把地址扩到 128 位(如 2001:db8::1),数量多到可以给地球上每粒沙子分配无数个。过渡期内两者并存,家用网络还普遍靠 NAT(让全家共用一个公网 IPv4)续命。
IP 只负责「尽力把包扔过去」,不保证送达、不保证顺序。TCP 在它之上补齐了可靠性:编号、确认、重传、排序。而这一切的前提是双方先建立连接、同步好初始序号——这就是著名的三次握手。
为什么是三次而不是两次?因为双方都需要确认「我能发出去、也能收到对方的回应」。两次只能证明一个方向通畅;三次刚好让双方各完成一次「发送 + 收到确认」。
断开连接要四次挥手(FIN → ACK → FIN → ACK)。多出一次是因为 TCP 是全双工的:一方说「我说完了」(FIN)后,另一方可能还有数据要发,所以「确认收到」和「我也说完了」要分开发送。
人类记不住 104.18.25.30 这种数字,于是有了域名。DNS(域名系统)就是互联网的电话簿:把 example.com 翻译成 IP 地址。它是一个巨大的分布式分层数据库——没有任何一台服务器知道所有答案,但顺着层级问下去总能问到。
完整的递归查询其实很少发生:浏览器、操作系统、路由器、运营商的解析器都会按 TTL(生存时间)缓存结果。这也是为什么改了域名解析后「要等一会儿才生效」——旧记录还在各级缓存里没过期。
连接建好了、地址查到了,终于轮到应用层说正事。HTTP 是浏览器和服务器之间的对话格式,本质就是一来一回的纯文本(HTTP/2 之后变成二进制,但语义不变):客户端发请求,服务器回响应。
GET /index.html HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 … Accept: text/html Cookie: session=a1b2c3
HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 1256 Cache-Control: max-age=600 <!DOCTYPE html> <html>…</html>
第一行是请求行 / 状态行,接着是若干头部(键值对),空一行之后是正文。响应里的三位数字就是状态码——点击下面的状态码看它们的含义:
另一个关键概念是端口:IP 地址定位到机器,端口定位到机器上的具体程序(一台服务器可能同时跑着网站、数据库、SSH)。一些约定俗成的「知名端口」值得记住:
| 端口 | 协议 / 服务 | 干什么的 |
|---|---|---|
| 80 | HTTP | 明文网页 |
| 443 | HTTPS | 加密网页(HTTP over TLS) |
| 53 | DNS | 域名解析 |
| 22 | SSH | 远程登录服务器 |
| 25 / 465 | SMTP | 发送邮件 |
| 3306 | MySQL | 数据库 |
| 6379 | Redis | 缓存数据库 |
HTTPS = HTTP + TLS。在 TCP 握手之后、HTTP 对话之前,再加一轮 TLS 握手:验证服务器证书(防冒充)、协商加密密钥(防窃听和篡改)。如今浏览器地址栏的小锁🔒就是它。原理可以去隔壁 解密台 看非对称加密那一节。
把前面所有概念串起来,就是这道经典面试题的答案。点击「播放」,沿着时间线走一遍完整旅程:
每一步都对应前面的一节:分层让这条流水线各司其职,封装让数据带着地址上路,TCP 保证可靠,DNS 解决寻名,HTTP 承载内容。所谓「上网」,就是这套流程每天重复亿万次。