| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 网络协议 -> 浏览器输入URL到看到页面中间都经历了什么?? -> 正文阅读 |
|
|
[网络协议]浏览器输入URL到看到页面中间都经历了什么?? |
|
浏览器输入
1
|
| 组成 | 说明 |
|---|---|
http | 通信协议,如http、https、ftp、maito等 |
user:pass | 登录信息(认证) |
www.xxx.cn | 主机(域名),如www.baidu.com |
:80 | 端口号,可选,省略则使用方案的默认端口,如http默认端口为80 |
index.html | 请求资源的文件路径,一般用来表示主机上的一个目录或文件地址 |
?a=1&b=2 | 参数,以键值对的方式,通过&符号分隔开来 |
#video | 片段标识符,#后面的内容,常见于链接锚点 |
缓存位置:分为内存缓存(Memory Cache)和硬盘缓存(Disk Cache)
disk cache 中是否有匹配,如有则使用,如没有则发送网络请求F5):因TAB没关闭,因此memory cache是可用的,会被优先使用,其次才是disk cacheCtrl + F5):浏览器不使用缓存,因此发送的请求头部均带有 Cache-control: no-cache,服务器直接返回 200 和最新内容强缓存:分为Expires和Cache-Control.
浏览器对于强缓存的处理是根据第一次请求资源时返回的响应头来确定的.
Expires:缓存过期时间,用来指定资源到期的时间(HTTP/1.0);Cache-Control: cache-control: max-age=2592000:第一次拿到资源后的2592000秒内(30天),再次发送请求,读取缓存中的信息(HTTP/1.1)Cache-Control优先级高于Expires
协商缓存(Last-Modified/ETag):就是强缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程.

数据缓存

DNS解析解析过程
当用户在地址栏输入一个url,如www.taobao.com,DNS解析过程如下:
浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束;操作系统缓存中有没有对应的已解析过的结果.(通过hosts文件设置,但因为容易被黑客攻击,所以该文件默认是readonly只读状态,防止被恶意篡改);hosts文件没有命中该域名,才会真正请求本地域名服务器(LDNS)来解析这个域名.本地域名服务器一般距离客户端不会太远,一般都会缓存域名解析结果.根域名服务器发送请求.主域名服务器(国际顶尖域名服务器,如.com .cn .org等)地址,本地域名服务器收到后再向该地址发送请求;权威域名服务器(如google.com)地址,权威域名服务器根据映射关系表找到目标ip,返回给本地域名服务器;ip;
优化:
减少DNS请求次数;
DNS预获取(DNS Prefetch)
<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//static.360buyimg.com"/>
<link rel="dns-prefetch" href="//misc.360buyimg.com"/>
<link rel="dns-prefetch" href="//img10.360buyimg.com"/>
<link rel="dns-prefetch" href="//d.3.cn"/>
<link rel="dns-prefetch" href="//d.jd.com"/>
服务器拆分的优势
HTTP并发
TCP三次握手
标识说明:
seq序号,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记ack确认序号,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1ACK:确认序号有效RST:重置连接SYN:发起一个新连接FIN:finish,终结的意思,释放一个连接三次握手过程:
第一次握手:建立连接。客户端发送连接请求报文段,将SYN置1,序列号seq(sequence number)为x;然后,客户端进入SYN_SEND状态,等待服务器的确认。
第二次握手:服务器收到SYN报文段,对这个SYN报文段进行确认,ACK置1,表示同意连接,确认号ack(acknowledgement number)为x+1;同时,服务器还要发送SYN请求信息,将SYN置1,序列号seq为y;服务器将上述SYN+ACK报文段一并发送给客户端,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK报文段。然后将确认号ack设置为y+1,向服务器发送ACK报文段。这个报文段发送完毕后,客户端和服务器都进入ESTABLISHED状态,完成TCP三次握手,之后可以开始传数据。
为什么需要三次握手?
为了保证服务器能接收到客户端的信息并做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。传输的信道实际上是不可靠的,所以要想数据传输可靠,至少要做到三次握手,三次是理论上的最小值.
TCP四次挥手当客户端和服务器通过三次握手建立了TCP连接之后,当数据传输完毕,就要断开TCP连接,这个过程称为四次挥手.

四次挥手过程:
第一次挥手:主机1(可以是客户端,也可以是服务器)设置序列号seq为u,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT状态,这表示主机1没有数据要发送给主机2了。
第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回复一个ACK报文段,确认号ack为u+1,序列号seq为v;主机2进入CLOSE_WAIT状态;主机1收到主机2发送的ACK报文段之后,进入FIN_WAIT_2状态。
第三次挥手:主机2向主机1发送FIN报文段,设置序列号seq为w,确认号ack为u+1,请求关闭连接,同时主机2进入LAST_ACK状态
第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,确认号ack为w+1,序列号seq为u+1,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL(MSL,最长报文段寿命)后依然没有收到回复,则证明服务端已经正常关闭,那么主机1也可以关闭连接了。
为什么需要四次挥手?
挥手次数比握手次数多了一次的主要原因在于
SYN连接请求报文后,可以直接发送SYN+ACK报文;FIN报文时,很可能并不会立即关闭链接,所以只能先回复一个ACK报文,告诉客户端:”你发的FIN报文我收到了,只有等到服务器端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送",故需要四步握手.挥手过程中如果客户端先挂断了,服务器端会发生什么?
TCP设有一个保活计时器,绑定每一个客户端,超过这个计时器设定的时间,还没有收到应答报文段,服务器端就会发送探测报文段(一般连续发送10个左右),如果还是没有回应,服务器端判定客户端出现问题,关闭连接.
关于页面渲染,可见本人另外一篇blog——浏览器页面渲染流程
|
|
| 网络协议 最新文章 |
| 使用Easyswoole 搭建简单的Websoket服务 |
| 常见的数据通信方式有哪些? |
| Openssl 1024bit RSA算法---公私钥获取和处 |
| HTTPS协议的密钥交换流程 |
| 《小白WEB安全入门》03. 漏洞篇 |
| HttpRunner4.x 安装与使用 |
| 2021-07-04 |
| 手写RPC学习笔记 |
| K8S高可用版本部署 |
| mySQL计算IP地址范围 |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年12日历 | -2025/12/15 20:14:39- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |