当我们在浏览器的地址栏填上 www.baidu.com
并敲下回车时,浏览器和 Web 服务器之间经历了什么样的操作?它们之间的通信连接是怎么建立?主要有以下 5 个步骤:
1、域名解析
首先浏览器会解析 www.baidu.com
这个域名对应的 IP 地址,解析的步骤主要是下面几步:
1.1、浏览器首先会去搜索自己本身的 DNS 缓存数据,如果存在对应的缓存,则解析结束,如果没有则会执行下面步骤的解析
1.2、搜索操作系统本身的 DNS 缓存数据,同样的如果找到了对应的缓存,则解析结束,如果没有对应的缓存则会执行下面步骤的解析
1.3、尝试去读取系统中的 `hosts` 文件,看看文件中是否存在对应的域名 - IP 映射,如果有则解析结束,如果没有则继续向下面步骤执行
1.4、浏览器向 DNS 系统发起请求,向本地配置的首选 DNS 服务器发起域名解析请求
2、建立 TCP 连接
经过步骤 1 之后已经解析域名得到了对应的IP 地址,浏览器会通过一个随机的端口(1024 < 端口 < 65535)向 Web 服务器的 80
端口发起 TCP 连接请求(即三次握手)。
第一次握手:建立连接。客户端发送连接请求报文,将 SYN 位置为 1, Sequence Number 为 x;然后,客户端进入 SYN_SEND 状态,等待服务器的确认;
第二次握手:服务器收到 SYN 报文段。服务器收到客户端的 SYN 报文段,需要对这个 SYN 报文段进行确认,设置 Acknowledgment Number 为 x+1(Sequence Number+1);同时,自己自己还要发送 SYN 请求信息,将 SYN 位置为 1,Sequence Number 为 y;服务器端将上述所有信息放到一个报文段(即 SYN+ACK 报文段)中,一并发送给客户端,此时服务器进入 SYN_RECV 状态;
第三次握手:客户端收到服务器的 SYN+ACK 报文段。然后将 Acknowledgment Number 设置为 y+1,向服务器发送 ACK 报文段,这个报文段发送完毕以后,客户端和服务器端都进入 ESTABLISHED 状态,完成 TCP 三次握手。
3、发送 HTTP 请求
建立了 TCP 连接之后,浏览器会向 Web 服务器发送请求,如:GET/user/hello.jsp HTTP/1.1
,并附带相应的请求报文信息。
4、 Web 服务器响应请求,并返回响应报文
当 Web 服务器接收到请求之后会做相应的处理,然后响应请求,如:HTTP/1.1 200 OK
,并返回响应的报文信息。
5、浏览器解析响应报文 HTML,并请求 HTML 代码中的资源
浏览器获取到响应的 HTML 文件后,开始解析 HTML 代码,遇到相应的静态资源(js
、css
等)时,就向服务器请求下载,最终展示到浏览器页面中。