We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
当我们在浏览器的地址栏中输入URL到页面渲染,中间具体发生了什么?
URL(Uniform Resource Locator)通常由协议 + 域名 + 端口 + 路径 + 查询参数组成。 比如https://www.baidu.com/search?name=123&age=24
URL(Uniform Resource Locator)通常由协议 + 域名 + 端口 + 路径 + 查询参数组成。
比如https://www.baidu.com/search?name=123&age=24
其中https是协议,www.baidu.com是域名,/search是路径,?name=123&age=24是查询参数
https
/search
?name=123&age=24
当我们输入好URL后,浏览器会解析出协议、域名、端口等信息,并发起一个HTTP请求。
exprise
Cache-Control
if-modified-since
if-none-match
浏览器缓存查找结果,并根据该结果的缓存规则来决定是否使用该缓存的过程
强缓存又分为exprise和Cache-Control,其中前者为HTTP1.0的产物,后者为HTTP1.1的产物
注意:exprise和cache-control同时存在时,cache-control的优先级更高
当强缓存失效,浏览器携带缓存标识想服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。
last-modified
e-tag
注意:e-tag和last-modified同时存在时,e-tag的优先级更高
注意,虽然这里简单介绍了浏览器缓存,但这并不是说明DNS解析在协商缓存之前,因为协商缓存是要发送HTTP请求的,而此时却还没有建立HTTP连接。 因为当你输入一个URL后,浏览器觉得这个URL曾经可能访问过,所以会先发送一个获取网页的请求。但是请求在发送前会查找缓存,存在缓存的话就会拦截请求并返回缓存,否则就往下进入网络请求过程
注意,虽然这里简单介绍了浏览器缓存,但这并不是说明DNS解析在协商缓存之前,因为协商缓存是要发送HTTP请求的,而此时却还没有建立HTTP连接。
因为当你输入一个URL后,浏览器觉得这个URL曾经可能访问过,所以会先发送一个获取网页的请求。但是请求在发送前会查找缓存,存在缓存的话就会拦截请求并返回缓存,否则就往下进入网络请求过程
众所周知,在发起HTTP请求前会进行域名解析,为的就是解析出网站的IP地址。为什么要获取网站的IP地址呢?因为域名只是为了方便大家记忆,真实情况下还是通过IP地址进行传输的。
我们的浏览器、操作系统、路由器都会缓存一些URL对应的IP地址,统称为DNS高速缓存。目的就是为了加快DNS解析速度,每次查询不用直接到根域名服务器中去查询。
查询顺序如下:
局部的DNS服务器并不会自己向其他服务器进行查询,而是将能够解析该域名的服务器的IP地址返回给客户端,让客户端再去查询。客户端会不断的向这些服务器进行查询,直到查询到结果。
因为三次握手才能确保客户端和服务器双方的接收和发送能力。第一次握手可以确认客户端的发送能力,第二次握手可以确认服务器的接收能力,和发送能力,第三次握手可以确认客户端的接收能力。少了任何一步都可能存在丢包的现象
第三次握手时可以携带数据,因为第三次握手对于客户端来说已经建立连接了,并且已经知道服务器接收和发送能力正常了,所以可以发送数据
渲染过程:
挥手过程:
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。
客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。如果不等待,客户端直接跑路,当服务端还有很多数据包要给客户端发,且还在路上的时候,若客户端的端口此时刚好被新的应用占用,那么就接收到了无用数据包,造成数据包混乱。
参考资料:https://juejin.cn/post/6935232082482298911
The text was updated successfully, but these errors were encountered:
No branches or pull requests
地址栏输入URL并解析
其中
https
是协议,www.baidu.com是域名,/search
是路径,?name=123&age=24
是查询参数解析URL
当我们输入好URL后,浏览器会解析出协议、域名、端口等信息,并发起一个HTTP请求。
exprise
和Cache-Control
判断是否命中强缓存,如果命中则从缓存获取资源,不会发送请求。如果没有命中则进行下一步if-modified-since
和if-none-match
判断是否命中协商缓存,命中则从缓存中获取资源,否则进行下一步浏览器缓存
强缓存
浏览器缓存查找结果,并根据该结果的缓存规则来决定是否使用该缓存的过程
强缓存又分为
exprise
和Cache-Control
,其中前者为HTTP1.0的产物,后者为HTTP1.1的产物Exprise
Cache-Control
Cache-Control的值
注意:exprise和cache-control同时存在时,cache-control的优先级更高
协商缓存
当强缓存失效,浏览器携带缓存标识想服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。
last-modified和if-modified-since
last-modified
字段,代表着该资源在服务器的最后修改时间if-modified-since
字段,值为服务器第一次返回的last-modified
的值e-tag和if-none-match
e-tag
字段,代表该资源的唯一标识if-none-match
,值为服务器第一次返回e-tag
的值注意:e-tag和last-modified同时存在时,e-tag的优先级更高
DNS解析
众所周知,在发起HTTP请求前会进行域名解析,为的就是解析出网站的IP地址。为什么要获取网站的IP地址呢?因为域名只是为了方便大家记忆,真实情况下还是通过IP地址进行传输的。
递归查询
我们的浏览器、操作系统、路由器都会缓存一些URL对应的IP地址,统称为DNS高速缓存。目的就是为了加快DNS解析速度,每次查询不用直接到根域名服务器中去查询。
查询顺序如下:
迭代查询
局部的DNS服务器并不会自己向其他服务器进行查询,而是将能够解析该域名的服务器的IP地址返回给客户端,让客户端再去查询。客户端会不断的向这些服务器进行查询,直到查询到结果。
建立HTTP连接(3次握手)
为什么需要三次握手
因为三次握手才能确保客户端和服务器双方的接收和发送能力。第一次握手可以确认客户端的发送能力,第二次握手可以确认服务器的接收能力,和发送能力,第三次握手可以确认客户端的接收能力。少了任何一步都可能存在丢包的现象
三次握手中可以携带数据吗
第三次握手时可以携带数据,因为第三次握手对于客户端来说已经建立连接了,并且已经知道服务器接收和发送能力正常了,所以可以发送数据
浏览器渲染页面
渲染过程:
断开连接(4次挥手)
挥手过程:
为什么挥手需要4次
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。
为什么客户端发送完ACK之后不能直接关闭,需要等一会?
客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。如果不等待,客户端直接跑路,当服务端还有很多数据包要给客户端发,且还在路上的时候,若客户端的端口此时刚好被新的应用占用,那么就接收到了无用数据包,造成数据包混乱。
The text was updated successfully, but these errors were encountered: