TCP
约 905 字大约 3 分钟
2021-03-09
简述TCP三次握手和四次挥手
下面符号的含义SYN(联机) ACK(确认) FIN(结束)
TCP三次握手
- 第一次握手:客户端采用TCP协议将带有SYN标志的数据包发送给服务器,进入syn_send状态,等待服务器的确认。
- 第二次握手:服务器端在收到SYN的数据包后,必须确认SYN,并发送的ACK标志,syn_recv状态,同时,自己也将会向客户端发送一个SYN+ACK包。
- 第三次握手:客户端在接收到服务器段的SYN+ACK包后,会向服务器发送ACK包,完成三次握手。那么客户端和服务器正式建立了连接,开始传输数据。
TCP四次挥手
- 第一次挥手:当客户端的数据传输到尾部时,客户端向服务器发送带有FIN标志的数据包,使其明白自己准备断开通信了,客户端进入fin_wait1状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
- 第二次挥手:因为TCP的通信是使用全双工通信的,所以在断开连接的时候也应该是双向的;当服务器收到带有FIN标志的数据包时,其必不会直接发送FIN标志断开通信的请求,而是先发送一个带有ACK标志的应答信息,使客户端明白服务器还有数据要进行发送,同时,将seq的值+1作为确认序号一并返回(确认序号为收到序号+1),服务端进入close_wait状态;
- 第三次挥手:服务器的数据发送完成后,向客户端发送带有FIN标志和一直值为n的seq的数据包,通知客户端断开连接,服务端进入last_wait状态;
- 第四次挥手:当客户端收到FIN后,担心某些不可控制的因素导致服务器不知道他要断开连接,会发送ACK进行确认,同时把自己设置成TIME_WAIT状态并启动定时器,在TCP的定时器到达后客户端并没有接收到请求,会重新发送;当服务器收到请求后就断开连接;当客户端等待2MLS(两倍报文最大生存时间)后,没有收到请求重传的请求后,客户端这边就断开连接,整个TCP通信就结束了。

为什么握手是三次,挥手是四次?
因为当服务端(Server)收到客户端(Client)的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文。 只有等到服务端所有的报文都发送完了,来通知客户端:"你发的FIN报文我收到了",才能发送FIN报文,因此不能一起发送,故需要四次挥手。
为什么不能进行两次握手链接
如果是两次握手,在第二次结束后,服务器并不能保证客户端已经收到了第二次的请求,如此一来的话,服务器会一直保存着这个通信过程, 因为TCP通信都是要占用端口的,造成了一定的资源浪费。所以,就一定要让客户端来发送ACK的确认请求。