网络协议相关的概念,包括 TCP/IP、DNS、HTTP 等等基础知识,对于前端开发来说也是需要掌握的。
# TCP/IP 协议
TCP/IP 提供点对点的链接机制,将数据应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。它将软件通信过程抽象化为四个抽象层,采取协议堆栈的方式,分别实现出不同通信协议。协议套组下的各种协议,依其功能不同,被分别归属到这四个层次结构之中,常被视为是简化的七层 OSI 模型。
- TCP/IP 协议分层
- 数据链路层:用来处理连接网络的硬件、设备驱动、网卡、光纤等
- 网络层:用来处理在网络上滚动的数据包(选路线)
- 传输层:TCP/UDP
- 应用层:FTP/DNS 域名系统/HTTP 协议等
- IP 协议
- 把各种数据包准确无误地传递
- ARP 协议、RARP 协议等
除了 TCP/IP 的基本概念以外,同样需要掌握 TCP/IP 协议的四个抽象层、七层 OSI 模型。另外,关于 TCP 连接,还需要知道 TCP/UDP 的区别、以及 TCP 的三次握手和四次挥手:
- TCP 协议提供可靠传输服务,UDP 协议则可以更快地进行通信
- 三个运行阶段:连接创建、数据传送和连接终止
- 三次握手:建立一个 TCP 连接需要客户端和服务端总共发送三个包以确认连接存在
- 四次挥手:TCP 连接的断开需要客户端和服务端总共发送四个包以确认连接关闭
这些内容比较基础,但作为前端开发也同样需要掌握,有时候我们需要优化应用的加载耗时、请求耗时等,或是定位一些偏底层的问题(请求异常、HTTP 连接无法建立等),这些内容都有一定的帮助。
# DNS 域名系统
DNS 的全称是 Domain Name System,又称域名系统,它负责把www.qq.com
这样的域名地址翻译成一个 IP(比如14.18.180.206
),而客户端与服务器建立 TCP 连接需要通过 IP 通信。
让客户端和服务器连接并不是靠域名进行的,在网络中每个终端之间实现连接和通信是通过一个唯一的 IP 地址来完成。在建立 TCP 连接前,我们需要找到建立连接的服务器,DNS 的解析过程可以让用户通过域名找到存放文件的服务器。
DNS 解析过程会进行递归查询,分别依次尝试从以下途径获取该域名对应的 IP 地址:
(1) 浏览器缓存:浏览器首先会在自己的缓存中查找。
(2) 系统缓存:在用户计算机系统 Hosts 文件 DNS 缓存中查找。
(3) 路由器缓存:进入路由器缓存中查找。
(4) ISP(互联网服务提供商)DNS 缓存:如果你用的是电信的网络,会进入电信的 DNS 缓存服务器中查找。
(5) 根域名服务器。
(6) 顶级域名服务器。
(7) 主域名服务器。
DNS 解析过程会根据上述步骤进行递归查询,如果当前步骤没查到,则自动跳转到到下一步骤通过下一个 DNS 服务器进行查找。
除此之外,我们在前后端联调过程中也常常需要配置 HOST,这个过程便是修改了浏览器缓存或是系统缓存。通过将特定域名指向我们自身的服务器 IP 地址,便可以实现通过域名访问本地环境、测试环境、预发布环境的服务器资源。之所以需要通过域名访问而不是直接使用 IP 地址进行访问,很多时候是因为避开浏览器的同源策略导致的跨域问题。
# HTTP 请求与 TCP 协议
目前大多数 HTTP 请求都基于 TCP 协议。由客户端发起的 HTTP 请求,和服务器建立起 TCP 连接之后,HTTP 服务器会监听客户端发起的请求。收到请求后,服务器会进行回复,回复内容通常包括 HTTP 状态、响应消息等,更具体的会在下一节 HTTP 协议中进行介绍。
TCP 协议的目的是提供可靠的数据传输,它使用序号标识每端发出的字节的顺序,从而另一端接收数据时可以重建顺序,无惧传输时的包的乱序交付或丢包,可通过发送方检测到丢失的传输数据并重传这些数据。
因此,目前大多数 HTTP 连接基于 TCP 协议。不过,HTTP/3 中底层支撑是 QUIC 协议,该协议基于 UDP,有 UDP 特有的优势,同时它结合了 TCP 中的精华,实现了即快又可靠的协议。