TCP的三次握手、四次挥手

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

一、TCP的三次握手
在这里插入图片描述
第一次握手:你能和我建立连接吗,可以接受到我的数据吗。
SYN = 1 ,seq = x
第二次握手:可以建立连接,我接受到你的请求了,能接受到我的数据吗,你的数据是这个吗
SYN = 1 ,ACK = 1 ,seq = y ,ack = x + 1
第三次握手:我已经收到你的回复,这是我的数据,这是你的数据(用于再次核对)
ACK = 1 ,seq = x + 1 ,ack = y + 1
建立连接成功。
1、具体说明
<1>第一次握手由客户端发送SYN(同步连接请求)和自己的seq;
<2>第二次握手由服务端收到客户端发送的SYN后回复ACK=客户端SYN+1,并发送自己的SYN;
<3>第三次握手由客户端发送ack已确认收到服务器的SYN,从而完成连接。
2、为什么 TCP 握手需要三次?
不用一次握手是因为TCP是面向连接的传输机制,是双向的,仅靠一次握手无法完成最基本的连接,所以一次握手肯定不可以;
假设需要两次握手,当客户端发送SYN给服务端时,如果因为网络延时或者其他原因导致该信息服务端没有收到,这时客户端迟迟未收到服务端发送的ACK回复,就会继续给服务端发送SYN连接请求,此时若服务端能正常收到该SYN并且回复ACK给客户端,二者建立连接,之后某个时间点,服务端收到了第一个SYN,会认为只是一个链接请求,就会回复客户端,而客户端知道自己已经完成了链接并且不需要该ACK,就会将其丢弃,而服务端则会持续发送ACK,造成网络资源的占用和浪费;上述现象的根源在于服务器不知道这是一个无效连接,而三次握手就可以解决这个问题,第二次服务端向客户端回复ACK+SYN时,服务器知道服务端还必须回复一次确认,如果没有收到该确认,证明这是一个无效的连接,将释放连接,重新建立连接,故采用三次握手机制。
所谓的"三次握手"即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。为了防止失效的连接请求报文段突然又传送到主机服务端 ,因而产生错误。
二、TCP的四次挥手
在这里插入图片描述
1、过程:
<1>第一次挥手:A数据传输完毕需要断开连接,A的应用进程向其TCP发出连接释放报文段(FIN = 1,序号seq = u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1状态,等待B的确认。
<2>第二次挥手:B收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT关闭等待状态,此时的TCP处于半关闭状态,A到B的连接释放。而A收到B的确认后,进入FIN-WAIT-2状态,等待B发出的连接释放报文段。
<3>第三次挥手:当B数据传输完毕后,B发出连接释放报文段(FIN = 1,ACK = 1,序号seq = w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A 的最后确认。
<4>第四次挥手:A收到B的连接释放报文段后,对此发出确认报文段(ACK = 1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSE状态。
2、为什么 TCP 的挥手需要四次?
因为TCP是全双公的,要实现可靠的连接关闭,A发出结束报文FIN,收到B确认后A知道自己没有数据需要发送了,B知道A不再发送数据了,自己也不会接收数据了,但是此时A还是可以接收数据,B也可以发送数据;当B发出FIN报文的时候此时两边才会真正的断开连接,读写分开。
三、可靠机制详解
TCP的可靠传输通过确认、排序、流控、重传四种传输机制来保证。
1、确认:当TCP收到来自TCP连接另一端的数据后,将给对端发送一个确认信息,这个确认信息并不是立即发送的,通常情况下会延迟几分之一秒。
2、排序:TCP报文段作为IP数据报来传输,由于IP数据报的到达可能会失序,因为TCP报文段的到达也可能会失序。如果必要的话,TCP将对收到的数据进行排序,将收到的数据以正确的顺序交给应用层。
3、流控:TCP连接的每一方都有固定大小的缓存空间。TCP的接收端只允许另一端发送接收端缓冲区能接纳的数据。这将防止发送较快主机引起发送较慢主机的缓冲区溢出现象。
4、重传:当TCP发出一个报文段后,会对该报文段启动一个定时器,等待目标端确认收到这个报文段。若在计时内收不到确认信息,就会重新发送这个报文段。


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

相关文章

TCP三次握手原理

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

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

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

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

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

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

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

TCP握手过程和挥手过程

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

TCP三次握手

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

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

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

为什么TCP需要握手

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

tcp_tw_recycle引起的TCP握手失败

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

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 大部分网络博客的错误解读 首先需要声明的是&#xff0c; 百度搜索到的大…

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

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

TCP 握手没成功怎么办?

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

深入理解TCP三次握手

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

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

三次握手 三次握手过程&#xff1a; &#xff08;1&#xff09;第一次握手&#xff1a;Client将标志位SYN置为1&#xff08;表示要发起一个连接&#xff09;&#xff0c;随机产生一个值seqJ&#xff0c;并将该数据包发送给Server&#xff0c;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;用命令行运行…

带参数的main函数

支持C语言的系统允许main函数有两个参数 int main(int argc,char *argv[]){//argc表示从命令行传入的参数的个数&#xff1b;//argv表示从命令行传入的字符串数组&#xff1b; } 回显命令行参数 #include<stdio.h> int main(int argc,char *argv[]){int i;for(i0;i<…

main主函数参数解析

默认的main函数参数 int main(int argc, char *argv[]) {// 主函数的代码逻辑return 0; }其中&#xff0c;int 是主函数的返回值类型&#xff0c;主函数执行完后会返回一个整数值给操作系统&#xff0c;通常返回值为 0 表示程序正常结束&#xff0c;非 0 的返回值表示程序运行…