Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

一次网络请求的完整旅程(总装)

复习

  • DNS 查询与缓存:域名被解析为 IP 地址
  • 路由器与逐跳转发:数据包被一跳一跳接力
  • TLS 握手与 HTTPS:安全通道保护通信
  • HTTP 请求与响应:浏览器与服务器交换资源

TL;DR

  • 从输入网址到页面出现,是一次跨越全部分层的旅程
  • 应用、传输、网络、链路各层依次参与
  • 每一步都用到了前面学过的机制
  • 分层与协作,是整张网络得以运转的关键

正文

  这是计算机网络部分的最后一章。让我们跟着一次真实的发生,把前面所有零件串成一条完整的线:你在浏览器里敲下一个网址,按下回车,到页面出现——这中间究竟发生了什么?

第一站:知道往哪去

  浏览器首先需要把域名变成IP 地址

  • 先查各层缓存,命中就省事了
  • 没有,就交给解析器,沿域名树逐级询问,直到拿到地址

  同时,如果目标内容在附近的 CDN 节点就有,后面的请求可能根本不必回源到很远的主机。

第二站:把包送到对面

  有了地址,数据包开始上路:

  • 若目标在本地网络,直接交付
  • 若在远方,交给默认网关,由一台台路由器逐跳接力
  • 每一跳都可能重新封装链路层帧,涉及 ARPNAT 等机制

  网络层负责端到端的方向,链路层负责每一跳的交付——这正是我们反复强调的分工。

第三站:建立可靠的、安全的通道

  到达目标主机后,还要把数据稳妥、保密地送进正确的程序:

  • TCP 先通过三次握手建立可靠连接
  • 在它之上,TLS 做握手:验证服务器证书、协商会话密钥
  • 之后的数据,用对称加密保护

  于是,可靠(TCP)与安全(TLS)两件事,在传输层和它之上稳稳落地。

第四站:交换内容

  通道好了,HTTP 开始工作:浏览器发请求,服务器回响应。响应里的网页、图片、样式、脚本,可能一部分直接来自缓存或 CDN 节点。

  页面渲染出来。整个过程,往往在几百毫秒内完成。

回头看这张图

  把这条旅程按层次排一下:

应用层      HTTP、DNS
传输层      TCP、UDP(端口)
网络层      IP、路由、ICMP
链路层      帧、MAC、以太网、无线
物理层      信号与介质

  每层只做自己那一件事,把其余交给上下层。没有哪一层需要理解全部,可合在一起,却能完成一件惊人的事。

  这就是分层的威力,也是这一部分的主题:复杂如互联网,也不过是一层层简单约定叠加出来的。 从一根线传一个比特,到一次完整的网页访问,我们终于走完了全程。

  数据的组织与步骤的安排,其实无处不在:调度要挑进程,缓存要挑淘汰,路由要挑路径。它们背后是同一个问题——怎样组织数据、怎样安排步骤。这,正是我们接下来要走进的领域:数据结构与算法。

思考题 1

  一次网页访问中,DNS、TCP、TLS、HTTP 分别在什么时候起作用?

思考题 2

  如果说“没有分层,网络将变成一团乱麻”,你能举出分层带来的至少两个具体好处吗?

小结

知识点

  • 一次访问依次经过 DNS、路由、TCP、TLS、HTTP
  • 各层各司其职、协同完成通信
  • 缓存与 CDN 让内容更近、更快
  • 分层是网络可构建、可理解、可修复的基础

参考资料

  1. Wikipedia(zh):互联网协议套件:构成互联网的分层协议集合
  2. Wikipedia(zh):OSI模型:网络通信的分层参考模型

思考题答案(仅供参考)

思考题 1

  DNS 最先起作用,把域名解析成 IP;随后 TCP 建立可靠连接、TLS 建立安全通道;通道就绪后,HTTP 才发送请求并接收响应。它们按先后顺序各司其职,共同完成一次访问。

思考题 2

  例如:一是便于分工与演进,某一层更换实现(如有线换无线)不影响其他层;二是便于理解与排障,出问题时可以按层逐步定位,而不必在混乱的整体中瞎找。此外还便于复用与标准化。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪