TCP协议的3次握手与4次挥手

Tyrant 2019年01月25日 •  Linux 127 •  0

在近日的Python学习中,再次学习到了TCP协议中比较精髓的部分,3次握手与4次挥手,记得以前网络原理老师给讲解时候的声容并茂,当时明白了,但是没有有效的记录,很快就忘记了,现在重新温习了一遍,好记性不如烂笔头,有效的记录是提高学习效率的好方法

一、3次握手

所谓3次握手,就是在client与server建立连接时候,client与server之间进行3次通信来建立有效的连接,如图所示:

第一次:客户端要连接到服务器,向服务器发送SYN数据包,并发送一个序号为X的数据

第二次:服务器接收到客户端发来的SYN数据包,并发送一个ACK报文,报文里的值为X+1,同时向客户端发送一个序号为Y的数据

第三次:客户端接收到服务器发来的SYN数据包,并发送一个ACK报文,报文的值为Y+1,然后与服务器建立连接

总结起来就是这么三句话:

今晚有空吗?吃个饭呗

有空,去哪吃

好的,我知道了,听我安排吧

二、4次挥手

所谓4次挥手,就是客户端与服务器断开连接时候,需要进行4次通信,来真正释放资源,断开连接,如图所示:

第一次:客户端要断开连接了,向服务器发送数据包,表示自己不会再发消息给服务器,跟3次握手相似,发送一个X数据和Z数据

第二次:服务器收到客户端发送的数据包,并发送一个X+1数据和Z数据,并确认客户端不会再发来数据

第三次:服务器向客户端发送一个数据包,表示自己不会再发数据给客户端,并发送一个Y数据和Z数据

第四次:客户端向服务器发送一个数据包,发送Y+1Z数据,确认服务器不会再发来消息

为什么这里会有四次?不像连接时候的3次,因为如果当你套接字close的时候才会有断开请求,所以说断开是主动的,不能跟发送数据是主动,所以返回数据和断开请求是分开的,在服务器发出断开请求之后,服务器会有一个超时时间来等待客户端发送返回回来的数据,只要客户端一发送过来服务器就立马释放资源,此时会有一个超时时间,如果等待不来客户端的第四次挥手,那么服务器就会再次重新发送第三次挥手的内容,而客户端在接收到第三次挥手的数据之后会进行第四次挥手,为确保第四次挥手能够正确发送到服务器并让服务器释放资源,客户端会有一个2分钟的TIME_WAIT,此时他会一直等待,当服务器释放资源结束等待,所以主动断开连接的一端会占用资源一会,这也是为什么你的tcp服务器在进行ctrl+C中止的时候不能立马再运行第二遍,因为主动断开连接的一端会有一个TIME_WAIT

4次挥手可以设置这么一个场景:

两个熟人在车站相遇,但是要分别去往不同的地方,此时两人要分别了:

A:我走了啊,我要去xxx

B:我知道了,你走吧

B:我也要走了,我要去yyy

A:我知道了,咱俩分头走吧

Tags:SOCKET
上一篇
打赏
下一篇

添加新评论