简析TCP之三次握手与四次挥手。

今天来介绍一下十分重要的TCP三次握手建立连接和四次挥手断开连接。

首先来看一下TCP的连接管理机制:

简析TCP之三次握手与四次挥手。

一。三次握手建立连接

1.首先客户端发送一个连接请求给服务端,而且必须在服务端进入监听状态之后发送,否则发送信息失败,因为只有监听状态下,系统才会接收请求并进行处理,这是第一次握手。服务器接收到请求之后,会应答客户端并发送SYN+ACK,告诉客户端开始连接,这是第二次握手。客户端收到消息之后再发送ACK给服务端确认连接。这样就完成了三次握手,此后就可以相互之间开始传输数据了。

2.问题:为什么一定是三次握手呢?

这里举个对话的例子,大家一看就懂了。有两个人A和B。

A:“你还好吗?”

B:我很好,你呢?

A:我也很好。

B:我很好。

如果是两次握手,那B就不知道A好不好;如果是四次握手,那B岂不是跟笨蛋一样重复自己说的话,所以说三次握手是最好的。具体来说,当客户端发送请求过来之后,服务端首先要回复它知道了,这已经握手两次了,如果不在握手,服务端怎么知道客户端接受到消息没。

3.在三次握手的过程中还有一个重要的等待队列。它是服务端用来存放那些客户端发送来的SYN请求的,这样服务端的监听状态才能监听到数据有没有传来。

二。四次挥手断开连接

1.首先这跟握手不一样,握手必须是客户端先发送连接请求,而挥手是两方都可以请求断开的。我们这里以客户端发送断开连接为例的大致过程:客户端先发送一个FIN断开连接的请求,服务端收到之后先发送一个应答ACK给客户端,自己在检验是否还有数据传输,此时客户端处于等待状态1,当服务端确认没有数据传输时,在发送FIN请求给客户端,客户端收到之后发送应答给服务端,并在此时处于TIME_WAIT状态,然后服务端接收到应答之后进入关闭状态,随即客户端也进入关闭状态。

2.在挥手过程中最重要的就是这个TIME_WAIT状态。这时就产生了一个经典面试题:为什么要有这个状态呢,客户端为什么不直接进入关闭状态?

答案是:当客户端收到服务端的FIN请求时,也会发送一个应答ACK给服务端,如果此时客户端关闭了,那它就不知道这个ACK是否发送成,若发送失败,而客户端已关闭,那服务端就会卡在那块一直等待应答。所以客户端不能直接关闭,要先进入这个等待状态,若ACK发送失败,那客户端就会重新发送,若经过2MSL时间后,此时ACK一定被服务端接收到了,所以客户端也可以进入关闭状态了。这样挥手过程才算真正的结束了。

3.这个MSL也就是最大报文生存时间,它是任何报文段被丢弃前在网络内的最长时间,若两个这么长的时间TIME_WAIT没有接收到ACK发送失败的消息,就可以证明发送成功了,所以就可以关闭了。

以上就是我对TCP三次握手建立连接和四次挥手断开连接的理解。