通信传输流 浏览器输入 url 回车后发生了什么

858 阅读15分钟

前言

写这篇文章的目的:看完了图解HTTP,系统的梳理一下整个流程。就想到了这个题目,浏览器输入url回车后发生了什么。参考了很多文章,整理了一下,作自己理解。

先从介绍四层模型开始,了解网络模型;然后再说网络通信流大概过程;最后介绍请求过程中发生了什么。

1. TCP/IP四层模型

(Transfer Control Protocol/Internet Protocol)
四次模型图

  • 应用层:决定了向用户提供应用服务时通信的活动。

    • 主要功能:为用户提供接口、处理特定的应用;数据加密、解密、压缩、解压缩;定义数据表示的标准。
    • 比如FTP(File Transfer Protocol)
      DNS(Domain NameServer)域名服务的协议,提供域名到IP地址的转换,允许对域名资源进行分散管理。
      HTTP;
      SMTP(Simple MessageTransfer Protocol)简单邮件传输协议;
      POP3(Post OfficeProtocol)邮局协议用于发送和接收邮件;
      RIP(RoutingInformation Protocol)路由器用来在 IP 网络上交换路由信息的协议;
      Radius(RemoteAuthentication Dial In User Service)拨号接入远端认证协议完成接入用户的认证、授权、计费功能的协议;
      等;
  • 传输层:提供处于网络连接中的两台计算机之间的数据传输。

    • 主要功能:分段上层数据;建立端到端连接;将数据从一端主机传送到另一端主机;保证数据按序、可靠、正确传输。
    • 在传输层有两个性质不同的协议:TCP(Transmission Control Protocol传输控制协议)和UDP(User Data Protocol用户数据报协议)。
  • 网络层:用来处理网络上流动的数据包,该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传送给对方。

    • 主要功能:在不同的网络之间转发数据包;提供逻辑地址,如果数据跨网络传递,则需要使用逻辑地址来寻址;路由:将数据报文从一个网络转发到另一个网络。
    • 数据包是网络传输的最小数据单位,网络层所起的作用就是在众多的路线内选择一条-传输路线。
    • 常用协议:IP协议,IP为网络层最主要的协议,其功能即为网络层的主要功能,一是提供逻辑编址,二是提供路由功能,三是报文的封装和解封装。ICMP、ARP、RARP协议辅助IP工作。
  • 数据链路层(网络接口层):用来处理链接网络的硬件部分

    • 包括控制操作系统、硬件的设备驱动、网络适配器、及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围内。
    • 数据链路层又分为MAC子层(media access controlsub-layer介质访问控制子层)和LLC(logic link control sub-layer逻辑链路控制子层)子层。
      MAC子层负责指定数据如何通过物理线路进行传输,并向下与物理层通信,它定义了物理编址、网络拓扑、线路规范、错误通知、按序传递和流量控制等功能。
      LLC子层负责识别协议类型并对数据进行封装以便通过网络进行传输。LLC子层主要执行数据链路层的大部分功能和网络层的部分功能。如帧的收发功能,在发送时,帧由发送的数据加上地址和CRC校验等构成,接收时将帧拆开,执行地址识别、CRC校验,并具有帧顺序控制、差错控制、流量控制等功能。此外,它还执行数据报、虚电路、多路复用等部分网络层的功能。

介绍完网络模型后,再说通信传输流,这样对整体就有个概念了。

2. TCP/IP通信传输流

通信流
通信流2
通信过程中各协议职责

包是指通过网络传输的基本信息单元。
基本的包由头(包含发送系统和接收系统的地址)和正文或有效负荷(包含要传送的数据)组成。
当包经由 TCP/IP 协议栈时,每一层上的协议都会在基本头中添加或删除字段。当发送系统上的协议向包头中添加数据时,此过程即被称为数据封装
此外,每一层对于已更改的包都有不同的称呼,如图中所示。

发送端

  1. 应用层:通信的起源
    当一个系统上的用户发送消息或发出必须访问远程系统的命令时,即会开始包的历史记录。应用协议会设置包的格式,以便相应的传输层协议(TCP 或 UDP)可以对包进行处理。

  2. 传输层:
    当数据到达传输层时,该层上的协议即会开始数据封装过程。传输层会将应用程序数据封装到传输协议数据单元中。

    • 使用TCP协议
      TCP 使用段来确定接收系统是否准备好接收数据。TCP 将从应用层收到的数据分成多个段,再向每个段中附加一个头。
      段头包含发送端口和接收端口、段排序信息以及称为校验和的一个数据字段。两台主机上的 TCP 协议都会使用校验和数据来确定数据传送是否出现错误。
      使用三次握手来建立连接。

    • 使用UDP协议
      与 TCP 不同,UDP 不会检查数据是否已到达接收主机。相反,UDP 会将从应用层收到的消息的格式设置为 UDP 包。UDP 会向每个包中附加一个头。此头包含发送端口和接收端口、包含包长度的字段以及校验和。
      发送 UDP 进程会尝试将包发送到接收主机上的对等 UDP 进程。应用层将确定接收 UDP 进程是否会确认包的接收。UDP 不需要任何接收通知。UDP 不使用三次握手。

  3. 网络层:准备传送包的位置
    IP 协议将在该位置处理这些段和包。
    IP 通过将这些段和包的格式设置为多个称为 IP 数据报的单元,准备对其进行传送。然后,IP 会确定数据报的 IP 地址,以便将其高效地传送到接收主机。
    IP会向段或包添加* IP 数据包头*,IP 数据包头中的信息包括发送主机和接收主机的 IP 地址、数据报长度以及数据报排序顺序。如果数据报超过网络包允许的字节大小而必须进行分段,则会提供此信息。

  4. 数据链路层:成帧位置
    数据链路层协议(如 PPP)会将 IP 数据报的格式设置为
    这些协议将附加第三个头和一个脚注,以便对数据报执行“成帧”操作。
    帧标题包括CRC字段(循环冗余码校验 ,cyclic redundancy check, CRC) ,用于检查帧经由网络介质时是否出现错误。然后,数据链路层会将帧传递到物理层。

  5. 物理网络层:帧的发送和接收位置
    发送主机上的物理网络层会接收帧,并且将 IP 地址转换为适合网络介质的硬件地址。然后,物理网络层会通过网络介质将帧向外发送。

接收端

当包到达接收主机时,包便会按照其发送顺序的相反顺序经由 TCP/IP 协议栈。
接收主机上的每种协议还会删除头信息,该信息通过发送主机上的对等协议附加到包中。

将会发生以下过程:
1. 物理网络层接收帧格式的包。物理网络层会计算包的 CRC,然后将帧发送到数据链路层。

  1. 数据链路层检验帧的 CRC 是否正确,然后删除帧标题和 CRC。最后,数据链路层将帧发送到 Internet 层。

  2. Internet 层读取头中的信息以识别传输。然后,Internet 层将确定包是否为分段包。如果分段进行传输,则 IP 会将分段重新汇编成原始数据报。然后,IP 将删除 IP 数据包头并将数据报传递到传输层协议。

  3. 传输层(TCP、SCTP 和 UDP)读取头以确定必须接收数据的应用层协议。然后,TCP、SCTP 或 UDP 将删除其相关的头。TCP、SCTP 或 UDP 将消息或流发送到接收应用程序。

  4. 应用层接收消息。然后,应用层将执行发送主机所请求的操作。

知道了通信传输的大概步骤后,现在就整理那个问题。

3. 发生了什么

大概过程

浏览器回车后:
1. DNS域名解析,获取目标服务器IP地址
2. HTTP封装请求(应用层包)
3. 调用系统API,使用Socket,通过三次握手建立连接(HTTP协议是使用TCP作为其传输层协议的),
4. 发送请求(TCP段),请求在第三次“握手”时就发送出去了。(IP数据报)
5. (网络层)路由寻址
(忽略链路层和物理层)
7. 服务器响应
8. 客户端关闭连接,TCP四次挥手

1 DNS域名解析

  • DNS(Domain Name System):域名转IP地址
  • DNS具有两层含义:
    1. 一个由分层的DNS服务器实现的分布式数据库;
    2. 一个允许主机查询分布式数据库的应用层协议。有三种类型的DNS服务器:根DNS服务器、顶级DNS服务器和权威DNS服务器。这些服务器以下图的层次结构组织起来。
  • 有三种类型的DNS服务器:根DNS服务器、顶级DNS服务器和权威DNS服务器。这些服务器以下图的层次结构组织起来。
    DNS服务器类型

  • DNS缓存:
    从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存(hosts文件),路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。

  • 查询过程

    1. 查询浏览器缓存
    2. 查询hosts文件
    3. 本地DNS解析器缓存
    4. 本地DNS服务器(TCP/IP参数中设置的DNS服务器)
    5. 如果本地DNS服务器设置了转发模式,就会把请求向上一级转发;未设置转发,就直接把请求发送到跟DNS服务器,向下查询;最后都把结果返回给本地DNS服务器,它再返回给客户端。
      未设置转发、无缓存查询过程
  • DNS负载均衡
    DNS可以返回一个合适的机器的IP给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是DNS负载均衡,又叫做DNS重定向。
    CDN(Content Delivery Network)就是利用DNS的重定向技术。

2 HTTP封装请求

就是HTTP的报文格式,封装为应用层包。

3、4 建立连接、发送请求

  • 套接字:
    在应用层和传输层之间,更准确地讲是在浏览器进程和操作系统提供的TCP服务程序之间,有一个很重要的东西叫做套接字(Socket)。
    套接字是对TCP和UDP的封装,它的作用是实现传输层的多路复用和多路分解。
    应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据(http 协议默认端口号是 80, https 默认端口号是 443)。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接。
    套接字

  • 建立TCP连接,三次握手:
    TCP是面向连接的,在实际发送数据之前,客户端和服务器需要建立起一个TCP连接。

    1. 客户端发送SYN标志的数据包请求连接
    2. 当服务器收到SYN请求后,如果其所请求的端口号正在等待连接,则会为这一条TCP连接分配资源,并发送一个SYN/ACK报文段作为应答。
    3. 客户端机收到SYN/ACK报文段后,客户机回传一个带ACK标志的数据包,此时握手结束。数据包在第三次握手时发送。
      三次握手
  • 此时连接已经建立起来,请求也被传送到客户端主机的网络层。

5 路由寻址

IP路由选择是逐跳(hop-to-hop)进行的。IP并不知道完整路径。
所有的IP选择只为数据报提供下一站的IP地址。
路由选择机制的基础是在每一台主机和路由器里都存储着一张路由表。路由表的每一项包含了目的主机IP地址、下一跳路由器(或主机)的IP地址、相对应的网络接口以及其他必要的信息。

6 服务器响应

发送响应报文,同样的传输路径发送至客户端。

7 客户端关闭连接,四次挥手

  1. 客户端发出FIN报文段
  2. 服务器收到后,回复ACK
  3. 服务器发送FIN报文段,服务器释放资源
  4. 客户端收到后,回复ACK,过了一段计时等待,客户端释放资源。(计时等待是为了客户端重传最后的ACK防止其丢失。)
    四次挥手

至此,关于通信过程有个大概了解了,接下来弄些小问题

4. 小问题

4.1 GET和POST区别

根据Restful的定义,GET用来获取资源,POST用来更新资源。这是语义上的区别。
1. GET把参数会附在请求行中,以?分割URL和传输数据,多个参数用&连接。
POST把参数放在请求体中。
2. HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。
但实际上(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。
3. POST的安全性要比GET的安全性高。
4. 等

但实际上HTTP是建立在TCP连接上的,所发送的都是TCP数据包,并不本质区别,但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
- 而真正的区别在于:GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

参考: 99%的人都理解错了HTTP中GET与POST的区别

4.2 TCP和UDP区别

Transmission Control Protocol传输控制协议
User Datagram Protocol用户数据报协议

UDP:单个数据报,不用建立连接,简单,不可靠,会丢包,会乱序;
TCP:流式,需要建立连接,复杂,可靠 ,有序。

UDP:

  • 无连接的,即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。数据报模式
  • 不保证可靠交付,因此主机不需要为此复杂的连接状态表
  • 面向报文的,意思是 UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界,在添加首部后向下交给 IP 层。
  • 没有阻塞控制,因此网络出现的拥塞不会使发送方的发送速率降低。
  • 支持一对一、一对多、多对一和多对多的交互通信,也即是提供广播和多播的功能。
  • 首部开销小,首部只有 8 个字节,分为四部分。

TCP:

  • 面向连接,流模式
  • 可靠的,所有会消耗资源进行连接等
  • 一对一的

参考:
UDP 和 TCP 的不同
TCP与UDP的区别

结语

文章参考了很多东西,梳理了一下整个通信流程,有个大概框架了解,之后遇到某方面知识再往里面填。




参考:
前端经典面试题: 从输入 URL 到页面加载发生了什么?
在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?
what happens when you type in a URL in browser [closed]
当···时发生了什么?
FEX:从输入 URL 到页面加载完成的过程中都发生了什么事情?