URL请求发送之后发生的事情:
-
URL解析:分析是否符合URL规则,不符合就当做查询内容,
-
域名解析DNS
-
查询浏览器DNS缓存
-
查询操作系统的DNS缓存
-
查询host文件
-
浏览器发送一个UDP协议向本地配置的ISP DNS服务器53端口进行请求
- 本地DNS服务器会帮助我们进行递归查询(从本地域名服务器向根服务器进行查询,根服务器未能查询到就会向顶级域名服务器查询…直到查询到地址对应ip或者进行返回)
- 迭代查询(由本地域名服务器进行后续查询,如果根服务器没有查询到就会接着向顶级域名服务器查询
-
-
查询到对应ip地址后就会对请求服务器发起TCP链接请求
浏览器随机选择一个端口向服务器的WEB容器的80端口发送TCP链接请求。这个链接请求经过应用层(HTTP、HTTPS),传输层(TCP头部),网络层(IP首部),数据链路层(以太网首部)的封装后通过网卡进行传输
-
应用层:发送HTTP请求
-
传输层:建立连接和发送TCP报文数据段
对数据进行分段并标号
-
网络层:将数据段打包发送,在路由中查询路由表从而选择下一跳地址
-
数据链路层:使用以太网协议根据MTU最大帧长度 将数据分为数据帧,
-
-
三次握手成功建立连接
-
建立了TCP链接之后会发送http请求
HTTP请求报文请求的方法为get方法,如果浏览器存储了这个域名的cookie信息在发送的时候就会携带Cookie在Http报文的请求报文头
-
请求在首先从本机网卡发出,到达本地路由器之后根据路由表和请求目的ip,在路由表进行检查(子网掩码和目的ip进行按位与&)如果在一个网段(网络号相同),就就行下一跳的转发或者直接到达.不弱路由表中不存在对应映射就会发送到默认网关
-
服务端接收到http请求
服务端的web容器接收到的http请求,创建一个子进程进行处理,将http请求进行拆封解析,如果是请求的图片等静态资源将会直接返回,如果是Servlet方法,容器将会在执行对应方法,处理完成返回响应
-
经过和发送过程大致相同的流程,将响应信息传输给浏览器进行解析
浏览器拿到的如果是一个html资源,就会对其中代码进行解析,如果有js/css/image等静态资源,就会触发再次向服务器发送请求,这个时候,如果浏览器支持长链接(http1.1后)
-
然后对资源进行解析渲染,缓存等工作
-
断开TCP连接
- A端调用close函数主动关闭链接进入到FIN WAIT1状态 :向B端发送带有FIN标志位的分组,序列号为m
- B端确认收到这个分组知道 A端 已经发送完毕,进入CLOSE_WAIT状态 :并自动返回ack给A端
- 当A端接收到ACK进入到FIN WALT_2状态,等待B端发送数据结束
- 当B端数据发送结束 进入到LAST ACK状态 : 主动发送FIN标志位的分组给A端
- A端接收到FIN分组进入TOME WAIT 状态 : 自动响应一个ACK回复给B端
- B端接受到回复的ACK后进入CLOSED状态,A端等待2个MSL最大报文生存时间后进入CLOSED状态