Gao Conghui

好好学习,天天向上

爬虫,视频处理


TIME_WAIT状态存在的意义

什么时候会TIME_WAIT

TCP在关闭的时候有个四次挥手的过程,主动关闭方在四次挥手的最后一个ACK发送之后会变成TIME_WAIT状态。

主动关闭方

跟握手不同,挥手可以由客户端发起,也可以是服务端发起。发起关闭的一端我们称之为主动关闭方,另一端称之为被动关闭方。

四次挥手
  • 主动关闭方会发送一个FIN给被动关闭方,表示数据已经发送完毕。
  • 被动关闭方接收到FIN,响应一个ACK。它的接收作为一个文件结束符(end-of-file)传递给接收端应用进程(放在所有已排队等候该应用进程接收的任何其他数据之后)。FIN意味着接收端在相应连接上再无额外的数据可以接收了。
  • 一段时间后,被动关闭方的应用进程收到了文件结束符,发送完所有需要发送的内容,也会发送一个FIN给主动关闭方。
  • 接收到这个最终的FIN的主动关闭方也需要响应一个ACK。

TIME_WAIT状态维持多久

主动关闭方响应完最后一次ACK之后,会在TIME_WAIT这个状态维持2MSL。

MSL

MSL全称是maximum segment lifetime,最长分节生命期。MSL是任何IP数据报能够在因特网存活的最长时间。我们知道,这个时间是有限的,因为每个数据报都含有一个限跳(hop limit)的8位字段,它的最大值是255(简单的讲就是不同经过超过255个路由器)。尽管这个跳数限制而不是真正的时间限制,我们仍然假设最大限跳的分组在网络中存在的时间不可能超过MSL秒。

MSL的具体值通常为30秒或者是2分钟。

为什么需要TIME_WAIT

可靠地实现了TCP全双工连接的终止

我们知道,TCP是比较可靠的。当TCP向另一端发送数据时,他要求对端返回一个确认(如同我们关闭时候的FIN和ACK)。如果没有收到确认,则会重发。

回忆一下我们最终的那个FIN与ACK,被动关闭方发送FIN,并等待主动关闭方返回的ACK。我们假设最终的ACK丢失,被动关闭方将需要重新发送它的最终那个FIN,主动关闭方必须维护状态信息(TIME_WAIT),以允许它重发最终的那个ACK。

如果没有了这个状态,当他第二次收到FIN时,会响应一个RST(也是一种类型的TCP分节),会被服务器解释成一个错误。

为了TCP打算执行必要的工作以彻底终止某个连接两个方向上的数据流(即全双工关闭),那么他必须要正确处理连接终止四个分节中任何一个分节丢失的情况。

允许老的重复分节在网络中的消逝(为什么需要2MSL)

首先,存在这样的情况,某个路由器崩溃或者两个路由器之间的某个链接断开时,路由协议需要花费数秒到数分钟的时间才能稳定找出另一条通路。在这段时间内,可能发生路由循环(路由器A把分组发送给B,B又发送回给A),这种情况我们称之为迷途。假设迷途的分组是一个TCP分节,在迷途期间,发送端TCP超时并重传该分组,重传分组通过某路径到达目的地,而后不久(最多MSL秒)路由循环修复,早先迷失在这个循环中的分组最终也被送到目的地。这种分组被称之为重复分组或者漫游的重复分组,TCP必须要正确处理这些重复的分组。

我们假设ip1:port1和ip2:port2 之间有一个TCP连接。我们关闭了这个链接,过一段时间后在相同IP和端口之间建立了另一个连接。TCP必须防止来自之前那个连接的老的重复分组在新连接上出现。为了做到这一点,TCP将不复用处于TIME_WAIT状态的连接。2MSL的时间足以让某个方向上的分组存活MSL秒后被丢弃,另一个方向上的应答也最多存活MSL秒后被丢弃。

最近的文章

品读 werkzeug reloader 实现机制

werkzeug使用reloader可以在文件被改变时自动加载更改过的文件,使用方法也很简单,run_simple('localhost', 4000, application,use_reloader=True),ues_reloader=True即可。本文试图去品读一下reloader的实现以及一些小细节。原理先概述下整个reloader的原理,看起来会舒服一些。非reloader的启动很简单,会调用make_server方法,然后调用serve_forever()去循环获取新的请求。...…

python werkzeug继续阅读
更早的文章

简析pyspider

pyspider优势所在pyspider非常适合那种很小很杂的爬虫的管理,比如有100个小网站,规则又各不相同,我要获取他的一些很简单的内容,如标题,所有的图片,正文内容。他分为几个模块:scheduler,fetcher,processor,resultworker以及一个ui,前三者各自分离,用消息队列连接,因此很容易做成分布式(或者说设计之初就是为了分布式的)。scheduler了解scheduler之前,先了解两个概念,一个是project,代表着一个项目,如百度爬虫项目;一个是t...…

python pyspider继续阅读