首页 > 编程知识 正文

tcp3次握手与4次挥手,tcp的四次挥手

时间:2023-05-05 03:23:48 阅读:32768 作者:273

摘要我们知道TCP是可靠的数据传输协议,而UDP是不可靠的传输,那么TCP如何保证可靠的传输呢? 那么,必须要TCP的3次握手和4次挥手。

三次握手下图是三次握手的流程图

让我们用wireshark捕获工具分析三次握手

三次握手数据包

第一次握手

建立连接。 客户端发送其SYN位置为1、Sequence Number为x的连接请求消息段; (x是随机生成的int值)然后,客户端进入SYN_SEND状态,等待服务器确认。

第二次握手

服务器接收到SYN消息段。 如果服务器从客户端接收到SYN段,则必须检查该SYN段并将确认编号设置为x1 (顺序编号1 )。 另外,自己发送SYN请求消息,将SYN位置设为1,将Sequence Number设为y。 (y是随机生存的int值); 服务器端将上述所有信息放在一个消息段(即SYN ACK消息段)中,然后同时发送到客户端。 此时,服务器处于SYN_RECV状态。

第三次握手

客户端接收服务器的SYN ACK消息段。 然后,将Acknowledgment Number设置为y 1,以向服务器发送ACK段。 此段发送完成后,客户端和服务器端都将处于ESTABLISHED状态,并完成TCP的三次握手。

挥手四次

第一次挥手的时候:

客户端(既可以是客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向服务器发送FIN消息段; 此时,客户端进入FIN_WAIT_1的状态; 这意味着客户端没有要发送到服务器的数据

客户端发送第一次挥手后,就不能在向 服务端发送数据了。

第二次挥手:

服务器接收客户端发送的FIN报文段,向客户端返回ACK报文段,Acknowledgment Number将Sequence Number加1; 客户端进入FIN_WAIT_2状态; 服务器告诉客户端,我“同意”你的关闭请求;

Server 第一次响应后,还可以继续向 Client 发送数据,这里只是告诉 Client ,我收到你发送的关闭请求。

第三次挥手

服务器向客户端发送FIN消息段,请求关闭连接,同时服务器进入CLOSE_WAIT状态;

服务器数据响应完成后,请告诉客户端。 这里也可以关闭请求。 此时

服务器将无法向客户端发送数据

第四次挥手

客户端接收服务器发送的FIN段,向服务器发送ACK段,客户端进入

TIME_WAIT状态; 服务器收到客户端的ACK消息段后,关闭连接; 在这种情况下为客户机

如果等待2MSL后仍未收到回复,则证明服务器端已正常关闭。 是的。 客户端也可以关闭连接。

什么是MSL

MSL是最大分段生命周期的英语缩写,在中文中可以翻译为“新闻报道最大生存时间”。 他是任何报纸报道都存在于网上的最长时间,超过这个时间就会销毁报纸报道。 tcp消息(segment )是ip数据报(datagram )的数据部分,具体名称请参考《数据在网络各层中的称呼》。 此外,ip标头具有TTL域,TTL是time to live的缩写,在中文中可以翻译为“生存时间”。 该生存时间由源主机设置初始值,但在保存的RFC 793中,MSL规定为2分钟,而不是保存的具体时间,实际上常用的时间为30秒、1分钟、2分钟等。

2MSL,即两倍MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,TCP的一端自主开始关闭,在发出最后一个ACK分组后,即在第三次握手结束后发送第四次握手的ACK分组后等待2MSL的主要目的是害怕最后一个ACK分组没有到达对方,对方可以在超时后重新发送第三次握手的FIN分组,在自主关闭后接收到重发的FIN分组之后发送另一个ACK回复分组在TIME_WAIT状态下,两端的端口不可用,在2MSL时间后才能继续使用。 如果连接处于等待2MSL的阶段,所有延迟的消息段将被丢弃。 但是,在实际的APP应用程序中,通过设置SO_REUSEADDR选项,您无需在使用此端口之前等待2MSL的时间结束。

TTL和MSL有关系,但不是简单相等的关系,MSL必须大于或等于TT

L。

为什么要三次握手?

为什么要三次握手

TCP 建立连接,其实通过两次握手就可以建立连接了,为什么要三次呢?是不是多此一举呢?

1、《计算机网络》中是这样说的:

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
在书中同时举了一个例子,如下:
已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

2、网络故障

比如,现在网络出现了故障,只能发请求数据包,而接收不到响应数据包,那么只要发送一次请求,服务器就建立请求,这样肯定也是不对的,网络请求有来有回才能完成通讯。所以三次握手是必不可少的。

为什么要四次挥手呢

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当 Client 发出FIN报文段时,只是表示 Client 已经没有数据要发送了,Client 告诉 Server,它的数据已经全部发送完毕了;但是,这个时候 Client 还是可以接受来自 Server 的数据;当 Server 返回ACK报文段时,表示它已经知道 Client 没有数据发送了,但是 Server 还是可以发送数据到 Client 的;当 Server 也发送了FIN报文段时,这个时候就表示 Server 也没有数据要发送了,就会告诉 Client ,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。



作者:jijs
链接:https://www.jianshu.com/p/f876f19112a2
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。