互联网访问的基本原理
在了解墙和翻墙的原理之前,首先最好对互联网运行的基本原理有一个宏观的了解——至少,需要知道从在浏览器键入网址,到页面呈现之时,这期间究竟发生了什么。只有了解了这些,才可能看懂墙是怎样实现阻止访问网页,而翻墙又是如何让你穿越重重阻碍,成功访问被墙阻止页面的。
传输协议
寻址,请求 DNS 记录
这里以使用浏览器访问 baidu.com 为例:
由于互联网世界很大,浏览器无法直接找到 baidu.com 的服务器,正如我们在使用传统电话时,不可能直呼一个朋友的名字,就能自动拨通对应的电话——我们必须需要输入朋友的电话号码。而此时 baidu.com 就相当于朋友的名字,他的电话号码就是可以帮助浏览器找到对应服务器的 IP 地址。但我们不太可能记住所有的朋友的号码,更何况一个人也可能拥有多个号码,网站也是同理。因此,我们就需要一个电话号码簿来记录对应的「电话号码」。
这个「电话号码簿」就是 DNS 记录。它能被储存在很多地方,例如:浏览器缓存(短时)、本地 DNS 缓存、Hosts 文件、网卡配置信息中记载的 DNS 服务器、路由器或光猫中记载的 DNS 服务器、互联网运营商提供的 DNS 服务器以及 DNS 根域名服务器,查询优先级从前至后。在上述所有「电话号码簿」中,都有可能记载了「baidu.com = xxx.xxx.xxx.xxx」这样一个信息。于是当我们命令浏览器访问 baidu.com 时,那么浏览器就会向上述「电话号码簿」逐一请求,直到获取到 baidu.com 的 IP 地址为止。
IP
IP(Internet Protocol,网际协议)是互联网协议包中的重要通信协议,它的路由功能实现了互联互通,并从本质上建立了互联网。IP 协议定义了用于传递数据的数据包结构以及数据包在传输时的寻址方法,使得数据包能被根据 IP 地址从源主机传递到目标主机。
DNS
DNS(Domain Name System,域名系统)是互联网的一项服务,具体表现为域名和 IP 地址相互映射的一个分布式数据库。
建立连接,TCP 的三次握手
在通过查询 DNS 记录获取到 IP 地址之后,浏览器会使用主流的传输协议向 baidu.com 的服务器建立连接,当前互联网世界的主流传输协议是 TCP(Transmission Control Protocol,传输控制协议),绝大部分的网页访问行为都会使用这个传输协议。
使用 TCP 传输协议建立连接之初,有着一个不可或缺的连接过程:TCP 的三次握手。
- 浏览器首先会向 baidu.com 发送一个带有 SYN 标识的数据包,其中包含了一个叫做 SEQ 的随机数。
- 在 baidu.com 收到后,会给浏览器回应一个 ACK,ACK 的值就是刚才的 SEQ 的值 +1,此外,在回应里,还包含另一个 SYN 和随机数 SEQ 。
- 浏览器收到 baidu.com 发过来的回应包之后,再给服务端发送一个 ACK,ACK 的值还是刚才 baidu.com 发过来的 SEQ 的值 +1。
以上三步便是 TCP 的三次握手,整个过程是为了连接的可靠性而设计的。就像在和别人打电话时严谨地确认是否都能听到对方讲话:
- 「喂喂喂,我是 A,你听的到吗?」
- 「B:在在在,我能听到,我是 B,你能听到我吗?」
- 「听到了,这里是 A,我们开始谈话吧。」
连接成功建立,使用 HTTP 协议传输内容
HTTP 协议,即超文本传送协议,是建立在 TCP 协议上的,用于将 baidu.com 的内容传输给浏览器的协议。
HTTP 协议是一个明文的传输协议,这意味着假如浏览器与 baidu.com 的连接内容被第三者截取,第三者可以轻松看到其中的所有连接内容,甚至登录 baidu.com 的账号密码都会被知晓,因此,现代网站几乎都已经在使用改良过后的 HTTPS 协议,多出来的一个「S」代表 Secure。
HTTPS 协议会在 baidu.com 与浏览器传输内容前,先行给浏览器发送一个公钥(加密算法),浏览器在收到这个公钥后,会利用这个公钥生成一套随机的对称密钥(类似于密码对照表),并把这套对称密钥使用公钥计算后进行加密,发送给 baidu.com。baidu.com 在收到后,使用与公钥相匹配的私钥(解密算法)进行解密计算,从而得到解密后的对称密钥,之后,再用这套对称密钥来和浏览器传输加密内容。由于第三人不知道 baidu.com 与浏览器用的「密码对照表」,因此即便截取了加密内容,也不知道其中内容。
到目前为止,虽然保证了密钥传输的安全性,也建立了加密连接,但是第三人攻击依旧可以攻破这个加密系统:假如第三者截取了 baidu.com 初次发给浏览器的公钥,自己偷偷把这个公钥留下来,转而发送一个自己的公钥给浏览器,声称自己是 baidu.com 的话,那么这个第三人就完全可以实现假冒 baidu.com 了。
为了解决这个问题,HTTPS 协议需要有一个值得信任的机构来让浏览器能够查询这个公钥是否是为 baidu.com 所发出的,这个机构就是 CA(Certificate Authority,证书发布机构)。在 baidu.com 支持 HTTPS 协议之时,便需要在任意一个 CA 处做登记,并得到一个被称作「SSL 证书」的数据文件。在 baidu.com 首次给浏览器发送公钥的时候,会包含在这个 SSL 证书中发送。浏览器得到这个 SSL 证书之后,会先行查找操作系统中内置的受信任的 CA,确认这个证书是否为 baidu.com 所有(这个过程同样利用了加密解密计算保证安全),若对比结果一致,则证明 baidu.com 没有被冒充,反之则有可能遭受了中间人攻击(当然,也有可能是证书过期导致的)。
结束连接,TCP 的四次挥手
这一部分内容与墙的运行手段关联不大,稍微了解即可。
- 若浏览器想要停止连接,它会向服务端 baidu.com 发送连接释放请求。
- baidu.com 收到连接释放请求后,会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时 baidu.com 不再接收浏览器发的数据了。但因为 TCP 连接是双向的,所以 baidu.com 仍旧可以发送数据给浏览器。
- baidu.com 如果此时还有没发完的数据,会继续发送,完毕后会向浏览器发送连接释放请求,然后 baidu.com 进入 LAST-ACK 状态。
- 浏览器收到释放请求后,向 baidu.com 发送确认应答,此时浏览器进入 TIME-WAIT 状态。该状态会持续 2MSL(最长报文段寿命,指报文段在网络中生存的时间,超时会被抛弃),若该时间段内没有 baidu.com 的重发请求的话,就进入 CLOSED 状态。当 baidu.com 收到确认应答后,也便进入 CLOSED 状态。
物理传输
众所周知,互联网并非一个能够凭空建立起来的系统,而是需要坚实的物质支持,组成物理网络的主要有连接驻留在网络上的不同硬件的电缆 (光纤、同轴电缆、双绞线和电话线) ,和连接到网络的计算机 (主机) 上使用的网络适配器(网卡)以及网络中使用的任何集线器、交换机、路由器或网桥组成。
数据包的境内传输
几大 ISP(Internet Service Provider,互联网业务运营商)共同建立的庞大的骨干网和城域网基础设施组成了中国互联网的全部。数据包就在这一庞大的网络系统中,通过一个个互相连通的节点的转发而实现传输。
例如,中国电信 163 骨干网分为北京、上海、广州三大片区,这三个片区有大型的骨干路由作为邻近省级区域的数据交汇中心。上海片区涵盖了上海、江苏、安徽、山东、浙江、福建、江西这几个省,而每个省的内部又有庞大的、互相连接的城域网,而在某个城市的城域网内部,又有数以万计的学校、企业、家庭等局域网的接入,从而形成了局域网→城域网→广域网三个层级。
除了 163 骨干网之外,中国电信还拥有 CN2 骨干网。此外,其他运营商也有各自的骨干网,例如中国联通有 CHINA169 骨干网和 CNCNET 骨干网,中国移动有 CMNET 骨干网……不同 ISP 建立的不同骨干网之间也设有数据交换的中心,从而实现数据包可以从全国的任何地方流向任何地方。
在上述提到的各个级别的网络中,分布着无数路由节点,每一张骨干网都有自己负责的路由群组和节点,整个群组统称为 AS(Autonomous system,自治系统),每一个骨干网管理的 AS 都经过名为「互联网号码分配局」的国际机构分配唯一识别代码,例如,中国电信 163 骨干网的 AS 自治系统编号为 AS4134。每一张骨干网都有内部路由协议,每一个节点都在依据某种规定互相交换他们所连通的 IP 地址信息,这就像绘制一张巨大的地图,告诉数据包在传输过程中能走哪条路,走哪条路最近。
各的骨干网之间也依靠外部路由协议互相交换它们所掌握的「地图」,典型的有 BGP(Border Gateway Protocol,边界网关协议)。BGP 协议使得各大骨干网的路由节点可以以 TCP 数据包的形式互相转发其掌握的路由信息,从而形成一个连通复数个 AS 的更加庞大的、完整的地图。因为各个节点都互相沟通,从而可以实现带领数据包途径属于其他 AS 的节点。
数据包的跨境传输
数据跨境的物理传输介质一般为陆上光缆和海底光缆。通过上海直达美国的 CN2 骨干网海底光缆,亦或是从广州到香港的 163 骨干网线路的连接,国内和国外的数据完全可以自由地进行交换。跨境传输中服务器的连接、数据包的交换、路由的选择,本质上和访问境内传输并没有什么区别,协议也是全球通用的,因此,不同国家的 AS 之间天然实现互通互联。
跨境传输与境内传输的唯一特殊之处就在于,需要经过互联网的国际出入口(通常为国家级 AS 的交换中心)。而我国的国际出入口运营资质是被中国电信、中国联通、中国移动三家国有 ISP 垄断的。也正因如此,GFW 得以部署在这些国际出入口,来检测和封锁互联网流量。