TCP是一种面向连接的可靠的传输协议,建立和断开TCP连接时需要进行握手的过程。其中,TCP的连接建立需要进行三次握手,而连接断开则需要进行四次握手。
解释
三次握手
-
第一次握手:客户端发送一个SYN(同步)报文给服务器,表示客户端请求建立连接。这个报文中包含一个初始的序列号(sequence number)。
-
第二次握手:服务器收到客户端的SYN报文后,会发送一个SYN+ACK(同步+确认)报文给客户端作为响应。这个报文中,SYN位被置为1,表示服务器同意建立连接,并且同时也发送一个确认序列号(acknowledge number)。
-
第三次握手:客户端收到服务器的SYN+ACK报文后,会向服务器发送一个ACK(确认)报文。这个报文中,ACK位被置为1,表示客户端确认服务器的响应,并且发送一个确认序列号。
四次握手
-
第一次握手:当客户端需要关闭连接时,发送一个FIN(结束)报文给服务器,表示自己已经没有数据要发送了,请求关闭连接。
-
第二次握手:服务器发送一个ACK报文,服务器确认收到了关闭请求。此时,接收方进入半关闭状态,可以继续发送数据,但不再接收数据。
-
第三次握手:服务器发送一个FIN报文给客户端,表示服务器也没有数据要发送了,并请求关闭连接。
-
第四次握手:客户端收到服务器的FIN报文后,向服务器发送一个ACK报文,确认收到了关闭请求,并且发送一个确认序列号。
通俗易懂
为什么要建立要三次,断开要四次?两次是否可以?断开三次行不行?
三次握手
假设A和B是两个人要通过传纸条来交流。他们之间有一扇门,门上有一个信箱。他们希望通过这个信箱来传递纸条。但是,他们不确定对方是否能够收到和回复纸条。
- 第一次握手:A先向B发出请求,他把一张纸条放进信箱,并敲了一下门。这个纸条上写着:"Hi B,我想和你建立通信连接,请确认你能够接收我的纸条。"此时,B收到了纸条,并知道A想要和他建立连接。但是,A并不知道B是否能够收到纸条。
- 第二次握手:B收到纸条后,他在纸条上写下回复,并放进信箱里。然后,他也敲了一下门。这个纸条上写着:"Hi A,我收到了你的纸条,并且确认我能够接收你的纸条。我也想和你建立通信连接,请确认你能够接收我的回复。"此时,A收到了B的回复,并知道B能够接收纸条。但是,B并不知道A是否能够收到他的回复。
- 第三次握手:A收到B的回复后,他在纸条上写下确认,并放进信箱里。然后,他再次敲了一下门。这个纸条上写着:"Hi B,我收到了你的回复,并且确认我能够接收你的纸条。我们可以建立通信连接了。"此时,B收到了A的确认,并知道A能够接收他的回复。双方都确认了彼此的通信能力。
通过这个三次握手的过程,A和B都知道彼此的通信能力。他们可以开始通过传纸条来进行交流,而且双方都知道对方能够接收和回复纸条。这样,他们就建立了可靠的通信连接。
四次握手
四次握手和三次握手原理基本一样,区别在与四次握手中B>A回了两次,原因是为了确保数据传输的完整性。第一次告诉A收到了,等B传输A的数据全部传输完毕后,再次告诉A传完了,可以关闭了。
总结
如果三次握手改成两次,那就会导致B不知道A是否收到B发的请求,直接给A发数据,可能导致A收到这个数据。四次握手同理,每一次握手都是为了实现某些功能和解决某些问题,如果少了任何一步,就会导致这个问题的发生。