通过dns域名解析ip
浏览器优先在hosts文件中查找,没有会递归查询也就是浏览器只跟本地域名服务器请求ip地址;
本地域名服务器没有,本地域名服务器自己会执行迭代查询,
优先到跟域名服务器下,根域名服务器不负责解析但是会告知可解析该域名的顶级域名服务器(.com)地址返回给本地域名服务器,
本地域名服务器再去对应地址下查找,对应地址下的服务器下无法解析会再告知本地域名服务器可以解析的二级域名(baidu.com)的地址,
本地域名服务器再去对应二级域名服务器下解析,一层一层向下迭代之后可解析ip返回给本地域名服务器。
本地域名服务器拿到后会将ip返给浏览器并缓存到本地供下次查询使用
浏览器根据ip建立tcp连接(三次握手)
通过三次握手连接服务器指定端口,同步连接双方的序列号和确认序号
浏览器发送请求包给服务端,将SYN标志位设为1,并发送自己的序列号seq=x给客户端
客户端接收到请求包后发送确认请求包给客户端,将请求标志位SYN设为1,确认标志位ACK设为1,自己的序列编号设为seq=y,以及确认序列编号ACKnum设为x+1
客户端发送确认包给服务端,确认标志位ACK设为1,确认编号序列ACKnum设为y+1
连接完成
不是两次是因为产生丢包后服务端在接受到这个请求包之后对其进行响应但不是现在对应的请求包序列,客户端不会对其响应,服务器一直处于等待状态,资源浪费
三次就够,四次就浪费资源了
在浏览器发送请求后需要优先检查本地是否有缓存
浏览器会去查看是否有缓存:
1、没有缓存
直接发送请求给服务器,在接收到服务器响应资源后记录状态码200对其解析并将其存入缓存,缓存标识添加max-age、if-modified-since、if-none-match
(请求头中的if-modified-since、if-none-match与响应头中的last-modified、etag对应,没过期的话他们的内容值应该是一样的)
2、有缓存:就判断缓存
优先根据cache-control的max-age(允许读取缓存的时间)和expires(缓存过期时间)来检测缓存是否过期,如果没有过期就直接读取缓存,过期的话发送请求到服务器,并在请求头中添加if-none-match以及if-modified-since;
服务器在接收到该请求后会将其与etag以及last-modified进行对比,验证请求资源是否更新,如果没有过期,返回304 继续使用该缓存,如果真的过期,服务器发送响应资源给客户端状态码显示为200,客户端接收到后对该资源进行缓存并解析。
建立连接后浏览器通过发送HTTP请求至服务器
五层模型传输单位
物理层:比特
数据链路层:帧
网络层:分组
运输层:报文段
应用层:报文
请求报文中包含(请求方法/URI/协议版本号)请求行 + 请求头 + 空行 + 请求内容
GET/sample.jspHTTP/1.1 //请求方法/URI/协议版本号
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 //请求内容
服务器接收请求并返回HTTP响应报文给客户端,返回请求资源
响应报文中包含(协议版本号/响应状态码/状态码说明)状态行 + 响应头 + 空行 + 响应正文
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
响应正文
浏览器接收到资源并检测响应状态码,200开始解析页面
将字节数据转化为标记再转成node再转成相应的dom以及cssom树
两者渲染成一颗render树,只渲染可见的dom
根据render树布局,计算每个节点位置,重绘和回流
调用GPU(图形处理器,渲染必须),形成图层(每个新属性形成一个新的图层,提高可修改性),所有图层叠加后显示在页面上
浏览器完成渲染,请求响应结束,断开tcp连接(四次挥手)
客户端发送断开请求包给服务端,断开标志位FIN置为1,发送序号编号seq=x
服务端接收到后发送确认包给客户端,将确认标志位ACK设为1,确认客户端序号编号seq=x+1,发送自己的当前序号编号seq=y,此过程中可以能还在继续发送资源给浏览器,等到发送全部完成才会完全确认断开
服务端返回所有资源,发送断开确认包给客户端,断开标志位FIN置为1,确认标志位ACK=1,确认客户端序号编号ACKnum为x+1,发送自己最终序号编号seq=u
客户端接收后发送确认包给服务器端,确认标志位ACK为1,确认客户端序号编号ACKnum=u+1,序号编号seq置为x+1
2MSL(报文最大存活时间)后,断开连接
等待2msl后才断开连接,确保最终发送的确认报文服务器端可以接收到