关于三次握手与四次挥手的超详细解释

关于三次握手与四次挥手的超详细解释

看了很多博客的文章,再结合自己想要知道的知识,发现还是需要东看一下西看一下,才能明白大概的过程。所以这里博主决定来小小的结合一下自己记录的内容。来写一个容易看明白并且能够应对面试问答的文章。
首先我们知道三次握手和四次挥手都是基于IP协议基础上进行的TCP应用。我们这里展示一下TCP报文格式
关于三次握手与四次挥手的超详细解释_第1张图片
三次握手
接下来是三次握手的流程及图片
其中的SYN是随机开始的。关于三次握手与四次挥手的超详细解释_第2张图片
(1)主机A,发送SYN请求字段请求B主机建立连接,然后创建一个序列号ISN发送给主机B。

(2)主机B应答主机A的消息,返回一段主机B的SYN请求连接,返回一个ack应答字段,并将主机A的序列号+1,来返回给主机A,以表示是应答主机A的并且也向A发送请求字段。

(3)主机A将主机B发送的序列号加1,并且将其作为确认号ACK应答字段返回给B以作为应答,此时AB主机双方建立连接。

第一次B确认A有发送能力,第二次A确认自己的发送能力以及B有接收能力,第三次B确认自己的发送能力以及A的接收能力

这三个步骤主要是用于AB主机双方确认对方以及自己是否都能正常发送、接收的能力,用三次来完成此次操作。

四次挥手
接下来是四次挥手的流程及图片
其中的SYN是随机开始的。这里的主机A和主机B并没有特定针对的服务器或者客户端,两个都可以在任意一边。但是我接下来的解释还是针对图片的情况
关于三次握手与四次挥手的超详细解释_第3张图片
(1)主机A的TCP协议栈向主机B发送FIN终止连接字段,将自己的序列号发送给主机B,并且将建立连接时的ack确认字段发送给主机B(在发送了释放报文字段后,进入到FIN_WAIT状态)

(2)主机B确认主机A的FIN终止请求,确认号为主机A的序列号+1,(此时主机B进入到CLOSE_WAIT状态,不接受A的数据,主机A进入到FIN_WAIT2)

(3)主机B这时候向主机A发送FIN请求,并且发送确认字段(在主机A的序列号上+1)(主机B是LAST_ACK,主机A是接收到了之后,发送回应之后进入到TIME_WAIT,等待2MSL,之后没有消息再确认关闭。因为怕发送过去的ACK可能丢失,一旦丢失,则主机B无法关闭连接。)

(4)主机A对主机B的释放连接请求进行确认。(主机B关闭连接,主机A关闭连接。)

看到这里,有的小伙伴可能对文章里说到的一些FIN_WAIT什么状态并不是很了解?那么看接下来的这幅说明图
关于三次握手与四次挥手的超详细解释_第4张图片
对于TIME_WAIT1等状态解释
当客户端最后一次发送消息时并没有直接进入close状态而是进入TIME_WAIT状态,这是因为TCP是面向连接的协议每一次发送都需要确认对方是否收到消息。客户端最后一次发送消息时可能会由于网络等其他原因导致服务器收不到消息,服务器就会选择从新给客户端发送一个FIN的包,如果客户端处于关闭状态将永远也收不到服务器发给它的消息了。至于这个时间要等多久才能确认对方收到了消息呢。
关于MSL等待时间
​ 报文在网络中有一个最大生存时间MSL超过这个时间就会被丢弃并通知源主机。TIME_WAIT 要等待 2MSL 才会进入 CLOSED 状态。ACK 包到达服务器需要 MSL 时间,服务器重传 FIN 包也需要 MSL 时间,2MSL 是数据包往返的最大时间,如果 2MSL 后还未收到服务器重传的 FIN 包,就说明服务器已经收到了 ACK 包。
关于FIN
​ 因为发送FIN的一方永远是表明自己没有信息数据要发送给对方了,然后处于FIN_WAIT是因为确认对方收到了ACK回复后,不知道对方还有没有消息要发送,然后等待到了对方的FIN,代表对方也不发了,这时候就准备断开了。TIME_WAIT是确认等待2MSL对方没有重新发送FIN代表收到了ACK包。于是关闭。CLOSE_WAIT是等待应用层在结束前的操作是否结束。
客户端方的状态
FIN_WAIT1是等待对方的ACK回应确认,FIN_WAIT2是等待对方的断开连接的请求。
TIME_WAIT是确认对方没有重新发送FIN请求,代表对方收到了我们的ACK请求所以可以CLOSE关闭了。
服务器端方的状态
CLOSE_WAIT 是等待应用层的应用手动操作结束,比如你还在操作应用。
LAST_ACK 等待客户端方发送回来的收到的确认字段。
CLOSE 关闭连接

以上就是针对三次握手四次挥手,以及其中的状态的我个人理解的一些解释。有哪里不对或者可以继续完善的希望大家能够纠正、建议出来。

你可能感兴趣的:(计算机网络,面经,TCP协议,网络协议,网络,面试)