TCP为什么三次握手?

article/2025/10/14 10:11:36

参考:公众号 小林coding

常见回答:三次握手保证双方都具有接受和发送数据的能力。

主要原因:

1. 防止重复历史连接的初始化

2.同步双方初始序列号

3.避免资源的浪费

1. TCP为什么三次握手?

1.1  防止重复历史连接的初始化

序列号seq标记已发送数据的位置,确认号ack表示数据已接受,期望下一次数据序列号seq = ack

当因为网络拥塞导致超时重传建立连接的请求:设两次请求seq分别为:100, 200,在第二次请求发送后,客户端记录seq = 200, 即使网络恢复旧请求成功得到响应,此时ack = 101, 在客户端处校验不通过,发送RST终止这次连接。

如果采用两次握手:(中间绿色的服务端发送数据就被浪费,并且需要进行连接的销毁

 1.2 同步双方初始序列号

使用序列号可以保证数据的发送是有序的,同时记录已发送数据的位置,便于对比请求响应ack确定下一次发送数据的位置。

在三次握手的情况下,双方都对请求作出响应,表示数据接受,初始化发送数据的序列号;保证双方都进入数据可发送和接受的状态。

其中的四次握手,说的服务端响应阶段需要发送标志位:SYN, ACK,SYN用于初始化序列号,ACK表示确定数据接受成功;而最优的三次握手中,将这两个阶段放到一起,减少一次请求

3.其他问题

3.1 为什么客户端和服务端的初始化序列号不同?

可以注意到,在三次握手的建立过程中,很多情况下客户端的seq = x, 而服务端的序列号 seq = y

这样做的原因为了防止历史报文被下一个相同的四元组(tcp连接)接收

服务端和接收端中分别维护窗口大小,用于接收数据;如果使用不同的seq, 可以保证及时连接重置,旧的历史数据也很大程度不会落入接收窗口中,不会使数据污染。

假设每次初始化序列号都是0:

 

3.2 为什么要在传输层分片?

MTU:网络中最大数据包长度, 包括:IP头 + TCP头 + 数据报,以太网一般1500

MSS:最大数据报长度

当数据报超过MSS的时候进行数据分片。

如果在IP中进行分片,网络层中不包含重传机制,一旦某一个分片丢失,会导致这次请求的所有数据都要重传。

3.3 SYN攻击

        在TCP 连接建立是需要三次握手,假设攻击者短时间伪造不同 IP 地址的 SYN 报文,服务端每接收到一个 SYN 报文,就进入SYN_RCVD 状态,但服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的 ACK 应答,久而久之就会占满服务端的半连接队列,使得服务器不能为正常用户服务。

4、四次挥手

        进入连接断开阶段:

        第一次:客户端数据发送结束,发送FIN, 服务端接受后进入close_wait状态

        第二次:服务端响应客户端断开连接的请求

        第三次:服务端接收数据结束,发送FIN, 客户端接收后进入time_wait状态

        第四次: 客户端响应服务端请求,发送ack, 在time_wait阶段下等待2MSL时间;如果这个时间间隔内没有收到服务端的请求,进入close状态

主动关闭连接的,才有time_wait状态

相比于三次握手,这里的FIN 和 ACK需要分开,表示服务端仍可以接受数据;因此需要四次挥手

4.1 为什么需要2MSL

什么是MSL: 是报文段在网络中传输的最长时间;超过这个时间,就会被丢弃

2MSL:客户端发送确认报文ACK + 等待服务端请求(如果ACK丢失,重新发送FIN)两次请求的最长存活时间;当超过这个时间,表示报文发送成功。

4.2 为什么要有TIME_WAIT状态

1. 防止历史数据被后面相同的四元组(TCP连接)接收。假设第一次TCP连接中seq = 100, 整个过程中发送一次seq = 101的报文但是因为网络产生延迟,在TCP关闭前也没有成功接收。再重新建立一个TCP连接使用seq = 100, 此时上一次连接中的报文到达,并且接收窗口 [100, x]可以接受这次的数据;导致了新的连接接受了上一次的旧数据。

 

2. 保证接收数据方能够正常断开;如果没有2MSL, 当客户端发送ACK后直接进入关闭状态,如果ACK丢包,导致服务端重新发送FIN, 此时没有接收方,服务端一直没有断开连接


后续LInux中的看不懂。。。慢慢看吧,哎


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

相关文章

【Java】TCP的三次握手和四次挥手

文章目录 一、三次握手三次握手的流程 二、四次挥手认识两个重要的状态 三、总结 一、三次握手 TCP三次握手是一个经典的面试题,它指的是TCP在传递数据之前需要进行三次交互才能正式建立连接,并进行数据传递。(客户端主动发起的)…

什么是TCP的三次握手?

三次握手是指建立一个 TCP 连接时,需要客户端和服务端发送三个数据包的过程。进行三次握手是为了确定双方的接收能力和发送能力是否正常。 刚开始客户端处于 Closed 状态,服务端处于 Listen 状态。 第一次握手: 客户端给服务端发送一个 SY…

TCP 三次握手 四次挥手

三次握手 三次握手过程描述 第一次握手: 客户端发送syn标志位和seq num,向服务器申请建立连接,客户端状态由closed变为syn_send 第二次握手: 服务端返回 syn和ack标志位,ack num以及seq num,确认第一次握手的报文段,…

Go_详解TCP协议三次握手四次挥手

三次握手: 三次握手表示建立通信阶段,在TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠,由于这种面向连接的特性, TCP协议可以保证传输数据的安全&#xff0c…

一文读懂TCP的三次握手(详细图解)

在学习TCP三次握手的过程前,首先熟悉几个缩写简称: TCB 传输控制块,打开后服务器/客户端进入监听(LISTEN)状态 SYNTCP报文标志位,该位为1时表示发起一个新连接ACKTCP报文标志位,该位为1时&…

TCP的三次握手与四次挥手的全过程

三次握手 (1)第一次握手:建立连接时,客户端发送syn包(seqj)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号。 (2)服…

简述TCP的三次握手过程

TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(synj)到服务器,并进入SYN_SEND状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers) 第二次握…

TCP-三次握手

文章目录 三次握手简单示意图详细分析 一些思考为什么是三次握手?SYN 攻击什么是SYN 攻击?如何防止SYN 攻击?数据包丢失了该怎么办?初始序列号为什么随机产生?为什么 SYN 段不携带数据却要消耗一个序列号呢&#xff1f…

计算机网络之TCP三次握手

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

网络通信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 译者…