浏览器与apache通讯中的TCP连接状态迁移
10-29
前言
浏览器(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