TCP 连接管理机制(一)——TCP三次握手详解 + 为什么要有三次握手

2023-11-16

TCP是面向连接的协议,在通信之前需要先建立连接,其本质就是打开一个socket文件,这个文件有自己的缓冲区,如果要发送数据,上层把数据拷贝到发送缓冲区;如果是接收数据,OS直接把来自网络的数据拷贝到接收缓冲区里。

那么三次握手期间,Server和Client都做了哪些工作?以及为什么要有三次?不可以是一次?两次?四次?


目录

一、握手之前的准备工作

1、Server端

2、Client端

二、TCP三次握手

1、第一次握手

2、第二次握手

3、第三次握手

三、为什么需要三次握手?

1、原因一:三次是确认对方主机状态及收发能力的最小次数

2、原因二:降低被攻击的风险的最小次数

(1) 如果只有一次握手

(2) 如果只有两次握手

(3)如果是三次握手


一、握手之前的准备工作

三次握手开始的时刻就是,Client端调用connect函数连接 Server端,此时需要有个前提条件就是Server端的套接字要处在监听状态。

1、Server端

第一步,调用Socket函数创建通信套接字。其本质就是打开用于通信的socket文件;

第二步,绑定服务器IP地址和端口号。其实就是将打开的socket文件与存放地址信息的sockaddr_in 结构体绑定,方便对方能够找到这个文件

第三步,调用listen函数将套接字设为监听状态。可以理解为设置文件的读写权限,即允许other读写;

2、Client端

站在客户端的角度其实是认为服务端是时刻准备好的,不然也不会主动发起连接。所以Client端只要调用Socket函数创建通信套接字,即打开用于通信的socket文件,随后就可以调用connect函数连接服务端了。

注意:作为主动连接别人的一方,必须要知道你要连谁,即对方的IP地址和端口号;但是你自己无需主动绑定IP地址和监听,因为客户端一般不会被其他主机连接。就好比你是送快递的,你要知道客户的住址;但是客户没必要知道你的住址。

二、TCP三次握手

1、第一次握手

客户端主动调用 connect函数的时候,就是发起第一次握手,表明Client端请求和Server端建立连接。发送的报文携带SYN标志位。

客户端状态 : SYN_SENT(连接请求已发送)

2、第二次握手

Server端收到Client 端的请求以后,理解了客户端的意图,同意建立连接(Client ==》Server方向上的),至此一个方向上的连接就建立好了。Server也发送SYN请求顺带应答,希望建立连接(Server ==》Client方向上的)。

服务端状态:SYN_REVD(接收到连接请求)

 

注意:服务端发送ACK之后才会有状态变化,在发送之前需要判断对方是否为恶意连接,如果是恶意连接,服务端不会接受连接的。这也是在第一次握手之后服务端没有直接建立连接的原因之一。详细原因在“为什么需要三次握手”说明。

3、第三次握手

Client端收到Server端的确认应答,并给Server端发送ACK同意建立连接(Server ==》Client方向上的)。给Server端发送ACK以后,客户端就认为连接已经建立成功了。

客户端状态:ESTABLISHED(建立连接)

Server端如果收到Client的应答,就说明Client 也同意建立连接,至此 Server ==》Client方向上的连接也就建立好了。服务端也认为连接建立成功了;如果迟迟没有收到,Server端认为客户端不希望与自己建立 Server ==》Client方向上的连接,此时会连接失败。

服务端状态:ESTABLISHED(建立连接)/ CLOSED(连接失败)

 

注意:从这个角度上看,TCP建立连接并非百分之百成功,因为最后一次ACK是没有应答的,Client也没法确认Server是否收到了ACK,即便没收到,由于最后一次ACK没有应答,也无法触发超时重传机制。

4、关于第三次握手

第三次握手需要多说一句,服务端收到ACK以后,此时服务端的状态变为 ESTABLISHED,但并不代表上层会立马会调用accept并返回一个文件描述符。传输层收到连接,然后接受是传输层的事;上层此时可能忙于处理其他事情,没时间调用accept。

因此,实际情况是,服务端收到了ACK,服务端状态变为ESTABLISHED,此时会进入一个名为“全连接”的队列,专门存放连接状态为ESTABLISHED的连接,等上层调用accept函数的时候,就会从全连接队列中取走连接,并返回。

三、为什么需要三次握手?

那么问题来了,为什么需要三次握手呢?为什么不可以是一次?两次?四次?五次?原因大致有两个,你可以选择你能接受的理由。我个人比较喜欢第二个理由。

1、原因一:三次是确认对方主机状态及收发能力的最小次数

Client给Server发,如果能收到Server的ACK,说明Server的主机状态正常,Server的接受能力也正常;

Server给Client发,如果能收到Client的ACK,说明Client的主机状态正常,Client的接受能力也正常。

相反,如果有任意一方即便是经过超时重传也没收到ACK,说明发送ACK的一方可能主机异常或者不具备接受能力。这说明为了确认双方的状态至少需要三次握手,握手次数太多只会增加连接成本

2、原因二:降低被攻击的风险的最小次数

连接建立成功的时候,服务端需要创建一个新的文件结构体来维护当前连接,这个文件结构体是需要占用服务端资源的!

(1) 如果只有一次握手

服务端可能会收到几万个主机的连接请求,每台主机通过for循环发送几十个连接请求,因为只握手一次,服务端直接照单全收,每次都创建一个新的文件结构体,这样的话,服务端的资源很快就会被耗尽。一个新手小白就可以搞垮一台服务器,很显然一次握手不行。

(2) 如果只有两次握手

只有两次握手也是一样,服务端收到一次连接,只要服务端发出一次ACK,就说明连接就建立起来了。如果服务端接收到一百万次连接,逐一发送ACK后,服务器依然要创建对应的结构体,此时依然要消耗服务器的资源。

(3)如果是三次握手

如果一个客户端一次发送大量的SYN,服务端当然会回复相应的ACK+SYN,但是此时服务端不会创建新的结构体,因为连接并没有建立成功。要想成功建立连接,客户端需要发送大量的ACK,一旦客户端发送一个ACK,客户端这边认为连接建立成功,就需要消耗大量资源来维护这个连接。

万一客户端就头铁呢?服务端也不会这么傻,服务器如果发现上百条连接都是来自同一个IP,那么在应用层层面可以把这个IP地址加入黑名单,下次连接的时候,可以拒绝该主机的连接。这样的话,如果是小白想通过某种工具一次发大量SYN的话,第一次可能没问题,第二次就直接被拉黑了。

补充:剩下的就是一些黑客会给其他用户的主机注入木马病毒,劫持其他用户的主机定时给服务器发送连接,有可能会有上百台被劫持的主机同时在发。这种情况就无法应对,因为每台主机是在正常发连接请求,服务端没法拒绝。

如有错误,希望能及时指正,谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP 连接管理机制(一)——TCP三次握手详解 + 为什么要有三次握手 的相关文章

  • 广告竞价策略:激发广告变现潜能的关键

    在数字化时代 广告已经成为企业推广品牌 产品和服务的关键手段之一 为了最大程度地发挥广告的效果 广告竞价策略成为广告主和数字营销专业人士关注的焦点 通过巧妙运用竞价策略 广告主可以在激烈的市场竞争中脱颖而出 实现广告变现的潜能 admaoy
  • 网络基础面试题(二)

    11 什么是网桥 防火墙的端口防护是指什么 网桥是一种网络设备 用于连接两个或多个局域网 LAN 并转发数据包 它能够根据MAC地址来识别和转发数据 提高网络的传输效率和安全性 防火墙的端口防护是指对防火墙上的各个端口进行保护和限制 只允许
  • 6类典型场景的无线AP选型和部署方案

    你们好 我的网工朋友 前段时间刚给你们来了篇解决无线频繁断网的技术文 解决无线频繁断网 这个办法值得收藏 不少朋友私聊 说想再聊聊无线AP的选型和部署方案 这不就安排上了 无线网络覆盖项目中 无线AP的合理选型和部署非常重要 在设计施工中
  • 成为一个黑客,就按照这个路线来!

    前几天一个同学在聊天中提到毕业后想要从事网络安全方向的工作 虽然他本身也是学计算机的 但是又怕心有余而力不足 因为 从事网络安全方面的工作向来起点都比较高 大学里少有开设这类课程的 在学校能够学到的知识比较有限 网上的关于这方面课程的质量又
  • CMAKE_MAKE_PROGRAM is not set 解读

    目录 CMAKE MAKE PROGRAM 未设置 错误原因 解决方案 示例1 GNU Make 示例2 Ninja CMakeLists txt 的结构 示例 CMakeLists txt 文件 总结 CMAKE MAKE PROGRAM
  • 服务器集群是如何提高计算性能的?

    服务器集群是一种将多台服务器连接起来协同工作的技术 通过集群配置 可以提高计算性能 可靠性和可扩展性 以下是服务器集群如何提高计算性能的详细解释 一 并行处理能力 服务器集群的核心优势在于其并行处理能力 通过将多个服务器组成一个集群 可以将
  • 这些专利知识你知道吗?

    专利作为一种重要的知识产权保护形式 专利不仅成为了企业核心竞争力的重要组成部分 也成为了国家创新发展的重要支撑 专利是指国家专利主管机关授予发明创造申请人的一种专有权 这种专有权具有独占性 排他性和法律强制性 能够为持有者带来经济利益和竞争
  • 掌握内网渗透之道,成为实战高手,看《内网渗透实战攻略》就够了

    文末送书 文末送书 今天推荐一本网络安全领域优质书籍 内网渗透实战攻略 文章目录 前言 如何阅读本书 目录 文末送书 前言 当今 网络系统面临着越来越严峻的安全挑战 在众多的安全挑战中 一种有组织 有特定目标 长时间持续的新型网络攻击日益猖
  • 使用Hypothesis生成测试数据

    Hypothesis是Python的一个高级测试库 它允许编写 测试用例 时参数化 然后生成使测试失败的简单易懂的测试数据 可以用更少的工作在代码中发现更多的bug 安装 pip install hypothesis 如何设计 测试数据 通
  • 基于成本和服务质量考虑的不确定性下,电动汽车充电网络基础设施需求预测和迭代优化的分层框架研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • 如何解决Mybatis-plus与Mybatis不兼容的问题:An attempt was made to call a method that does not exist. The attempt

    博主猫头虎的技术世界 欢迎来到 猫头虎的博客 探索技术的无限可能 专栏链接 精选专栏 面试题大全 面试准备的宝典 IDEA开发秘籍 提升你的IDEA技能 100天精通Golang Go语言学习之旅 领域矩阵 猫头虎技术领域矩阵 深入探索各技
  • 基于成本和服务质量考虑的不确定性下,电动汽车充电网络基础设施需求预测和迭代优化的分层框架研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • 线程安全(中)--彻底搞懂synchronized(从偏向锁到重量级锁)

    接触过线程安全的同学想必都使用过synchronized这个关键字 在java同步代码快中 synchronized的使用方式无非有两个 通过对一个对象进行加锁来实现同步 如下面代码 synchronized lockObject 代码 对
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 用户数据中的幸存者偏差

    幸存者偏差 Survivorship bias 是一种常见的逻辑谬误 意思是没有考虑到筛选的过程 忽略了被筛选掉的关键信息 只看到经过筛选后而产生的结果 先讲个故事 二战时 无奈德国空防强大 盟军战机损毁严重 于是军方便找来科学家统计飞机受
  • 远程控制软件安全吗?一文看懂ToDesk、RayLink、TeamViewer、Splashtop相关安全机制_raylink todesk

    目录 一 前言 二 远程控制中的安全威胁 三 国内外远控软件安全机制 ToDesk RayLink Teamviewer Splashtop 四 安全远控预防 一 前言 近期 远程控制话题再一次引起关注 据相关新闻报道 不少不法分子利用远程
  • 【网安神器篇】——WPScan漏洞扫描工具

    目录 一 Wordpress简介 二 WPScan介绍 三 安装 四 获取token 1 注册账号 2 拿到token 五 使用教程 1 常用选项 2 组合命令 1 模糊扫描 2 指定扫描用户 3 插件漏洞扫描 4 主题漏洞扫描 5 Tim
  • Vue 如何使用WebSocket与服务器建立链接 持续保持通信

    WebSocket 浏览器通过JavaScript向服务器发出建立WebSocket链接的请求 链接建立后 客户端和服务器端就可以通过TCP链接直接交互数据 WebSocket链接后可以通过 send 方法来向服务器发送数据 并通过 onn
  • 网络安全(黑客)自学启蒙

    一 什么是网络安全 网络安全是一种综合性的概念 涵盖了保护计算机系统 网络基础设施和数据免受未经授权的访问 攻击 损害或盗窃的一系列措施和技术 经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 作
  • 高防服务器什么意思

    高防服务器什么意思 为什么要用高防服务器 小编为您整理发布高防服务器什么意思的解读 高防服务器是指具备较高防御能力的服务器 能够抵御DDoS CC等网络攻击 高防服务器通常用于保护游戏 APP 金融 电商等业务 这些领域因为其业务特性 容易

随机推荐

  • 计算机进pe按键,台式机进入pe按什么键

    我的台式机想进入pe设置下系统 但不知按什么键进入 该怎么办呢 下面由学习啦小编给你做出详细的台式机进入pe按键说明 希望对你有帮助 台式机进入pe按键说明一 开机按F12 台式机 一体机 笔记本通用 其他品牌的有按F10的 F8的 F2的
  • 小程序支付-java

    https pay weixin qq com wiki doc api wxa wxa api php chapter 7 3 index 1 支付流程步骤 1 首先调用wx login方法获取code 通过code获取openid 2
  • js中defer和async的区别

    一般情况 按照惯例 所有script元素都应该放在页面的head元素中 这种做法的目的就是把所有外部文件 CSS文件和JavaScript文件 的引用都放在相同的地方 可是 在文档的head元素中包含所有JavaScript文件 意味着必须
  • 抖音很火的召唤神龙的小游戏完整代码-召唤神龙

    抖音很火的解压小游戏 完整代码分享 有兴趣的可以试着写一下 1 index
  • MongoDB和Elasticsearch的各使用场景对比

    MongoDB vs Elasticsearch MongoDB ElasticSearch 备注 定位 文档型 数据库 文档型 搜索引擎 一个管理数据 一个检索数据 资源占用 一般 高 mongo使用c es使用Java开发 写入延迟 低
  • 【Linux】常用的 Linux 命令行

    目录 写在前面 一 查看信息指令 1 df 查看磁盘驱动器的可用空间 2 free 显示可用内存 二 常用操作指令 1 pwd 查看当前目录 2 cd 改变目录 3 ls 列出目录内容 4 file 确定文件类型 5 切换 root 普通用
  • 【LeetCode与《代码随想录》】数组篇:做题笔记与总结-Java版

    代码随想录地址 是学习过程中的笔记 图来自代码随想录 文章目录 理论 题目 704 二分查找 35 搜索插入位置 34 在排序数组中查找元素的第一个和最后一个位置 69 x 的平方根 367 有效的完全平方数 理论 数组是存放在连续内存空间
  • Nginx---进程锁的实现

    http wang peng 1123 blog 163 com blog static 129821112201381311441180 在前面的源码分析中我们大致的介绍了一下nginx对负载均衡问题和惊群问题的解决方案 在本次源码分析中
  • 【C++】引用

    1 引用的基本语法 2 引用注意事项 int b 错误 int b a 正确 3 引用做函数参数 int temp a a b b temp 4 引用做函数返回值 出现问题 https www bilibili com video BV1e
  • 微信小程序水平居中,和垂直居中

    微信小程序水平居中 和垂直居中 1 WXML信息展示
  • Windows文本编辑器——推荐、介绍与安装(1)

    撰写时间 2023年4月11日 目的 介绍各种类型的文本编辑器 阐述编辑器的优缺点 并提供安装与使用方法 前言 文本编辑器是应用各种已有的编程语言进行软件开发的一种重要工具 它能够帮助开发者更加高效地编写代码 也能够帮助电脑小白快速上手各种
  • Qt Model View TreeView及对应Model

    点击上方蓝字可直接关注 方便下次阅读 如果对你有帮助 可以点个在看 让它可以帮助到更多老铁 一 概述 接着之前的话题继续 如果把之前的QTableView改成QTreeView 我们在不改变Model的情况下可以直接得到一个没有结构层次的
  • Linux KVM 使用教程(一)

    文章目录 1 KVM简介 2 KVM 的功能列表 3 KVM 工具集合 3 1 Virsh命令 1 KVM简介 1 KVM 全称是 基于内核的虚拟机 Kernel based Virtual Machine 它是Linux 的一个内核模块
  • python2(基本)

    实验02 基本 一 课内实验题 共10小题 100分 题型得分 100 描述 编写程序 从键盘输入两个整数 计算并输出这两个整数的和 平均值 最小值和最大值 平均值保留2位小数 输入 分行输入两个整数 输出 分行输出两个整数的和 平均值 最
  • JDK1.8 下载与安装

    JDK安装 JDK1 8下载 下载链接 https www oracle com java technologies javase javase jdk8 downloads html 根据操作系统版本下载 这里以win10 64位操作系统
  • 驱动程序里ioctl下switch问题

    今天在写步进电机驱动程序时 switch语句引出3个分支 case 0 case 1 case 2 case 0 什么都不做 case 1让步进电机正向转动 case 2让步进电机反向转动 但是测试时 case 2怎么也动不起来 后来把ca
  • PLSQL Developer的配置方法

    1 下载32位的版本instantclient basic nt 11 2 0 3 0 zip 因为PLSQLDev是32位的 没有64位的版本 这 个和操作系统无关 2 instantclient下载完后是一个压缩文件 不需要安装 配置一
  • 服务器系统如何清理,服务器清理内存怎么清理

    服务器清理内存怎么清理 内容精选 换一换 本节操作指导您完成Windows操作系统云服务器磁盘空间清理 弹性云服务器匀出一部分磁盘空间来充当内存使用 当内存耗尽时 云服务器可以使用虚拟内存来缓解内存的紧张 但当内存使用率已经非常高时 频繁的
  • 关于HTTP协议,一篇就够了

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol 超文本传输协议 的缩写 是用于从万维网 WWW World Wide Web 服务器传输超文本到本地浏览器的传送协议 HTTP是一个基于TCP IP通信协
  • TCP 连接管理机制(一)——TCP三次握手详解 + 为什么要有三次握手

    TCP是面向连接的协议 在通信之前需要先建立连接 其本质就是打开一个socket文件 这个文件有自己的缓冲区 如果要发送数据 上层把数据拷贝到发送缓冲区 如果是接收数据 OS直接把来自网络的数据拷贝到接收缓冲区里 那么三次握手期间 Serv