TCP的三次握手和四次挥手

本文详细解析了TCP协议中的三次握手和四次挥手的过程。解释了为什么建立连接需要三次握手,而断开连接则需要四次挥手的原因。同时,文章也深入探讨了这些机制如何确保数据传输的可靠性和有序性。

        在TCP/IP模型中的传输层,有一个协议,叫做TCP协议,TCP协议的特点是面向连接的,通信是双向的,也就是通信双方都可以进行收发数据,TCP协议可以保证数据收发的可靠性和有序性。

TCP的三次握手:

既然是面向连接,那么在双方通信之前,就要建立连接,TCP的连接是通过三次握手来进行的,图解如下:


第一次握手:client发起连接请求,向server发送SYN包,发送之后将自己的状态置为:SYN_SEND状态

第二次握手:server收到client的请求之后,立马进行响应,也就是向client发送SYN+ACK包,server发送的ACK包的序号等于发送方的SYN包的序号+1,发送完成之后,server进入SYN_RECV状态。

第三次握手:client收到server发送的响应之后,再向server发送一个确认包:ACK,此时ACK确认包的序号是上一次server发送的SYN包的序号+1,发送完成之后,client和server都进入ESTABLISHED状态。

这个时候连接就建立了,双方就可以进行通信,这就是TCP的三次握手。


为什么是三次握手,不是两次或者更多次?

        现在我们假设A是客户端client,B是服务端server,既然是面向连接的协议,那么一次肯定是不行的,那么两次为什么不行呢? 现在假设现在A向B发送消息,但是由于网络延迟的原因,B没有收到消息,然后A就会重新发送SYN包,进行新的请求连接,此时B收到了第二次的连接请求,进行了响应,但是现在第一次的SYN在响应了第二次的请求之后也到了,此时服务器就会认为这是A新发起的请求,那么也会对这个SYN进行一次响应,但是此时A认为B对第一次的响应是无效的,就不会去处理,此时B就会一直为A的第一个SYN保留相关资源,就造成了资源的浪费。

而不是四次的原因就是,三次就可以保证连接的建立,四次以上就会把过程变得复杂和繁琐。


TCP的四次挥手

四次挥手的图解:


因为client和server都有可能发起关闭的请求,所以我们现在以client发起请求为例学习

第一次挥手:client发起关闭请求,向server发送FIN包,将自己的状态置为FIN_WAIT_1,意思就是:告诉server我没有数据向你发送了,我要关闭了。

第二次挥手:server收到client发送的FIN包之后,向client发送ACK包,然后将自己的状态置为CLOSE_WAIT,此时ACK包的序号和握手序号规则一样,是发起请求端的序号+1,意思就是:我知道你的数据发送完成了,但是我的数据还没有发送完成,所以我还不着急关闭连接,当client收到ACK确认之后将自己的状态置为:FIN_WAIT_2。

第三次挥手:当server的数据发送完成之后,server也要发起关闭的请求,向client发送FIN包,然后讲自己置为LAST_WAIT状态,告诉client,我的数据也发送完成了,现在我也要关闭连接了

第四次挥手:当client收到server发送的FIN包,然后将自己的状态置为TIME_WAIT,然后给server发送ACK确认包,此时的ACK确认包是server发送的FIN包的序号+1,意思就是告诉server。我知道你要结束了,现在断开吧。当serve收到client的确认之后,将自己的状态置为:CLOSED,最后一次client发送完ACK确认之后,等待2MSL,如果没有收到server的消息,那么就认为连接已经成功断开了,讲自己置为CLOSED状态。

Tip:MSL,任何报文在被丢弃前在网络中的最长时间,

为什么挥手是四次不是三次呢?

        因为当client发送FIN之后,得到了确认,此时的client的状态是FIN_WAIT_2,此时client不能发送数据,但是可以接收数据。当client第一次发送FIN包的时候,server的数据不一定也发送完了,所以server暂时还不能关闭,此时就让client处于一个FIN_WAIT_2状态,让其继续接收server没有发送完成的数据。

为什么在client响应了server发送的FIN之后没有直接进入CLOSED状态呢?

        因为在client响应了server发出的FIN请求之后,回应以ACK确认,如果此时client直接进入CLOSED状态,那么万一这个ACK包因为网络的原因没有即使的到达server,server就会再次的发送FIN包,请求关闭,但是此时client已经关闭了,那么server收到的就是RST,并会报告错误,此时就不复合TCP的可靠性原则。所以,综上所述,在client响应了server的FIN之后,状态只能是TIME_WAIT,等2MSL之后,client的状态才能置为CLOSED。




限于编者水平,文章难免有缺漏之处,欢迎指正。

        如需转载,请注明出处。

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化并行计算等改进策略。; 适合人群:具备一定Python编程基础优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值