TCP/IP-三次握手和四次挥手
TCP/IP协议在客户端与服务器建立连接和断开连接时的一套消息确认机制,就是三次握手和四次挥手。
TCP/IP
的三次握手和四次挥手是《计算机网络》的基础知识。
数据在两端之间的网络传输,是确认对方能发也能收。
三次握手
三次握手是TCP/IP
建立连接的确认机制,是客户端和服务器双方要确认对方能收到自己的信息,而三次握手是最短路径。
- 第一次握手:建立连接时,
Client
发送请求报文段(syn seq=x
),进入SYN_SENT
状态,等待Server
确认。 - 第二次握手:服务器收到,
Server
回复信息给Client
,包含给客户端的确认信息,和服务器自身的报文信息(ack=x+1 syn seq=y
),此时服务器进入SYN_RECV
状态。 - 第三次握手:客户端收到
SYN+ACK
包,Client
回复服务器(ack=y+1
),客户端和服务器进入ESTABLISHED
(TCP连接成功)状态,完成三次握手。
三次握手完成后,客户端与服务器开始传送数据。
形象比喻
- A 向 B 发起建立连接请求:A——>B;
- B 收到 A 的发送信号,并且向A发送确认信息:B——>A;
- A 收到 B 的确认信号,并向B发送确认信号:A——>B。
通过第一次握手,B 知道 A 能够发送数据。通过第二次握手,A 知道 B 能发送数据。
结合第一次握手和第二次握手,A 知道 B 能接收数据。结合第三次握手,B知道A能够接收数据。
至此,完成了握手过程,A 知道 B 能收能发,B 知道 A 能收能发,通信连接至此建立。
三次连接是保证可靠的最小握手次数,再多次握手也不能提高通信成功的概率,反而浪费资源。
四次挥手
四次挥手是TCP/IP
关闭连接的确认机制。
对于一个已经建立的连接,TCP使用改进的三次握手来释放连接(使用一个带有FIN附加标记的报文段)。TCP关闭连接的步骤如下:
- 第一步:当主机 A 的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有
FIN
附加标记的报文段(FIN表示英文finish)。 - 第二步:主机 B 收到这个
FIN
报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。 - 第三步:主机 B 的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机 A送一个
FIN
报文段。 - 第四步:主机 A 收到这个
FIN
报文段后,向主机 B 发送一个ACK
表示连接彻底释放。
形象比喻
- A 向 B 发起请求(fin),表示A没有数据要发送了:A——>B;
- B 向 A 发送信号(ack),知道A要请求断开;
- B 向 A 发送信号(fin),数据接收完成,告知B要关闭连接:B——>A;
- A 向 B 收到信号(fin)向B发送(ack),确认断开:A——>B。
- B 收到确认信号,断开连接,而A在一段时间内没收到B的信号,表明B已经断开了,于是A也断开了连接。至此,完成挥手过程。
2,3次挥手不能合为一次,因为此时 A 虽然不再发送数据了,但是还可以接收数据,B可能还有数据要发送给A,所以两次挥手不能合并为一次。
挥手次数比握手多一次,是因为握手过程,通信只需要处理连接。而挥手过程,通信需要处理数据+连接。