当前位置: 首页 > news >正文

三次握手-升级详解-注意问题

TCP建立连接的过程就是三次握手(Three-way Handshake),在建立连接的过程实际上就是客户端和服务端之间总共发送三个数据包。进行三次握手主要是就是为了确认双方都能接收到数据包和发送数据包,而客户端和服务端都会指定自己的初始化序列号,就是为了后面数据传输的可靠性做好准备。实质上也就是客户端在连接服务器端的时候指定端口,建立TCP连接,并同步连接双方的序列号(seq)和确认号(ack),交换TCP的窗口大小信息。

一、三次握手的流程图

二、 三次握手过程详解

最开始建立连接的时候,客户端最开始是处于closed关闭状态,服务器是要处于listen监听状态。

当开始连接的时候,客户端会主动打开,打开端口。然后进行三次握手。

发送第一个SYN的一端将执行主动打开(active open),接收这个SYN并发发回下一个SYN的另一端执行被动打开(passive open)。在socket编程中,客户端执行connect()时,将触发三次握手。

第一次握手:客户端给服务端发一个 SYN 标志位的数据包(TCP中有6个标志位,SYN标志位在倒数第15位,二进制位为1,发送第一个SYN包之后,SYN=1)请求建立连接,并指明客户端的初始化序列号 seq(初始序列号是随机产生的,是为了网络安全)。此时客户端处于SYN_SENT 状态。首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。

第二次握手:服务端收到客户端的SYN标志位数据包之后,也会给客户端发送一个SYN标准位数据包(SYN是为了告诉客户端,客户端到服务端的通道是没问题的)作为应答,表示同意建立连接。还指明了自己的初始化序列号seq。并且会把客户端的seq+1(x+1)作为ACK的值,(ACK是用来验证服务端到客户端的通道没有问题),表明自己已经接收到了客户端的SYN,此时的服务器处于SYN_RCVD的状态。

在确认标志位数据包的ACK=1,确认号ack=x+1(需要回复的数据包ack会在发送过来的序列号上加1),服务器端的初始序号seq=y。

第三次握手:客户端收到SYN标志位数据包之后,会发送一个ACK标志位数据包,也会把服务端的初始序列号seq+1(y+1)作为自己的确认号ACK的值,表示收到了服务端的SYN标志位数据包。此时,客户端处于ESTABLISHED状态(完成连接)。

在确认标志位数据包的ACK=1,确认号ack=y+1,客户端的序列号seq=x+1(初始为seq=x,第二个报文段所以要+1)。ACK可以携带数据,不携带数据则不消耗序号。

最后: 服务器收到确认标志位数据包,服务器状态由syn_received变为ESTABLISHED(完成连接)。这样双方就建立起了连接。

最后一个发送数据包的时候,服务器端不需要回复数据包,所以ack就不会占用序列号。

一般来说,ACK会携带序列号,但是一般不占用序列号,下一个包还可以从ACK序列号开始。

二、 三次握手中的常见问题

1、三次握手为什么是三次而不是两次?

为了保证数据能达到目标,TCP采用三次握手策略。三次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已经准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。最主要的目的就是双方都需要确认自己与对方的发送与接收都是正常的。

第一次握手:客户端:发送数据包,服务端收到了。服务端就能得知:客户端的发送能力、服务端的接收能力都是正常的。

第二次握手:服务端发送数据包,客户端收到了。客户端就能得出:服务端的接收、发送能力,客户端的接收、发送能力都是正常的。

第三次握手:客户端发送数据包,服务端接收到了。服务端就能得出:客户端的接收、发送能力正常,服务器自己的发送、接收能力也是正常的。

因此,需要三次握手才能确认双方的接收和发送能力是否正常。

现在假设将三次握手改为仅需要两次握手的话,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S认为连接已经是成功建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S是否已经准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成,将会忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

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

TCP还设有一个保活计时器,显然,客户端如果出现了故障,服务器不能一直等下去,白白浪费资源。服务器每次收到一次客户端的请求之后都会重新复位这个计时器,时间通常是设置为2个小时,如果2小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。如果一连发送10个探测报文仍然没有反应,服务器就认为客户端出现了故障,接着就会关闭连接。

3、为什么三次握手,返回时,ack值是seq加1(ack=x+1)?

假设对方接收到数据,比如sequence number = 1000,TCP Payload = 1000,数据第一个字节编号为1000,最后一个为1999,回应一个确认报文,确认号为2000,意味着2000前的字节接收完成,准备接收编号为2000及更多的数据。

确认收到的序列,并且告诉发送端下一次发送的序列号从哪里开始(便于接收方数据排序,便于选择重传)

4、三次握手过程中可以携带数据吗?

其实第三次握手的时候,是可以携带数据的。但是。第一次、第二次握手不可以携带数据。因为如果第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的SYN报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后就疯狂重复的发送着SYN报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。也就是,第一次握手不可以放数据,其中的一个原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于ESTABLISHED状态,对于客户端来说,他已经建立起连接了,并且也知道服务器的接收、发送能力是正常的了,所以携带数据是可以的。

相关文章:

三次握手-升级详解-注意问题

TCP建立连接的过程就是三次握手(Three-way Handshake),在建立连接的过程实际上就是客户端和服务端之间总共发送三个数据包。进行三次握手主要是就是为了确认双方都能接收到数据包和发送数据包,而客户端和服务端都会指定自己的初始…...

软件架构知识3-系统复杂度-高可用性、可扩展性、低成本、安全、规模

高可用性 系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。 高可用的“冗余”解决方案,单纯从形式上来看,和之前讲的高性能是一样的,都是通过增加更多机 器来达到目的,但…...

SpringCloud学习笔记 - 自定义及解耦降级处理方法 - Sentinel

1. SentinelRecourse配置回顾 通过之前的学习,我们知道SentinelRecourse配置的资源定位可以通过两种方式实现:一种是URL,另一种是资源名称。这两种限流方式都要求资源ID唯一 RestController public class RateLimitController {GetMapping(…...

Redis之搭建一主多从

搭建redis一主多从的过程 1.在相应位置创建一个文件夹存放redis配置文件 mkdir myredis2.复制redis配置文件到此文件夹中 cp /opt/redis/redis/bin/redis.conf /opt/myredis/redis.conf3.新建三个配置文件 touch redis6379.conf touch redis6380.conf touch redis6381.conf4…...

Transformer机制学习笔记

学习自https://www.bilibili.com/video/BV1J441137V6 RNN,CNN网络的缺点 难以平行化处理,比如我们要算b4b^4b4,我们需要一次将a1a^1a1~a4a^4a4依次进行放入网络中进行计算。 于是有人提出用CNN代替RNN 三角形表示输入,b1b^1b1的…...

1、第一个CUDA代码:hello gpu

目录第一个CUDA代码&#xff1a;hello gpu一、__global__ void GPUFunction()二、gpu<<<1,1>>>();三、线程块、线程、网格知识四、核函数中的printf();五、cudaDeviceSynchronize();第一个CUDA代码&#xff1a;hello gpu #include <stdio.h>void cpu(…...

UG二次开发装配篇 添加/拖动/删除组件方法的实现

我们在UG装配的过程中&#xff0c;经常会遇到需要调整组件目录位置&#xff0c;在软件设计过程中可以通过在目录树里面拖动组件来完成。 那么&#xff0c;如果要用程序实现组件的移动/拖动&#xff0c;我们要怎么做呢&#xff1f; 本节就完成了添加/拖动/删除组件方法的实现&…...

【ros bag 包的设计原理、制作、用法汇总】

ros bag 包的设计原理 序列化和反序列化 首先知道Bag包就是为了录制消息,而消息的保存和读取就涉及到一个广义上的问题序列化和反序列化,它基本上无处不在,只是大部分人没有注意到,举个简单的例子,程序运行的时候,是直接操作的内存,也就是一个结构体或者一个对象,但内…...

Linux网络:聚合链路技术

目录 一、聚合链路技术 1、bonding作用 2、Bonding聚合链路工作模式 3、Bonding实现 一、聚合链路技术 1、bonding作用 将多块网卡绑定同一IP地址对外提供服务&#xff0c;可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过 bonding&#xff0c…...

2023年数据安全的下一步是什么?

IT 预算和收入增长领域是每个年度开始时的首要考虑因素&#xff0c;在当前的世界经济状况下更是如此。 IT 部门和数据团队正在寻找确定优先级、维护和构建安全措施的最佳方法&#xff0c;同时又具有成本效益。 这是一个棘手的平衡点&#xff0c;但却是一个重要的平衡点&#…...

在浏览器输入URL后发生了什么?

在浏览器输入URL并获取响应的过程&#xff0c;其实就是浏览器和该url对应的服务器的网络通信过程。从封装的角度来讲&#xff0c;浏览器和web服务器执行以下动作&#xff1a;&#xff08;简单流程&#xff09;1、浏览器先分析超链接中的URL:分析域名是否规范2、浏览器向DNS请求…...

Dubbo学习

0.start 容器container启动&#xff08;spring&#xff09;&#xff0c;初始化我们的服务提供者&#xff08;Provider&#xff09;1.register 把业务层的方法&#xff0c;注册到注册中心&#xff08;Register&#xff09;2.subscribe 消费者&#xff08;Consumer&#xff09;订…...

CMMI-立项管理流程

立项管理&#xff08;Project Initialization Management, PIM&#xff09;的目的是&#xff1a;&#xff08;1&#xff09;采纳符合机构最大利益的立项建议&#xff0c;通过立项管理使该建议成为正式的项目&#xff08;即合法化&#xff09;。&#xff08;2&#xff09;杜绝不…...

看《狂飙》读人生,致敬2023!

作为2023年的第一篇博文&#xff0c;我不想写代码&#xff0c;我想谈谈最近看的《狂飙》&#xff0c;总结了十条哲理&#xff0c;共勉。希望我们的2023&#xff0c;未来的人生会更加出彩。 01 你以为很好的关系&#xff0c;其实也就那么回事。 陈金默以为高启强对他很好&…...

Web自动化测试——Junit5篇

文章目录一、相关依赖注入二、注解调用三、断言 Assert四、规定用例执行顺序五、高效参数化1&#xff09;单参数2&#xff09;多参数3&#xff09;文件获取参数4&#xff09;方法获取数据&#xff08;动态参数&#xff09;六、测试套件整活Junit 是一个面向 Java 语言的单元测试…...

Seata源码学习(二)-源码入口

Seata源码剖析-源码入口 Seata客户端启动 首先一个Seata的客户端启动一般分为几个流程&#xff1a; 自动加载各种Bean及配置信息初始化TM初始化RM&#xff08;具体服务&#xff09;初始化分布式事务客户端完成&#xff0c;代理数据源连接TC&#xff08;Seata服务端&#xff…...

2023如何选购适合游戏设计的电脑硬件

游戏设计涉及许多不同的学科&#xff0c;因此涉及许多不同的软件包。有游戏引擎本身&#xff0c;例如 Unreal Engine 和 Unity&#xff0c;以及 3D 设计软件&#xff0c;例如 3ds Max、Blender 和 ZBrush——等等&#xff01;大多数软件开发人员都维护着这些不同应用程序的系统…...

springboot maven项目集成阿里p3c-pmd插件使用

阿里巴巴规约使用的是pmd代码静态分析工具&#xff0c;通过maven-pmd-plugin这个maven插件实现。 pom文件引入 <!-- 阿里p3c插件 --> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-pmd-plugin</artifactId><…...

PowerJob的server启动都经历了哪些?代码不多也很简单,咱们来逐一理解。

这是一篇让你受益匪浅的文章&#xff0c;点个关注交流一下吧~ PowerJob如何使用&#xff0c;官方文档已经说的很详细了&#xff0c;即使没学过计算机的人&#xff0c;按照那上面的步骤来也是可以搭建出一个可以使用的例子来&#xff0c;所以今天就不在这里重复前人的工作&#…...

分享好玩的h5小游戏制作步骤_怎么做h5微信小游戏

近年来&#xff0c;市面上一直流行各种h5游戏&#xff0c;例如投票、答题、刮刮乐、大转盘等等等等&#xff0c;而且我在各种营销场景下经常看到它们的身影&#xff0c;是做促销&#xff0c;引流和宣传的神器之一&#xff01;那么&#xff0c;怎么做好玩的h5游戏&#xff1f;还…...

代理模式--设计模式

为什么要学习代理模式&#xff1f; 因为这是SpringAOP的底层&#xff01; 1、定义&#xff1a; 在不改变源码的情况下&#xff0c;实现对目标对象的功能扩展 根据代理类的生成时间不同可以将代理分为静态代理和动态代理两种 静态代理 角色分析 抽象角色&#xff1a;一般会…...

【RSTP的原理和配置】

一、RSTP 概述 RSTP使用了IEEE 802.1W协议&#xff0c;视为STP的改进版本&#xff0c;收敛速度快&#xff0c;兼容STP。 RSTP可以兼容STP&#xff0c;但是会丧失快速收敛等优势&#xff1b; 1、RSTP对STP的改进&#xff1b; 1.1、端口角色的增补、简化了生成树协议的理解及部…...

Doom流量回放工具导致的测试环境服务接口无响应的排查过程

Doom流量回放工具导致的测试环境服务接口无响应的排查过程 现象描述&#xff1a; a)部分接口&#xff08;A组接口&#xff09;无响应 b)部分接口&#xff08;B组接口&#xff09;正常响应 c)还有一部分接口&#xff08;C组接口&#xff09;,场景1无响应&#xff0c;场景2正常响…...

2023年留学基金委(CSC)西部/地方合作项目选派办法及解读

2023年2月13日国家留学基金委&#xff08;CSC&#xff09;官方网站发布了2023年西部地区人才培养特别项目、地方合作项目通知。知识人网小编现将其选派工作流程及选派办法原文转载并加以解读、提出建议。知识人网建议1. 邀请函是公派申请的必备条件。对于外语语言证明未达标者&…...

ILSSI国际研讨会将为您呈现六西格玛技术的未来与前景

ILSSI 欢迎世界各地的精益六西格玛专业人士参加即将举行的2023年国际精益六西格玛研讨会&#xff0c;这次研讨会将邀请到世界各地的专家学者&#xff0c;分享他们的专业知识和经验&#xff0c;并就精益六西格玛等相关议题进行探讨和交流。 这是一个绝佳的机会&#xff0c;让您…...

KDJ日周月金叉共振指标

昨天介绍了MACD多周期共振指标公式&#xff0c;KDJ通过类似的写法&#xff0c;也可以共振。本文介绍的KDJ日周月金叉共振指标包含日周金叉共振、日月金叉共振、周月金叉共振、日周月金叉共振四种类型。 需要注意的问题依然是周、月金叉的信号漂移&#xff0c;接近周末月末的信…...

线程私有变量ThreadLocal详解

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 烈火试真金&#xff0c;逆境试强者。——塞内加 文章目录什么是ThreadLocalThreadLocal 原理set()方法get()方法remove()方法ThreadLocal 的Hash算法ThreadLocal 1.7和1.8的区别ThreadLocal 的问题ThreadLoca…...

如何保证数据库和缓存双写一致性

前言 数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。 我很负责的告诉大家,该问题无论在面试,还是工作中遇到的概率非常大,所以非常有必要跟大家一起探讨一下。 今天这篇文章我会从浅入深,…...

一文搞懂:JS严格模式“use strict”

什么是JS的严格模式 JS严格模式概念是在ES5中引入的&#xff0c;在此模式下&#xff0c;JS对语法的要求会变的严格&#xff0c;某些不太严谨的代码在严格模式下将不能运行。 如何启用严格模式 只需要JS代码的起始添加 "use strict"即可。如&#xff1a; "use…...

Linux的ACL(扩展权限)规划:setfacl、getfacl

目录 什么是ACL与如何支持启动ACL ACL设置技巧&#xff1a;getfacl、setfacl getfacl命令用法 setfacl命令用法 最简单的【u&#xff1a;账号&#xff1a;权限】设置 使用默认权限设置目录未来文件的ACL权限继承 什么是ACL与如何支持启动ACL ACL是Access Control List的…...

企业网站管理系统手机版教程/厦门seo排名优化公司

大家好&#xff0c;我是小小教育&#xff0c;欢迎大家关注留言。随着大家上网课时间的推进&#xff0c;现在的学习任务已经完成一大半&#xff0c;而部编版二年级下册《数学》中的除法部分知识&#xff0c;又是一个过渡性很强的知识内容&#xff0c;这部分掌握的好坏&#xff0…...

wordpress的qq邮件列表qq邮件列表订阅rss源地址怎么找/企业网络营销方案策划

快速开发平台&#xff0c;简单地说就是指那些不用编码或通过少量代码&#xff0c;就可以快速开发应用程序的平台。既可以降低开发人力成本&#xff0c;又可以缩短开发时间&#xff0c;从而实现企业降本增效的价值。应用快速开发&#xff08;rapid application development, RAD…...

企业做网站推广产品需要多少钱/拼多多商品关键词搜索排名

作者&#xff1a;瀚高PG实验室 &#xff08;Highgo PG Lab&#xff09;-瀚高大李 PostgreSQL是世界上功能最强大的开源数据库&#xff0c;在国内得到了越来越多机构和开发者的青睐和应用。随着PostgreSQL的应用越来越广泛&#xff0c;Oracle向PostgreSQL数据库的数据迁移需求也…...

做我女朋网站源码/什么是引流推广

总体分为翻译类编程类应用类&#xff08;占大多数&#xff09;翻译类标题格式tra-openpgptra-sqlitetra-bash工具类标题格式win-client-putty,Bitvisewin-client-VNCViewerwin-client-tortoiseSVNwin-client-toad,navicat服务类标题格式分守护类与内核类守护类分网络类与系统类…...

手机网站是怎么做的/软文大全500篇

If you want something youve never had, you must be willing to do something youve never done. 如果你想拥有从未有过的东西&#xff0c;那么你必须去做你从未做过的事。(Thomas Jefferson) 原文载于&#xff1a;爱词霸英语学习网-每日一句...

wordpress主题W3C/口碑营销案例ppt

ReplicatorG是一款简单易用的3d打印机控制软件&#xff0c;软件旨在帮助用户向其RepRap或CNC机器发出命令。该程序支持大多数常见的3D打印机&#xff0c;并且可以通过内置功能上传新固件。其还具有估计时间、模拟打印、生成代码、打印、暂停、停止、GCode生成器、编辑分层配置、…...