首页 > 其他分享 >三次握手和四次挥手的一些疑问

三次握手和四次挥手的一些疑问

时间:2024-01-10 13:23:10浏览次数:29  
标签:重传 挥手 ACK 报文 SYN 四次 握手 服务端 客户端

TCP 三次握手期间的异常

 

1 )第一次握手丢失了,会发生什么?
当客户端想和服务端建立 TCP 连接的时候,首先第一个发的就是 SYN 报文,然后进入到SYN_SENT状态。
在这之后,如果客户端迟迟收不到服务端的 SYN-ACK 报文(第二次握手),就会触发超时重传机制。
不同版本的操作系统可能超时时间不同,有的 1 秒的,也有 3 秒的,这个超时时间是写死在内核里的,如果想要更改则需要重新编译内核,比较麻烦。
当客户端在 1 秒后没收到服务端的 SYN-ACK 报文后,客户端就会重发 SYN 报文,那到底重发几次呢?
在 Linux 里,客户端的 SYN 报文最大重传次数由tcp_syn_retries内核参数控制,这个参数是可以自定义的,默认值一般是 5。
通常,第一次超时重传是在 1 秒后,第二次超时重传是在 2 秒,第三次超时重传是在 4 秒后,第四次超时重传是在 8 秒后,第五次是在超时重传 16 秒后。没错,每次超时的时间是上一次的 2 倍。
当第五次超时重传后,会继续等待 32 秒,如果服务端仍然没有回应 ACK,客户端就不再发送 SYN 包,然后断开 TCP 连接。
所以,总耗时是 1+2+4+8+16+32=63 秒,大约 1 分钟左右。

2) 第二次握手丢失了,会发生什么?
当服务端收到客户端的第一次握手后,就会回 SYN-ACK 报文给客户端,这个就是第二次握手,此时服务端会进入SYN_RCVD状态。
第二次握手的SYN-ACK报文其实有两个目的 :

第二次握手里的 ACK, 是对第一次握手的确认报文;
第二次握手里的 SYN,是服务端发起建立 TCP 连接的报文;
所以,如果第二次握手丢了,就会发送比较有意思的事情,具体会怎么样呢?
因为第二次握手报文里是包含对客户端的第一次握手的 ACK 确认报文,所以,如果客户端迟迟没有收到第二次握手,那么客户端就觉得可能自己的 SYN 报文(第一次握手)丢失了,于是客户端就会触发超时重传机制,重传 SYN 报文。
然后,因为第二次握手中包含服务端的 SYN 报文,所以当客户端收到后,需要给服务端发送 ACK 确认报文(第三次握手),服务端才会认为该 SYN 报文被客户端收到了。
那么,如果第二次握手丢失了,服务端就收不到第三次握手,于是服务端这边会触发超时重传机制,重传 SYN-ACK 报文。
在 Linux 下,SYN-ACK 报文的最大重传次数由tcp_synack_retries内核参数决定,默认值是 5。
因此,当第二次握手丢失了,客户端和服务端都会重传:

客户端会重传 SYN 报文,也就是第一次握手,最大重传次数由 tcp_syn_retries内核参数决定。;
服务端会重传 SYN-AKC 报文,也就是第二次握手,最大重传次数由 tcp_synack_retries 内核参数决定。
3 )第三次握手丢失了,会发生什么?
客户端收到服务端的 SYN-ACK 报文后,就会给服务端回一个 ACK 报文,也就是第三次握手,此时客户端状态进入到ESTABLISH状态。
因为这个第三次握手的 ACK 是对第二次握手的 SYN 的确认报文,所以当第三次握手丢失了,如果服务端那一方迟迟收不到这个确认报文,就会触发超时重传机制,重传 SYN-ACK 报文,直到收到第三次握手,或者达到最大重传次数。
注意,ACK 报文是不会有重传的,当 ACK 丢失了,就由对方重传对应的报文。

TCP 四次挥手期间的异常

 

1) 第一次挥手丢失了,会发生什么?
当客户端(主动关闭方)调用 close 函数后,就会向服务端发送 FIN 报文,试图与服务端断开连接,此时客户端的连接进入到FIN_WAIT_1状态。
正常情况下,如果能及时收到服务端(被动关闭方)的 ACK,则会很快变为FIN_WAIT2状态。
如果第一次挥手丢失了,那么客户端迟迟收不到被动方的 ACK 的话,也就会触发超时重传机制,重传 FIN 报文,重发次数由tcp_orphan_retries参数控制。
当客户端重传 FIN 报文的次数超过tcp_orphan_retries后,就不再发送 FIN 报文,直接进入到close状态。

2)第二次挥手丢失了,会发生什么?
当服务端收到客户端的第一次挥手后,就会先回一个 ACK 确认报文,此时服务端的连接进入到CLOSE_WAIT状态。
在前面我们也提了,ACK 报文是不会重传的,所以如果服务端的第二次挥手丢失了,客户端就会触发超时重传机制,重传 FIN 报文,直到收到服务端的第二次挥手,或者达到最大的重传次数。
这里提一下,当客户端收到第二次挥手,也就是收到服务端发送的 ACK 报文后,客户端就会处于FIN_WAIT2状态,在这个状态需要等服务端发送第三次挥手,也就是服务端的 FIN 报文。
对于 close 函数关闭的连接,由于无法再发送和接收数据,所以FIN_WAIT2状态不可以持续太久,而
tcp_fin_timeout控制了这个状态下连接的持续时长,默认值是 60 秒。
这意味着对于调用 close 关闭的连接,如果在 60 秒后还没有收到 FIN 报文,客户端(主动关闭方)的连接就会直接关闭。

3) 第三次挥手丢失了,会发生什么?
当服务端(被动关闭方)收到客户端(主动关闭方)的 FIN 报文后,内核会自动回复 ACK,同时连接处于CLOSE_WAIT状态,顾名思义,它表示等待应用进程调用 close 函数关闭连接。
此时,内核是没有权利替代进程关闭连接,必须由进程主动调用 close 函数来触发服务端发送 FIN 报文。
服务端处于 CLOSE_WAIT 状态时,调用了 close 函数,内核就会发出 FIN 报文,同时连接进入LAST_ACK 状态,等待客户端返回 ACK 来确认连接关闭。
如果迟迟收不到这个 ACK,服务端就会重发 FIN 报文,重发次数仍然由tcp_orphan_retries 参数控制,这与客户端重发 FIN 报文的重传次数控制方式是一样的。

4) 第四次挥手丢失了,会发生什么?
当客户端收到服务端的第三次挥手的 FIN 报文后,就会回 ACK 报文,也就是第四次挥手,此时客户端连接进入TIME_WAIT状态。
在 Linux 系统,TIME_WAIT 状态会持续 60 秒后才会进入关闭状态。
然后,服务端(被动关闭方)没有收到 ACK 报文前,还是处于 LAST_ACK 状态。
如果第四次挥手的 ACK 报文没有到达服务端,服务端就会重发 FIN 报文,重发次数仍然由前面介绍过的tcp_orphan_retries参数控制。

标签:重传,挥手,ACK,报文,SYN,四次,握手,服务端,客户端
From: https://www.cnblogs.com/beatle-go/p/17956279

相关文章

  • TCP连接的三次握手(建立连接)与四次挥手(释放连接)
    1.TCP连接的建立三报文握手: 客户端主动打开连接,服务器被动打开连接(1)TCP客户端创建客户进程首先创建传输控制模块TCB,向服务器发出连接请求报文段,不能携带数据。(2)服务器接收请求报文段,如果同意建立了请求,则向客户端发送确认。(3)客户端还要向服务器发送确认,可以携带数据,防治已经失......
  • 软件多开助手的秘密技巧:发挥手机潜能,提升生活效率
    软件多开助手:发挥手机潜能,提升生活效率的秘密技巧导语:在现代社会中,手机成为了我们生活中不可或缺的一部分。为了提高生活和工作效率,我们经常需要同时运行多个应用程序。然而,手机默认的单一应用运行模式限制了我们的操作空间。在这篇文章中,我们将介绍一种秘密技巧——软件多开助手......
  • TCP中握手挥手流程解读
    TCP(TransmissionControlProtocol)是一种面向连接的、可靠的传输层协议,在网络通信中起着至关重要的作用。TCP连接的建立和关闭过程涉及到握手和挥手流程,本文将深入解读TCP中的握手和挥手流程,并提供详细的代码演示,以帮助读者更好地理解和应用TCP协议。1.握手流程TCP连接的建立采用......
  • 第四次
    #一、团队介绍 1.小组名称:被迫上岗的爷们儿2.小组口号:生死看淡、不服就干3.小组成员:-组长:王孝冉-组员:徐昂杰、陶毅、杨弋4.项目选题:小组构想做一个学生信息与成绩管理系统 #二、小组成员介绍 ##陶毅我来自浙江绍兴,我会用python和C语言进行一些简单的编程,......
  • TCP协议 和 UDP协议 的区别 (三次握手/四次挥手)
    TCP协议拓展:FTP:(File Transfer Protocol)文件传输协议FIle协议:访问本地文件Webscoket:网络通信协议;主动给客户端发送协议FTP:文件传输协议①重点:面试重点:TCP、UDP协议区别UDP(UserDatagramProtocol)......
  • TCP连接断开:为什么要挥手四次
    本文分享自华为云社区《解密TCP连接断开:四次挥手的奥秘和数据传输的安全》,作者:努力的小雨。TCP连接断开在当今数字化时代,互联网已经成为了人们生活中不可或缺的一部分。而在互联网的基础之上,TCP协议扮演着关键的角色,它负责着数据在网络中的可靠传输。在TCP连接的建立过程中,我......
  • 第四次python学习笔记
    循环结构:1.while循环:用法:while条件:条件成立重复执行的代码1条件成立重复执行的代码2......示例一:计算1-100累加和分析:1-100的累加和,即1+2+3+4+….,即前两个数字的相加结果+下一个数字(前一个数字+1)。 i=1num =0......
  • 聪明办法学python第四次打卡
    循环for循环的特点基于提供的范围,重复执行特定次数的操作for循环嵌套#下面的代码将输出二维坐标defprintCoordinates(xMax,yMax):forxinrange(1,xMax+1):foryinrange(1,yMax+1):print(f"({x},{y})",end="")print()printCoordinat......
  • python第四次笔记
    循环和字符串循环for循环forxinrange(x,y)forxinrange(1,10,2):print(int(x))表示遍历1到9之间的数,步长为2即打印13579while循环while(条件):执行行为whileTrue:print("nihao")这个代码会一直打印nihaocontinuebreakpasscontinue用于跳出本......
  • tls 握手时被公司路由器网关阻断
    经过一天的研究发现当tcp三次握手成功后,客户端向服务端发送clienthello包时被网络出口网关设备立即返回RST包。客户端日志立即打印如下:随即tls建立连接失败。[2023-11-2317:47:55][ERROR]127.0.0.1:59998SSLhandshakefailedwithigcc.cc:9120:Connectionresetbypeer......