计算机网络之TCP三次握手

article/2025/10/14 11:10:41

文章目录

  • 计算机网络之TCP三次握手
    • 1.TCP三次握手过程
    • 2.TCP三次握手原因,而不是两次
    • 3.TCP三次握手原因,而不是四次
    • 4.TCP三次握手能携带数据吗
    • 5.三次握手连接阶段,最后一次ACK包丢失,会发生什么
    • 6.TCP 握手为什么是三次,为什么不能是两次?不能是四次?

计算机网络之TCP三次握手

1.TCP三次握手过程

1.第一次握手:
客户端请求建立连接,客户端将标志位SYN置为1;
主机A发送位码为SYN=1,ACK=0,随机产生一个随机数seq number= j的同步报文(也是数据包)到服务器(TCP规定SYN=1时不能携带数据但要消耗一个序号);
客户端进入SYN_SENT状态(即等待状态),等待服务器确认,服务端由客户端发送的SYN=1知道,客户端要求建立联机;
2.第二次握手:
服务端收到连接请求报文(也是数据包)后由标志位SYN=1知道客户端请求建立连接,主机B收到请求后要确认联机信息;
服务端将标志位SYN和ACK都置为1;
向A发送确认号ack number(=客户端的seq+1=j+1)、及SYN=1,及ACK=1,随机产生一个随机数seq=K作为初始序列号的同步确认报文并将该数据包发送给客户端以确认连接请求;
此时服务器进入SYN_RECV状态
3.第三次握手:
主机B收到后确认收到的ack值与发送给A的seq+1是否相等和ACK是否为1来判断连接是否建立成功。
客户端收到确认后,检查ack是否为J+1,ACK是否为1;
如果正确客户端将标志位ACK置为1;
如果正确客户端会再发送ack number(=Server的seq+1=K+1)、ACK=1,并将该确认报文(数据包)发送给服务端,
服务端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务端进入ESTABLISHED状态,完成三次握手,随后客户端与服务端之间可以开始传输数据了。
注:理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去

image-20220206110748529

思路: TCP 连接的三次握手机制,最重要的知识点,必须得会,通讯过程以及客户端、服务器的对应的状态都需要记住哈。
TCp 提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的就是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。
流程:
● 第一次握手 (发送连接请求报文SYN=1, 初始序号随机seq=x,ACK=0),发送完毕后,客户端就进入 SYN_SENT 状态
● 第二次握手 (发送连接确认报文SYN=1, ACK=1, seq=y, ACKnum=x+1), 发送完毕后,服务器端就进入 SYN_RCV 状态。
● 第三次握手 (发出连接确认报文ACK=1,ACKnum=y+1,序号seq=x+1),发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态。
注:ACK也好,ack也好,只不过是个代号而已
ACK是确认值(Acknowledgement),为1便是确认连接。
ack是确认编号(Acknowledgement Number),即接收到的上一次远端主机传来的seq然后+1,再发送给远端主机。提示远端主机已经成功接收上一次所有数据。

img

2.TCP三次握手原因,而不是两次

主要有三个原因:

第一个原因:三次握手才能让双方均确认自己和对方的发送和接收能力都正常
1.第一次握手:客户端发送包,服务端收到了
根据第一次握手,服务端得出结论:客户端的发送能力、服务端的接收能力是正常的。
2.第二次握手:服务端发包,客户端收到了
根据第一次握手以及第二次握手,客户端能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的;
不过此时服务端并不能确认客户端的接收能力、以及服务端的发送能力是否正常
3.第三次握手:客户端发包,服务端收到了
根据第一次握手及第二次握手以及第三次握手,服务端能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
因此,需要三次握手才能确认双方的接收与发送能力是否正常

第二个原因:防止已过期的连接请求报文突然又传送到服务器,因而产生错误和资源浪费
为什么A还要发送一侧确认呢?这主要是为了防止已失效的连接请求报文突然又传送到了B,因而产生错误。
所谓“已失效的连接请求报文段”是这样产生的。双方两次握手即可建立连接的情况下,A发出连接请求,但因连接请求丢失而未收到确认。于是A再次重传一次连接请求。后来收到了确认建立了连接。数据传输完毕后,就释放了连接。A供发送了两个连接请求的报文段,其中第一个丢失,第二个到达了B。没有“已失效的连接请求报文段”。
现假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络节点长时间滞留了,以致延误到连接释放以后的某个时间才到B。本来这是一个已失效的报文段。但是B收到此失效的连接请求报文段后,就误认为是A有发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。
由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立了,并一直等待A发来数据。B的许多资源就这样拜拜浪费了。
采用三次握手的办法可以防止上述现象的发生。例如在刚才的情况下,A不会向B的确认发出确认。B由于收不到确认,就知道A并没有要求建立连接。

第三个原因:告知对方自己的初始序号值,并确认收到对方的初始序号值
TCP 实现了可靠的数据传输,原因之一就是 TCP 报文段中维护了序号字段和确认序号字段,通过这两个字段双方都可以知道在自己发出的数据中,哪些是已经被对方确认接收的。这两个字段的值会在初始序号值得基础递增,如果是两次握手,只有发起方的初始序号可以得到确认,而另一方的初始序号则得不到确认。

另一种解释:
这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了”。这可视为对“三次握手”目的的另一种解答思路。

3.TCP三次握手原因,而不是四次

因为三次握手已经可以确认双方的发送接收能力正常,双方都知道彼此已经准备好,而且也可以完成对双方初始序号值得确认,也就无需再第四次握手了。
第一次握手:服务端确认“自己收、客户端发”报文功能正常。
第二次握手:客户端确认“自己发、自己收、服务端收、客户端发”报文功能正常,客户端认为连接已建立。
第三次握手:服务端确认“自己发、客户端收”报文功能正常,此时双方均建立连接,可以正常通信。

4.TCP三次握手能携带数据吗

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

5.三次握手连接阶段,最后一次ACK包丢失,会发生什么

服务端:
*第三次的ACK在网络中丢失,那么服务端该TCP连接的状态为SYN_RECV,并且会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN+ACK包,以便客户端重新发送ACK包。
*如果重发指定次数之后,仍然未收到 客户端的ACK应答,那么一段时间后,服务端自动关闭这个连接。
*客户端:
客户端认为这个连接已经建立,如果客户端向服务端发送数据,服务端将以RST包(Reset,标示复位,用于异常的关闭连接)响应。此时,客户端知道第三次握手失败。

6.TCP 握手为什么是三次,为什么不能是两次?不能是四次?

思路: TCP 握手为什么不能是两次,为什么不能是四次呢?为了方便理解,我们以男孩子和女孩子谈恋爱为例子:两个人能走到一起,最重要的事情就是相爱,就是我爱你,并且我知道,你也爱我,接下来我们以此来模拟三次握手的过程:

在这里插入图片描述

为什么握手不能是两次呢?
如果只有两次握手,女孩子可能就不知道,她的那句我也爱你,男孩子是否收到,恋爱关系就不能愉快展开。
为什么握手不能是四次呢?
因为握手不能是四次呢?因为三次已经够了,三次已经能让双方都知道:你爱我,我也爱你。而四次就多余了。
总结:
确保可靠的通信通道,让双方都确认对方和自己的接收和发送功能是正常的。
将三次握手通俗的说。
1.第一次握手,Server知道Client的发送能力和自己的接收能力是正常的。
2.第二次握手,Client知道Server的发送和接收能力和自己的发送和接收能力是正常的,但是Server还不知道我的接收和他的发送能力正常与否。
3.第三次握手,Client回馈,让Server知道自己的发送能力和Client的接收能力正常。


http://chatgpt.dhexx.cn/article/ZJRDIkFj.shtml

相关文章

网络通信TCP协议三次握手

TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、 基于IP的传输层协议。TCP在IP报文的协议号是6。TCP是一个超级麻烦的协议,而它又是互联网的基础,也是每个程序员必备的基本功。首先来看看OSI的七层模…

栈溢出实例--笔记三(ret2libc)

栈溢出实例--笔记三(ret2libc) 1、栈溢出含义及栈结构2、ret2libc基本思路3、实战3.1、二进制程序如下3.2、查看栈结构3.3、第一次栈溢出3.4、第二次栈溢出 1、栈溢出含义及栈结构 请参考栈溢出实例–笔记一(ret2text) 栈溢出实例–笔记二&a…

ret2libc3

文章目录 ret2libc31.程序分析2.栈帧设计3.exp编写 ret2libc3 当前的ret2libc3:无system,无”\bin\sh“ 1.程序分析 首先file一下,发现是32位程序: checksec一下,发现没有开启pie ida分析程序: 发现有个Se…

PWN题型之Ret2Libc

文章目录 前言0x1 :使用前提条件0x2 :解题思路0x3 :32位程序libc题型模板0x4 :代码的解析0x5 :64位程序实例 前言 菜鸡总结,如有不对,请不吝赐教。 0x1 :使用前提条件 存在溢出条件…

【PWN · ret2libc】[2021 鹤城杯]babyof

Linux_64的经典ret2libc题目,有必要好好整理总结一下其中的流程和注意点 目录 前言 一、题目重述 二、exp(思考与理解在注释) 三、经验总结 攻击步骤: 注意要点 四、疑问 前言 64位Linux和32位Linux确乎有着关于参数传递上的不同&a…

运行不同版本libc

author: Tamako 先上两个美化的链接,不用zsh的 字体 样式,颜色 成品 切换libc 我的工具机是Ubuntu 18.04。 获取libc版本 这个很容易,通过运行libc就可以直接获取,比如buu的Ubuntu16.04 32位机使用的libc 当然有些libc运行…

ret2libc实战

title: ret2libc实战 date: 2021-05-13 22:00:00 tags: binary securitystudy reportret2libc comments: true categories:ctfpwn ret2libc是一个pwner必备的基础知识。 ret2libc为return to libc的缩写,我们需要执行libc函数里面的system("/bin/sh") …

WSL vhdx非root误删除libc.so.6

思路 由于不在root这种情况的特殊性,没有办法使用网上例如LDPRELOAD进行软连接。则使用linux挂载ext4格式的vhdx然后重新进行软链接 挂载vhdx wsl ubuntu 20.04的虚拟磁盘在windows下的这个目录,不同的发行版在package目录下的地址不一样 在Package目…

ret2libc

一、原理 payload padding1 address of system() padding2 address of “/bin/sh” Padding1 随意填充, 长度刚好覆盖基地址 长度与shellcode处的一样的方法 address of system() 是system在内存中的地址,用来覆盖返回地址 system()函数地址在哪里? 从动态库中获取,计…

libc

1. libc (1). libc是Standard C library的简称,它是符合ANSI C标准的一个函数库。 libc库提供C语言中所使用的宏,类型定义,字符串操作函数,数学计算函数以及输入输出函数等。 正如ANSI C是C语言的标准一样,lib…

为什么要避免使用 libc

【CSDN 编者按】libc 是 Linux 下的标准 C 库&#xff0c;也是初学者写 hello world 包时含有的头文件 #include < stdio.h> 定义的地方&#xff0c;后来其逐渐被 glibc 给取代&#xff0c;本文作者列出了为什么要避免使用 libc 的 20 个理由。 作者 |Chris Wellons 译者…

统计学⑤——假设验证

统计学系列目录&#xff08;文末有大奖赠送&#xff09;&#xff1a; 统计学①——概率论基础及业务实战 统计学②——概率分布&#xff08;几何&#xff0c;二项&#xff0c;泊松&#xff0c;正态分布&#xff09; 统计学③——总体与样本 统计学④——置信区间 一、什么是假…

统计基础(四)假设检验

Hypothesis Testing 1.中心极限定理Central Limit Theorem1.1 X ˉ \bar{X} Xˉ的抽样分布1.2 p ^ \hat{p} p^​的抽样分布1.3 二项的正态逼近 2.假设检验概念2.1 零假设与备则假设2.2 如何制定决策规则 3.假设性检验步骤3.1假设检验框架3.2术语定义3.3 proportion test步骤3…

连续性概率

提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 欧拉常数连续型随机变数与概率密度函数正态分布标准正态分步检验t检验t假设 在我们将离散型数据的数值放大到无限&#xff0c;也就是讨论所谓的极限时&#xff0c; …

概率统计:离散分布和连续分布

1. 几种分布分类 (1) 离散分布&#xff1a;  伯努利分布&#xff08;零一分布&#xff0c;两点分布&#xff09;&#xff0c;二项分布&#xff0c;几何分布&#xff0c;泊松分布&#xff08;Poisson分布&#xff09; (2) 连续分布&#xff1a;  指数分布&#xff0c;正态分…

【概率论】随机试验、随机变量、离散型/连续型随机变量

1. 随机试验 满足以下3个条件的试验可以称为随机试验&#xff1a; 相同条件下可重复试验结果明确可知且不只一个试验前不知道哪个结果会发生 例如&#xff1a;我们平时做的抛硬币、掷骰子试验都是随机试验。以抛硬币试验为例&#xff1a;①该试验可以重复进行多次&#xff1…

连续型随机变量

连续型随机变量&#xff1a;continuous random variables 即在一定区间内变量取值有无限个&#xff0c;或数值无法一一列举出来 如下面的例子 概率密度函数&#xff08;probability density function, pdf&#xff09;: 在数学理论中&#xff0c;一个连续型随机变量的概率密度…

概率论基础 —— 3.离散型、连续型概率模型,及其概率密度与概率分布函数

在前面的文章里&#xff0c;已经带大伙了解了概率论的概率事件类型&#xff0c;以及针对某些事件的发生概率&#xff0c;以及针对全部场景的某事件的发生概率等基本知识。不过对于统计学专业来说&#xff0c;或者实际应用来说&#xff0c;接触最多的还是离散型和连续型概率&…

概率论的离散型随机变量和连续型随机变量

借鉴大佬的 下面附上网址 https://blog.csdn.net/ckk727/article/details/103435150 随机变量 随机变量是指变量的值无法预先确定仅以一定的可能性(概率)取值的量。 它是由于随机而获得的非确定值&#xff0c;是概率中的一个基本概念。 在经济活动中&#xff0c;随机变量是某…

计量经济学 联合假设检验 F统计量

考虑这样一个问题&#xff0c;现在你拥有1个被解释变量y和4个解释变量&#xff0c;如何判断x3,x4这2个变量是没有必要的&#xff1f; 或者换个说法&#xff0c;你现在有x1&#xff0c;x2这2个解释变量&#xff0c;突然你在寻找数据时&#xff0c;发现了另外2个变量x3&#xff0…