【网络通信基础与实践番外三】TCP的三次握手和四次挥手和例题

news2024/11/27 8:38:41

一、TCP连接的三次握手

第一次握手:客户端首先向服务器发送一个特殊的TCP报文,这个报文段首部不包含应用层数据,但是在报文段中有一个SYN标志位被置1。因此这个特殊的报文段也被叫做SYN报文段,然后客户端随机选择一个初始序列号(client_isn),并将此数字放入初始TCP SYN段的序列号字段中,SYN段又被封装到IP数据段中发送给服务器。

第二次握手:一旦包含IP数据段到达服务器后,服务端会从IP数据段中提取TCP SYN段,将TCP缓冲区和变量分配给连接,然后给客户端发送一个连接所允许的报文段,这个连接所允许的报文段不包括应用层数据,包括了SYN =1, TCP报文段的首部确认号被设置为client_isn+1,服务器选择自己的初始序号(server_isn),然后放到报文中。

第三次握手:在收到SYNACK报文段后,客户端也要为该连接分配缓冲区和变量。客户端主机向服务器发送另一个报文段,最后一个报文段对服务器发送的响应报文做了确认,确认的标准是客户端发送的数据段中确认号为server_isn+1,因为连接已经建立,SYN = 0。 

1、SYN泛洪攻击

在这里开始服务器为了响应一个收到的SNY,分配并初始化变量连接和缓存,然后服务器发送一个SYNACK作为响应,然后等待来自于客户端的ACK报文。如果客户端不发送ACK来完成最后一步的话,那么这个连接就处在一个挂起的状态,也就是半连接的状态。

攻击者通常在这种情况下(第二次握手完毕第三次握手没完成)发送大量的TCO SYN报文段,服务端持续相应,但是每次连接都完不成三次握手的步骤。随着SYN的不断增加,服务器会不停地为这些半开连接分配资源,导致服务器的连接最终被消耗殆尽。

抵御这种攻击的方法使用SYN cookie,当服务器收到SYN报文段时,它并不知道这个报文段来自哪里,是来自攻击者主机还是正常客户端的主机。因此服务器并不会分配资源,也不会生成一个半开连接。与此相反,服务器生成一个初始的TCP序列号,这个序列号是SYN报文段的源和目的IP地址与端口号这个四元组构造的一个复杂的散列函数,这个散列函数生成的TCP序列号就是SYN cookie,用于缓存SYN请求。然后服务器会发送带着SYN Cookie的SYNACK分组,有一点注意的是服务器不会记忆这个cookie或者SYN的其他状态信息。

如果发送方不是攻击者的话,它就会返回一个ACK报文段,当服务器收到这个ACK后,需要验证这个ACK与SYN发送的是否相同,验证的标准就是散列函数是否匹配。

如果发送方没有返回ACK,就认为是攻击者,那么这样也没关系,因为服务器没有收到ACK,不会分配变量和缓存资源,不会对服务器产生危害。

2、为什么两次握手不可以?

防止已经失效的报文在双方连接已经释放了的情况下突然又传送到了服务器,从而让服务端误认为要进行第二次握手,但是客户端已经释放连接了面对服务器的第二次握手请求不会理睬,服务端的资源被浪费。

二、TCP释放的四次挥手

第一次挥手:客户端和服务器开始都处于ESTABLISHED状态,客户端应用程序发出释放连接的报文段,并停止发送数据,主动关闭TCP连接。客户端主机发送释放连接的报文段,报文段中首部FIN位置为1,不包含数据,序列位号seq=u,客户端主机进入到FIN-WAIT-1(终止等待1)阶段。

第二次挥手:服务器主机接收到客户端发出的报文段后,即发出确认应答报文,确认应答报文中ACK=1,生成自己的序号位seq=v,ack=u+1,然后服务器主机CLOSED-WAIT(关闭等待)状态,这个时候客户端-->服务器这条方向的连接就释放了,客户端没有数据需要发送,此时服务器是一种半连接的状态,但是服务器主机仍然可以发送数据。客户端主机收到服务端主机的确认应答后,即进行FIN-WAIT-2(终止等待2)的状态,等待服务器发出连接释放的报文段。

第三次挥手:当服务器主机没有数据发送后,应用进程就会通知TCP释放连接。这时服务器主机就会发出断开连接的报文段,报文段中ACK=1,序列号seq=w,因为在客户端FIN-WAIT-2阶段服务端可能已经发送了一些数据,因此seq不一定等于v+1,在发送完断开请求的报文后服务端主机就进入了LAST-ACK(最后确认)阶段。

第四次挥手:客户端收到服务端的断开连接请求后,客户端需要作出响应,客户端发出断开连接的报文段,此报文段中ACK=1,序列号seq=u+1,因为客户端从连接开始断开后就没有再发送数据,ack=w+1,然后进入到TIME-WAIT(时间等待)状态,但是这个时候TCP连接没有释放。必须经过2MSL(最长报文段寿命 Maximum Segment Lifetime )后,客户端才会进入到CLOSED状态。

为什么要等待2MSL呢?

当然是我们传输过程中最常见的两个问题:一个是丢包一个是无效包。

一个理由是最后一个由客户端向服务端发送到ACK报文段可能会丢失,从而使服务端一直处于LAST-ACK状态等待客户端响应。这个时候服务端会重传一次FIN ACK断开连接报文,客户端接收后再重新确认,重启定时器。如果客户端不是2MSL,在客户端发送ACK后直接关闭的话,如果报文丢失,那么双方主机会无法进入到CLOSED状态。

另一个理由是防止已经失效的报文段。客户端在发送一个ACK后,再经过2MSL,就可以使本连接持续时间内所产生的报文段都从网络中消失。从而保证在关闭连后不会有还在网络中滞留 的报文段去骚扰服务器。

三、例题

其实本质上在考察连接过程中三次握手最后一次握手的序列号和释放过程中第一次挥手时序列号二者的差值。

TCP连接过程:

 

TCP释放过程: 

 

 

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

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

相关文章

【JWT安全】portswigger JWT labs 全解

目录 1.利用有缺陷的 JWT 签名验证 ①接受任意签名 lab1:通过未验证的签名绕过 JWT 身份验证 ②接受无签名的token lab2:通过有缺陷的签名验证来绕过 JWT 身份验证 2.暴力破解密钥 ①使用hashcat lab3:通过弱签名密钥绕过 JWT 身份验证 3.JWT 标头参数注入 ①通过 jwk…

kubevirt基于CDI创建虚拟机

CDI介绍 KubeVirt 的 Containerized Data Importer (CDI) 是一个 Kubernetes 原生的数据管理组件,专门为虚拟机 (VM) 提供存储支持,尤其在虚拟机的镜像管理和数据导入方面非常有用。CDI 的主要用途是帮助用户轻松地将外部数据源导入到 Kubernetes 集群中…

Linux线程(三)终止线程与回收线程详解

1.终止线程 在示例代码,我们在新线程的启动函数(线程 start 函数)new_thread_start()通过 return 返回之后,意味着该线程已经终止了,除了在线程 start 函数中执行 return 语句终止线程外,终止线程的方式还…

Qt基础之四十八:按钮为何会有点击效果

我们从一个最简单的Window API窗口程序开始说起。 一.一个最简单的Window API窗口程序 #include <windows.h> #include <wingdi.h> // 声明窗口过程函数 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);int WINAPI WinMain(HI…

Windows程序包管理器WinGet的使用方法

Windows 程序包管理器 WinGet 命令行工具作为应用安装程序的一部分在 Windows 11 和现代版本的 Windows 10 上提供。 WinGet 工具的当前预览版支持以下命令: 命令说明info显示有关系统的元数据&#xff08;版本号、体系结构、日志位置等&#xff09;。 有助于进行故障排除。i…

电磁兼容(EMC):整改案例(四)人体对EFT测试影响有多大?

目录 1. 异常现象 2. 原因分析 3. 整改方案 4. 总结 1. 异常现象 某产品按GB/T 17626.4标准进行电快速瞬变脉冲群测试&#xff0c;测试条件为&#xff1a;频率5kHz/100kHz&#xff0c;测试电压L&#xff0c;N线间2kV&#xff0c;L&#xff0c;N线对PE线4kV。测试过程中需要…

Linux学习笔记(五):shell脚本,强大的文本处理工具awk,sed

Linux学习笔记&#xff08;五&#xff09;&#xff1a;shell脚本&#xff0c;awk&#xff0c;sed&#xff0c;服务管理 1. Shell 脚本 Shell 脚本是一种使用 Shell 编写的脚本&#xff0c;它可以在 Linux 系统中执行各种任务。 1.1 变量 声明变量&#xff1a; 使用 export 命令…

C++容器类型内置函数随笔

vector 容器 添加数据 vector <int> v ; v.push_back(数据); 访问数据的两个迭代器b.begin()和v.end() vector <int> :: iterator it_begin v. begin(); //容器起始位置元素的指针vector <int> :: iterator it_end v.end(); //指向容器最后一个元素下一…

FinOps三人行:云计算时代的FinOps 反模式和SRE(文字+视频版)

简介 9月20日&#xff0c;由SRE专委会和雅菲奥朗主办的“FinOps三人行&#xff1a;云计算时代的FinOps 反模式和SRE”在线研讨会成功举办&#xff0c;三位业界专家雅菲奥朗刘峰老师、易点天下董金老师和辛诺科技Larry老师齐聚一堂&#xff0c;聚焦于云计算环境下的并购模式、运…

Python编码规范与常见问题纠正

Python编码规范与常见问题纠正 Python 是一种以简洁和易读性著称的编程语言&#xff0c;因此&#xff0c;遵循良好的编码规范不仅能使代码易于维护&#xff0c;还能提升代码的可读性和可扩展性。编写规范的 Python 代码也是开发者职业素养的一部分&#xff0c;本文将从 Python…

Java-数据结构-Map和Set(三)-习题 o(´^`)o

目录 ❄️一、习题一(只出现一次的数字)&#xff1a; ❄️二、习题二(随机链表的复制)&#xff1a; ❄️三、习题三(宝石与石头)&#xff1a; ❄️四、习题四(旧键盘)&#xff1a; ❄️五、习题五(前k个高频单词)&#xff1a; ❄️总结&#xff1a; ❄️一、习题一(只出现一…

【Nacos架构 原理】内核设计之Nacos一致性协议

文章目录 Nacos一致性协议为什么需要一致性协议Nacos选择了Raft&#xff08;强一致性&#xff09;&Distro&#xff08;最终一致性&#xff09;服务发现角度配置管理角度 Nacos自研Distro协议背景设计思想数据初始化数据校验写操作读操作 Nacos一致性协议 为什么需要一致性…

大模型笔记05--coze经典案例分析

大模型笔记05--coze经典案例分析 介绍经典案例分析抖音视频转小红书文案艺术照 & 卡通照片助手艺术照图像流卡通照片图像流多功能图像助手 注意事项说明 介绍 扣子是新一代 AI 应用开发平台&#xff0c;具备完善的生态系统&#xff0c;是国内最出色的AI平台之一。用好coze…

C/C++/EasyX ——入门图形编程(2)

【说明】这一篇的内容都是很基础的&#xff0c;所以内容会很多&#xff0c;具体现在也不知道要写多少&#xff0c;先写下去吧&#xff0c;新手小白们都不用担心&#xff0c;这个内容不会很难&#xff0c;因为我也是从一无所知过来的&#xff0c;很好入门的&#xff0c;&#xf…

游览器输入URL并Enter时都发生了什么 面试完美回答

文章目录 前言URL解析DNS解析**浏览器缓存****操作系统缓存**&#xff1a;**路由器缓存**&#xff1a;ISP&#xff08;Internet service provider&#xff09;缓存DNS递归解析IP地址的获取缓存结果 建立TCP连接发送HTTP请求服务器响应TCP链接断开渲染页面解析一 HTML解析过程解…

带你快速了解后端API服务的搭建

前言&#xff1a;写这篇文章的初衷是想分享一下我学习搭建后端API的过程&#xff0c;希望能帮助到和我一样想快速写API接口并部署到服务器上的同学&#x1f61c; 第一步&#xff1a;创建阿里云服务器 1、首先注册一个阿里云账号&#x1f917; 2、出于学习成本考虑&#xff0…

Linux系统,docker容器内查看pikachu源代码

在Linux系统中&#xff0c;要查看Docker容器内的Pikachu的源代码&#xff0c;需要先确保Pikachu的Docker镜像已经运行在系统上。以下是步骤和示例代码&#xff1a; 1、查找Pikachu容器的ID或名称&#xff1a; docker ps -a 2、使用docker exec命令进入运行中的Pikachu容器&am…

Spring MVC的运行流程详解

Spring MVC作为一个广泛使用的框架&#xff0c;提供了灵活且强大的MVC架构支持。尤其在业务系统中&#xff0c;Spring MVC能够有效地处理大量并发请求&#xff0c;提供良好的用户体验。本文将详细讲解Spring MVC的运行流程&#xff0c;以电商交易系统为案例&#xff0c;帮助读者…

不再烦恼!四款AI工具助你轻松打造完美PPT

嘿&#xff0c;各位办公室的小伙伴们&#xff0c;今儿咱们来聊聊那些让咱们工作生活大变样的“智能小伙伴”。作为每天跟PPT打交道的办公室文员&#xff0c;我敢说&#xff0c;自从有了这些神器&#xff0c;我的工作效率简直坐上了火箭&#xff0c;嗖嗖地往上涨&#xff01; 1…

Vue-Lecture1-Notes

渐进式框架 Vue 被称为“渐进式框架”&#xff0c;是因为它允许开发者根据项目的需求逐步引入和使用其功能&#xff0c;而不需要一次性使用整个框架。简单来说&#xff0c;Vue 提供了从简单到复杂的功能层次&#xff0c;可以灵活选择使用。 按需使用&#xff1a;Vue 的核心功能…