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

所属分类: 网络 / 网络其他 阅读数: 343
收藏 0 赞 0 分享

前言

浏览器(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

更多精彩内容其他人还在看

局域网限速管理软件之路由器分配网速分配软件、路由器网速限制软件怎么选择

这篇文章主要介绍了局域网限速管理软件之路由器分配网速分配软件、路由器网速限制软件怎么选择,需要的朋友可以参考下
收藏 0 赞 0 分享

局域网流量监控软件之如何突破ARP防火墙限速、绕过ARP防火墙限制网速

局域网网速常常不够快,一旦被局域网某些员工用P2P下载、看在线视频、玩大型网络游戏所占用的话,会导致局域网网速更慢,严重影响局域网正常的工作。为此,企业局域网必须有效控制电脑网速、限制局域网网速
收藏 0 赞 0 分享

局域网共享文件管理之如何设置共享文件的不同访问权限、保护共享文件安全

这篇文章主要介绍了局域网共享文件管理之如何设置共享文件的不同访问权限、保护共享文件安全,需要的朋友可以参考下
收藏 0 赞 0 分享

网管员如何禁止电脑上网,怎么禁止电脑上网,禁止电脑访问互联网

在企业局域网网络管理中,为了防止员工上班时间上网冲浪、看视频、玩网络游戏、网购等,我们需要禁止电脑访问外网,那么如何实现呢,需要的朋友可以参考下
收藏 0 赞 0 分享

公司局域网如何控制共享文件访问、设置共享文件访问权限,保护共享文件安全

这篇文章主要介绍了公司局域网如何控制共享文件访问、设置共享文件访问权限,保护共享文件安全,需要的朋友可以参考下
收藏 0 赞 0 分享

胖AP与瘦AP区别分析

将多个AP部署在会议室中,使用同一个SSID,瘦AP的组网方案比较适合,胖AP和瘦AP组网方案存在如下区别
收藏 0 赞 0 分享

宽带如何免费提速(电信、联通) 宽带免费提速技巧

对于光纤宽度用户来说,提速很容易的,不过如何免费为自己的电信宽带账户提速呢?下面小编就来进一步介绍一下宽带如何免费提速(电信、联通),为个人总结后的经验,仅供参考
收藏 0 赞 0 分享

WPA/WPA2无线网络密码破解图文教程

先跟大家说明一下基础知识:首先要明白一种数学运算,它叫做哈希算法(hash),这是一种不可逆运算,你不能通过运算结果来求解出原来的未知数是多少,有时我们还需要不同的未知数通过该算法计算后得到的结果不能相同
收藏 0 赞 0 分享

局域网暴风影音限制上传速度、暴风影音限制网速的方法

这篇文章主要介绍了局域网暴风影音限制上传速度、暴风影音限制网速的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

完爆Wi-Fi的Li-Fi是什么?与Wi-Fi有哪些不同?

如今,一个新的技术正在向Wi-Fi发起革命性的的冲击,它就是Li-Fi(可见光无限通信技术),该技术由德国物理学家Herald Haas和他的爱丁堡大学科研团队发明,那么完爆Wi-Fi的Li-Fi是什么?与Wi-Fi有哪些不同?下面我们来看看吧
收藏 0 赞 0 分享
查看更多