三次握手
当客户端使用connect()函数,尝试与服务器进行连接时,默认是堵塞的状态。通过三次握手就可以解堵塞。说是"三次握手",其实细分应该有4个过程。那么我们就先按照"四次握手"来解释一下。
第一次握手:客户端给服务器发送一个数据,记为syn1;
第二次握手:如果服务器接收到了客户端的数据,就会回复一个ack1。这样客户端与服务器的连接就成功建立了。非常美丽。但是tcp是一个全双工通信,所以除了需要客户端与服务器建立连接。服务器也需要与客户端建立连接。这样就产生了后两次握手;
第三次握手:服务器给客户端发送一个数据,记为syn2;
第四次握手:如果客户端接收到了服务器的数据,就会回复一个ack2。
通过四个数据的传送,服务器与客户端之间的连接就真的成功建立了,这次真的是非常美丽了。但是四次握手是怎么变成三次握手的呢。因为每次传送的数据都有一个变量名进行标识,所以我们可以将第二次握手和第三次握手合并,这样就构成了著名的“三次握手”了。
四次挥手
说完了三次握手,那四次挥手是什么情况呢。当客户端调用close()函数时,就会停止发送数据了,此时他会给服务器挥手一次,告诉他我不会再给你发消息了,服务器收到后,会告知收到,就产生了第二次挥手,但由于tcp的全双工,虽然客户端的发送关闭了,但是客户端的接收还是打开的状态,这时服务器就告诉客户端说我也不会给你发消息了,这是第三次挥手,对应的就是服务器调用了close()函数,客户端如果成功接收到讯息,那就会执行第四次挥手,告知服务器收到。
这其中有一个问题,那就是,我的最后一次挥手,客户端怎么知道服务器有没有收到我的告知呢?万一他没收到,继续给我发送怎么办?为了解决这个问题,在第三次挥手后,会等待一段时间,等着客户端给予响应,如果没有响应,如果没有,那就再次执行第三次挥手,这样重复几次,如果一直没有响应,就会进行判断客户端是哪里出现问题了。