从输入URL到页面展示到底发生了什么(非常重要!)
HTTP版本
1在浏览器中输入URL
2浏览器根据DNS协议获取IP地址
3浏览器根据IP地址和端口号 ,向目标服务器发送一个TCP连接请求
4浏览器TCP连接后,向目标服务器发送HTTP请求报文,请求获取网页的内容
5服务器收到HTTP请求报文后,处理请求,返回HTTP响应报文
6浏览器收到HTTP响应报文后,解析响应体中的HTML代码,渲染网页结构和代码,同时根据HTMl中其他资源的URL,再次发送HTTP请求报文,直到网页完全加载出来
7浏览器不需要和服务器通信时,可以主动关闭TCP连接,或等待服务器的关闭请求
访问网页的全过程
从网络结构五层模型出发描述:
应用层
1打开浏览器输入URL(URL组成:协议+域名+端口+资源路径+参数+锚点。其中,参数是键值对,锚点以 # 开头)
2DNS服务器解析,获取IP地址
3根据协议向IP发送请求报文
传输层
TCP协议保证传输数据的可靠
网络层
转发和路由
转发,将分组从路由器的输入端口转移到合适的输出端口
路由,确定分组从源到目的地经过的路径
数据链路层
物理层
DNS解析过程
1浏览器的DNS缓存
2操作系统的DNS缓存和hosts文件
3本地域名服务器查询
4递归查询
先根域名服务器——获取顶级域名服务器地址
再顶级域名服务器——获取权限域名服务器地址
后权限域名服务器——获取IP地址
5返回结果
6操作系统返回IP地址
7浏览器获得IP地址
TCP三次握手四次挥手
是什么:
TCP协议,即传输控制协议,是一种面向连接、可靠的数据传输协议,是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。
面向连接:数据传输之前,客户端和服务器必须建立连接
可靠的:数据传输是有序的,要对数据进行校验
有什么用(为什么需要TCP协议):
为保证客户端和服务端的可靠连接,TCP建立连接时必须进行三次会话,即TCP三次握手:目的是确认双方接收能力和发送能力是否正常。
三次握手
第一次握手:客户端向服务端发送报文syn包
证明客户端发送能力正常
第二次握手:服务端接收到报文并向客户端发送报文syn包和ack确认包
证明服务器端的接收能力、发送能力正常
第三次握手:客户端向服务器发送报文ack包
证明客户端的接收能力正常
四次挥手
四次挥手:
数据传输完毕后,双方都可释放连接。
最开始时,双方都是ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
第一次挥手
客户端发出连接释放报文,停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(前面已经传送过来的数据的最后一个字节的序号+1),此时客户端进入FIN-WAIT-1(终止等待1)状态
第二次挥手
服务器端接收到连接释放报文后,发出确认报文,ACK=1,ack=u+1,且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT关闭等待状态
第三次挥手
客户端接收到服务器端的确认请求后,客户端就会进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,待服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器进入LAST-ACK(最后确认)状态,等待客户端的确认。
第四次挥手
客户端接收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL(最长报文寿命),当客户端撤销相应的TCB后,客户端才会进入CLOSEDD关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态。
到此TCP连接断开,四次挥手完成。
客户端为什么要等待2MSL:为了保证客户端发送的第一个ACK报文能到达服务器,因为这个ACK报文可能丢失,而2MSL是任何报文在网络上存在的最长时间,超过这个时间,报文将被丢弃,这样新的连接不会出现旧连接的请求报文。
为什么需要三次握手:
对于一个半双工通信协议,只需要客户端向服务端发起一次请求,服务端响应一次请求即可确认连接。
而TCP协议是一个全双工通信协议,需要同时确保客户端可以向服务端发送请求,服务端可以向客户端发送请求。
本来需要客户端发送请求,服务端响应,服务端发送请求,客户端响应共四个操作,但其中服务端的响应(ACK)和服务端发送请求(SYN)可合并为一次握手
为什么需要四次挥手:
当客户端向服务端发起关闭连接请求时,服务端可能还没有将数据发送完毕,所以两次请求不能合并,因此需要四次挥手