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

本文深入探讨DNS域名解析过程,包括浏览器缓存、操作系统缓存及公共域名服务器的解析顺序。同时,详细解析TCP三次握手连接机制,涵盖Client与Server端的交互细节,以及为何需要Client端的最后一次确认。此外,还介绍了Nginx反向代理的工作原理及其在保障内网服务器安全和负载均衡中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/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报文,所以等待一段时间让该报文传输完毕(即从网络中消失)。

 

<think>好的,我需要帮助用户理解如何查看当前运行的Docker容器及其相关信息,特别是如何解读docker ps命令的输出。首先,用户的问题集中在docker ps的输出信息以及容器的状态和端口映射上。根据提供的引用内容,我需要整合这些信息并给出清晰的解释。 首先,引用[1]提到docker ps会显示容器的名称、ID、状态、使用的镜像和绑定的端口。引用[3]补充了如何查看端口映射情况,可以使用docker port命令。而引用[2]解释了运行容器时的一些参数,比如-d、-t、-i和-p的作用,这些参数可能会影响容器的状态和端口配置。 我需要分步骤解释docker ps的输出列,包括CONTAINER ID、IMAGE、COMMAND、CREATED、STATUS、PORTS、NAMES。每个字段的含义需要详细说明,例如STATUS可能显示运行时间或退出状态,PORTS显示端口映射。然后,用户可能想知道如何进一步查看端口映射,这时候需要提到docker port命令,如引用[3]所述。 接下来,关于状态部分,需要解释常见的状态如Up、Exited、Restarting等,并说明如何通过STATUS字段了解容器的运行情况。例如,Up后面跟的时间表示运行了多久,Exited则显示退出状态码和时间,这对于排查问题有帮助。 然后,端口映射部分需要详细说明PORTS列的格式,比如0.0.0.0:8080->80/tcp表示主机端口8080映射到容器的80端口。同时,要提到-p参数的作用,如引用[2]中的解释,这样用户可以理解在运行容器时如何设置端口映射。 最后,可能需要给出示例,让用户更直观地理解输出。例如,运行一个nginx容器后,执行docker ps,展示具体的输出行,并逐列解释。此外,如果用户需要更详细的端口信息,可以建议使用docker port命令,如引用[3]中的步骤。 在生成相关问题时,需要考虑用户可能进一步想知道如何分析容器日志、如何管理容器状态或者如何配置网络和存储,这些都与docker ps的输出信息相关。因此,相关问题可以包括如何查看容器日志、如何启动/停止容器,以及如何配置网络和存储,帮助用户扩展知识。 总结一下,回答需要结构清晰,先解释docker ps的输出列,然后详细说明状态和端口映射,给出示例,最后提供相关命令和进一步的问题。确保引用正确的参考资料,并自然地将引用标识添加到相应的解释部分。</think>要查看当前运行的Docker容器及其信息,可按照以下步骤操作: --- ### 1. 执行`docker ps`命令 ```bash docker ps ``` 输出示例: ``` CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a1b2c3d4e5f6 nginx "nginx -g…" 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp webserver ``` --- ### 2. 解读输出字段 | 字段 | 说明 | |-----------------|--------------------------------------------------------------------| | **CONTAINER ID** | 容器唯一标识(前12位),用于操作容器(如`docker stop a1b2c3d4`)[^1] | | **IMAGE** | 容器基于的镜像名称(如`nginx:latest`) | | **COMMAND** | 容器启动时执行的命令(如`"nginx -g 'daemon off;'"`) | | **CREATED** | 容器创建时间(如`2 hours ago`) | | **STATUS** | 容器运行状态:<br>- `Up 2 hours`:已运行时长<br>- `Exited (0) 5m ago`:退出状态码和时间[^1] | | **PORTS** | 端口映射:<br>`0.0.0.0:8080->80/tcp`表示主机8080端口映射到容器80端口[^2] | | **NAMES** | 容器自定义名称(可通过`--name`参数指定) | --- ### 3. 端口映射详解 - **格式**:`主机IP:主机端口->容器端口/协议` - 示例:`0.0.0.0:8080->80/tcp`表示所有主机IP的8080端口映射到容器的80端口 - **查看完整映射**:使用`docker port [容器ID/名称]`[^3] ```bash docker port webserver # 输出:80/tcp -> 0.0.0.0:8080 ``` --- ### 4. 状态分类 | 状态类型 | 说明 | |---------------|--------------------------------------------------------------------| | **Up** | 容器正在运行(`Up 2 hours`表示已持续运行2小时) | | **Exited** | 容器已停止(括号内为退出状态码,如`Exited (137) 5m ago`) | | **Restarting**| 容器处于启状态(可能因崩溃或配置导致) | --- ### 5. 扩展操作 - **查看所有容器**(包括已停止的): ```bash docker ps -a ``` - **过滤容器**(按状态、名称等): ```bash docker ps --filter "status=exited" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值