TCP/IP 三次握手四次挥手详解,以及异常状态分析

目录

        • 1.TCP/IP 三次握手
          • TCP/IP 三次握手过程
          • 为什么是三次握手?
          • 半连接队列和全连接队列
          • ISN(initial sequence number)是否是固定的吗?
          • 三次握手过程能携带数据?
          • SYN 攻击
        • TCP/IP 四次挥手
          • TCP/IP 四次挥手过程
          • 为什么是 2MSL 时间才进入到 close 状态
        • 2.TCP/IP 异常状态
          • 1.第一次和第二次握手失败
          • 2.第三次握手失败
          • 对于挂起,程序崩溃的情况

1.TCP/IP 三次握手
TCP/IP 三次握手过程

主要依靠IP协议报文中的 SYN ACK 两个标识位,SYN 表示是请求连接的报文,ACK 表示确认报文的请求

过程:

  1. 客户端处于 CLOSE 状态,服务器处于 LISTEN 状态,客户端向服务器发送请求连接报文,SYN=1 seq=x,发送成功后,客户端状态修改为 SYN_SEND 状态
  2. 服务器接收到客户端的请求报文,就发送 ACK 确认报文,表示服务器接收到了这个请求,ACK=1 syn=y ack=x+1 服务器将状态为 SYN_RCVD 状态
  3. 客户端收到服务器发送的确认报文后,到这里,客户端知道服务器接收和发送功能都没有问题,但是服务器只知道客户端有发送功能,所以有第三次握手,
  4. 客户端发送确认报文,ACK=1 ack=y+1 seq=x+1 ,这里seq=x+1 可以用来标识第一次连接的握手,到这里客户端处于 ESTABLISHED 状态
  5. 服务器收到客户端的确认报文后,知道了客户端收发能力没问题,将状态修改为 ESTABLISHED 状态,连接建立成功,可以开始发送消息了
为什么是三次握手?
  1. 确认客户端与服务器之间都有收发功能。
  2. 如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,
    客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,
    此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,
    此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。
半连接队列和全连接队列
  1. 对于状态为 SYM_RCVD 的状态,服务器会将这个连接加入到半连接队列中,等待客户端发送数据,当三次握手完成,服务器会将这个连接加入到全连接队列中
  2. 全连接队列,顾名思义就是指完成三次握手的连接,如果队列满了就会出现丢包的情况
ISN(initial sequence number)是否是固定的吗?

ISN 是一个随机数(本质是32位的一个计数器),用来标识连接的起始序号,ISN 会随连接的建立而改变,ISN 的值是随机的,也不完全随机,和系统策略有关,所以不会出现 ISN 冲突的情况。

  1. 这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它做错误的解释。
  2. ISN不固定也可以防止攻击者猜到后续的确认号,提升连接的安全性
三次握手过程能携带数据?

第一次和第二次都不能携带数据

  1. 第一次不能携带数据的原因主要是防止 SYN 攻击,攻击者伪造大量的SYN请求到服务器,如果还携带了大量数据,服务器会分配很多资源来处理数据进一步增加了服务器的负担
  2. 第二次不能携带数据的主要原因是此时还只是半连接状态,服务器还不能确认客户端的接收能力是否正常。如果第二次握手能够携带数据,那么服务器在还没有完全确认客户端的接收能力的情况下就发送数据,可能会导致数据丢失或混乱。
SYN 攻击

在TCP三次握手中,当客户端向服务器发送SYN报文时,服务器会回复一个SYN+ACK报文,并等待客户端的ACK报文。如果客户端没有回应ACK报文,服务器会在一定时间内重发SYN+ACK报文。
SYN攻击就是利用这个机制,恶意攻击者发送大量的伪造SYN报文给服务器,而不回应ACK报文。这样,服务器会不断重发SYN+ACK报文,消耗大量资源,最终导致无法响应正常请求。

TCP/IP 四次挥手

建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

TCP/IP 四次挥手过程
  1. 动作开始,客户端和服务器都属于 ESTABLISHED 状态,客户端发送完毕,发送 FIN 报文,FIN=1,seq=u,停止发送数据,关闭 TCP 连接,客户端进入到 FIN_WAIT1 状态
  2. 服务器接收到 FIN 报文,于是向客户端发送 ACK 报文,表示知道了客户端的关闭,ACK=1,ack=u+1,seq=v,服务器进入到 CLOSE_WAIT 状态
  3. 客户端收到服务器的 ACK 报文后,进入 FIN_WAIT2 状态,此时服务器的数据可能还没有传输完成,等待服务器发送完毕后,向客户端发送 FIN 报文
  4. 服务器数据发送完成,向客户端发送 FIN 报文,FIN=1,seq=w,ACK=1 ack=u+1,服务器进入 LAST_ACK 状态
  5. 客户端收到服务端的FIN报文后,发送一个ACK报文给服务端,ACK=1,ack=w+1,表示确认收到了FIN报文。服务端收到报文后,进入CLOSED状态,客户端为TIME_WAIT状态,需要过2MSL后,才会进入到CLOSE状态。

在步骤四中,服务端发送的FIN报文常常会被合并成一个带有ACK标志的报文,这样服务端可以在一个报文段中同时表示“我收到了你的FIN”和“现在我也要关闭连接”。
这种做法在TCP协议中是被允许的,并且由于减少了网络往返时间(RTT),可以提高效率。
步骤三中的ACK是对客户端的FIN的确认,而步骤四中的ACK(如果有的话)通常是对之前未确认的数据的确认。这两个ACK是不同的,分别对应于不同的报文段和不同的确认目的。

为什么是 2MSL 时间才进入到 close 状态
  1. 防止迟到的报文段干扰:当TCP连接关闭后,网络中可能仍然存在未到达目的地的报文段。这些报文段可能由于网络延迟或其他原因而延迟到达。为了确保这些迟到的报文段不会干扰新的连接或导致混淆,
    TCP连接在关闭后需要等待一段时间,以确保所有可能的迟到的报文段都已经从网络中消失。2MSL时间足够长,可以确保这些报文段在网络中自然消亡。
  2. 确保对方收到ACK报文:在TCP的四次挥手过程中,当一方发送FIN报文请求关闭连接时,对方会回复一个ACK报文以确认收到关闭请求。然而,由于网络的不确定性,发送方可能无法确定对方是否真正收到了这个ACK报文。
    通过等待2MSL时间,发送方可以确保如果对方没有收到ACK报文,它会重发FIN报文。如果在2MSL时间内没有收到重发的FIN报文,发送方可以确信对方已经收到了ACK报文。
2.TCP/IP 异常状态
1.第一次和第二次握手失败

第一次SYN丢包,客户端处于 SYN_SEND状态,服务器处于LISTEN状态,客户端会进行超时重传,每一次重传时间的间隔都是上一次重传间隔的两倍,控制tcp重传次数的内核参数是 /proc/sys/net/ipv4/tcp_syn_retries
第二次SYN和ACK丢包,客户端处于SYN_SEND状态,服务器处于SYN_RCVD状态,服务器也会进行超时重传,时间间隔也是上一次重传时间的两倍,参数是 /proc/sys/net/ipv4/tcp_synack_retries

客户端一段时间得不到回应便会自动重发syn,且每次发送间隔是上一次间隔的2倍,服务端收到客户端syn报文后其超时定时器并不会重置,在隔到指定时间后仍会重发synack报文,且报文的重发间隔也是上一次间隔的两倍。

最后客户端和服务端在接受不到应有的回答后各自重传均达到5次后断开连接。

2.第三次握手失败

服务端由于一直收不到客户端的ACK报文停留在SYN_RCVD状态,而客户端由于收到服务端的第二次握手SYN-ACK,已处于ESTABLISH状态。

服务端得不到ACK将会重传SYN_ACK报文,服务端达到最大重传次数,便中断连接,客户端仍保持ESTABLISH状态。使客户端发送数据,由于服务端已CLOSE无法响应,客户端便会一直试图重传,且重传的时间间隔越来越大,但并不是超时重传的每次乘2倍的算法。

客户端重传数据的内核参数由tcp_retries2控制,默认为15,据此上述客户端并不会一直重传下去,而且在重传次数达到15次后退出。

cat /proc/sys/net/ipv4/tcp_retries2
15

如果客户端一直不发送数据,TCP也有机制断开其连接,负责这个任务的是tcp的保活机制,这个机制的原理是这样的:

定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔,发送一个「探测报文」,该探测报文包含的数据非常少,如果连续几个探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。

在 Linux 内核可以有对应的参数可以设置保活时间、保活探测的次数、保活探测的时间间隔,以下都为默认值:

net.ipv4.tcp_keepalive_time=7200
net.ipv4.tcp_keepalive_intvl=75  
net.ipv4.tcp_keepalive_probes=9

总体来讲,会出现两种情况

  • 如果客户端没发送数据包,一直处于 ESTABLISHED 状态,然后经过 2 小时 11 分 15 秒才可以发现一个「死亡」连接,于是客户端连接就会断开连接。(前提是客户端要打开keepalive选项,否则就会一直持续下去)
  • 如果客户端发送了数据包,一直没有收到服务端对该数据包的确认报文,则会一直重传该数据包,直到重传次数超过 tcp_retries2 值(默认值 15 次)后,客户端就会断开 TCP 连接。
对于挂起,程序崩溃的情况

对于挂起,拔线等没有导致进程崩溃的情况,只要客户端能在服务端的重传时间内重新连上服务端,就能够保持之前的连接,否则服务端一旦达到最大重传次数就会自动断开连接,之后客户端再次若尝试连上服务端,服务端便会无情地回复RST中断连接;

对于重启(包括关机再重启),SIGINT中断,kill等导致客户端进程崩溃的情况,客户端会向服务端发送FIN报文断开连接,将先前的连接清除,下次客户端再度重新连接服务端时,将采用新的四元组连接。

至于服务端没传数据的情况则更加简单,若客户端进程拔线,则原有连接不影响,服务端将在一定时间后启动tcp保活机制检测连接是否“活着”,若此时客户端仍不活跃,服务端将会清除该连接。而客户端主机宕机,进程崩溃的情况就是直接断连了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/693382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis篇----第十篇

系列文章目录 文章目录 系列文章目录前言一、Redis 集群如何选择数据库?二、怎么测试 Redis 的连通性?三、怎么理解 Redis 事务?四、Redis 事务相关的命令有哪几个?五、Redis key 的过期时间和永久有效分别怎么设置?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易…

备考2025年AMC8数学竞赛:2000-2024年AMC8真题练一练

对于想了解或者加AMC8美国数学竞赛的孩子来说,熟悉AMC8的历年考试真题,既可以了解考试的内容、形式、难度,还可以看看自己的掌握程度,发现自己的短板查漏补缺,毕竟,这个比赛考察的知识点相对固定&#xff0…

14. rk3588自带的RKNNLite检测yolo模型(python)

首先将文件夹~/rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/下的文件librknnrt.so复制到文件夹/usr/lib/下(该文件夹下原有的文件librknnrt.so是用来测试resnet50模型的,所以要替换成yolo模型的librknnrt.so),如下图所示&am…

【Python爬虫】requests库get和post方法使用

requests库是一个常用于http请求的模块,性质是和urllib,urllib2是一样的,作用就是向指定目标网站的后台服务器发起请求,并接收服务器返回的响应内容。 1. 安装requests库 使用pip install requests安装 如果再使用pip安装python…

数据结构——时间复杂度

前言: 当谈到数据结构和算法时,时间复杂度是一个至关重要的概念。时间复杂度是衡量算法执行时间随输入规模增长而变化的度量,它指示了算法的效率和性能。在本篇博客中,我们将深入探讨时间复杂度的相关知识,并结合C语言…

kali linux出现添加源无法更新的问题:更新时显示签名无效和没有数字签名

kali linux更新源时显示签名无效和没有数字签名 一、出现显示签名无效和没有数字签名二、 解决办法三、几种开源镜像站 一、出现显示签名无效和没有数字签名 原因:因为没有下载签名,所以显示签名无效和没有数字签名 二、 解决办法 wget archive.kali.o…

OpenCV边缘检测与视频读写

原理 OpenCV中的边缘检测原理主要基于图像梯度的计算,包括一阶梯度和二阶梯度。 一阶梯度:它反映了图像亮度变化的速度。Sobel算法就是一种以一阶梯度为基础的边缘检测算法。它通过计算图像在水平和垂直方向上的梯度来检测边缘。这种方法简单有效&…

mysql connect unblock with mysqladmin flush-hosts

原因 同一个ip在短时间内产生太多(超过max_connect_errors的最大值)中断的数据库连接而导致的阻塞。 查看 max_connect_errors show variables like max_connect_errors; 解决 前提:需要换一个IP地址连接 方法一 增大 max_connect_err…

命令行窗口文本复制到 Word 格式保持不变

命令行窗口文本复制到 Word 格式保持不变 References 标题栏右键 -> 编辑 -> 标记 / 全选 标题栏右键 -> 编辑 -> 复制 粘贴到 Notepad 中,语言栏设置对应语言,格式可以保持不变 复制文本粘贴到 Excel 中 选中 Excel 中文本复制&#xf…

基于qt的图书管理系统----01数据库设计

参考b站:视频连接 目录 1、数据库设计2、数据库增删改查2.1 book表操作2.2 user表操作2.3 record表的操作(重点) 3、数据表导出 1、数据库设计 使用sqlite3,新建一个book的表,并且都让主键自增 NmaeValuebookid书本…

编程笔记 Golang基础 010 常量和变量

编程笔记 Golang基础 010 常量和变量 一、常量二、变量小结 在 Go 语言中,常量(Constant)是一个固定的值,在程序运行期间不可被修改。它们通常用来表示那些在整个程序执行过程中不会变化的数值或其他类型的数据。在 Go 语言中&…

GIN框架介绍以及使用

Gin是一个用Go语言编写的web框架。它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍。 如果你是性能和高效的追求者, 你会爱上Gin,而且现在大多数企业都在使用Gin框架,反正学一学总没有错。 1、 GIn框…

赞:java使用easy-excel导入数据的通用模板思路

我们在项目中都会有导入导出的功能&#xff0c;这篇文章主要是讲导出的&#xff0c;导入我会在另外一篇博客文章中讲解。 现在我们开始。 首先&#xff1a;需要在项目中的pom.xml中导入easy-excel的依赖 <!--使用esay-excel进行导入导出 --> <dependency> &…

实习日志26 捷通打印机交接

概要 捷通打印机的研究和使用需要下载一些软件 打印机驱动下载说明 驱动&#xff1a;选择DL-721Z 端口选择&#xff1a;USB002 智能助手&#xff1a;&#xff08;连接&#xff0c;设置打印机&#xff09; 打印机显示 rfid未校准 时可以在这里点RFID标签校验 LabelEditor编译…

unity学习(31)——跳转到角色选择界面(打勾?手滑挂错脚本)

There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene. 是因为后来创建了一个camera&#xff0c;因为camera中自带一个组件Audio Listener。所以有两个camera就有两个audio listener导致报错。 一个简单的解决…

超声波清洗机大测评!希亦、洁盟、德国ODI、苏泊尔哪款性价比高?

眼镜逐渐已经成为现在大部分都离不开的一个视线辅助&#xff0c;但是很多朋友对于眼镜的清洗从开始佩戴眼镜时&#xff0c;就没有重视起来。其实清洗眼镜的方法有很多种&#xff0c;手动清洗跟超声波清洗机&#xff0c;后者的清洗相对来说会更加方便快捷一点&#xff0c;且清洗…

Unity【角色/摄像机移动控制】【1.角色移动】

本文主要总结实现角色移动的解决方案。 1. 创建脚本&#xff1a;PlayerController 2. 创建游戏角色Player&#xff0c;在Player下挂载PlayerController脚本 3. 把Camera挂载到Player的子物体中&#xff0c;调整视角&#xff0c;以实现相机跟随效果 3. PlayerController脚本代码…

计算机网络——15套接字编程

套接字编程 Socket编程 Socket编程&#xff1a;应用进程使用传输层提供的服务才能够交换报文&#xff0c;实现应用协议&#xff0c;实现应用 TCP/IP&#xff1a;应用进程使用Socket API访问传输服务 地点&#xff1a;界面上的SAP 方式&#xff1a;Socket API 目标&#xff1…

强化学习入门(Matlab2021b)-创建环境【2】

目录 1 前言2 利用step和reset函数创建自定义环境2.1 对象描述2.2 reset函数2.3 step函数2.3 构建自定义环境3 使用匿名函数传递额外的参数4 可视化检查自定义函数的输出参考链接1 前言 本文介绍如何基于MATLAB编写step、reset函数,创建自己的强化学习环境(Environment)。 使…

Windows 中文版下 MSVC 对 UTF-8 支持(避免乱码)

原文&#xff1a;https://blog.iyatt.com/?p14017 1 测试环境 我这里在 Windows 11 专业版 23H2 中文版PowerShell 7.4.1 中&#xff0c;默认的字符编码是 936 GB2312 官方的标识码解释&#xff1a;https://learn.microsoft.com/zh-cn/windows/win32/Intl/code-page-iden…