这本书的重点在于展示网络的全貌。第一,从输入 url 到浏览器展示页面这个经典的问题出发,讲解整个网络系统。第二,重点在于讲解实际的网络设备和软件是如何工作的。

这两个出发点很有意义。单单学习 tcp/ip、http 是无法理解整个网络的,对整个网络没有框架性、系统性的认识就没法理解每一项技术背后的意义,无法理解技术的真正意义的话就只能停留在死记硬背的表面,无法做到实际应用。

单单从某项技术出发,是没法理解设备和软件内部如何实际工作的。技术只是规定了设备和软件的工作方式或规则,并不是真正的实现。要想熟练运用技术的话,理解网络设备和软件的内部构造、工作方式很有必要。

本书从浏览器输入 url 开始探索,直到浏览器显示网页。这一过程中会出现较多的硬件、软件,千万不要迷失方向,记住这张大图-网络全貌图。
image.png
网络由两部分组成,运输信息的机制、以及各种网络应用程序。这个机制的话就包括协议、硬件、软件。网络应用程序包括客户端、服务器、代理、网关、隧道、web 机器人等。

浏览器输入 url 到浏览器显示内容,从硬件和软件的角度分为6个部分,浏览器,协议栈和网卡,集线器、交换机和路由器,接入网、网络运营商,防火墙、缓存服务器,web 服务器。

浏览器

浏览器只负责生成请求消息,然后操作系统用协议栈将请求消息加工,发送给网卡。

World Wide Web,WWW,万维网,是一个分布式服务系统,并不是协议。万维网建立在网络上,向全球的用户提供动态的、跨平台的图形文本信息服务。

浏览器负责的活,更细的来说,① 解析 url、生成 http 报文,② DNS 查询、DNS 分布式系统,③ 委托协议栈。

url
记住 url 的各个组成部分,请求报文中的 url 包含哪些部分,省略文件名、省略斜杠。

url 中包含协议名://用户名@密码:路径/文件名?查询字符串#锚。如果文件名省略,那么会查询默认的文件 index.html/default.html。如果文件名前面的斜杠也省略了,那么服务器会先将查询字符串前的字符作为文件名查询,没有的话,再当作目录查询。

http报文
重点是 http 报文消息格式、请求方法、响应状态码、头部字段。

http 协议定义了客户端和服务器交互的消息格式和步骤。请求报文有两个重要的信息,“对什么”、“做什么”,分别对应 url、method。这部分就交给《http权威指南》吧。
DNS 查询
生成请求报文后,进行 DNS 查询。

让用户使用 DNS,路由器使用 IP 地址。DNS 与 IP 并用的理由有两点,① IP 地址难以记忆,② 域名用到 TCP/IP 中效率低下。TCP/IP 网络架构中用 IP 来确定通信对象,如果使用域名,路由器需要处理的字节数大大增加,计算、传输负担都比较重。

就是因为这样并用的方案,还需要一种自动转换的机制(DNS 分布式系统)来衔接。通过 DNS 查询 IP,域名解析。解析的过程就是遵守 DNS 协议,向 DNS 服务器发起请求,接受 DNS 返回的响应。

DNS 解析器就负责域名解析操作,解析器是操作系统中的一段程序,在操作系统的 Socket 库中。Socket 中调用gethostbyname(domainName),就是在调用解析器。浏览器就将这段代码返回的 IP 地址保存在一段内存中。

解析器生成 DNS 请求报文,同样交给协议栈进行加工,然后通过网卡发送给 DNS 服务器。请求报文中主要包含域名、类(永远为IN)、记录类型(A、MX、PTR、CNAME、NS)。服务器接收到请求报文后,根据这3个信息来查表,然后返回查询结果给客户端。

PTR 记录类型中记录了IP地址对应的域名,是用来反查域名的。CNAME 是用来查询域名的别名,用在 CDN 中。NS 用来查询 DNS 服务器的 IP。

有两个点① DNS 传输层采用TCP还是UDP, ② DNS 服务器 IP 地址从何而知。DNS 最初是采用 UDP 协议,后续加入了 TCP 协议,现在是可选的。DNS 服务器的 IP 地址是可以预置的。

DNS 服务器的分布式架构是很复杂的。互联网中的服务器不计其数,用一台机器来保存所有域名对应的 IP 记录是不可能的。域名是分层次结构的,每一个句点就代表不同的层级,越靠右层级越高。句点左边的域是右侧域的下级域,也叫子域。

互联网中 DNS 服务器有数万台。DNS 的层级结构就非常有用,下级域的 DNS 服务器将自己的 IP 注册到上级 DNS 服务器中。顶级域.com/.jp服务器的上一级是根域,根域是最上级的,IPv4的13个 IP 指向了所有的根域服务器(服务器数量不止13个)。

根域服务器保存了顶级域名服务器的 IP,而所有的 DNS 服务器都内置了根域的 IP。本地 DNS 服务器向运营商 DNS 服务器请求,又向顶级 DNS 查询,再向根 DNS 查询,再根据根域返回的结果找到指定的。

协议栈
web 应用生成好了请求消息,知道服务器 IP 地址后,调用 socket 库发送接受数据。在真正发送数据前,需要做准备工作。总的收发流程分为:① 创建套接字,② 建立连接,③ 收发数据,④ 断开连接并删除套接字。
@todo tcp 状态机是如何维护两者之间的通信管道的?

协议栈和网卡

协议栈也叫网络控制软件,将应用程序交付的数据再打包,转交给网卡。网卡收到后将信息转换为电信号通过网线发送出去。

集线器、交换机和路由器

从网卡出去之后,上网的方式有很多,书中只讲了经典的场景,计算机连接家庭和公司的局域网,然后通过 ASDL/FTTH 等宽带线路入网。

电信号从网卡出来之后,顺着网线经过交换机,到达接入互联网的路由器。路由器后面就是互联网。

接入网和网络运营商

互联网的入口线路就叫接入网。接入网是通信线路,通信线路的技术有很多,电话线、ISDN、ADSL、有线电视、光纤、专线。骨干网就是各大运营商组成的网络,有很多运营商和路由器。

电信号再从接入互联网的路由器出发,来到签约的网络运营商,进入这个网络运营商的接入点设备(PoP,Point of Presence)。再从接入点输出到骨干网。

服务器局域网

电信号从骨干网最终来到服务器所在的局域网。会先经防火墙的检查,然后再到缓存服务器。最终到达 web 服务器。

缓存机制不仅有单纯的缓存服务器,还有内容分发服务。除了缓存机制和安全机制,还有负载均衡器。

web 服务器

经过局域网之后,最终达到 web 服务器。首先经过网卡,将电信号转换为数字信息。然后交给协议栈解包,将传输层、ip 层的头部剥掉,交给服务器上指定的应用程序。应用程序分析消息,将相应的数据封装成响应报文。

然后又通过协议栈、网卡等等发送给浏览器。