三次握手与四次挥手

简介

传输层在前面的博文中已经详细的介绍了,以漫画 + 画图的方式,因此这里不在赘述。但是相关的细节叙述的不是太好,因此主针对TCP的三次握手和四次挥手再次进行叙述。联系上socket套接字编程进行说明。?传输层漫画版

三次握手

1、图示

拿上一次博文的图继续说在这里插入图片描述注意红色框内的接口。

2、补充

由于上一篇博文叙述的顺序,所以并没有说,如果ACK丢失或者SYN丢失会怎么样。所以现在进行补充。
①第一次握手失败,即SYN丢失,客户端接重传。
②第二次握手失败,即服务端发送的ACK丢失,也就意味着服务端的SYN也丢失了,客户端和服务端都会重新发送SYN
③第三次握手失败,即客户端给服务器的ACK丢失,这个时候, 如果此时ACK在网络中丢失,那么Server端该TCP连接的状态为SYN_RECV,并且依次等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。如果重发指定次数后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。 但是Client认为这个连接已经建立,如果Client端向Server写数据,Server端将以RST包(用于强制关闭tcp连接)响应,方能感知到Server的错误。

3、三次握手的原因

这个问题其实同为什么不是两次,为什么不是四次等回答是相似的。TCP是全双工通信,3次握手完成两个重要的功能,既要双方都能够通信,也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。如果只是两次握手,只能确定单向是可以通信的,这样当客户端发起请求,服务端响应,服务端创建新的套接字开始与客户端通信,但是如果这是一个无效的连接请求,如网络滞留的一个请求,这样会造成服务器的资源浪费。
不需要四次,是因为前四次就可以确定双方可以通信,由于ACK只是一个比特位,因此可以让回复一端发送SYN时带上ACK,这样提高了连接效率

四次挥手

1、图示

在这里插入图片描述

2、TIME_WAIT

这个状态是非常重要的状态,在这个状态是属于主动关闭方的,在第三次挥手完毕后,主动关闭方会自动等待2MSL,这样等待的意义则是:

1、保证最后一次握手报文能到被动关闭方,到不了还能能进行超时重传。
2、2MSL后,这次连接的所有报文都会消失,不会影响下一次连接。
3、如果重传的FIN包或者ACK丢失,也不影响,最后会直接关闭当前连接。

3、FIN包和ACK

第二次挥手和第三次挥手之所以不能同时,是因为如果被动关闭方还有数据没有发送完,它会先回复一个ACK,等数据发送完后再发送FIN。

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页