在浏览器输入url后发生了什么
在浏览器输入url后发生了什么
1、域名解析
2、发起TCP的3次握手
3、建立TCP连接后发起的http请求
4、服务器端响应http请求,浏览器得到html代码
5、浏览器解析html代码,并请求html代码中的资源
6、浏览器对页面进行渲染呈现给用户
分点解析:
1.域名解析
通过本地DNS或者DNS服务器进行域名解析,将网址域名转换为服务器对应的IP地址。
DNS解析的详细过程:
1、解析域名时,浏览器会首先会依次查看自己的DNS缓存、操作系统中的DNS缓存、本地硬盘的 hosts 文件、路由器缓存,看看其中有没有缓存和这个域名对应的ip地址,如果有的话就直接使用 。
2、如果在上面的文件中没有找到对应的 IP 地址,浏览器就会发出一个DNS请求到本地DNS服务器 。本地DNS服务器一般是你的网络接入服务器商提供,比如中国电信,中国移动。
3、于是本地DNS服务器查看自己有没有缓存对应的 IP 地址,若有则直接返回结果,否则本地DNS服务器需要向DNS根服务器进行查询。根 DNS 服务器没有记录具体的域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,你可以到域服务器上去继续查询,并返回*域名服务器的 IP 地址给本地DNS 服务器。
4、本地DNS服务器再请求*域名服务器返回二级域名服务器IP,再请求二级域名服务器返回三级域名服务器IP…直到找到对应的 IP 地址,返回给浏览器。
5、最后,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
注: 域服务器收到请求之后,不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,相关域名的DNS服务器的地址。
2.TCP的三次握手
过程:
(1)第一次握手:
客户端主动向服务端发送请求建立连接的报文,并进入同步已发送状态;SYN = 1 表示连接请求,seq = x 表示起始***,x表示一个随机数,通常为1。(SYN = 1,seq = x)
(2)第二次握手:
服务端收到客户端的报文之后,返回一段确认接收到请求报文并同意创建新连接的报文,并进入同步收到状态。(SYN = 1, ACK = 1, seq = y, ack = x + 1)
(3)第三次握手:
客户端接收到服务端的确认报文之后,也返回一段确认报文给服务端表示自己已收到确认报文并进入建立连接状态,服务端收到确认报文后也进入建立连接状态,此时双方成功建立TCP连接。(ACK = 1, seq = x + 1, ack = y + 1)
注: 双方的确认号ack和序号seq的值,都是在彼此ack和seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成。
关于详细的TCP三次握手与四次挥手可见文章: TCP的三次握手与四次挥手.
3.客户端发送HTTP请求
浏览器将用户输入的地址封装成HTTP Request请求报文,发送到服务器。
HTTP请求报文格式:请求行+请求头+空行+请求体
GET / HTTP/1.1 //请求行:请求方法+HTTP版本
Accept:image/gif.image/jpeg //从这里开始直到空行都是请求头
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234 //请求体
4.服务器端响应资源
服务器收到请求后会返回响应报文,并在响应体中返回相关资源。
HTTP响应报文格式:状态行+响应头+空行+响应体
HTTP/1.1 200 OK //状态行:HTTP版本+状态码+提示信息
Server:Apache/r/n //从这里开始直到空行都是响应头
Content-Type:application/json
Content-Encoding:gzip/r/nxi
{"password": "1234","userName":"Tom"} //响应体
5.浏览器渲染页面
(1)HTML被HTML解析器解析成DOM Tree, css则被css解析器解析成CSSOM Tree(并行解析)。
(2)DOM Tree和CSSOM Tree解析完成后,被合并到一起,形成渲染树(render Tree)。
问题:
当第5步完成后,之前建立的TCP连接会因为资源传输完成而断开吗?
这要根据Connection请求头,如果是keep-alive,服务器就保持TCP连接;如果没有或者是close,则传输完毕便主动关闭TCP连接。
现在的浏览器都是http1.1,都是默认keep-alive,http1.0及以前就都是请求完毕便主动关闭TCP连接。
上一篇: wireshark抓包基础学习