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

TCP三次握手和四次断开 - 指南

 三次握手

TCP的三次握手 (建立连接)
三次握手的目的是为了确认客户端和服务端的发送和接收能力都正常,并同步序列号,为后续可靠数据传输做准备。
过程如下:
第一次握手 (SYN)
客户端 -> 服务端:发送一个TCP数据包。
标志位:SYN = 1 (表示请求建立连接)
序列号:seq = x (客户端随机生成的一个初始序列号)
客户端状态:从 CLOSED 进入 SYN-SENT (同步已发送)。
第二次握手 (SYN + ACK)
服务端 -> 客户端:发送一个TCP数据包。
标志位:SYN = 1, ACK = 1 (表示同意建立连接,并确认客户端的序列号)
序列号:seq = y (服务端随机生成的一个初始序列号)
确认号:ack = x + 1 (表示期望收到客户端的下一个数据包的序列号是x+1,同时也确认了收到了客户端的SYN)
服务端状态:从 LISTEN 进入 SYN-RCVD (同步已收到)。
第三次握手 (ACK)
客户端 -> 服务端:发送一个TCP数据包。
标志位:ACK = 1
序列号:seq = x + 1 (因为第一次握手的SYN包消耗了一个序列号)
确认号:ack = y + 1 (表示期望收到服务端的下一个数据包的序列号是y+1,确认了收到了服务端的SYN)
客户端状态:进入 ESTABLISHED (连接已建立)。
服务端状态:收到这个ACK后,也进入 ESTABLISHED (连接已建立)。
至此,连接建立成功,双方可以开始数据传输。

四次断开

TCP的四次断开 (挥手)
四次挥手的目的是为了可靠地终止双向连接。因为TCP连接是全双工的,每个方向必须单独关闭。
过程如下:
第一次挥手 (FIN)
主动关闭方 (假设是客户端) -> 被动关闭方 (服务端):发送一个TCP数据包。
标志位:FIN = 1 (表示请求终止连接)
序列号:seq = u (等于之前已传送数据的最后一个字节的序列号加1)
客户端状态:从 ESTABLISHED 进入 FIN-WAIT-1 (终止等待1)。
第二次挥手 (ACK)
被动关闭方 (服务端) -> 主动关闭方 (客户端):发送一个TCP数据包。
标志位:ACK = 1
序列号:seq = v
确认号:ack = u + 1 (确认收到了客户端的FIN请求)
服务端状态:从 ESTABLISHED 进入 CLOSE-WAIT (关闭等待)。
客户端状态:收到这个ACK后,状态从 FIN-WAIT-1 进入 FIN-WAIT-2 (终止等待2)。
此时,TCP连接处于半关闭状态。 客户端已经没有数据要发送了,但服务端可能还有数据要发送给客户端,客户端也需要接收。这个状态就是 CLOSE-WAIT。
第三次挥手 (FIN)
当服务端也没有数据要发送时,它会发起自己的关闭连接请求。
被动关闭方 (服务端) -> 主动关闭方 (客户端):发送一个TCP数据包。
标志位:FIN = 1, ACK = 1
序列号:seq = w (在半关闭状态期间,服务端可能又发送了一些数据)
确认号:ack = u + 1 (这个确认号不变,因为它还是对第一次FIN的确认)
服务端状态:从 CLOSE-WAIT 进入 LAST-ACK (最后确认)。
第四次挥手 (ACK)
主动关闭方 (客户端) -> 被动关闭方 (服务端):发送一个TCP数据包。
标志位:ACK = 1
序列号:seq = u + 1 (因为第一次挥手的FIN包消耗了一个序列号)
确认号:ack = w + 1 (确认收到了服务端的FIN请求)
客户端状态:从 FIN-WAIT-2 进入 TIME-WAIT (时间等待)。等待 2MSL (两倍的最大报文段生存时间) 后,状态变为 CLOSED。
服务端状态:收到这个ACK后,状态从 LAST-ACK 进入 CLOSED。
至此,连接完全关闭。

TCP机制

四大计时器

重传计时器(Retransmession)

为了防止数据报丢失,当TCP发送一个报文时,就启动重传计时器,有2种情况:

1.若在计时器超时之前收到了特定报文的确认,则撤消这个计时器

2.特定数据报在计时器超时前没有收到确认,则重传该数据报,并把计时器复位

持久计时器(Persistance)

避免死锁,当发送端TCP接收到rwnd=0的确认时,就启动持久计时器,当计时器截止时间到时,发送端TCP需要发送一个特殊的报文,叫做探测报文,该报文只有1字节,有序号,但无需确认,探测报文提醒接收端TCP:确认已丢失,必须重传,持久计时器截止时间设置为重传时间的数值,但是,如果没有收到从接收端回来的响应,则需要发送另外一个探测报文,并将持久计时器的值加倍和复位,如果结果和上面一样,发送端继续发送探测报文,直到其截止时间增大到阈值(通常为60s)为止,在这以后,发送端每60s发送一个探测报文,直到窗口重新打开。

保活计时器(keep-alive)

在某些实现中要使用keeplive timer来防止两个TCP之间出现长时间的空闲

比如客户端打开了服务器端的连接,传送了一些数据,然后就保持静默了,也许该客户端除了故障,在这种情况下,这个连接就永远处于打开状态,保活计时器的解决方法为,当服务器端收到客户端的信息时,就把计时器复位,超时通常设置2小时,若服务器2小时还没有收到客户的信息,就发送探测报文,若发送10个同样的报文(每个相隔75s)还没有收到响应,就认为客户端出了故障,终止这个连接。

时间等待(time-wait)

如果最后一个ACK报文丢失了,那么服务器TCP(它为最后的FIN设置了计时器)以为它的FIN丢失了,因而重传

TCP流控/拥塞管理

原理

接收端处理数据的速度是有限的,如果发送方的速度太快,就会把缓冲区u打满。这个时候如果继续发送数据,就会导致丢包等一系列连锁反应。

所以TCP支持根据接收端能力来决定发送端的发送速度。这个机制叫做流控制。

窗口大小

(接收端向发送端主机通知自己可以接受数据的大小,这个大小限制就叫做窗口大小)。

什么是请求

一次http请求

keepalived

长连接设置。Httpd守护进程,一般都提供了keep-alive timeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个 keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住 keepalive_timeout秒后,才开始关闭这个连接。当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,便是 keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http连接。

关闭长连接会如何

直接关闭http连接。

http://www.jsqmd.com/news/343133/

相关文章:

  • 大数据计算机毕设之基于Python+Echart的学生心理健康数据可视化系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • OpenClaw/Memu/Nanobot
  • 【报告】东鹏饮料印尼落子:2亿美元携手华商巨头,共筑出海桥头堡
  • 在Docker中运行OpenClaw
  • GJ504b 的 React 进阶之路:Day 4
  • 【无线传感器网络】多级动态优化智能LEACH与成本效益深度信念网络附Matlab代码
  • 任何东西都可以转成 Base64!?
  • spring6-注解式开发
  • CodeChef - TREEQUER
  • AI应用开发从入门到精通:打破“调接口”误区,收藏这一篇就够了!
  • 【无人机协同路径规划】基于六种最新优化算法(TOC、MSO、AE、DOA、GOA、OX)求解多个无人机协同路径规划研究(可以自定义无人机数量及起始点)附Matlab代码
  • 大模型Agent应用开发教程(非常详细),手把手教你从零构建智能体!
  • 从 synchronized 到 ConcurrentHashMap:一个小小的并发控制策略升级优化,证明我还是初级程序员
  • Claude Code生成UI的3个技巧
  • 【无人水面艇】USV路径跟踪LOS控制算法仿真附Matlab代码
  • Java面试早就不问八股文了!都是面试场景题,没做过根本回答不上来!
  • SQL性能优化秘籍:速度与简洁兼得
  • 汉中装修风格怎么选?汉府人家装饰本地业主实测好看风格盘点 - 一个呆呆
  • 大数据毕设项目推荐-基于Python+Echart的学生心理健康数据可视化系统设计与实现【附源码+文档,调试定制服务】
  • CSSCI期刊官宣:同一个作者一年内只能在核心期刊上发表一篇论文,你怎么看?
  • 大数据毕设选题推荐:Python大数据基于ECharts的数据分析可视化大屏基于Python+Echart的学生心理健康数据可视化系统设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 【无线传感器网络路由协议LEACH的研究与改进】LEACH、LEACH-C、TS-I-LEACH比较研究附Matlab代码
  • UOJ Round #33 部分题目题解
  • 中科院分区表发布在即!人工智能领域7本期刊升1区TOP,2025中科院分区升降对比!
  • 分布式锁的特性是什么?如何实现分布式锁?
  • 千兆宽带在英国城乡地区加速普及
  • 计算机大数据毕设实战-基于Python+Echart的学生心理健康数据可视化系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Java 企业级 Agent 实战:完整工程模板 · 多 Agent + Graph 工作流落地指南
  • 老年人评估项目开发记录8
  • 5步搞定|宠物AI识别与智能剪辑开发实践