https://www.cnblogs.com/cswiki/p/14429730.html

在浏览器中 ,输入一个网址后 回车背后到底发生了什么?

0、浏览器和服务器

在我们 输入 一个**www.yuque.com** 后,就会返回一个语雀的主页面。这其实就是 浏览器 和 语雀 服务器 网络通信 的过程。浏览器是客户端,用于发出请求,而语雀的服务器就是服务端,用来接收请求并且 响应出这个主页面。

1、解析URL

URL ,可以理解成为 我们输入的这个网址,而网址里有域名。举例子 :www.yuque.com/dashboard 这是个网址 ,而www.yuque.com 就是个 域名。
URL的各元素组成:
image.png

2、浏览器封装 HTTP请求报文

对URL 进行 解析之后,浏览器就确定了目标服务器 和 文件名 , 接下来 就需要 根据 这些消息 封装 成 一个HTTP 请求报文发输出。
封装:发送端在层与层 之间传输数据的时候,每经过一层必定被打上一个该层所属的首部信息。反之,接收端在层与层 之间传输数据 的时候,每经过一层就会把该层对应的首部信息消去。
image.png

3、DNS域名解析 获取IP地址

封装好HTTP请求报文后, 还有一项工作 那就是 获取目标服务器的IP 地址。
虽然解析得到了域名,但是 域名并不是 目标服务器真正意义上的地址,互联网上每一台计算机都被全世界IP地址 标示着,但是 IP 地址不方便记,所以才设计出域名。
因此,就需要解析域名获取IP地址,不然空有一个域名也是没有用的。 通过域名 解析 得到 IP地址 就是 DNS协议做的事情。

DNS协议 解析的过程:

  1. 首先搜索浏览器中的 DNS缓存,缓存中维护着一张 域名与IP地址对应的表。
  2. 如果没有查到就去操作系统的DNS 缓存去查询
  3. 如果仍没有命中,操作系统将域名 发送到本地 HOST文件 中 查询,
  4. 无结果,发送 本地域名服务器,本地域名服务器查询自己的DNS缓存,查找成功后则返回结果,(注意:主机和本地域名服务器之间的查询方式是递归查询
  5. 如果没有成功,本地域名服务器向上级域名服务器进行查询,通过一下方式进行迭代查询(注意:本地域名服务器和其他域名服务器之间的查询方式是迭代查询,防止根域名服务器压力过大)
    1. 首先本地域名服务器向根域名服务器发出请求,根域名服务器是高层次的,他不会直接指明这个域名的IP地址,而是返回一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,顶级域名。如.com .cn .org等)地址而是返回根域名服务器的地址,也就是说给本地域名服务器指明一条道路,让他去这里寻找答案。
    2. 通过根域名服务器的IP地址,向它发出请求,获取 权限域名服务器的地址。
    3. 本地域名服务器 根据 权限域名服务器 的地址 向其发出 请求,最终本地域名服务器得到该域名的 IP地址。
  6. 本地域名服务器 将IP地址返回给操作系统,同时将自己IP地址 缓存起来
  7. 操作系统 将IP地址 返回给浏览器 ,同时自己 也将IP 地址缓存起来。
  8. 到这里,浏览器 就得到了域名 对应的IP 地址,再将IP 地址缓存起来。

image.png
需要注意的是,DNS 使用的是 UDP 协议,也就是说上面各种请求的转发,都是基于 UDP 这个无连接协议的。


💦 用户数据报协议 UDP(User Datagram Protocol):

  • UDP 在传送数据之前不需要先建立连接,远程主机在收到 UDP 报文后,不需要给出任何确认。
  • 虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如:QQ 语音、 QQ 视频 、直播等等.

💦 传输控制协议 TCP(Transmission Control Protocol):

  • TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
  • TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的传输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、流量控制、拥塞控制机制,在数据传完后,还会四次挥手断开连接用来节约系统资源),这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。
  • TCP 一般用于文件传输、发送和接收邮件、远程登录等场景

    4.建立TCP连接

    好,现在 ,我们发送数据包,知道了要发送到哪个电脑上,无论多远,都可以到达。这就是物理层,数据链路层,网络层这三层干的事情。
    然后你在要发送的数据包上,增加了传输层的头部,源端口号与目标端口号。
    这个时候就可以开始发送封装好了的 HTTP 请求报文了,那么既然需要发送请求,必然就需要 TCP 通过三次握手为浏览器和服务器之间建立可靠的连接,保证双方都具有可靠的接收和发送能力
    输入域名后发生了什么?🍳🍳🍳🍳 - 图4

    问题来了

    可这时候又有问题出现了,电脑上那么多进程,我们怎么知道要发送到哪个进程呢?
    输入域名后发生了什么?🍳🍳🍳🍳 - 图5
    所以,你需要把通信的进程区分开来,于是就给每个进程分配一个数字编号,你给它起了一个响亮的名字:端口号。
    输入域名后发生了什么?🍳🍳🍳🍳 - 图6
    然后你在要发送的数据包上,增加了传输层的头部,源端口号与目标端口号。
    image.png
    OK,这样你将原本主机到主机的通信,升级为了进程和进程之间的通信。你没有意识到,你不知不觉实现了 UDP 协议!(当然 UDP 协议中不光有源端口和目标端口,还有数据包长度和校验值,我们暂且略过)就这样,你用 UDP 协议无忧无虑地同 B 进行着通信,一直没发生什么问题。

    大问题:

  • 丢包问题

  • 效率
  • 顺序
  • 流量
  • 拥塞
  • 连接问题

    解决连接问题

    TCP的三次握手(建立连接) 和 四次挥手(断开连接)
    详细的不多说,看这就是网络。

    5.浏览器发送请求

    TCP 三次握手完成后,浏览器与目标服务器之间就建立了一个可靠的虚拟通道,于是浏览器就可以发送自己的 HTTP 请求了。
    需要注意的是:,HTTP 请求报文或者响应报文在 TCP 连接通道上进行传输的时候,由于这些报文比较大,为了更容易和准确可靠的传输,TCP 会将 HTTP 报文按序号分割成若干报文段并加上 TCP 首部,分别进行传输。接收方在收到这些报文段后,按照序号以原来的顺序重组 HTTP 报文

输入域名后发生了什么?🍳🍳🍳🍳 - 图8

6. 负责传输的 IP 协议

实际上,TCP 在三次握手建立连接、四次握手断开连接、以及连接建立过程中的收发数据(TCP 报文段)等各阶段操作时,都是通过 IP 协议进行传输的,IP 协议将这些阶段的数据添加 IP 首部封装成 IP 数据报再进行传输。
IP 数据报的首部存有源 IP 地址目标 IP 地址。所谓源 IP 地址 就是发送方的 IP 地址;目标 IP 地址就是通过 DNS 域名解析得到的目标服务器的 IP 地址。
事实上,IP 协议身处的网络层规定的是:数据报要通过怎样的路径(传输路线)才能到达对方计算机,并传送给对方。不理解这句话的详细解释马上就来,继续往下读。

7. 使用 ARP 协议凭借 MAC 地址通信

APR协议:地址解析协议 :通过IP地址 ,找到对应的MAC地址。
上面说了,IP 协议的作用是把各种数据包传送给对方,而要保证确实传送到对方那里,则需要满足各类条件,其中必要的两个就是 IP 地址 和 MAC 地址。
MAC 地址也是用来唯一标识一个接入互联网的设备的,可能不禁有小伙伴要问,既然网络层已经有了唯一标识的 IP 地址,为啥还需要 MAC 地址?
看下面这幅图,在网络上,通信的双方在同一局域网内的情况是很少见的,通常是需要多台计算机和网络设备的中转才能连接到对方。而在进行中转时,就需要利用下一站中转设备的 MAC 地址来搜索下一个中转目标
image.png

  • 网络层指定了从哪个主机(「源 IP 地址」)发送到哪个主机(「目的 IP 地址」)。源 IP 地址和目标 IP 地址在传输过程中是不会变化的。
  • 而数据链路层则是根据 MAC 地址在一个接一个的区间中进行传输的,每个区间内的出发地址即「源 MAC 地址」,每个区间内的目的地址即「目的 MAC 地址」。显然,随着数据的传输,源 MAC 地址和目的 MAC 地址会不断的发生变化比如上图,网络层告知了 1-2-3 路线,也就是说指明了这几个路由器的 IP 地址。那么数据链路层就会根据这几个 IP 地址对应的 MAC 地址依次找到 1、2、3,并在他们之间传输数据

ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的。并且每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表
如下图所示,假定主机 A 向同一链路上的主机 B 发送 IP 数据报,已知主机 A 和主机 B 的 IP 地址,它们互不知道对方的 MAC 地址:
image.png
…….TO BE CONTINUE

8. 服务器响应请求

浏览器的 HTTP 请求报文通过 TCP 三次握手建立的连接通道被切分成若干报文段分别发送给服务器,服务器在收到这些报文段后,按照序号以原来的顺序重组 HTTP 请求报文。然后处理并返回一个 HTTP 响应。当然,HTTP 响应报文也要经过和 HTTP 请求报文一样的过程。

9. 断开 TCP 连接

四次挥手断开 TCP 连接,

10. 浏览器显示界面

浏览器接收到服务器返回的数据包,根据浏览器的渲染机制对相应的数据进行渲染。

总结

应用层:

  • 浏览器封装 HTTP 请求报文
  • DNS 解析域名获得目标服务器地址

传输层:

  • 建立连接
  • 把应用层传过来的 HTTP 请求报文进行分割,并在各个报文上打上标记序号及端口号转发给网络层

网络层:

  • 利用 ARP 协议根据 IP 地址获取作为通信目的地的 MAC 地址后转发给链路层

服务端在链路层收到数据,按序往上层发送,一直到应用层接收到浏览器发送来的 HTTP 请求报文,然后处理该请求并返回 HTTP 响应报文,浏览器接收到响应报文之后解析渲染界面。最后 TCP 断开连接。