TCP的三次握手和四次挥手
所谓的三次握手的作用:是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立
官方解释:
第一次握手:建立连接,客户端发送syn包到服务器,并进入syn_send状态,等待服务器的确认
第二次握手:服务端收到syn包,同时自己也发送一个syn包(syn+ack),并且服务器进入syn_recv状态
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ack,此包发送完毕,客户端和服务器进入ESTABLISHED 状态,完成三次握手
过度解释:
客户端发送连接请求消息到服务端,服务端收到请求消息后知道自己与客户端可以连接成功,但是客户端不知道服务端是否接受到自己的请求。因此服务端需要给客户端发送一个消息。当客户端接受到服务端的消息后,确认自己与服务端可以进行连接。这个时候客户端需要再次给服务端发送一个请求,因为如果此时客户端没有进行任何请求操作的话,服务器会一直等待客户端的请求,这样会造成资源的浪费。其实第三次握手的主要作用是为了防止已经失效的请求报文又突然传递到了服务端,因此造成错误的产生
大白话解释:
男孩:我们可以恋爱吗?(客户端请求服务器建立连接)
女孩:你想追我?想清楚了!(服务器要求客户端确认连接)
男孩:没错,你就是我的梦中情人!(客户端确认连接)
二、TCP的四次挥手
所谓四次挥手的作用:即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开
官方解释:
第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态。
第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入CLOSE_WAIT状态。
第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,Server进入LAST_ACK状态。
第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务端,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。
过度解释:
客户端向服务器发送消息,告诉服务器需要断开连接,此时客户端已经不能向服务端发送消息,服务端接收到客户端的消息后,还可以继续向客户端发送消息,这里只说告诉客户端我收到了你的关闭请求。当服务端的响应数据完成后,在次告诉客户端我这边也要关闭请求了,这时服务端已经不能向客户端发送数据了,客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)
大白话解释:
男:“我觉得我们可能不太合适,我们分手吧,我不想和你联系了。”(发出关闭连接的请求) 女:“你要分手,可以,但是我有些话想跟你说,说完后如果你想分手就分手吧?”(发出ACK报文段) (此后男生不会再主动联系女生,而女生还会联系男生)女:“我要说的话已经说完了,咱们好聚好散吧。渣男再见!”(发送关闭连接的报文段) 男:“再见。”(发出ACK报文段,让女生知道我已经收到了)
为什么客户度还需要等待2秒
TCP允许不同的实现可以设置不同的MSL值。 第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器