当前位置: 首页 > news >正文

同ip多域名做同行业网站seo搜索引擎优化视频

同ip多域名做同行业网站,seo搜索引擎优化视频,推广计划和推广单元,禅城做网站最近遇到一个线上报警#xff1a;服务器出现大量TIME_WAIT导致其无法与下游模块建立新HTTP连接#xff0c;在解决过程中#xff0c;通过查阅经典教材和技术文章#xff0c;加深了对TCP网络问题的理解。作为笔记#xff0c;记录于此。 备注#xff1a;本文主要介绍…    最近遇到一个线上报警服务器出现大量TIME_WAIT导致其无法与下游模块建立新HTTP连接在解决过程中通过查阅经典教材和技术文章加深了对TCP网络问题的理解。作为笔记记录于此。        备注本文主要介绍TCP编程中涉及到的众多基础知识关于实际工程中对由TIME_WAIT引发的不能建立新连接问题的解决方法将在下篇笔记中给出。1. 实际问题        初步查看发现无法对外新建TCP连接时线上服务器存在大量处于TIME_WAIT状态的TCP连接最多的一次为单机10w其中引起报警的那个模块产生的TIME_WAIT约2w导致其无法跟下游模块建立新TCP连接。        TIME_WAIT涉及到TCP释放连接过程中的状态迁移也涉及到具体的socket api对TCP状态的影响下面开始逐步介绍这些概念。2. TCP状态迁移       面向连接的TCP协议要求每次peer间通信前建立一条TCP连接该连接可抽象为一个4元组four-tuple有时也称socket pairlocal_ip, local_port, remote_ip,remote_port这4个元素唯一地代表一条TCP连接。       1TCP Connection Establishment       TCP建立连接的过程通常又叫“三次握手”three-way handshake可用下图来示意             可对上图做如下解释        a. client向server发送SYN并约定初始包序号sequence number为J        b. server发送自己的SYN并表明初始包序号为K同时针对client的SYNJ返回ACKJ1注J1表示server期望的来自该client的下一个包序为J1        c. client收到来自server的SYNACK后发送ACKK1至此TCP建立成功。        其实在TCP建立时的3次握手过程中还要通过SYN包商定各自的MSStimestamp等参数这涉及到协议的细节本文旨在抛砖引玉不再展开。           2TCPConnection Termination       与建立连接的3次握手相对应释放一条TCP连接时需要经过四步交互又称“四次挥手”如下图所示                 可对上图做如下解释       a. 连接的某一方先调用close()发起主动关闭active close该api会促使TCP传输层向remotepeer发送FIN包该包表明发起active close的application不再发送数据特别注意这里“不再发送数据”的承诺是从应用层角度来看的在TCP传输层还是要将该application对应的内核tcp send buffer中当前尚未发出的数据发到链路上。                       remote peer收到FIN后需要完成被动关闭passive close具体分为两步       b. 首先在TCP传输层先针对对方的FIN包发出ACK包主要ACK的包序是在对方FIN包序基础上加1       c. 接着应用层的application收到对方的EOFend-of-file对方的FIN包作为EOF传给应用层的application后得知这条连接不会再有来自对方的数据于是也调用close()关闭连接该close会促使TCP传输层发送FIN。       d. 发起主动关闭的peer收到remote peer的FIN后发送ACK包至此TCP连接关闭。       注意1TCP连接的任一方均可以首先调用close()以发起主动关闭上图以client主动发起关闭做说明而不是说只能client发起主动关闭。       注意2上面给出的TCP建立/释放连接的过程描述中未考虑由于各种原因引起的重传、拥塞控制等协议细节感兴趣的同学可以查看各种TCP RFC Documents 比如TCP RFC793。        3TCP StateTransition Diagram       上面介绍了TCP建立、释放连接的过程此处对TCP状态机的迁移过程做总体说明。将TCP RFC793中描述的TCP状态机迁移图摘出如下下图引用自这里               TCP状态机共含11个状态状态间在各种socket apis的驱动下进行迁移虽然此图看起来错综复杂但对于有一定TCP网络编程经验的同学来说理解起来还是比较容易的。限于篇幅本文不准备展开详述想了解具体迁移过程的新手同学建议阅读《Linux Network Programming Volume1》第2.6节。3. TIME_WAIT状态        经过前面的铺垫终于要讲到与本文主题相关的内容了。 ^_^        从TCP状态迁移图可知只有首先调用close()发起主动关闭的一方才会进入TIME_WAIT状态而且是必须进入图中左下角所示的3条状态迁移线最终均要进入该状态才能回到初始的CLOSED状态。        从图中还可看到进入TIME_WAIT状态的TCP连接需要经过2MSL才能回到初始状态其中MSL是指MaxSegment Lifetime即数据包在网络中的最大生存时间。每种TCP协议的实现方法均要指定一个合适的MSL值如RFC1122给出的建议值为2分钟又如Berkeley体系的TCP实现通常选择30秒作为MSL值。这意味着TIME_WAIT的典型持续时间为1-4分钟。       TIME_WAIT状态存在的原因主要有两点       1为实现TCP这种全双工full-duplex连接的可靠释放       参考本文前面给出的TCP释放连接4次挥手示意图假设发起active close的一方图中为client发送的ACK4次交互的最后一个包在网络中丢失那么由于TCP的重传机制执行passiveclose的一方图中为server需要重发其FIN在该FIN到达clientclient是active close发起方之前client必须维护这条连接的状态尽管它已调用过close具体而言就是这条TCP连接对应的local_ip, local_port资源不能被立即释放或重新分配。直到romete peer重发的FIN达到client也重发ACK后该TCP连接才能恢复初始的CLOSED状态。如果activeclose方不进入TIME_WAIT以维护其连接状态则当passive close方重发的FIN达到时active close方的TCP传输层会以RST包响应对方这会被对方认为有错误发生而事实上这是正常的关闭连接过程并非异常。        2为使旧的数据包在网络因过期而消失       为说明这个问题我们先假设TCP协议中不存在TIME_WAIT状态的限制再假设当前有一条TCP连接(local_ip, local_port, remote_ip,remote_port)因某些原因我们先关闭接着很快以相同的四元组建立一条新连接。本文前面介绍过TCP连接由四元组唯一标识因此在我们假设的情况中TCP协议栈是无法区分前后两条TCP连接的不同的在它看来这根本就是同一条连接中间先释放再建立的过程对其来说是“感知”不到的。这样就可能发生这样的情况前一条TCP连接由local peer发送的数据到达remote peer后会被该remot peer的TCP传输层当做当前TCP连接的正常数据接收并向上传递至应用层而事实上在我们假设的场景下这些旧数据到达remote peer前旧连接已断开且一条由相同四元组构成的新TCP连接已建立因此这些旧数据是不应该被向上传递至应用层的从而引起数据错乱进而导致各种无法预知的诡异现象。作为一种可靠的传输协议TCP必须在协议层面考虑并避免这种情况的发生这正是TIME_WAIT状态存在的第2个原因。       具体而言local peer主动调用close后此时的TCP连接进入TIME_WAIT状态处于该状态下的TCP连接不能立即以同样的四元组建立新连接即发起active close的那方占用的local port在TIME_WAIT期间不能再被重新分配。由于TIME_WAIT状态持续时间为2MSL这样保证了旧TCP连接双工链路中的旧数据包均因过期超过MSL而消失此后就可以用相同的四元组建立一条新连接而不会发生前后两次连接数据错乱的情况。 4. socket api: close() 和 shutdown()       由前面内容可知对一条TCP连接而言首先调用close()的一方会进入TIME_WAIT状态除此之外关于close()还有一些细节需要说明。       对一个tcp socket调用close()的默认动作是将该socket标记为已关闭并立即返回到调用该api进程中。此时从应用层来看该socket fd不能再被进程使用即不能再作为read或write的参数。而从传输层来看TCP会尝试将目前send buffer中积压的数据发到链路上然后才会发起TCP的4次挥手以彻底关闭TCP连接。       调用close()是关闭TCP连接的正常方式但这种方式存在两个限制而这正是引入shutdown()的原因       1close()其实只是将socket fd的引用计数减1只有当该socket fd的引用计数减至0时TCP传输层才会发起4次握手从而真正关闭连接。而shutdown则可以直接发起关闭连接所需的4次握手而不用受到引用计数的限制       2close()会终止TCP的双工链路。由于TCP连接的全双工特性可能会存在这样的应用场景local peer不会再向remote peer发送数据而remote peer可能还有数据需要发送过来在这种情况下如果local peer想要通知remote peer自己不会再发送数据但还会继续收数据这个事实用close()是不行的而shutdown()可以完成这个任务。       close()和shutdown()的具体调用方法可以man查看此处不再赘述。       以上就是本文要分析和解决的“由于TIME_WAIT太多导致无法对外建立新连接”问题所需要掌握的基础知识。下一篇笔记会在本文基础上介绍这个问题具体的解决方法。^_^【参考资料】1.《Linux Network Programming Volume 1》. Chapter 2 Chapter 42. TCP RFC 793 3. Online Document: TCP StateTransition Diagram EOF 转载于:https://blog.51cto.com/kusorz/1881309
http://www.zqtcl.cn/news/951153/

相关文章:

  • 网站建设售后培训wordpress 过滤html
  • 湖北森泰建设集团有限公司网站国外产品设计网站推荐
  • 网站建设与代运营产品介绍排版网页设计教程
  • 音乐网站排名搜索引擎网络推广方法
  • asp.net 企业网站昆明高端seo怎么做
  • 图书馆网站建设需求方案企业网站背景图片
  • 网站app的作用做家教网站资质
  • 资源网站搭建北京app网站建设
  • 天津做宠物饲料的网站wordpress添加注册页面模板
  • 网站建设公司石家庄php网站开发报价
  • 国外免费网站服务器链接cpa自己做网站
  • 手机网站的优缺点2024中国企业500强
  • 黄河道网站建设网站设计标语
  • 企业网站建设范文wordpress 5.1
  • 网站 河北 备案 慢设计一个营销方案
  • 网站建设培训合肥品牌设计案例
  • 建网站注册免费云服务器
  • 可以做网站的公司有哪些聊天软件开发厂家有哪些
  • 正规网站建设公司一般要多少钱婚纱网站有哪些
  • 企业网站开发目的和意义住房和城乡建设厅官网查询
  • 直播一级a做爰片免费网站wordpress 模板 使用
  • 网站开发中期检查优质的菏泽网站建设
  • 建设网站号码在线html编辑
  • 品牌型网站制作有哪些公司石家庄广告制作公司
  • 做网站赚几百万网站效果图怎么做的
  • 哪些网站做企业招聘不要花钱wordpress底部导航代码
  • 怎么用链接进自己做的网站企业组织架构
  • 建设新网站征求意见网站设计佛山
  • 重庆建设造价工程信息网站东莞电商页面设计公司
  • 乔拓云智能建站官网登录入口怎么样做网站卖农产品