在浏览器中输入URL并回车后发生了什么?

1、解析URL

在浏览器中输入URL后,浏览器首先对拿到的URL进行识别,抽取出域名字段。

URL(Universal Resource Locator):统一资源定位符。俗称网页地址或者网址。
在这里插入图片描述
80端口默认不显示,“?” 到“#”之间跟着参数,多个参数使用“&”连接,“#”后面跟着锚。

2、DNS域名解析

DNS,域名系统,是一个把域名和IP映射的数据库。
IP地址往都难以记住,但机器间互相只认IP地址,于是人们发明了域名,让域名与IP地址之间一一对应,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。

可以在浏览器中输入IP地址浏览网站,也可以输入域名查询网站,虽然得出的内容是一样的但是调用的过程不一样,输入IP地址是直接从主机上调用内容,输入域名是通过域名解析服务器指向对应的主机的IP地址,再从主机调用网站的内容。

DNS解析的步骤:
(1)查询浏览器缓存(浏览器会缓存之前拿到的DNS 2-30分钟时间),如果没有找到
(2)检查系统的hosts文件(保存了一些以前访问过的网站的域名和IP的数据),如果没有找到
(3)检查路由器缓存,如果没有找到
(4)查询本地服务器缓存,如果还没有找到
(5)由本地域名服务器依次向根域名服务器、顶级域名服务器、极限域名服务器请求搜索目标域名的IP
(6)获取到IP地址

3、建立TCP连接(三次握手)

第一次握手,客户端发送一个带有SYN标志的请求给服务端等待确认,状态变为syn-send
第二次握手,服务器发送一个带有syn+ack的确认指令
第三次握手,客户端收到确认指令并返回一个ACK确认信息。
连接建立,可以传输数据了。
然后建立连接
为什么要三次握手?
因为客户端发出的连接请求有可能因为网络原因滞留了,并没有丢失,有可能在连接释放以后才到达服务端。这时B收到在发送一个确认报文,由于这时客户端没有请求连接,所以不会回应服务端的确认,也就不会建立连接。

4、浏览器发起HTTP请求

HTTP请求报文由请求行、请求头、请求体组成。
请求行
请求方法、URL、HTTP协议及版本。

POST /user HTTP/1.1

请求头:
包含一些请求信息。

Accept:可接受的响应内容类型,如text/plain、image/jpeg…
Accepy-Language:响应内容的语言,如zh-CN
Content-Type:请求体的类型
Connection:客户端想使用的连接类型,如Keep-Alive
Cache-Control:指定是否使用缓存机制,如no-cache
Host:表示服务器域名和监听的端口号,如localhost:8088

空行

请求体:
GET方法中没有,POST方法中用来传递参数。

5、服务端处理HTTP请求并响应

服务器收到请求后,将收到的HTTP报文封装成HTTP的请求对象,由不同的来处理然后把结果放在响应报文中一起返回给浏览器。

响应报文由响应行、响应头、响应体组成。

响应行
服务器HTTP协议版本,响应状态码,状态码的文本描述

HTTP/1.1 200 OK

响应头
Access-Control-Allow-Origin:指定哪些网站可以跨域源资源共享
Allow:对于特定资源的有效动作
Cache-Control:通知从服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象及缓存有效时间。其单位为秒
Content-Range:如果是响应部分消息,表示属于完整消息的哪个部分
Date:此条消息被发送时的日期和时间
Expires:指定一个日期/时间,超过该时间则认为此回应已经过期
Last-Modified:所请求的对象的最后修改日期
Set-Cookie:设置HTTP cookie

响应体
需要返回的数据

6、浏览器解析渲染

(1) 首先当用户输入一个URL的时候,浏览器就会发送一个请求,请求URL对应的资源。
(2) 然后浏览器的HTML解析器会将这个文件解析,并且构建成一棵DOM树。
(3) 在构建DOM树的时候,遇到JS和CSS元素,HTML解析器就会将控制权转让给JS解析器或者是CSS解析器。
(4) JS解析器或者是CSS解析器解析完这个元素时候,HTML又继续解析下个元素,直到整棵DOM树构建完成。
(5) DOM树构建完之后,浏览器把DOM树中的一些不可视元素去掉,然后与CSSOM合成一棵render树。
(6) 接着浏览器根据这棵render树,计算出各个节点(元素)在屏幕的位置,然后渲染到屏幕上去。

7、关闭TCP连接(四次挥手)

第一次挥手。客户端发送带有FIN的终止请求。进入fin-wait
第二次挥手。服务端收到请求,先发送ACK确认信息,然后等待剩余的数据传完。
第三次挥手。传完后,服务端发送FIN报文表示要关闭。进入close-wait
第四次挥手。客户端收到后,向服务端发送请求ACK表示连接断开,之后会进入time_wait等待2ms以免ACK丢失重传。服务端收到后关闭。

在这里插入图片描述
为什么要四次挥手?
关闭时,服务器收到关闭报文,不会立即关闭,先回复一个ACK报文。需要等到所有的服务端报文发送完毕才会发送FIN报文。

为什么要有time_wait?
为了保证客户端发送的最后一个ACK能够到达服务端。这个ACK可能丢失,然后服务端就会超时重传这个FIN+ACK,A就可以在2ms内收到这个重传的报文,然后A再重传一次确认,然后都进入closed状态。

猜你喜欢

转载自blog.csdn.net/lixinyi0622/article/details/84640012