浏览器与apache通讯中的TCP连接状态迁移

前言
浏览器(IE,火狐,谷歌等)和apache都是基于http协议进行通讯的。浏览器在客户端,apache在服务端。http协议是在TCP/IP模型中的应用层。TCP协议状态在TCP/IP模型中的传输层。在浏览一个网站的时候,如果关闭了浏览器,只是关闭了浏览器的进程,浏览器和apache之间的连接还没有完全断开。操作系统会在一定时间后自动断开该连接。服务端也是一样,虽然apache的进程已经关闭了,但是连接不会立刻断开,linux操作系统会在一定时间后断开该连接。
TCP/IP结构对应OSI结构
TCP/IPOSI功能TCP/IP协议族应用层应用层文件传输,电子邮件,文件服务,虚拟终端TFTP,HTTP,SNMP,FTP,SMTP,DNS,RIP,Telnet 表示层数据格式化,代码转换,数据加密没有协议 会话层解除或建立与别的接点的联系没有协议传输层传输层提供端对端的接口TCP,UDP网络层网络层为数据包选择路由IP,ICMP,OSPF,BGP,IGMP,ARP,RARP链路层链路层传输有地址的帧以及错误检测功能SLIP,CSLIP,PPP,MTU,ARP,RARP 物理层以二进制数据形式在物理媒体上传输数据ISO2110,IEEE802,IEEE802.2
那么当完成数据传输后操作系统是怎么断开该连接的?下面详细讲解这个连接和断开过程。
首先了解TCP协议的几种状态
LISTEN:侦听来自远方的TCP端口 的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接 请求的确认
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN- WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对 连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接 收到连接中断请求的确认
CLOSED:没有任何连接状态
发起连接请求
apache服务器(服务端)不会主动发起连接请求的,apache服务器一直监听80端口(设定的某个端口),一旦有连接请求就会对请求作出响应。
所以每次的连接都是从浏览器(客户端)发起的。而关闭连接请求有可能是apache服务器发给浏览器,也有可能是浏览器发送给apache服务器。
浏览器发起关闭连接请求
浏览器在什么情况是会发起关闭连接请求?
1,所有的数据传输完成。
2,关闭了浏览器
3,其他
浏览器发起关闭连接请求的TCP协议状态迁移图
每个步骤的说明:
1,浏览中输入网址,开始连接服务器。这时浏览器的状态是SYN_SENT,apache的状态是LISTEN。
2,apache收到连接请求,开始一些准备工作,比如为该连接开辟内存空间,建立进程,并回复浏览器确认连接。这时浏览器的状态是SYN_SENT,apache的状态是SYN_RCVD。
3,浏览收到连接确认,连接被成功建立,开始请求需要的数据。这时浏览器的状态是ESTABLISHED,apache的状态是SYN_RECVD。
4,apache收到数据请求,发送相应的数据给浏览器。这时浏览器的状态是ESTABLISHED,apache的状态也是ESTABLISHED。
5,浏览器继续请求需要的数据。这时浏览器的状态是ESTABLISHED,apache的状态也是ESTABLISHED。
6,apache收到数据请求,发送响应的数据给浏览器。这时浏览器的状态是ESTABLISHED,apache的状态也是ESTABLISHED。
。。。。。
。。。。。
重复5和6直到所有数据接收完成
7,浏览器判断所有数据接收完毕,发送关闭连接请求。这时浏览器的状态是FIN_WAIT_1,apache 的状态是ESTABLISHED。
8,apache收到关闭连接请求,开始关闭连接工作(只是开始,并不是准备工作全部完成),比如关闭内存空间,关闭进程等,并发送同意关闭连接。这时浏览器的状态是FIN_WAIT_1,apache的状态是CLOSED_WAIT。
9,浏览器收到同意关闭连接,浏览器不会再发送请求,只是等待,开始等待apache的关闭工作完成,开始等待apache完成关闭工作后的确认。这时浏览器的状态是FIN_WAIT_2,apache的状态是CLOSE_WAIT。
10,apache完成关闭工作,内存回收,关闭进程等,发送最后的关闭确认请求。这时浏览器的状态是FIN_WAIT_2,apache的状态是LAST_ACK。
11,浏览器收到最后的关闭确认,关闭连接,并发送最后的关闭连接应答。这时会有2*SML秒的缓冲时间。2*SML时间后连接正式关闭。SML时间根据操作系统不一样而不一样。centos的SML时间是30秒。这时浏览器的状态时TIME_WAIT,apache的状态是LAST_ACK。
12,apache收到最后的关闭连接应答,apache关闭连接。这时也会有2*SML秒的缓冲时间。2*SML后连接正式关闭。这时浏览器的状态是TIME_WAIT,apache的状态是TIME_WAIT。
13,2*SML秒后浏览器的状态时CLOSED,apache的状态也是CLOSED。
apache发起关闭连接请求
apache在什么情况下会发起关闭连接请求呢?
1,http.conf 里面有个参数time_out。这个值是完成上一个请求的应答之后和下一个请求到来的时间差。如果apache在完成上一个请求的应答之后等了time_out秒还没收到第二个连接,apache就会主动断开该连接。
2,apache内存耗尽,或者一些其他原因
apache发起关闭连接请求的TCP状态迁移图
每个步骤的说明:
1,浏览中输入网址,开始连接服务器。这时浏览器的状态是SYN_SENT,apache的状态是LISTEN。
2,apache收到连接请求,开始一些准备工作,比如为该连接开辟内存空间,建立进程,并回复浏览器确认连接。这时浏览器的状态是SYN_SENT,apache的状态是SYN_RCVD。
3,浏览收到连接确认,连接被成功建立,开始请求需要的数据。这时浏览器的状态是ESTABLISHED,apache的状态是SYN_RECVD。
4,apache收到数据请求,发送相应的数据给浏览器。这时浏览器的状态是ESTABLISHED,apache的状态也是ESTABLISHED。
5,浏览器继续请求需要的数据。这时浏览器的状态是ESTABLISHED,apache的状态也是ESTABLISHED。
6,apache收到数据请求,发送响应的数据给浏览器。这时浏览器的状态是ESTABLISHED,apache的状态也是ESTABLISHED。
。。。。。
。。。。。
重复5和6直到所有数据接收完成
7,apache等待time_out秒后没有收到下个请求,所以主动发起关闭连接请求。这时浏览器的状态是ESTABLISHED,apache的状态是FIN_WAIT_1。
8,浏览器收到关闭连接请求,开始关闭连接工作(只是开始,并不是准备工作全部完成),比如关闭内存空间,关闭进程等,并发送同意关闭连接。这时浏览器的状态是CLOSED_WAIT,apache的状态是FIN_WAIT_1。
9,apache收到同意关闭连接,apache不会再发送请求,只是等待,开始等待浏览器的关闭工作完成,开始等待浏览器完成关闭工作后的确认。这时浏览器的状态是CLOSED_WAIT,apache的状态是FIN_WAIT_2。
10,浏览器完成关闭工作,内存回收,关闭进程等,发送最后的关闭确认请求。这时浏览器的状态是LAST_ACK,apache的状态是FIN_WAIT_2。
11,apache收到最后的关闭确认,关闭连接,并发送最后的关闭连接应答。这时会有2*SML秒的缓冲时间。2*SML时间后连接正式关闭。这时浏览器的状态时LAST_ACK,apache的状态是TIME_WAIT。
12,浏览器收到最后的关闭连接应答,浏览器关闭连接。这时也会有2*SML秒的缓冲时间。2*SML后连接正式关闭。这时浏览器的状态是TIME_WAIT,apache的状态也是TIME_WAIT。
13,2*SML秒后浏览器的状态时CLOSED,apache的状态也是CLOSED。
查看apache的连接状态
linux下查看所有连接状态的命令为:
#netstat -nat
linux下查看所有TCP连接数的统计:
#netstat -nat|awk ‘{print awk $NF}’|sort|uniq -c|sort –n
linux下查看80端口的连接数的统计:
#netstat -nat|grep “:80″|awk ‘{print $5}’ |awk -F: ‘{print $1}’ | sort| uniq -c|sort -n
linux下查看apache的连接状态的命令为:
#netstat -nat|grep –i ’80′
linux下查看apache的某个状态的命令为:
#netstat -nat|grep LISTEN
#netstat -nat|grep ESTABLISHED
#netstat -nat|grep TIME_WAIT
。。。。。。。。对应的TCP协议状态
linux下查看apache的所有相关连接状态的命令为:
#netstat -n |awk ‘/^tcp/ {++S[$NF]} END {for(a in S)print a,S[a]}’
该命令非常实用,会列出apache的所有连接状态信息的统计。如果某个状态没有连接则不显示。
补充:
本篇文章是为以后编写关于apache,mysql并发优化的辅助文章,是最基础的知识。是本人对浏览器与apache的TCP连接状态的一些理解,难免会有一些错误。但是作为一个程序员如果理解上面这些内容足以。更多的细节内容应该是架构师的事情了。
本文地址:http://www.qindamoni.com/84
相关文章
FTTC/FTTH和FTTR有什么区别? 光纤接入方式详细介绍
国内主流 ISP 普遍都采用了光纤连接,常见术语包括 FTTC(光纤到路边)、FTTB(光纤到楼宇)、FTTH(光纤到户)和 FTTR(光纤到房间),他们之间有什么区别?详细如下2025-03-05TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务
近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所有用户必须通过实名认证流程,方能继续使用其提供的DDNS服2025-02-15- 之前我们介绍过ssid的概念,那么自己的设备怎么显示ssid和隐藏ssid呢?下面我们就来看看详细的教程2025-01-14
- SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络2025-01-14
向日葵Q2Pro怎么样? 贝锐向日葵Q2Pro工业级远控设备测评
今天带来的这款向日葵 Q2Pro ,就是一款专门用于工业设备、医疗设备等远程控制的硬件产品,凭借其即插即用、断网可远控、无需被控主机安装软件等特性,为设备维护带来了全2024-11-23双频BE5100面板AP! TP-LINK TL-7AP5100HI-PoE拆机测评
TP-LINK一款为TL-7AP5100HI-PoE 易展版的 Wi-Fi 7 AP 面板怎么样?该面板隶属 BE5100 规格家族,详细请看下文拆机测评2024-06-28AP2.4g和5g的wifi区别 无线网2.4g和5g有什么区别
AP2.4g和5g的wifi区别 无线网2.4g和5g有什么区别WIFI这一名词可谓是家喻户晓,但是你知道2.4g和5g wifi的区别吗2024-01-03- 无线路由器根据不同用户群体的需求,提供了多种工作模式,只有选对了模式,才能充分发挥路由器的作用,路由器常见的三大工作模式为:路由模式、中继模式和AP模式,不同的模2023-12-26
- 第一次测评PCIe 3.0 x1的双口2.5G网卡,下面我们就来看看SSU双口2.5G网卡拆机和测试双口有没有瓶颈2023-12-12
- 最近经常有很多小白朋友在后台问,公网、私网、内网、外网,这些的概念是啥样的,又该怎么去界定2023-09-06
最新评论