加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

TCP的状态转换及生产问题实操

发布时间:2019-03-02 08:20:58 所属栏目:教程 来源:itworld123
导读:前文先容了TCP协议首要的流程,包罗成立毗连、传输数据和断开毗连。假如各人当真阅读了附图,应该可以看到在各个流程中套接字的状态是在不绝变革的,差异的状态标识了套集字所处的阶段。 如图1是TCP一个完备的状态转换图,图中包括了套接字的全部状态,以
副问题[/!--empirenews.page--]

前文先容了TCP协议首要的流程,包罗成立毗连、传输数据和断开毗连。假如各人当真阅读了附图,应该可以看到在各个流程中套接字的状态是在不绝变革的,差异的状态标识了套集字所处的阶段。

如图1是TCP一个完备的状态转换图,图中包括了套接字的全部状态,以及产生状态转变的触发前提。也许会有人问,相识这些状态有什么用呢?我们平常编程又用不到。

TCP状态转换图

图1 TCP状态转换图

为了声名上述题目,我们从3个角度举办表明,别离是各类状态的寄义、在体系层面怎样查询状态和在现实出产中的应用。

一、各类状态的寄义

在答复题目之前我们先详细相识一下各个状态的寄义。

  • CLOSED:这个是套接字的初始状态,暗示TCP毗连是新建“未打开的”状态可能已经“封锁着的”。
  • LISTEN :这个是处事端仅有的状态,暗示处事器端的某个SOCKET处于监听状态,可以接管客户端的毗连。
  • SYN_RCVD :暗示处事器吸取到了来自客户端哀求毗连的SYN报文。在正常环境下,这个状态我们也许调查不到,由于这个状态是处事器端的SOCKET在成立TCP毗连时的三次握手会话进程中的一此中间状态,很短暂。
  • SYN_SENT :这个状态与SYN_RCVD 状态相呼应,当客户端SOCKET执行connect()举办毗连时,它起首发送SYN报文,然后随即进入到SYN_SENT 状态,并守候处事端的发送三次握手中的第2个报文。SYN_SENT 状态暗示客户端已发送SYN报文。
  • ESTABLISHED :暗示TCP毗连已经乐成成立。
  • FIN_WAIT_1 :这个状态得好好表明一下,着实FIN_WAIT_1 和FIN_WAIT_2 两种状态的真正寄义都是暗示守候对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态现实上是当SOCKET在ESTABLISHED状态时,它想主动封锁毗连,向对方发送了FIN报文,此时该SOCKET进入到FIN_WAIT_1 状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2 状态。虽然在现实的正常环境下,无论对方处于任何种环境下,都应该顿时回应ACK报文,以是FIN_WAIT_1 状态一样平常是较量难见到的,而FIN_WAIT_2 状态偶然仍可以用netstat看到。
  • FIN_WAIT_2 :上面已经表明白这种状态的由来,现实上FIN_WAIT_2状态下的SOCKET暗示半毗连,即有一方挪用close()主动要求封锁毗连。留意:FIN_WAIT_2 是没有超时的(不像TIME_WAIT 状态),这种状态下假如对方不封锁(不共同完成4次挥手进程),那这个 FIN_WAIT_2 状态将一向保持到体系重启,越来越多的FIN_WAIT_2 状态会导致内核crash。
  • TIME_WAIT :暗示收到了对方的FIN报文,并发送出了ACK报文。 TIME_WAIT状态下的TCP毗连会守候2*MSL(Max Segment Lifetime,最大分段保留期,指一个TCP报文在Internet上的最长保留时刻。)在Linux可以通过cat /proc/sys/net/ipv4/tcp_fin_timeout看到本机的这个值,然后即可回到CLOSED 可用状态了。
  • CLOSING :这种状态在现实环境中应该很少见,属于一种较量有数的破例状态。正常环境下,当一方发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。可是CLOSING 状态暗示一方发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么环境下会呈现此种环境呢?那就是当两边险些在同时close()一个SOCKET的话,就呈现了两边同时发送FIN报文的环境,这是就会呈现CLOSING 状态,暗示两边都正在封锁SOCKET毗连。
  • CLOSE_WAIT :暗示正在守候封锁。怎么领略呢?当对方close()一个SOCKET后发送FIN报文给本身,你的体系毫无疑问地将会回应一个ACK报文给对方,此时TCP毗连则进入到CLOSE_WAIT状态。接下来呢,你必要搜查本身是否尚稀有据要发送给对方,假如没有的话,那你也就可以close()这个SOCKET并发送FIN报文给对方,即封锁本身到对方这个偏向的毗连。稀有据的话则看措施的计策,继承发送或扬弃。简朴地说,当你处于CLOSE_WAIT 状态下,必要完成的工作是守候你去封锁毗连。
  • LAST_ACK :当被动封锁的一方在发送FIN报文后,守候对方的ACK报文的时辰,就处于LAST_ACK 状态。当收到对方的ACK报文后,也就可以进入到CLOSED 可用状态了。

二、状态的监控要领

前文已经有说起,可以通过netstat呼吁查察TCP毗连的状态。图2是一个简朴的例子,执行该呼吁的时辰不带任何参数。

图2 netstat执行功效

由上图可以看出,通过netstat可以看到每个TCP毗连和UDP的状态和具体的IP地点等信息。该呼吁有许多参数,通过差异的参数可以获得我们想要的内容。下面我们举几个详细的例子。

1. 表现全部端口信息

可以通过-a参数列出全部端口信息,并且可以附带-t只列出TCP协议的,可能-u只列出UDP协议的端口信息。

  1. [root@itworld123~]# netstat -a # 列出全部端口 
  2. [root@itworld123~]# netstat -at # 列出全部TCP端口 
  3. [root@itworld123~]# netstat -au # 列出全部UDP端口 

2. 表现全部监听状态的套接字

可以通过-l参数列出全部处于监听状态的套接字。虽然也可以团结-t可能-u参数获取想要的信息。如下是获取TCP处于监听状态的套接字列表:

  1. root@itworld123:~# netstat -lu 

图3 监听状态列表

3. 查察处事状态

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读