当我们输入一个url,按下回车之后发生了什么
这道题按理来说其实并不难,但是它经典在它是一个引子,通过这个例子可以引出任何面试官想要问你的问题
- 总体来说分为以下几个过程:
- 输入地址
- DNS解析
- TCP连接
- 发生http请求
- 返回http响应
- 浏览器解析渲染页面
- 断开连接
- 输入地址
当我们在浏览器输入完地址的时候,浏览器已经在智能的匹配可能得到的url了,它会从历史记录,书签等地方,找到可能的url,来彰显智能 - DNS解析
- DNS(Domain Name System)是域名系统的缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络。它主要职责是用来将主机名和域名转换为IP地址
- 我们常说的网址,域名并非是计算机的唯一标识,计算机的唯一标识是IP地址。但是IP地址很难记住,因此我们搜索网址,DNS服务器自动解析成IP地址,进而查找到目标主机
- 其过程如下:
- 首先查找浏览器缓存:看看是否含有该网址的IP地址缓存记录
- 查找系统缓存:浏览器找不到缓存就会去访问本地磁盘中的hosts文件,看看里面是否记录了该网址的IP缓存
- 如果仍然没找到,浏览器会发送一个DNS请求到本地DNS服务器
- 同样的,本地DNS服务器也会先查找它的缓存记录,此过程是递归的方式进行查询。如果没有则向DNS根服务器进行查询
- 根DNS服务器如果查不到会告诉本地DNS服务器,你可以去域服务器查询,并给出域服务器地址。这种是迭代的过程。
- 因为域名解析是从右往左开始的,因此对于www.baidu.com (准确的来说应该是www.baidu.com. ,最后一个点我们一般都会省略) 来说,先查找.com域服务器,.com域服务器同样会告诉本地DNS服务器去.baidu域服务器查找,这个过程会依次持续下去
- 最后,本地DNS服务器向顶级域名服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问
- TCP连接
主机浏览器通过DNS解析得到了目标服务器的IP地址之后,开始与其建立TCP连接
TCP连接的建立需要三次握手:- 第一次握手:客户端将标志位SYN置为1,随机产生seq=j的数据包到服务器,客户端进入SYN-SENT状态,等待服务端确认
- 第二次握手:服务端收到数据包后,由标志位SYN=1知道客户端需要请求建立连接,服务端将标志位SYN和ACK都置为1,ack=j+1,随机产生一个seq=K,并将该数据包发送给客户端以确定连接请求,服务端进入SYN_RCVD状态
- 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务端,服务端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,完成三次握手,随后客户端A与服务端B之间可以开始传输数据了
- 发送http请求
建立TCP连接之后,发起http请求。一个典型的http request header 一般需要包括请求的方法,例如get,post - 返回http响应
服务器接受处理完请求,返回http响应,一个响应报文格式基本请求报文,由响应行,响应头,空行,实体组成 - 浏览器解析渲染页面
浏览器是一个边解析边渲染的过程。首先浏览器解析html生成DOM树,然后解析css生成渲染树,最后绘成render树并绘制到屏幕上去, - 断开连接
四次挥手实现连接中断- 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据连接,客户端进入FIN_WAIT_1状态
- 第二次挥手:服务器收到FIN,发送一个ACK给客户端,确认序号确认序号为收到的序号+1,服务器进入CLOSE_WAIT状态
- 第三次挥手:服务器发送了FIN,用来关闭服务器到客户端数据连接,服务器进入LAST_ACK状态
- 第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送ACK给服务器,确认序号为收到序号+1,服务器关闭,完成挥手。