现在对前端工程师的技能要求越来越高了。除了需要熟练掌握 HTML、CSS、JavaScript 以及各大主流的前端框架(vue、angular、react等)的应用,还需要需熟练使用各类前端工程化工具(grunt、gulp、webpack、yeoman等)。而一些大厂对前端工程师的技能要求,也慢慢开始要求前端工程师掌握 HTTP 协议相关的知识的了。今天就和大家聊聊 HTTP 协议与 TCP、IP 协议以及 DNS 服务之间的关系。

不过在说明它们的关系前,需要先要了解什么是 TCP/IP 协议族,还有就是 TCP 协议、IP 协议、以及 DNS 服务的功能是是什么?

TCP/IP 协议族

先来看看什么是TCP/IP 协议族?

计算机与网络设备要相互通信,双方就必须基于相同的方法。比如、如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信以及怎样结束通信,这些都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则,而这种规则就称为协议。

协议中包含各种各样的内容。从电缆的规则到 IP 地址的选定方法、寻找异地用户的方法、双方建立通信的顺序、以及 Web 页面的显示需要处理的步骤等等。像这样把互联网相关的协议集合起来的总称就是我们熟知的 TCP/IP 协议族(有说法认为 TCP/IP 指 TCP 和 IP 协议,还有人认为 TCP/IP 是 IP 协议通信过程中,使用到的协议族的统称)。

TCP/IP 协议族中常见的协议有:HTTP、TCP、IP、DNS、UDP、SNMP、FTP、IEEE 802.3、FDDI、ICMP、PPPoE。

我们通常使用的网络(包括互联网)就是在 TCP/IP 协议族的基础上运作的。HTTP 协议属于它内部的一个子集。

TCP/IP 的分成管理

提到网络,就离不开经典的网络层次划分的理论。TCP/IP 协议族也是按网络层次划分的,分别是以下 4 层:应用层、传输层、网络成和数据链路层。

各层的作用如下:

  • 应用层:应用层决定了向用户提供应用服务时的通信活动。FTP(文件传输协议)、DNS(域名系统)和 HTTP 协议就处于应用层。
  • 传输层:传输层对上层的应用层提供处于网络连接中的两台计算机之间的数据传输。TCP(传输控制协议)和 UDP(用户数据报协议)就位于传输层。
  • 网络层:网络层又叫网络链路层。网络层用来处理在网络上流动的数据包。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传递给对方。网络层的作用就是在众多的路径中选择一条传输路径。IP 协议位于网络层。
  • 链路层:链路层又叫数据链路层或者网络接口层。链路层用来处理连接网络的硬件部分。网络硬件上的范畴均在链路层的作用范围。

TCP/IP 通信传输流

TCP/IP 协议族各层的通信传输流如下图:

TCP/IP 协议族进行通信时,会通过网络分层顺序与对方通信,客户端(发送端)从应用层开始层层往下传输,到了服务器(接收端)则是从链路层开始层层往上传输。

我们用一个简单的 HTTP 请求的传输为例来说明,首先客户端(通常是浏览器)在应用层使用 HTTP 协议发送一个查看某个 Web 页面的 HTTP 请求。

到了传输层,传输层(TCP 协议)把从应用层处接受到的数据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号和端口号后就转发到网络层。

在网络层(IP 协议)会增加作为通信目的地的 MAC 地址,然后再转发给链路层。这样一来,发往网络的通信请求就准备齐全了。

到了接收端的服务器,在接受端的链路层接收到数据后,会按网络层次顺序往上层发送数据,直到应用层(例如 IIS 服务器或者 nginx 服务器等)。直到这时候,才算是真正完成了由发送端到接收端的 HTTP 请求传输。

发送端在层与层之间传输数据的时候,每经过一层就会被打上该层所属的首部信息。到了接收端就正好相反,每经过一层时,就会把对应的首部消去。这种把数据信息包装起来的做法称作封装(encapsulate)。

IP 协议的功能

IP(Internet Protocol)网际协议(以下简称 IP 协议),它位于网络层,通过上面的网络层次图我们可以清晰的知道。Internet Protocol 听起来很夸张,但事实 IP 协议确实确实很牛。因为几乎所有使用网络的系统都会用到 IP 协议。

IP 协议的作用就是把各种数据包传输到接收端。要确保数据能够从发送端传输到接收端,必须要知道双方的 IP 地址和 MAC (Media Access Control Address)地址。通常发送端和接收端的通信上方在同一个局域网(LAN)里的情况很少,一般都要经过多个网络设备和计算机进行中转才能连接双方。在进行中转的过程中会利用下一个中转设备的 MAC 地址搜索下一个中转设备。这时会用到 ARP (Address Resolution Protocol)协议,ARP 协议是用以解析地址的协议,通过通信双方的 IP 反查出对应的 MAC 地址。

在到达最终的接收端前的中转过程,设备与设备之前都只能获悉很初略的传输线路,这种机制就叫做路由选择(routing)。每次中转的路由器会明确下一站的地址,直至最终将数据发送到最终的接收端。

TCP 协议的功能

TCP (Transmission Control Protocol)传输控制协议,它位于传输层,是一种面向连接的、可靠的、基于字节流的传输层通信协议。

基于字节流指的是它可以提供字节流服务(Byte Stream Service),也就是为了方便数据传输,会将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的,则指的是可以提供可靠的传输服务,即能够把数据准确而可靠的传输给对方。概括来说,就是 TCP 协议为了更容易传输大数据会把数据分割,并且 TCP 协议能够确认数据是否最终传输到接收端。

为了确保数据能够准确无误地传输到目标处,TCP 协议采用了为人熟知的三次握手策略(three-way handshaking)。TCP 协议将数据发送出去后,会向接收端确认是否成功送达。握手过程中使用了 TCP 的标志(flag):SYN(synchronize)和 ACK(acknowledgement)。

发送端首先发送一个带有 SYN 标志的数据包到对方。接收端收到数据后,就会回传一个带有 SYN/ACK 标志的数据包以表示传达确认信息。

最后,发送端会再次回传一个带 ACK 标志的数据包给接收端,表示“握手”结束。

如果在“握手”过程中某个阶段被中断,TCP 协议将会再次以相同的顺序发送相同的数据包给接收端。

DNS 服务的功能

DNS(Domain Name System)服务,它位于应用层,提供域名到 IP 地址之间的解析服务。

计算机既可以被赋予 IP 地址,也可以被赋予主机名和域名,例如 www.yaohaixiao.com。而用户通常使用域名来访问对方计算机,而不是直接使用 IP 地址访问。对于人类来说域名更便于记忆和使用,而对于计算机来说则是 IP 地址更容易处理。

为了解决人与计算机之间对于域名与 IP 地址之间的解析问题,DNS 服务就应用而生。DNS 服务提供了通过域名查找 IP 地址,或者通过 IP 地址查询域名的服务。

HTTP 协议与 IP、TCP 协议以及 DNS 服务之间的关系

在了解了 TCP、IP 协议以及 DND 服务 后,最后就来了解一下 IP、TCP 协议和 DNS 服务在使用 HTTP 协议的通信过程中各自的关系。

首先,用户从发送端(Chrome 浏览器)通过 HTTP 协议发出请求,想要访问 www.yaohaixiao.com 的 Web 页面。浏览器首先从 DNS 服务器查询获取 www.yaohaixiao.com 域名对应的 IP 地址。在获取到 IP 地址后,HTTP 协议负责生成针对目标 Web 服务器的 HTTP 请求报文。

接着,TCP 协议为了方便通信,将 HTTP 请求报文按序号分割成多个报文段,然后将每个报文段可靠的传送给接受端。此时的数据包中包含了 TCP 协议添加的 SYN 的标志

接下来, IP 协议负责搜索 www.yaohaixiao.com 的服务器 IP 地址,一边中转,一边传送数据包。直到将数据包传送到 www.yaohaixiao.com 的服务器。

在数据包发送到 www.yaohaixiao.com 的服务器后,接收端的 TCP 协议又将接收到的多个报文包按原来的顺序重新组成原始的 HTTP 请求报文。然后由 Web 服务器使用 HTTP 协议对收到 HTTP 请求做出解析,并将想要的访问的页面数据生成新的 HTTP 报文数据向客户端返回请求访问的数据。

这时候,www.yaohaixiao.com 的服务器的角色似乎就成为了发送端,之前的客户端变成了接收端。服务器端返回的 HTTP 数据就再次经历一遍之前的过程,直到客户端接受到请求页面的数据。在这次返回数据经过 TCP 协议分割数据的时候,会包含 SYN/ACK 标记。

最后,在开始的发送端(浏览器)接受到 www.yaohaixiao.com 服务返回的 Web 页面数据数据后,发送端还会会再次回传一个带 ACK 标志的数据包给接收端,表示本次 HTTP 页面请求完成,本次 HTTP 请求就最终结束了。

分类: Blog