文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

计算机网络传输协议TCP三次握手与四次挥手原理

2024-04-02 19:55

关注

TCP三次握手四次挥手

我们之前在 传输层协议TCP与UDP 中详细介绍了UDP协议和TCP协议格式以及他们各自的特点,我们知道TCP协议是面向连接的,那面向连接就得需要做建立连接,维护连接,断开连接这些工作。

TCP三次握手四次挥手

服务器状态转换

[CLOSED->LISTEN] 服务器调用listen后就进入LISTEN状态,等待客户端向自己发起连接

[LISTEN->SYN_RCVD] 一旦监听到连接请求(同步报文段),就会将该连接放入内核中维护的连接等待队列中,并向客户端发送SYN+ACK报文确认已收到看客户端的连接请求

[SYN_RCVD->ESTABLISHED] 服务器一旦收到了客户端的确认报文,就进入ESTABLISHED状态,就可以进行读写数据了

[ESTABLISHED->CLOSE_WAIT] 当客户端主动关闭连接(调用close),服务器收到客户端发送的结束报文段FIN,服务器向客户端返回确认收到关闭连接的报文后,就会进入CLOSE_WAIT

[CLOSE_WAIT->LAST_ACK] 当服务器进入CLOSE_WAIT状态时,说明服务器已经开始准备关闭连接(但是需要先处理完之前的数据),当服务器真正调用close关闭连接时,会向客户端发送FIN报文,自己则进入LAST_ACK状态,等待最后一个ACK的到来(这里的ACK是指客户端对于服务器发送的FIN的响应报文)

[LAST_ACK->CLOSED] 服务器收到了客户端对FIN报文的响应ACK,至此服务器关闭连接成功

客户端状态转换

[CLOSED->SYN_SEND] 客户端调用connect,向服务器发送同步报文段,表示想与服务器建立连接,自己进入SYN_SEND状态等待服务器的响应

[SYN_SEND->ESTABLISHED] connect调用成功,客户端收到服务器的响应报文ACK,进入ESTABLISHED状态,可以读写数据

[ESTABLISHED->FIN_WIAT_1] 客户端主动调用close,向服务器发送结束报文段,自己进入FIN_WAIT_1状态,等待服务器的响应

[FIN_WAIT_1->FIN_WAIT_2]客户端收到服务器对结束报文段的确认,则进入FIN_WAIT_2状态,开始等待服务器的结束报文段

[FIN_WAIT_2 -> TIME_WAIT] 客户端收到服务器发来的结束报文段, 进入TIME_WAIT, 并发出对服务器发送的结束报文的的响应 LAST_ACK;

[TIME_WAIT -> CLOSED] 客户端要等待一个2MSL(Max Segment Life, 报文最大生存时间)的时间, 才会进入CLOSED状态(因为要防止服务器没有收到LASK_ACK,需要进行重发的情况).

TCP状态转换图

TCP状态转换图

TCP中常见的面试题

为什么是三次握手,不是一次或者两次

答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

为什么是三次握手,四次挥手

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。

但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。

只有等到Server端所有的报文都发送完了,所有的数据也处理完了之后,Server端才能发送FIN报文表示自己能够断开连接,因此不能一起发送。故需要四步握手。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

答:TCP连接是有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。

服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。

若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

为什么会有TIME_WAIT状态

现在做一个测试,首先启动server,然后启动client,然后用Ctrl-C使server终止,这时马上再运行server, 结果是:

这是因为,虽然server的应用程序终止了,但TCP协议层的连接并没有完全断开,因此不能再次监 听同样的server端口.我们用netstat命令查看一下:

理解TIME_WAIT

我们来想一想,为什么TIME_WAIT的时间是2MSL

MSL是TCP报文的最大生存时间, 因此TIME_WAIT持续存在2MSL的话就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的);

同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失, 那么服务器会再重发一个FIN. 这时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发LAST_ACK);

解决TIME_WAIT状态引起的bind失败的方法

setsockopt

setsocket

以上就是计算机网络传输协议TCP三次握手与四次挥手原理的详细内容,更多关于TCP三次握手与四次挥手的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯