输入url到页面呈现的过程

输入url到页面呈现的过程

  • DNS解析
  • TCP连接
  • 发送HTTP请求
  • 服务器向浏览器发送响应报文
  • 浏览器解析渲染页面

DNS解析

实现网址到IP地址的转换

DNS是一个递归搜索的过程

本地域名服务器-->根域名服务器-->顶级域名服务器
先去本地域名服务器查找,如果有,直接返回IP地址,
没有,本地域名服务器向根域名服务器发送请求,如果根域名服务器也不存在该域名,
本地域名服务器会向com顶级服务器发送求求,直到最后本地域名服务器得到IP地址并缓存在本地

最后找到并缓存到本地域名服务器

www.baidu.com (从右向左的过程)

com–baidu–www

(浏览器DNS缓存,系统DNS缓存,路由器DNS缓存,网络运营商DNS缓存)
采用递归搜索的方式

TCP连接

tcp三次握手

step1 客户端向浏览器发送SYN=1,seq=k,我要和你建立连接了,客户端进入( SYN_SENT )

step2 服务端收到客户端的请求,服务端向客户端发送SYN+ACK(SYN=1,ACK=1,seq=u,ack=k+1),我收到你的建立连接的请求了,我准备好了,你呢? 服务端进入(SYN_RECVD)

step3 客户端向服务端发送ACK(ACK=1,ack=u+1),表示收到了服务端的响应,要建立连接成功 (客户端 直接进入ESTABLISHED)
服务端建立完成(服务端 ESTABLISHED)

发送HTTP请求

发送http请求就是构建http请求报文并通过tcp协议中发送到服务端指定端口
http默认端口 80 https默认端口443

请求报文由三部分组成 请求行 请求头 请求正文

+ 请求行 Method request-url http-version
GET index.html http/1.1
常用的方法:GET POST PUT (传输文件)

  • 请求头 允许客户端向服务端传递请求的附加信息和客户端自身的信息
    Accept 指定客户端用于接收哪些类型的信息
    Connection 设置为Keep-alive用于告诉客户端本次http请求结束之后并不需要关闭TCP
    连接,这样下次http请求可以使用相同的tcp通道,节省tcp连接建立的时间

  • 请求正文
    客户端向服务端传送数据(post put)

4 服务器向浏览器发送响应报文

对tcp连接进行处理,对http协议进行解析,并按照报文格式进一步封装成HTTP Request对象

状态码

1 指示信息
2 成功
3 重定向
4 客户端错误
5 服务端错误

响应报文
服务器返回给给浏览器的文本信息,
响应报头

浏览器解析渲染页面

  • 解析html 构建DOM树,并行请求css/image/js
  • css文件下载完毕,开始构建cssom树
  • css树构建完毕,DOM+csson树一起生成渲染树(render tree)
  • 布局 计算每个节点在屏幕的位置
  • 绘制 通过显卡把页面画到屏幕上

断开连接

tcp的四次挥手
tcp是全双工的,两方都断开连接,才能完成断开连接

step1 客户端主动发送断开连接的请求,发送FIN(FIN=1,seq=u),
用来关闭主动到被动的数据连接 ,客户端不会再向服务端发送数据了,
(如果在FIN包之前发送出去的数据,如果没有收到对应的ack确认报文,
客户端仍然会重传这些数据)此时客户端进入FIN_WAIT1状态
但客户端此时还能接收服务端发送过来的数据

step2 服务器收到fin包,发送ACK=1,ack=u+1,seq=v给对方,服务端进入CLOSE_WAIT(关闭等待),tcp服务器通知高层的应用京城,客户端向服务器的方向就释放了,处于半关闭状态,客户端没有数据要发送了,服务端有要发送的数据
客户端收到服务端的确认后,进入客户端进入FIN_WAIT2,等待服务器发送释放报文,客户端还可以接收数据

step3 服务端向客户端发送 FIN=1,ack=w+1,自己的序号是seq=u+1,seq=w,服务器进入LAST_ACK,等待客户端确认,
tcp连接还没有释放,必须经过2*msl的时间后,
服务器发送fin,用来关闭服务器到客户端的数据传送,告诉客户端,我的数据发送完了,不会再给你发送数据了

step4 客户端收到服务端的连接释放报文后,必须发出确认,ACK=1,ack=w+1,自己的seq=u+1,此时,客户端进入TIME_WAIT状态,
tcp连接未断开,必须经过2*MSL的时间后,才进入closed

服务端收到ACK,立即进入closed

为什么连接是三次握手,关闭是四次握手

两次握手: 耗费服务端资源
防止已经失效的连接请求报文突然有传送至服务器,从而导致错误

当Server收到Client端的SYN连接请求,可以直接发送SYN+ACK报文,SYN报文是用来同步,ACK是用来应答的
但在关闭连接的时候当server收到client的fin,不会立即关闭socket,先回复ack,告诉client,你发的fin我收到了,
只有等到我Server端所有报文都发送完了,我才能发送fin报文,,所以需要四次握手

为什么需要TIME_WAIT状态需要经过2MSL才能返回CLOSE状态

用来重发可能丢失的ack报文,,client必须确认服务端收到了ack,客户端在发送ack之后进入time_wait
客户端设置一个计时器,等待2MSL
MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。
如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值