为什么要“三次握手,四次挥手”?
1)所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。在socket编程中,客户端执行connect()时,将触发三次握手:即客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能明确自己和对方的收、发能力正常。
第一次握手:客户端发送网络包,服务端收到。服务端得出结论:客户端发送能力、服务端接收能力正常。
第二次握手:服务端发包,客户端收到。客户端得出结论:服务端接收、发送能力正常,客户端接收、发送能力正常。
第三次握手:客户端发包,服务端收到。服务端得出结论:客户端接收、发送能力正常,服务端发送、接收能力正常。
所以第一、二次握手,只是为了验证彼此的接收发送能力是否正常。经历上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的,就可以正常通信了。
2)所谓四次挥手(four-way handshake),就是指TCP的连接的拆除过程需要发送四个包,客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送或接收数据。客户端或者服务端皆可以主动发送指令告诉对方,我要关闭连接了,比如:
客户端:我要关闭连接了(客户端发起Close)
服务端:好,你关吧(服务端收到关闭指令,回了一个ACK)【此时客户端不可以向服务端传输数据,但是服务端仍然可以向客户端传输数据】
服务端:我传完所有数据啦(发送一个FIN段来关闭向客户端传输方向上的连接)
客户端:哦,好的,知道(发送ACK确认关闭连接)
注意:接收到FIN报文的一方只能回复一个ACK, 它是无法马上返回对方一个FIN报文段的,因为结束数据传输的“指令”是上层应用层给出的,它只负责“搬运”。