TCP连接的三次握手四次挥手

通常情况下,一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手。
1、建立连接协议(三次握手)
(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。
(2)服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。
(3)客户必须再次回应服务段一个ACK报文,这是报文段3。
2、连接终止协议(四次握手)
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
(4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)

连接进程是通过一系列状态表示的,这些状态有:LISTEN,SYN-SENT,SYN-RECEIVED,ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT和CLOSED。

各个状态的意义如下:
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 – 没有任何连接状态;

客户端TCP状态迁移:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服务器TCP状态迁移:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

状态说明:

1、LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN。
2、SYN_SENT:客户端通过应用程序调用connect进行active open,于是客户端TCP发送一个SYN以请求建立一个连接,之后状态置为SYN_SENT。
3、SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN,之后状态置为SYN_RECV。
4、ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了。
5、FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态。
6、CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT。
7、FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2。
8、LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个FIN,等待对方的ACK,就进入了LAST-ACK。
9、TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。
10、CLOSING:比较少见。
11、CLOSED:被动关闭端在接受到ACK包后,就进入了CLOSED的状态,连接结束。

如下图:

99c88e348af2ae0e5ab5f5e6

 

我觉得可以这样简单的理解,就好比两个人之间的交谈:

三次握手,确定连接的事情

C:你现在准备好连接了吗?【syn_sent】

S:我现在准备好了 【syn_rcvd之后发送syn&ack】

C:马上连接 【这就是发送的ack】

四次挥手,确定结束拜访

C:我要走了,如果没有其他的事情?【发送fin 1】

S:没有了 【发送ack给client】

S:我来关闭连接【发送数据,确认fin2】

C:我也来关闭连接【发送ack,关闭连接】

TCP就是通过这样简单的会话来实现沟通的,这样理解就很简单了

大家也经常会听到长连接和短连接,这个也是和TCP的三次握手四次挥手相关的.

通俗点讲:短连接就是一次TCP请求得到结果后,连接马上结束。而长连接并不马上断开,而一直保持着,直到长连接TIMEOUT(具体程序都有相关参数说明)。长连接可以避免不断的进行TCP三次握手和四次挥手。
长连接(keepalive)是需要靠双方不断的发送探测包来维持的,keepalive期间服务端和客户端的TCP连接状态是ESTABLISHED。目前http 1.1版本里默认都是keepalive(1.0版本默认是不keepalive的),IE 6/7/8和Firefox都默认用的是http 1.1版本了。
一个应用至于到底是该使用短连接还是长连接,应该视具体情况而定。一般的应用应该使用长连接。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注