一次web请求:DNS->TCP连接->Nginx->SpringMVC->TCP断开

12 篇文章 0 订阅
9 篇文章 0 订阅

DNS域名解析

简单的说就是把域名翻译成 IP 地址,但如果在浏览器直接输入IP,则跳过这个步骤。

DNS寻找解析顺序:

浏览器缓存解析

操作系统缓存解析

公共域名服务器解析(根域名服务器/Root Server,主域名服务器)

TCP三次握手连接

  1. Client 端发送一个同步位SYN = 1,初始序号seq = x的报文段到Server端。TCP规定SYN报文段不能携带数据,但消耗掉一个序号,这时候 Client 进入SYN-SENT(同步已发送)状态。
  2. Server 监听到连接请求报文后,如同意建立连接,则向 Client 发送确认。Server端发送 SYN = 1 ,ACK=1,确认号ack=x+1,初始序号seq = y的报文段到Client。同样,这个报文段不携带数据,消耗一个序号。这时Server进入SYN-RCVD(同步收到)状态。
  3. Client 收到确认后还需再次发送确认。Client发送 ACK=1,确认号ack = y + 1,此时可带(seq=x+1)可不带(不消耗序号)数据。发送完成后Client与Server分别进入established(已建立连接)状态

四报文握手:

Service端发送的报文,可以拆分为一个确认报文段(ACK=1,ack=x+1)和一个同步报文段(SYN=1,seq=y),这样就变成了四报文握手,但与三报文握手的效果是一样的

为什么有Client的最后一次确认:

为了防止已失效的 连接请求报文段 又到达了Server端,因而产生错误。

Nginx反向代理:

代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部网络上服务器得到的结果返回给 Internet 上请求连接的客户端。

通过这样来保证内网服务器的安全,和做负载均衡。

 

参考:https://www.cnblogs.com/Lujihang/p/10682687.html

SpringMVC中的大体处理流程:

 

1. 客户端发送Http请求到DispatcherServlet

2. DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找对应Handler,返回给DispatcherServlet

3. DispatcherServlet调用HandlerAdapter,执行对应的Controller,并将得到的ModelAndView返回给DispatcherServlet

4. DispatcherServlet调用ViewResolver(视图解析器)来解析HandlerAdapter传递的ModelAndView(逻辑视图名),并返回视图(view)和模型数据给DispatcherServlet

5. DispatcherServlet根据视图解析器解析的视图结果,并渲染数据到视图中

6. 最后将视图结果响应到客户端显示

 

HandlerExecutionChain 使用的设计模式以及执行源码可参考(https://blog.csdn.net/BigBug_500/article/details/104435391

TCP四次握手断开连接

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。

客户端向服务器端请求关闭连接,服务器端向客户端发送确认关闭。服务器端向客户端发送关闭请求,客户端向服务器端发送确认关闭。

 

1. Client 端发送一个终止控制位FIN = 1,初始序号seq = u的报文段到Server端。TCP规定FIN报文段不能携带数据,但消耗掉一个序号,这时候 Client 进入FIN-WAIT-1(终止等待 1)状态。

2. Server端收到后发出确认,ACK=1,确认号ack=u+1,包序号seq=v的报文段,此时Server端进入CLOSE-WAIT(关闭等待)状态,Client端到Server端方向的连接就释放 了。

3. Client端收到报文后,进入FIN-WAIT-2状态。

4. 若Server端无数据发向Client端,则发送终止控制位FIN = 1,确认上次的报文段,ACK=1,ack=u+1,本次序号seq=w的报文段,进入LAST-ACK状态。

5. Client端收到后,发送确认包ACK=1,ack=w+1,序号seq=u+1的报文段,并进入TIME-WAIT阶段,该阶段结束后,连接才被释放

6. Server端收到报文后,释放连接。

为什么要有TIME-WAIT阶段:

1. 为确保Client最后一次ACK确认报文段到达Server,等待Service最后一次FIN报文段能够通过超时重传机制发送到Client端,最后,让Client与Server端都进入closed状态。

2. 为避免Client的最后一个ACK报文,被当作连接请求建立中的ACK报文,所以等待一段时间让该报文传输完毕(即从网络中消失)。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值