简单的记录一下从浏览器地址栏输入url到页面显示,经过了哪些处理.
1,chrome(以chrome浏览器为例)浏览器搜索自身的DNS缓存,看看缓存里面,比如说有没有比如baidu.com域名或是ip地址,然后检查域名有没有过期(通常是1min)
chrome://net-internals/#dns 可以查看你曾经访问过的域名地址。
2,搜索操作系统自身的dns缓存(浏览器中没有找到缓存或是缓存失效)
3,如果操作系统里面也找不到缓存,就会自动的到系统host文件里面去找域名或是ip。
4,如果host文件查找失败,浏览器就会发起一个dns(域名解析请求)的一个系统调用。
4.1 宽带运营商服务器查看自身的缓存。
4.2运营商服务器发起一个迭代dns解析的请求,这时运营商服务器把结果返回操作系统的内核同时缓存起来,操作系统内核把结果返回浏览器,最终浏览器拿到baidu.com对应的ip地址。
5,http三次握手。
6,tcp/ip建立起来,浏览器就可以向服务器发送http请求,使用了get方法请求了一个根域里面的一个域名...
7,服务器端接收了这个请求,根据路径参数,经过后端的一些处理之后,把处理后的结果的数据返回给浏览器,如果是某个网站的页面,就直接返回页面。
8.浏览器拿到完整的html页面代码,在解析和渲染这个页面的时候,里面的js css图片,静态资源,也同样经过上面的步骤。
9.浏览器根据拿到的资源,对页面进行渲染,最终把完整的页面呈现给用户。

三次握手,四次分手
图片描述

TCP SYN ACK

三次握手:
握手过程的第一个段的代码位设置为SYN,序列号为x,表示开始一次握手。接收方收到这个段后,向发送者回发一个段。代码位设置为SYN和ACK,序列号设置为y,确认序列号设置为x+1。发送者在受到这个段后,知道就可以进行TCP数据发送了,于是,它又向接收者发送一个ACK段,表示,双方的连接已经建立。
Client --> 置SYN标志 序列号 = J,确认号 = 0 ----> Server
Client <-- 置SYN标志 置ACK标志 序列号 = K, 确认号 = J + 1 <-- Server
Clinet --> 置ACK标志 序列号 = J + 1,确认号 = K + 1 --> Server
a 发起方 b接受方
a发送一个SYN包给b,b回一个[SYN,ACK]给b,a再回一个ACK包给b;

数据交换:
a ---->b
a 发送数据完毕,(PSH,ACK) aseq = x,ack=y,datalen = z
b 接受到以后发送(ACK) bseq = aack, back = aseq + alen, datalen=blen
b 发送数据完毕 (PSH,ACK)bseq = bseq + blen,back = back,datalen = blen
a 确认接受 (ACK) aseq = back ,aack = bseq + blen
注:PSH标志指示接收端应尽快将数据提交给应用层。从我协议分析的经历来看,在数据传输阶段,几乎所有数据包的发送都置了PSH位;而ACK标志位在数据传输阶段也是一直是置位的

在数据传输阶段,按照常理应用层数据的传输是这样的:(我们假定建立连接阶段Client端最后的确认包中序列号 = 55555, 确认号 = 22222)
Client --> 置PSH标志,置ACK标志 序列号 = 55555, 确认号 = 22222,数据包长度 = 11 ---> Server
Client <-- 置ACK标志,序列号 = 22222, 确认号 = 55566 (=55555 + 11),数据包长度 = 0 <--- Server
Client <-- 置PSH标志,置ACK标志 序列号 = 22223, 确认号 = 55566,数据包长度 = 22 <--- Server
Client --> 置ACK标志,序列号 = 55566, 确认号 = 22244(=22222+22),数据包长度 = 0 ---> Server


MichaelDuan
1.8k 声望39 粉丝

« 上一篇
Nodejs API
下一篇 »
http概念进阶