——这是一篇等你学完整个计算机网络体系后再回来看会有新的感觉的文章
对于计算机网络这门课,其核心在于对于各层协议的学习,包括协议的内容,协议的工作方式,不同层协议之间是怎样相互协作的等等……

什么是协议

在此举一个简单的例子。有三个人A、B、C。A只会说汉语、B只会说英语、而C既会说汉语又会说英语。现在A与B要聊天,他们之间该如何沟通呢?若A与C要聊天,又会怎样?这时如果我们:

  • 将汉语和英语当作“协议”
  • 将聊天当作“通信”
  • 将说话的内容当作“数据”

那么A与B之间由于各持一种语言,恐怕说多久也无法交流。因为他们之间的谈话所用的协议(语言)不同,双方都无法将数据(所说的话)传递给对方 。
如果A与C之间都用汉语这个“协议”,就能理解对方所要表达的具体含义了。也就是说A与C为了顺利沟通,采用同一种协议,使得他们之间能够传递所期望的数据(想要说给对方的话)。
如此看来,协议如同人们平常说话所用的语言。虽然语言是人类才具有的特性,但计算机与计算机之间通过网络进行通信时,也可以认为是依据类似于人类“语言”实现了相互通信。
对于计算机协议而言更特别的一点是,计算机协议不仅是机器与机器之间交流的协议,也是人与机器交流的协议,只有通过一定的协议,计算机才知道我们想让它们做什么

协议三要素

  • 语法:协议的内容应该符合一定的规则和格式。例如,括号要成对,语句末尾要有分号等
  • 语义:协议的内容表达着某种含义。
  • 顺序:协议的内容体现着操作的顺序。

提到网络,很多人的第一感觉就是打开浏览器浏览网页(上网)。
有一天你想查些资料,常规的做法是打开浏览器,在地址栏输入 [https://www.baidu.com/](https://www.baidu.com/) ,浏览器就会为你呈现对应的界面。
我们看看浏览器是如何做到这件事的。我们之所以能够看到各式各样的界面,是因为浏览器收到了一段来自 HTTP 协议的“响应”,格式就像下面这样:

  1. HTTP/1.1 200 OK
  2. Bdpagetype: 2
  3. Bdqid: 0xfe498001000b28b4
  4. Cache-Control: private
  5. Content-Type: text/html;charset=utf-8
  6. Date: Mon, 22 Feb 2021 11:34:22 GMT
  7. Expires: Mon, 22 Feb 2021 11:34:22 GMT
  8. Server: BWS/1.1
  9. Set-Cookie: BDSVRTM=306; path=/
  10. Set-Cookie: BD_HOME=1; path=/
  11. Set-Cookie: H_PS_PSSID=33425_33355_33272_31660_33570_33463_26350_22158; path=/; domain=.baidu.com
  12. Strict-Transport-Security: max-age=172800
  13. Traceid: 1613993662024334567418323317300717627572
  14. X-Ua-Compatible: IE=Edge,chrome=1
  15. Connection: close
  16. Content-Length: 348627
  17. <!DOCTYPE html><!--STATUS OK-->
  18. <html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#2932e1"><meta name="description" content="全球最大的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中文网页数据库,可以瞬间找到相关的搜索结果。"><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /><link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" /><link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg"><link rel="dns-prefetch" href="//dss0.bdstatic.com"/><link rel="dns-prefetch" href="//dss1.bdstatic.com"/><link rel="dns-prefetch" href="//ss1.bdstatic.com"/><link rel="dns-prefetch" href="//sp0.baidu.com"/><link rel="dns-prefetch" href="//sp1.baidu.com"/><link rel="dns-prefetch" href="//sp2.baidu.com"/>
  19. <title>百度一下,你就知道</title>
  20. <!--以下内容省略-->

这符合协议的三要素么?我们来看一下。
首先符合语法,也就是说只有按照上面的格式来,浏览器才看得懂(状态码200 - 请求头首部 - 报文内容);
其次符合语义,就是按照约定的意思来,例如状态码200表示网页返回正常,404表示网页找不到等等;
再者符合顺序,当你在地址栏输入地址按下回车后,HTTP 请求就随之发出,才有了你收到的请求。
浏览器按协议商定的方式将得到的报文进行渲染,就得到了我们所看到的界面。

常用的网络协议

我们通过浏览器访问百度的完整过程来看看我们将会接触到哪些网络协议。
我们在地址栏输入 [https://www.baidu.com/](https://www.baidu.com/) ,这是一个 URL 。浏览器只知道名字是https://www.baidu.com,但是不知道具体地点,也不知道如何访问。于是,浏览器打开地址簿查找。我们可以使用一般的地址簿协议—— DNS ,也可以使用更加精确的地址簿协议—— HTTPDNS
无论用哪种方式查找,我们都会得到这个地址: 220.181.38.148 。这是 IP 地址,是网络中的“门牌号”。
知道了目标地址,浏览器就开始打包你的请求。对于普通请求,往往使用 HTTP 协议;但是对于一些敏感请求(例如你的淘宝订单),往往需要加密传输,因此会使用更加安全的 HTTPS 协议。
DNS、HTTP、HTTPS 所在的层为应用层。经过应用层封装后,浏览器会将应用层的包交给下一层去完成,通过 socket 编程实现。
下一层是 传输层 。传输层上有两种协议,一种是无连接的 UDP ,一种是面向连接的 TCP 协议。对于访问网页而言,我们往往使用 TCP 协议。所谓面向连接就是,TCP 会保证这个包能够到达目的地。如果不能到达,就会重复发送,直至到达。
TCP 协议中会有两个端口,一个是浏览器的监听端口,另一个是服务器上的WEB应用端口。操作系统往往通过端口来判断它得到的包应该给哪个进程。
网络协议概述 - 图1
传输层封装完毕后,浏览器会将包交给操作系统的 网络层 。网络层的协议是 IP 协议。在 IP 协议里面会有源 IP 地址,即浏览器所在机器的 IP 地址和目标 IP 地址。
我们前面提到过,目标 IP 来自 DNS 协议查询,我们本机的 IP 则来自于操作系统启动时 DHCP 协议自动配置的 IP,并同时配置了默认 网关 的 IP 为 192.168.1.1。
网络协议概述 - 图2
操作系统既然知道了目标 IP 地址,就开始想如何根据 IP 找到目标机器。操作系统往往会判断这个目标 IP 是本地人还是外地人(具体方法我们后面会详述)。显然,百度的服务器在外地。
操作系统知道要离开本地前往外地,首先他要去“车站”——也就是我们前面所说的 网关 。那么网关在哪里?操作系统又要查询地址簿——这次的地址簿是 ARP 协议,而我们查询到的地址就是 MAC 地址。
网络协议概述 - 图3
于是操作系统将 IP 交给了下一层,也就是 MAC层 。网卡将包发出去,由于这个包里面有 MAC 地址,因此能够到达网关。网关往往是一个路由器,到了某个 IP 应该怎么走,这个叫做路由表。
每当包要跨越路由器传输时,都需要拿出 IP 头来问一问路由器接下来该怎么走,而路由器和相邻的路由器之间也会经常沟通。到那里怎么走,这种沟通的协议称为 路由协议 ,常用的路由协议有 OSPFBGP
就这样,包不断通过路由表查询下一个网关的 IP 地址并在当前到达的网关上查询下一个网关的 MAC 地址,直到到达最后一个网关,在最后一个网关的路由表成功查询到目标IP 以及目标 IP 的MAC地址,从而找到目标服务器。
目标服务器发现 MAC 地址对上了,取下 MAC 头来发送给操作系统的网络层。发现 IP 地址也对上了,就取下 IP 头。IP 头里面会写上一层封装的 TCP 协议,然后交给传输层。
在这传输层里,对于收到的每个包,都会有一个回复的包说明收到了。然而这个回复的包仅仅是 TCP 层的一个说明,及收到后的回复。
如果过一段时间还是没到,发送端的 TCP 层会重新发送这个包,还是上面的过程,但是, 这个重新发送绝不是将访问请求的动作重复一次 。对于浏览器而言,你只发起了一个请求,TCP 层自己不断闷头尝试。
当网络包到达 TCP 层后,TCP 头中有一个目标端口号,通过这个端口号,可以找到百度服务器端的进程(BWS,Baidu Web Server)正在监听这个端口号。
BWS得到了 HTTP 请求的内容,通过 RPC 协议调用其他进程处理各种请求,例如进行关键词搜索时,将关键词告知搜索引擎进程等。
当一切处理完毕,就回复一个 HTTPS 的包,告知下单成功,这个包会像来的时候一样经过千难万险到达你的电脑,最终进入浏览器,显示出百度的界面。

其他可能用到的协议

应用层 DHCP HTTP/HTTPS RTMP P2P DNS GTP RPC
传输层 UDP TCP
网络层 ICMP IP ODPF BGP IPSec GRE
链路层 ARP VLAN STP
物理层 网络跳线