TCP三次握手四次挥手
先了解下我们常说的TCP。
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族中,TCP层是位于IP层之上,应用层之下的中间层。
TCP的三次握手和四次挥手?
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接,与之相反的,采用四次挥手来断开连接。
TCP标志位有6种标志,即:SYN(建立联机)、ACK(确认)、PSH(传送)、FIN(结束)、RST(重置)、URG(紧急)。
三次握手步骤:
1、客户端采用TCP协议将带有SYN标志的数据包发送给服务器,等待服务器确认;
2、服务器端在收到SYN的数据包后,必须确认SYN,即发送ACK标志,同时,自己也将会向客户端发送一个SYN标志;
3、客户端在接收到服务器端的SYN+ACK包后,自己会向服务器发送ACK包,完成三次握手。那么客户端和服务器正式建立了连接,开始传输数据。
三次握手图如下:
四次挥手:
四次挥手是用来断开服务器和客户端之间通信的,之所以要断开连接,是因为TCP/IP协议是要占用端口号的,而计算机的端口是有限的,不进行断开的话,势必会造成计算机资源的浪费。
1、在整个通信的过程中,谁先发起请求,谁就是客户端;
当客户端的数据传输到尾部时,客户端向服务器发送带有FIN标志的数据包,使其明白自己准备断开通信了。
2、因为TCP的通信是使用全双工通信的WebSocket,所以在断开连接的时候也应该是双向的;当服务器收到带有FIN标志的数据包时,不会直接发送FIN标志断开通信的请求,而是先发送一个带有ACK标志的应答信息,使客户端明白服务器还有数据要进行发送。
3、当服务器的数据发送完成后,向客户端发送带有FIN标志的数据包,通知客户端断开连接。
4、当客户端收到FIN后,担心网络上某些不可控的因素导致服务器不知道他要断开连接,会发送ACK进行确认,同时把自己设置成TIME_WAIT状态并启动定时器,如果在TCP的定时器到达后客户端并没有接收到请求,会重新发送;当服务器收到请求后就断开连接;当客户端等待2MLS(报文最大生存时间2倍)还没有收到请求重传的请求,客户端这边就断开连接,整个TCP通信就结束了。
四次挥手图如下:
三次握手为什么不能改成两次握手?
三次握手中的每一次都是必须的。如果是两次握手,在第二次结束后,服务器并不能保证客户端已经收到了第二次的请求,如此一来的话,服务器会一直保存着这个通信进程,因为TCP通信都是占用端口的,造成了一定资源的浪费,所以,就一定要让客户端发送ACK的确认请求。
(两次握手,客户端收到服务端的应答后进入established(已建立连接状态),而服务端在收到客户端的连接请求之后就进入到established状态。如果出现网络拥塞,客户端发送的连接请求报文A过了很久都没有到达服务端,会超时重发报文B,服务端正确接收并确认应答。连接建立并开始传输数据,等通信结束之后释放连接。此时,如果之前失效的连接请求A到达服务端,由于两次握手就能成功建立连接,服务端收到请求A之后进入established已连接状态,等待发送数据或者主动发送数据,此时,客户端已进入CLOSED断开状态,服务器会一直等下去,浪费服务器连接资源。)
关闭的时候为什么会是四次挥手?
四次挥手不能像三次握手一样,三次握手可以将SYN+ACK一起发送,ACK用于确认信息,SYN却是用来建立联机的;四次挥手中ACK不能和FIN一起发送,ACK只是告诉客户端确认收到了,等我将数据发送完毕之后会向其发送FIN的标志,所以四次挥手是不能改变的。