TCP连接的状态转移

TCP是一个面向连接的传输层协议,因此不论哪一方需要传输数据,都需要在双方之间建立一条传输连接。

TCP连接的状态转移


用TCP的三次握手与四次挥手来解释TCP的各个状态之间的会比较清晰。

一、TCP的三次握手:

a)         单方主动发起连接:

TCP连接的状态转移

1、  服务器端应用层的应用程序创建了一个socket,使服务端被动打开,从CLOSED状态切换至LISTEN状态;

2、  此时客户端向服务端发送了一个SYN=1seq=i的数据段,主动打开,并将状态从CLOSED切换至SYN_SENT(此为TCP三次握手中的第一次握手);

3、  服务端收到客户端的发来的同步请求后,给客户端回应一个SYN=1ACK=1seq=jack=i+1的数据段,并将状态从LISTEN切换至SYN_RCVD,等待客户端的最后的ACK(此为TCP三次握手中的第二次握手);

4、  客户端收到服务端发来的ACKSYN请求后,回应服务端ACK=1seq=i+1ack=j+1数据段,并将状态从SYN_SENT转换至ESTABLISHED(此为TCP三次握手中的第三次握手);

5、  服务端收到客户端发来的ACK确认后,将状态从SYN_RCVD转换至ESTABLISHED.

 

b)         双方同时发起连接请求:
TCP连接的状态转移
此种状态并不存在一方为服务器,一方为客户端的情况,主机A与主机B既是客户端又是服务端。

1、  主机A与主机B同时向对方发起同步请求;并将状态从CLOSED转换到SYN_SENT
  A
SYN=1  seq=i —–>  B(在收到对方的SYN请求后,状态从SYN_SENT转换到SYN_RCVD
  B
SYN=1  seq=j —–>  A(在收到对方的SYN请求后,状态从SYN_SENT转换到SYN_RCVD

2、  主机A与主机B再同时确认对方的同步请求;
  A
SYN=1 ACK=1  seq=i+1  ack=j+1 —–>  B(在收到对方的ACK确认后,状态从SYN_RCVD转换到ESTABLISHED
  B
SYN=1 ACK=1  seq=j+1  ack=i+1 —–>  A(在收到对方的ACK确认后,状态从SYN_RCVD转换到ESTABLISHED
                                                           
注:注意同时发起请求时各状态转换的时间

二、TCP的四次挥手:

a)         单方主动发起断开请求:
TCP连接的状态转移

1、  假设由客户端主动发起断开请求,客户端向服务器端发送FIN=1seq=m的数据段,请求断开连接,并将状态从ESTABLISHED转换至FIN_WAIT 1 等待服务器确认;(此为四次挥手中的第一次挥手)

2、  服务器端接收到客户端发来的FIN请求后,会回应给客户端一个ACK=1
seq=n
ack=m+1的数据段,并将状态从ESTABLISHED转换至CLOSE_WAIT;此时如果服务器端还由未发送完成的数据,则会继续发送;(此为四次挥手中的第二次挥手)

3、  客户端收到来自服务器端发来的ACK数据段后,关闭客户端至服务器方向TCP连接,此时整个TCP连接处于半关闭状态(half-close);
客户端状态从FIN_WAIT 1切换至FIN_WAIT 2 ;等待服务器端发送FIN确认可以断开连接;注:此时客户端仍然可以接收来自服务器端发送的数据

4、  当服务器端数据传输完成,向客户端发送FIN=1 ACK=1 seq=w ack=m+1的数据段(此时服务器ack确认的数据段为客户端关闭TCP连接的最后一个数据段的序号),并将状态从CLOSE_WAIT转换至LAST_ACK,等待客户端的ACK确认(此为TCP四次挥手的第3次挥手)

5、  客户端收到来自服务器端发送的FIN数据段后,向服务器段发送ACK确认数据段,并将状态从FIN_WAIT 2转换至TIMED_WAIT;等待2MSL(最大报文段生存时间),如果没有收到来自服务器端的回应,关闭TCP连接,从TIMED_WAIT状态转换至CLOSED状态(此为TCP四次挥手的第四次挥手)

6、  服务器端在收到客户端发送的ACK后,将状态转换为LISTEN;如果在一定时间内收不到客户端的ACK,会重新向客户端发送FIN数据段

b)         双方同时发起FIN请求:
TCP连接的状态转移

1、  双方同时向对方发送FIN请求;并将状态从ESTABLISHED转换至FIN_WAIT 1

2、  双方都收到来自对方发送的FIN请求时,将状态从FIN_WAIT
1
转换至CLOSING;给对方发送ACK确认数据段后,又将状态从CLOSING转换至TIMED_WAIT;双方在等待2MSL时长后,没有收到来自对方的回应后,超时进入CLOSED状态

c)         如果在客户端向服务端发起SYN请求后,服务器段不愿意进行连接,此时服务器端会向客户端发送一个FIN请求,并将状态从SYN_RCVD切换到FIN_WAIT1;客户端收到FIN后,会回应服务器端一个ACK数据段,表示双方同时尝试关闭连接;并将状态从SYN_SENT切换至CLOSING;服务器端在收到客户端发来的ACK数据段后,切换状态至TIMED_WAIT;在超时后双方即关闭连接。

三、各个状态梳理:

CLOSED:初始状态;

LISTEN:应用层应用程序创建了一个socket

SYN_RCVD:收到SYN同步请求,回应对方发送ACKSYN
SYN_SENT
:发送了SYN同步请求;
ESTABLSHED
:收到了对方的ACK确认;

FIN_WAIT 1:发起了FIN终止连接的请求,还未得到对方确认;

CLOSE_WAIT:收到了对方的FIN请求,回应给对方ACK
FIN_WAIT 2
:发送FIN请求,收到了ACKA确认,但未收到对方的FIN请求;

LAST_ACK:向对方发送了FIN请求,还未得到确认;

TIMED_WAIT:收到对方的FIN请求,回应ACK,等待2MSL

CLOSING:在向对方发送FIN后,先接到对方的FIN,从FIN_WAIT 1转换至此状态,在向对方发送ACK后会进入TIME_WAIT状态; 

原创文章,作者:M22-Zero,如若转载,请注明出处:http://www.178linux.com/71378

(1)
M22-ZeroM22-Zero
上一篇 2017-03-19
下一篇 2017-03-19

相关推荐

  • Linux文件系统

      文件系统是一个逻辑上的概念,本身与磁盘没有什么关系,它是一个外围性永久存储设备,我们知道,计算机共有五大部件,存储设备是一种,内存是个临时性质的存储设备,无论是关机还是断电,存在里面的数据都会消失,我们需要一个永久性存储的设备,来弥补内存只是临时存储性。   对于Linux来说,其哲学思想之一就是一切皆文件,我们L…

    Linux干货 2016-11-11
  • 第三周作业

    1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost ~]# who | cut -d' ' -f1 | sort -u 2.取出最后登录到当前系统的用户的相关信息。 […

    Linux干货 2017-01-04
  • 实现基于MYSQL验证的vsftpd虚拟用户

    马哥教育面授21期 运维 vsftpd MySQL 说明:本实验在两台CentOS主机上实现,一台做为FTP服务器,一台做数据库服务器 一、安装所需要包和包组: 在数据库服务器上安装包: yum –y install mariadb-server mariadb-devel systemctl start mariad…

    Linux干货 2016-12-21
  • 逻辑卷小结

    逻辑卷 逻辑卷:把不同大小的物理设备,抽象成一个完整的文件系统,方便对物理设备的管理与应用。 其基本步骤为: 1.将指定的设备设置为物理卷     物理卷是指定大小的固定得物理区域 2.用一个或者多个物理卷创建一个卷组 3.创建逻辑卷     在物理卷上创建的逻辑卷由物理区域组成…

    Linux干货 2016-09-01
  • nginx配置文件中文文档

    Nginx配置参数中文说明。 #定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数。worker_processes 8; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]error_log /var/log/nginx/error…

    Linux干货 2017-08-08
  • Linux下的文件管理系统

    一、文件系统的FHS标准     因为Linux的属于开源系统,开发人员多,为了统一开发标准,Linux有一个文件系统标准,也就是FHS(Filesystem HierarchyStandard)标准。有了这个标准,那些独立的软件开发商、系统开发人员以及系统的使用者就能方便的在系统上操作。 二、文件系统  &…

    Linux干货 2016-08-02