尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
吃透 TCP:可靠传输完整原理【上】
目录1. TCP协议段格式2. TCP协议特点2.1 确认应答2.2 超时重传2.3 连接管理2.3.1 三次握手2.3.1.1 三次握手的意义2.3.2 四次挥手TCPTransmission Control Protocol传输控制协议是传输层面向字节流的全双工不可靠传输协议。1. TCP协议段格式TCP协议段格式包含首部选项可选和数据部分。格式如图各个字段的含义1.源端口号/目的端口号分别表示数据从哪个应用进程源端口号来到哪个应用进程目的端口去2. 序号/确认号后文确认应答和超时重传详细介绍。3.首部长度TCP头部长度用来表示TCP头部有多少个32位bit4个字节所以TCP首部的最大长度是 15*460 。4.标志位URT表示紧急指针是否有效。ACK表示确认号是否有效。PSH提醒接收端将接收缓冲区的数据读走。RST对方要求重新建立连接。我们把带有RST的报文称为复位报文段。SYN要求建立连接。我们把带有SYN的报文称为同步报文段。FIN向对方要求断开连接。我们把带有FIN的报文称为结束报文段。5.窗口大小后面讲到滑动窗口后再详细介绍。6.校验和发送端填充该字段进行CRC计算校验和。接收端校验不通过则认为该数据出现错误直接丢弃。此处的校验和不仅包括首部还包含数据部分。7.紧急指针用来指定哪些数据需要紧急传。8 .头部选项后面详细讲。2. TCP协议特点我们都知道UDP是不可靠传输所以它的传输过程是很简单的。但是TCP是可靠传输但网络传输的过程中会遇到千奇百怪的问题为了保证TCP传输的可靠性TCP协议设置了一系列机制来保证数据传输的可靠性和高效性以下一系列TCP协议的机制可以让我们更深入地了解TCP协议的传输可靠性。2.1 确认应答确认应答是指发送端向接收端发送数据了之后接收端在收到并校验成功数据后向发送端发送确认应答ACK告知发送端已成功接收到并发送确认号告知下一次从哪里开始发TCP将每个字节的数据都进行了编号即为序列号如图2.2 超时重传发送方发送完数据后等待接收方的确认应答但不会一直等待TCP设置了最长的等待时间一旦超过该时间还没有收到应答消息就会进行重新传输数据给接收方这就叫超时重传。但发送方没有收到确认应答有几种情况数据在发送过程中丢失产生丢包。主机B发送的确认报文ACK丢失。还有一种情况就是由于网络拥堵导致发送时间超出最长等待时间触发重传。于是主机B会收到大量重复数据通过前面提到的序列号就可以区分哪些是重复数据并将重复数据丢弃。❓问题那么超时时间是如何确定的呢在比较理想的情况下此时选择一个最短的时间能够保证 “ 确认应答一定能够在这个时间返回 ” 。但是由于网络的不稳定性超时时间的长短是有差异的当超时时间太短会频繁地发送重复包当超时时间太长会影响重传机制的。TCP为了在任何情况下都能够有高效的通信因此会动态计算超时时间。Linux中Windows和BSD Unix通常以500ms为一个单位控制超时时间每次设置超时时间都以500ms的整数倍进行控制。如果重发一次仍然没有收到确认应答则以2 * 500ms设置超时时间。如果还是没有反应则以4 * 500ms设置超时时间呈指数倍增长。如果重传次数达到一定限度时发送方就会认为接收方或者网络出现异常强制关闭。2.3 连接管理连接管理分为建立连接和断开连接管理TCP使用 “三次握手” 使双方建立连接使用 “四次挥手” 使上方断开连接。2.3.1 三次握手纯靠文字来描述 “三次握手” 机制难以让大家理解可以先看图客户端先向服务器发送syn同步请求等待服务器发送ack确认应答。【第一次握手】服务器向客户端发送ack确认应答客户端→服务器连接成功同时也发送syn同步请求等待对方ack。【第二次握手】客户端最后向服务器发送ack确认应答服务器→客户端连接成功。【第三次握手】由于步骤②、③都是操作系统内核同时完成的故这两个步骤可以合并故整个TCP建立连接的过程就是这三个步骤称为 “三次握手” 。图中的状态表示的解释CLOSED不存在的状态tcp还没有建立连接LISTEN服务器监听准备随时建立连接SYN_SENT发送syn同步请求SYN_RCVD服务器接收到同步信息并返回了ack和synESTABLISHED表示连接已建立接下来双方可以进行通信。2.3.1.1 三次握手的意义首先看了三次握手的过程有些小伙伴可能会有些疑惑❓问题为什么一次握手不行也就是为什么服务器向客户端返回了ack确认消息之后还要向客户端发送syn同步请求呢不是已经建立了连接了吗☑️答此时的连接成功只是客户端向服务器传输数据且服务器可以成功接收这个方向的成功但并不知道服务器是否能够成功向客户端发送响应所以需要向客户端发送syn同步请求。举个简单的例子例如要测试两个正在用耳机语音时的耳机的连通性耳机A与耳机BA先向B说一句“你好”B收到后回答“嗯呢”但此时B并不知道A是否听到自己的回答于是A听到B的回答后再说“OK了”此过程也可以视作是“三次握手”。那么三次握手的意义是什么总结来讲为以下3点✅投石问路初步验证连接是否通常✅验证通信双方的收发能力是否匹配✅协商关键信息如下一次发送从第几个序号开始2.3.2 四次挥手TCP使用 “ 四次挥手 ” 的策略使通信双方断开连接如图设备A向设备B发送FIN断开连接请求等待设备B返回ACK确认应答。【第一次挥手】设备B收到FIN后立即返回ACK确认应答【第二次挥手】设备B向设备A发送FIN断开连接请求等待设备A发送ACK确认应答。【第三次挥手】设备A收到FIN后立即返回ACK确认应答【第四次挥手】图中的状态表示的解释FIN_WAIT_1主动方发完 FIN等 ACKFIN_WAIT_2主动方收到 ACK等对方 FINCLOSE_WAIT被动方收到 FIN等待应用程序关闭 socketLAST_ACK被动方发完 FIN等待最后的 ACKTIME_WAITTCP主动关闭一方进入确认关闭的最后的一个状态CLOSED主动方发完最后 ACK等待 2MSL。下一节继续介绍TCP可靠传输的特点滑动窗口、流量控制、拥塞控制、延迟应答、捎带应答、面向字节流、 粘包问题、异常情况等感兴趣的小伙伴不妨点个关注再走叭~
RELATED

相关推荐

如何3步实现QQ连连看秒破:基于Python图像识别的自动化解决方案

如何3步实现QQ连连看秒破:基于Python图像识别的自动化解决方案

如何3步实现QQ连连看秒破:基于Python图像识别的自动化解决方案 【免费下载链接】Auto-Lianliankan 基于python图像识别实现的连连看外挂,可实现QQ连连看秒破 项目地址: https://gitcode.com/gh_mirrors/au/Auto-Lianliankan 你是否曾在QQ连连看游…

📅 2026/10/5 15:10:06
IoT全栈硬件开发:从云端到设备端的关键技术解析

IoT全栈硬件开发:从云端到设备端的关键技术解析

1. 从零构建IoT全栈硬件能力的必要性 在物联网项目落地的过程中,最常遇到的困境就是"最后一米"的连接问题。所谓最后一米,指的是从云端平台到物理设备的最终连接环节。这个环节往往成为项目成败的关键,却也是最容易被忽视的部分。 …

📅 2026/10/7 17:13:02
从 TCP 90μs 到 SHM 28μs:我的 RPC 框架零拷贝优化历程

从 TCP 90μs 到 SHM 28μs:我的 RPC 框架零拷贝优化历程

从 TCP 90μs 到 SHM 28μs:我的 RPC 框架零拷贝优化历程 同一个 echo 请求,本机 TCP 走完要 90μs,换成共享内存只要 28μs。记录一下踩的坑,也聊聊两种通信方式到底差在哪。 为什么会慢——TCP 本机通信其实绕了远路 先讲一个不…

📅 2026/9/12 4:45:11
MORE NEWS

更多资讯

📰

Halcon计量模型详解:从圆到矩形的亚像素测量与参数调优

做视觉项目这些年,被项目方问得最多的一个问题不是算法选型,而是:“你能不能又准又快地量出这个圆的半径?”以前我第一反应是灰度阈值加fit_circle_contour_xld,碰上光照稳定的实验室图确实没啥问题,但一上…

📰

多目标轨迹追踪实战:从检测到可信绘图的完整工程链路

1. 这不是“画线游戏”,而是让机器真正“看见”运动的底层能力“物体轨迹追踪与轨迹绘制”这八个字,乍看像美术课作业,实则是计算机视觉领域里最硬核的实战命题之一。我带过不少刚入门的开发者,一上来就想直接调用OpenCV的cv2.lin…

📰

AI重写工业软件:从CAD到MES的底层逻辑与演进路径

算起来,我在工业软件这个圈子里待了十几年,从早期守着单机版CAD画图,到后来折腾PLM、仿真平台,再到这两年眼看着大模型往工业现场里钻,一个很明显的感受是: AI时代工业软件的演化趋势,不是&quo…

📰

基于SpringBoot+Vue的汽车销售平台毕业设计开发实战

做毕设最怕什么?不是不会写代码,而是拿到题目之后不知道从哪下手,做到一半发现功能串不起来、答辩时说不出设计理由。汽车销售网站这个题看上去是标准的“增删改查”,实际上要把用户端看车、预约试驾、在线下单,加上后…

📰

Bonding粒子爆破解析:粒子约束与破碎模拟实战

刚看到“Bonding粒子爆破解析”这个标题,我第一反应是:这不就是做个爆炸吗?粒子系统里拖个爆炸预设,加个噪波,完事。但真正在项目里被要求做“一个完整的雕塑在镜头前突然碎裂炸开、碎片还带着互相拉扯的余劲”这种效果…

📰

Git分支拉取与commit合并实战:从原理到命令细节

前阵子做模拟项目X的时候,我们同时开了两个功能分支:我在feature/report这边写导出模块,另一个同事在feature/data那边重构数据接入层。等到功能联调,我必须把他那一整套改动完整地拉到我这边来跑。结果一看远端分支,十…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬