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

(0)

相关推荐

  • 谷歌Chrome浏览器中自己的连接不是私密连接怎么办

    谷歌浏览器是我们常用的一款浏览器,深受大家的欢迎,十分高效受用,有的朋友想知道谷歌Chrome浏览器中自己的连接不是私密连接怎么办,小编为大家分享解决问题的方法.具体如下:1. 首先,请大家打开电脑中 ...

  • TCP连接的建立与释放:[1]TCP连接的建立

    在互联网学习中,了解TCP/IP协议的工作原理是十分重要的,其中TCP连接的建立和释放过程更为重要.下面坐标来帮您学习这些东西. 操作方法 01 一.TCP连接建立和释放 TCP的连接和建立过程简单来 ...

  • 启用和禁用Vista和Win 7中的TCP半开连接数限制

    从Windows Vista开始,Windows中的TCP半开连接数限制就被禁用了,这样一来,系统想建立多少TCP连接就可以建立多少TCP连接。那么,出于安全考虑,用户如果想要启用TCP半开连接数限制 ...

  • 明明有网络但ie浏览器打不开网页显示未连接到网络怎么办

    很多网友反映,自己的电脑网络明明连接成功的,但IE浏览器显示未连接到网络打不开网页怎么办?下面一起来看看具体如下:1. 第一步,还是要再确认下自己的电脑是否真的连接上了网络,确认是联网的话,点击IE浏 ...

  • 国内gog客户端中发现没有连接steam的选项

    国内gog客户端中发现没有连接steam的选项怎么办呢,下面小编介绍一下.1. 当打开gog设置页面,没有关于绑定steam的选项2.我们打开浏览器,在地址栏输入红色框中的地址搜索,然后滑动页面,找到 ...

  • 如何在Windows系统中安装TCP/IP协议

    如果我们误操作将电脑上的TCP/IP协议卸载了,该怎么进行安装呢?今天就跟大家介绍一下如何在Windows系统中安装TCP/IP协议的具体操作步骤.1. 首先打开电脑上的控制面板,进入页面后,找到[网 ...

  • 怎么查看电脑TCP连接进程

    电脑是现在最常用的工具之一,有些用户想知道怎么查看电脑TCP连接进程,接下来小编就给大家介绍一下具体的操作步骤.具体如下:1. 首先第一步按下[Win+R]快捷键打开[运行]窗口.2. 第二步根据下图 ...

  • windows xp操作系统IIS突破TCP连接限制的方法

    windows xp操作系统IIS突破TCP连接限制的方法 步骤/方法 01 Microsoft提供了一个管理IIS的小工具MetaEdit,MetaEdit工作在Windows NT4.0.Wind ...

  • Linux系统下中 在命令行中实现Wifi 连接的方法

    无论何时要安装一款新的 Linux 发行系统,一般的建议都是让您通过有线连接来接到互联网的。 这主要的原因有两条:第一,您的无线网卡也许安装的驱动不正确而不能用;第二,如果您是从命令行中来安装系统的, ...