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

这篇具有很好参考价值的文章主要介绍了浏览器与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文章来源地址https://www.toymoban.com/news/detail-452797.html

到了这里,关于浏览器与apache通讯中的TCP连接状态迁移的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 浏览器无法连接网络问题

    浏览器无法连接网络问题

    电脑其他程序都能正常联网,但是所有的浏览器都无法联网,同时外部网站都能ping通 查看电脑Internet连接的问题报告显示: 该设备或资源(Web 代理)未设置为接受端口\\\"7890\\\"上的连接 。 经过检查发现不是IP地址设置和防火墙设置的问题,最终 采用重置网络设置解决了问题 。 重

    2024年02月13日
    浏览(12)
  • 浏览器连接grafana失败解决方案

    浏览器连接grafana建立连接失败,如下: If you\\\'re seeing this Grafana has failed to load its application files 1. This could be caused by your reverse proxy settings. 返向代理会引起这个问题。 2. If you host grafana under subpath make sure your grafana.ini root_url setting includes subpath. If not using a reverse proxy make sure to se

    2024年02月07日
    浏览(28)
  • 建立安全连接失败(解决浏览器提示建立安全连接失败问题)

    建立安全连接失败(解决浏览器提示建立安全连接失败问题)

    1、首先打开开始菜单,选择“网络和Internet”并进入。 2、接着在“以太网”选项中选择“更改适配器选项”,点击并进入。

    2024年02月04日
    浏览(10)
  • selenium连接已打开的Firefox浏览器

    原理:将 session_id 和 url 进行记录,下次打开firefox浏览器进行复用 调用

    2024年02月12日
    浏览(13)
  • selenium连接已经存在的edge浏览器

    selenium连接已经存在的edge浏览器

    使用remote-debugging-port连接edge浏览器 官方文档 1.edge为最新版浏览器,基于chromenium内核 使用命令行 端口号只要没有占用,可以随便设置 2. 脚本连接 执行后打开该页面 温馨提示:必须加user-data-dir参数否则会失败 待完善

    2024年02月13日
    浏览(53)
  • iphone的safari浏览器实现全屏的pwa模式,并修改顶部状态栏背景颜色

    iphone的safari浏览器实现全屏的pwa模式,并修改顶部状态栏背景颜色

    要想修改顶部背景颜色,需要用到这个属性:content就是你要设置的颜色 然后再加上下面的设置: 总的设置:  如果没有设置状态栏背景颜色,可能看到的效果:背景是黑色或者白色   配置好状态栏颜色后:

    2024年02月07日
    浏览(44)
  • selenium还能这么玩:连接已经存在的浏览器

    selenium还能这么玩:连接已经存在的浏览器

    测试和爬虫对selenium并不会陌生,现有的教程已经非常多。但是因为 selenium 封装的方法比较底层,所以灵活性非常高,我们可以基于这种灵活性来实现非常丰富的定制功能。 这篇文章介绍一个操作,可以让 selenium 连接我们手动打开的浏览器。他的应用场景主要是:你可以通

    2024年02月08日
    浏览(10)
  • selenium 连接已经打开的chrome浏览器 MAC

    selenium 连接已经打开的chrome浏览器 MAC

    今天在爬取chatGPT的谷歌插件的prompts的时候,发现绕不过他的反爬机制,失败+1+1+1,所以想用连接已打开的chatGPT页面进行控制 1,添加环境变量 用临时在终端添加环境变量的方法,方便又快捷了属实是,新打开一个终端复制粘贴即可。 测试有没有添加环境变量成功: 当看到

    2024年02月04日
    浏览(62)
  • selenium还能这么玩:连接手动打开的浏览器

    selenium还能这么玩:连接手动打开的浏览器

    粉丝交流群已开放,不定期分享面试题和视频教程,点击文末公众号加群。 测试和爬虫对selenium并不会陌生,现有的教程已经非常多。但是因为 selenium 封装的方法比较底层,所以灵活性非常高,我们可以基于这种灵活性来实现非常丰富的定制功能。 这篇文章介绍一个操作,

    2024年02月06日
    浏览(7)
  • 第138篇:了解HTTP协议(TCP/IP协议,DNS域名解析,浏览器缓存)

    第138篇:了解HTTP协议(TCP/IP协议,DNS域名解析,浏览器缓存)

    好家伙,发现自己的网络知识十分匮乏,赶紧补一下   这里先举个我生活中的例子 欸,作业不会写了,上网搜一下 用edge浏览器上bing必应搜一下(百度广告太多了,真不想用百度举例子)   假设这是我们第一次访问bing的首页 当我向浏览器中输入https://cn.bing.com/并按下回车

    2023年04月24日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包