三次握手和四次挥手是在计算机网络中用于建立和终止TCP连接的协议。这两个过程是TCP协议的重要组成部分,确保数据的可靠传输。
三次握手指的是在客户端和服务器之间建立连接时的步骤。具体流程如下:
- 客户端向服务器发送一个连接请求报文段(SYN)。
- 服务器收到请求后,回复一个确认报文段(SYN+ACK),表示可以建立连接。
- 客户端收到服务器的确认后,再次发送一个确认报文段(ACK),表示连接已建立。
通过这个三次握手的过程,双方确认了彼此的存在,并同意建立连接。这样,在数据传输过程中就能够确保双方之间的通信正常。
四次挥手指的是在客户端和服务器之间关闭连接时的步骤。具体流程如下:
- 客户端向服务器发送一个关闭连接请求报文段(FIN)。
- 服务器收到请求后,回复一个确认报文段(ACK),表示已收到客户端的关闭请求。
- 服务器执行完当前的数据传输任务后,发送一个关闭连接请求报文段(FIN)给客户端。
- 客户端收到服务器的关闭请求后,回复一个确认报文段(ACK)。双方都确认关闭连接。
通过这个四次挥手的过程,双方在关闭连接时相互通知,确保数据传输的完整性和正常关闭。
三次握手和四次挥手的设计是为了保证数据传输的可靠性。通过握手过程,双方建立了可靠的连接;通过挥手过程,双方能够安全地关闭连接,避免数据的丢失或不完整。这些步骤是TCP协议的基础,也是网络通信中重要的一环。
三次握手
运行服务端测试程序,服务端socket进入监听状态。
用netstat -na|less
命令可以查看网络状态:
可以看到5005的口在LISTEN状态。
运行客户端的程序,重新在服务端的主机上查看。
可以看到131的外部地址端口为47856,132的本地地址宽口为5005。
socket包含两部分,IP地址和端口。
对服务端来说,端口是固定的设置的,这样客户端才能连上来,客户端的端口是随机分配的(不关心)。
客户端的网络状态:
握手过程:
三次握手是在TCP/IP协议中用于建立可靠的连接的过程。它由客户端和服务器之间的交互组成,确保双方都愿意进行通信,并且同步初始序列号。
以下是详细的三次握手过程:
-
第一步:客户端发送SYN请求
- 客户端向服务器发送一个SYN(同步)请求包,其中包含随机生成的初始序列号(ISN)。这个序列号用于后续通信中标识数据包的顺序。
- 客户端还设置了一个SYN标志位来表示这是一个连接请求。
-
第二步:服务器回应SYN-ACK
- 服务器收到客户端的SYN请求后,如果接受连接,会向客户端发送一个SYN-ACK(同步-确认)响应包。
- 服务器为自己生成一个随机的初始序列号(ISN),并将客户端的初始序列号加一作为确认号(ACK)发送给客户端。
- 服务器同时设置SYN和ACK标志位,表示既同步又确认。
-
第三步:客户端发送ACK确认
- 客户端收到服务器的SYN-ACK响应后,检查其中的确认号是否正确,并向服务器发送一个ACK(确认)包作为响应。
- 客户端将服务器的初始序列号加一作为确认号发送给服务器,同时设置ACK标志位来表示确认操作。
这样,三次握手完成,客户端和服务器都知道对方愿意进行通信,并且双方的初始序列号也已经同步。数据传输阶段可以开始了。
需要注意的是,三次握手过程中可能会出现超时、网络延迟等情况,导致握手失败或延迟。而且,由于网络的不可靠性,即使完成了三次握手,仍然有可能出现丢包或重复包的情况,TCP协议通过序列号和确认号以及重传机制来处理这些问题。
四次挥手
四次挥手是TCP连接的关闭过程,由发起方和接收方共同完成。以下是四次挥手的详细介绍:
-
发起方(客户端)发送关闭连接请求:
客户端首先向服务器发送一个FIN(Finish)包,表示希望关闭连接。这个包的序列号是X。 -
接收方(服务器)确认关闭连接请求:
服务器接收到关闭连接请求后,会向客户端发送一个ACK(Acknowledgment)包,表示已经收到了关闭请求,并且准备关闭连接。这个ACK包的确认号是X+1。 -
接收方发送关闭连接请求:
服务器发送完ACK包后,会进入CLOSE_WAIT状态,等待自己的应用程序结束数据传输。当应用程序结束后,服务器会向客户端发送一个FIN包,表示自己也准备关闭连接。这个FIN包的序列号是Y。 -
发起方确认关闭连接请求并关闭连接:
客户端接收到服务器端发送的FIN包后,会发送一个ACK包作为确认,表示已经接收到关闭请求,并准备关闭连接。这个ACK包的确认号是Y+1。客户端发送完ACK包后,进入TIME_WAIT状态,等待一段时间后关闭连接。
在四次挥手过程中,有两个阶段需要等待一段时间。一个是服务器端等待应用程序结束数据传输的CLOSE_WAIT状态,另一个是客户端在TIME_WAIT状态下等待一段时间。这是为了确保网络中所有的数据包都已经传输完毕,以防止后续的重复连接。
总结起来,四次挥手过程是:
客户端发送FIN,服务器发送ACK;
服务器发送FIN,客户端发送ACK;
其中,FIN表示关闭连接请求,ACK表示确认收到请求。这样双方就完成了TCP连接的关闭。