三次握手 TCP 提供面向有连接的通信传输,面向有连接是指数据通信开始之前先做好两端的准备工作。所谓三次握手是指建立一个 TCP 连接时需要客户端和服务端总共发送三个包以确认连接的建立。在 socket 编程中,这一过程由客户端执行 connect 来触发。
流程图如下:
-
第一次握手
客户端将标志位 SYN(Synchronize Sequence Numbers,同步序列编号)置为 1,随机产生一个序列号 seq=J,并将该数据包发送给服务端,客户端进入 SYN_SENT 状态,等待服务器确认。
-
第二次握手
服务端收到数据包后,通过标志位 SYN=1 知道客户端请求建立连接,服务端将标志位 SYN 和 ACK(ACKnowledge Character 确认字符)都置为 1,ack=J+1,随机生成一个序列号 seq=K,并将该数据包发送给客户端以确认连接请求,服务端进入 SYN_RCVD 状态。
-
第三次握手
客户端收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务端,服务端检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务端进入 ESTABLISHED 状态,完成三次握手,随后客户端和服务端之间就可以开始传输数据了。
而从上面的过程可以看到,最少是需要三次握手过程的。两次达不到让双方都得出自己、对方的接收、发送能力都正常的结论。这种建立连接的确认的方式是很自然的,比如发快递
快递员(客户端):三点在家么,有个快递给你送一下
我(服务端): 在家,可以送
快递员: 好的,那我三点钟给你送过去(我收到这个回答后就确认了)
四次挥手
四次挥手即终止 TCP 连接,断开一个 TCP 连接时需要客户端和服务端总共发送四个包以确认连接的断开。在 socket 编程中,这一过程通过任意一方执行 close 来触发。由于 TCP 连接是全双工的,因此,每个方向都必须单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个 FIN(finish,结束)来终止这一方向的连接,收到一个 FIN 只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个 TCP 连接上扔能够发送数据,直到这一方向也发送了 FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
中断连接端可以是客户端,也可以是服务端。
流程图如下:
-
第一次挥手
客户端发送一个 FIN=M,用来关闭客户端到到服务端的数据传送,客户端进入 FIN_WAIT_1 状态。意思是说“我客户端没有数据要发给你了”,但是如果你服务端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
-
第二次挥手 服务端收到 FIN 后,先发送 ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续等我的消息(以免主动方没有收到应答而继续发送断开连接的请求),那么主动方这个时候客户端就进入 FIN_WAIT_2 状态,继续等待服务端的 FIN 报文。这个确认消息使得挥手变成了 4 次。
-
第三次挥手
当服务端确定数据发送完成后,则向客户端发送 FIN=N 的报文,告诉客户端,好了,我这边的数据发送完了,准备好关闭连接了,服务端进入 LAST_ACK 状态。
-
第四次挥手
客户端收到 FIN=N 报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器不知道要关闭了,所以发送 ACK=1,ack=N+1 后进入 TIME_WAIT 状态,如果服务端没有收到 ACK 则可以重传。服务端收到 ACK 后,就知道可以断开连接了。客户端等待了 2MSL(Maximum Segment Lifetime,报文最大生存时间,一般为 30s)后依然没有收到回复,则证明服务端已经正常关闭,那好,我客户端也可以关闭了。最终完成了四次挥手。
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。而关闭连接时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送。
全双工(Full Duplex)是指在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的网卡一般都支持全双工。
半双工(Half Duplex),所谓半双工是指一段时间内,只有一种动作发生,例如一条窄路,而只有一辆车可以通行,当当前有两辆车相对时,在这种情况下,只有一辆车先开,等到另一辆车的头部再开,这个例子生动地说明了原始半双工。原因。早期对讲机、早期集线器等设备都是基于半双工产品的。随着技术的不断进步,半双工会逐渐退出历史舞台。