当在浏览器地址栏输入一个地址并按回车时会发生什么?
这里先看三张图,然后再具体说下
第一步 浏览器地址栏输入 URL
在浏览器地址栏中输入内容后按回车键,浏览器首先会检查输入的内容是否是合法的 URL
,如果不合法,浏览器会使用默认的搜索引擎去搜索输入的内容,如果合法,会先在浏览器中查找是否有缓存,如果有直接使用缓存,没有则进行下一步。
第二步 DNS
域名解析
在浏览器中找不到缓存后,则会解析 URL
中的域名拿到对应的IP地址,解析时会以这样一个顺序去查找,找到则停止
首先会搜索浏览器自身的 DNS
缓存
如果浏览器自身的缓存里面没有找到,那么浏览器会搜索系统自身的 DNS
缓存
还找不到,就会尝试从 hosts
文件中查找
前面三个都找不到的话,就会通过 DNS
域名服务器解析
第三步 建立 HTTP
连接
浏览器解析 URL
拿到协议,IP
和端口后,通过 TCP
与对应服务器建立连接,这个过程称为 3
次握手,如下图, SYN
,ACK
表示存放在 TCP
的标志位
第一次握手:
首先客户端发起请求,带着 SYN=1
,表示我想要创建连接
第二次握手:
服务器收到请求后,告诉客户端:我收到了,回复 ACK=1
,此时标识位就变为 SYN=1
,ACK=1
第三次握手:
到第 2
步服务器回复时,理论上就已经创建连接成功了,但为了防止意外,客户端又做了一次确认,告诉服务器我收到你的回复啦,此时只用发送 ACK=1
标志位就可也了
到此 HTTP
连接成功。
第四步 服务器处理和响应请求
连接成功后,TCP
就开始传输数据到服务器端,它会解析 URL
中的路径和相关参数,执行对应的程序,返回处理结果
第五步 浏览器处理响应
浏览器接收服务器的响应并进行处理,比如后端返回一个 HTML
页面,浏览器就会渲染加载显示出来
第六步 HTTP
请求响应完毕
看到这里,一次 HTTP
请求的过程就算完成了,但是还有后续的事要做,请求完成后 HTTP
连接需要断开,不然连着没发挥作用就是浪费资源了
第七步 断开 HTTP
连接
HTTP
建立连接时只能由客户端发起,而断开时可以由客户端和服务器端任意一方发起
第一次挥手:
主机 A
(可以为客户端或服务器端)向主机 B
发送一个 FIN
标志位,表示我没事做了请求关闭连接
第二次挥手:
主机 B
收到 FIN
后,向主机 A
发送一个 ACK
回复,表示我也没数据发送了,可以关闭连接
第三次挥手:
因为连接是双向的,此时主机 B
也会向主机 A
发送 FIN
标志位,请求客户端关闭连接
第四次挥手:
主机 A
收到主机 B
发送的 FIN
后,向主机 B
发送 ACK
回复,此时主机 B
收到后会关闭连接,主机 A
在长时间等不到主机 B
的回复后,自己也就关闭了连接
以上就是整个 HTTP
请求的全过程了!