当我们在浏览器中输入网址后发生了什么?

发布时间 2023-08-21 00:22:43作者: QiuqL

编写目的

如标题所示,这是我在21年找工作时面试官问到的问题,很可惜当时我的回答非常的不尽人意,时间过去两年,对于网络知识也沉淀了很多,趁着这次再次找工作,再次审视这个问题,希望这次的回答能我或新的面试官满意。

输入网址

网址,也就是我们常说的URL,我们通常用浏览器来访问web服务器的资源,但是浏览器实际上并不只有这个功能,它也可以用来在FTP服务器上下载和上传文件,同时具备电子邮件客户端的功能,所以,除了“http:”开头的网址,我们还能看到一些例如“ftp:”、“file:”及“mailto:”开头的网址。所以根据访问目标的不同,URL的写法也会不同。后续均已http协议为例。
image

浏览器解析URL

用户在浏览器中输入的URL后,浏览器会对URL进行解析,拆分出URL的各个元素,如协议、web服务器ip或域名、需要访问的资源的路径名及具体文件。解析完成之后浏览器就知道了该使用什么协议,对哪台服务器进行访问,该访问什么资源。

生成HTTP请求信息

对URL进行解析后,浏览器就确定了web服务器和文件名,接下来就是根据这些信息来生成HTTP请求信息。请求信息中包含请求行、请求头、请求体

  1. 请求行的格式是: <方法> <HTTP版本>
  2. 请求头的格式是:<字段名>:<字段值>
  3. 请求体:包含客户端向服务器发送的数据,例如用post方法向web服务器发送的网页表单数据

向DNS服务器查询web服务器的IP地址

生成http消息后,接下来需要将消息发送给web服务器,浏览器本身不具备将消息发送到网络的功能,所以需要委托操作系统来实现。而发送消息需要知道web服务器的具体IP地址,很多情况下,我们并不能记得一串数字的IP地址,所以输入域名进行访问的情况更多,所以在发送请求之前,浏览器就需要先完成域名对应IP地址的查询工作。
查询IP地址的方法非常简单,就是向最近的DNS服务器询问对应域名的IP地址是什么就可以了。通过DNS查询IP地址的操作称为域名解析。浏览器通过socket库调用解析器,解析器就会向DNS服务器发送查询消息,然后DNS服务器会在响应消息中返回对应的IP地址给浏览器,至此浏览器就拿到了域名对应的IP地址。

委托协议栈发送消息

数据的收发分为若干个阶段,可以大致总结为以下4个:

  1. 创建套接字(创建套接字阶段)
  2. 将管道连接到服务器端的套接字上(连接阶段)
  3. 收发数据(通信阶段)
  4. 断开管道并删除套接字(断开阶段)

先写到这,累了。。。改天再继续