TCP三次握手学习心得

article/2025/10/1 17:50:21

客户端A若要连接服务端B,首先A会向B发送一个连接请求,其中SYN=1,ACK=0,B为了告诉A成功收到了消息,则向A发送一个确认包,其中SYN=1,ACK=1,这时A收到之后又会向B发送一个确认收到确认包的确认包,SYN=0,ACK=1。最后B收到这个包之后,A和B的连接就成功建立。

首先解释SYN和ACK分别是什么,SYN是同步标志位,ACK是确认标志位,SYN的作用是告诉对方自己数据的起始序列号是多少,ACK是告诉对方自己已收到对方发来的数据包,希望对方传来的下一个数据包是第几个字节。也就是说三次握手的1,2次握手是向对方同步自己的序列号而2,3次握手是向对方确认自己已经收到了对方发来的数据包。
在这里插入图片描述
这时候就会有人有疑问,为什么不是两次握手或四次握手呢?
先来说两次握手,A向B发送请求连接信号,B向A发送一个收到信号,同意连接的信号,这样两次握手不就可以了吗。其实不然,假如A发送请求后,这时A进入等待状态,B收到了信号再向A发送确认信号,B就已经进入了连接状态,但是万一B发送的信号中途丢包了呢,这样A就会一直处于等待状态,但是B却认为连接已经建立。

换一种想法,其实三次握手的第一次握手是A告诉B自己有发的能力,第二次握手B告诉了A自己有收和发的能力,第三次握手A告诉B自己有收的能力。这样也说明了为什么不是四次握手,三次握手都已经把该说的都说了,该知道的都知道了,四次岂不是就很浪费了。

有人认为四次握手应该是:第一次A向B发送同步序列信号,第二次B向A发送确认信号,第三次B向A发送同步序列信号,第四次A向B发送确认信号。明显第二次和第三次的可以合成一次发送。
其实三次握手协议也不是一定可靠的,但是可以说是最合适最可靠的。

就拿两军交流为例,A军和B军中间隔了一座大山,A想告诉B军一个作战计划,这时A就会派一个传令兵赶到B军所在地告诉他们作战计划,B一听:诶,这个计划不错哟,我要告诉A我同意这个计划了,于是B也派这个传令兵回去A的兵营告诉A,A知道B同意这个计划后就想让B知道自己已经了解到他们同意了,于是又派这个传令兵千里迢迢赶到B的所在地,但是A不知道这个传令兵究竟有没有成功告知B,于是B就只能再派这个传令兵到A的兵营。。。。就这样陷入了死循环,传令兵累死了。。。

所以如果真要保证连接正确无误,就需要像这样无限次的握手。


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

相关文章

使用wireshark抓取Tcp三次握手

文章目录 wireshark的下载安装TCP协议段格式简单介绍确认应答机制介绍使用wireshark抓取TCP的三次握手 wireshark的下载安装 软件的下载可以直接去官网下载 wireshark,选择自己电脑适合的版本就行。 但是不咋推荐,原因是国外网站访问速度太慢&#xff…

TCP的三次握手、四次挥手

一、TCP的三次握手 第一次握手:你能和我建立连接吗,可以接受到我的数据吗。 SYN 1 ,seq x 第二次握手:可以建立连接,我接受到你的请求了,能接受到我的数据吗,你的数据是这个吗 SYN 1 &#…

TCP三次握手原理

在众多的网络协议中,TCP协议占据着举足轻重的地位,你知道什么是TCP协议吗? 一、TCP协议 TCP(Transmission Control Protoco)协议属于计算机网络体系中的运输层。运输层的任务是负责向主机中应用层进程之间的通信提供通用的数据传输服务。所以…

TCP三次握手及四次挥手过程中的异常处理

1. 消息丢失的情况: 总的原则: ACK不会重传,SYN和FIN报文段有最大重传次数。无论是SYN还是FIN,达到最大重传次数后对端若仍无响应则直接进入CLOSED状态。 1.1 三次握手过程的消息丢失: 正常的三次握手的流程&#x…

HTTPS 中 TLS 和 TCP 能同时握手吗?

HTTPS 中 TLS 和 TCP 能同时握手吗? 大家好,我是小林。 有位读者在面试的时候,碰到这么个问题: 面试官跟他说 HTTPS 中的 TLS 握手过程可以同时进行三次握手,然后读者之前看我的文章是说「先进行 TCP 三次握手&#…

TCP优化一:TCP 三次握手的优化

TCP 三次握手的性能提升 TCP 是面向连接的、可靠的、双向传输的传输层通信协议,所以在传输数据之前需要经过三次握手才能建立连接。 那么,三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上,在网络状态不佳、高并发或者遭遇 SYN 攻击…

TCP握手过程和挥手过程

TCP报文首部 源端口和目的端口,各占2个字节,分别写入源端口和目的端口;序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有1…

TCP三次握手

TCP协议是传输层协议,是一种面向连接的传输控制协议,可以控制流量的传输。是一种可靠的传输,能够保证数据的完整性,有效性和有序性。 1.TCP建立连接(三次握手) 第一次握手:PC1发送SYN请求&…

TCP握手与挥手详解(附有图)

为什么不是4次握手 首先我们知道TCP是3次握手与4次挥手,为什么不是4次握手呢,因为其中握手请求同步过程中并不需要数据传输因此将两次合并为一次了。 我们需要掌握哪些标志量 SYN:请求同步标志,为1的时候为有效 ACK&#xff1…

为什么TCP需要握手

一、TCP握手流程 二、为什么不是4次握手 TCP的每次请求都是成对的,原则上应该是四次 【Client to Server】第一次SYN,seqx【Server to Client】第二次ACK,seqy,ackx1(没有携带数据的ACK不消耗序列号)【Se…

tcp_tw_recycle引起的TCP握手失败

背景 测试环境的一台Nginx服务器,最近一直被前端同事吐槽网络有问题,经常出现访问HTTP请求时超时,哪怕是静态文件也经常超时。 刚开始以为是公司网络抽风了,也就没放在心上,但持续了一个星期,而且复现率很…

TCP握手过程(正解版)

参考文章 Why do we need a 3-way handshake? Why not just 2-way https://blog.csdn.net/qq_36903042/article/details/102656641 https://blog.csdn.net/qq_36903042/article/details/102513465 大部分网络博客的错误解读 首先需要声明的是, 百度搜索到的大…

网络协议 (五) TCP握手建立连接

一、握手策略 为了可以准确的将数据准确无误地送达目标主机,所有基于 TCP 实现的协议,都需要先完成 TCP 协议的三次握手策略。 1. 首先我们需要了解一下图中提到的几个标志符: 1.序号seq seq 是TCP通信过程中,某一个传输方向上字…

TCP 握手没成功怎么办?

大家好,我是小林。 之前收到个读者的问题,对于 TCP 三次握手和四次挥手的一些疑问: 第一次握手,如果客户端发送的SYN一直都传不到被服务器,那么客户端是一直重发SYN到永久吗?客户端停止重发SYN的时机是什么…

深入理解TCP三次握手

一、TCP 包头格式 首先,TCP报文是TCP层传输的数据单元,也称为报文段,下面就是TCP包头格式: 接下来我们来看看每个字段的含义: 源端口和端口字号: TCP源端口:源计算机上应用程序端的端口号&…

TCP的三次握手及四次挥手详解

三次握手 三次握手过程: (1)第一次握手:Client将标志位SYN置为1(表示要发起一个连接),随机产生一个值seqJ,并将该数据包发送给Server,Client进入SYN_SENT状态&#xff0c…

C语言中main函数参数使用

在C99标准中定义main函数两种正确的写法 int main(void); int main(int argc, char* argv[]);常见的不标准写法 void main() main()这里主要说明带参数的main函数如何使用 int main(int argc, char* argv[]) {int i;for (i0; i<argc; i)printf("%d: %s\r\n", i…

C语言main函数参数、返回值

C语言main函数返回值&#xff1a; main函数的返回值&#xff0c;用于说明程序的退出状态。如果返回0&#xff0c;则代表程序正常退出&#xff1b;返回其他数字的含义则由系统决定&#xff0c;通常&#xff0c;返回非零代表程序异常退出&#xff0c;即使程序运行结果正确也仍需修…

main 函数的参数说明

C/C语言中的main函数&#xff0c;经常带有参数argc&#xff0c;argv&#xff0c;如下&#xff1a; int main(int argc, char** argv)int main(int argc, char* argv[])这两个参数的作用是什么呢&#xff1f;argc 是指命令行输入参数的个数&#xff0c;argv存储了所有的命令行参…

C++ main函数及main函数的参数

C main函数及main函数的参数 1、main函数的几种形式 int main() int main(int argc) int main(int argc,char** argv)//int main(int argc,char* argv[])2、argc表示命令行参数的个数、argv表示命令行参数的值 &#xff08;1&#xff09;写个小代码&#xff0c;用命令行运行…