网络原理 ——TCP 协议

TCP 报文结构

TCP 头部 20字节(无选项),关键字段:

字段长度(bit)说明
源端口16发送方端口
目的端口16接收方端口
序列号(seq)32数据字节的编号
确认号(ack)32期望收到的下一个字节编号(ACK=1时有效)
数据偏移4TCP 头部长度(单位:4字节)
控制位6URGACKPSHRSTSYNFIN
窗口大小16接收方的可用缓冲区大小
校验和16数据完整性校验
紧急指针16URG=1 时有效,指示紧急数据位置

TCP 核心特性

一、 可靠性(Reliability)

TCP 确保数据 无丢失、无重复、无错误、按序到达,主要依赖以下机制:

  • 确认应答(ACK):接收方收到数据后,发送 ACK(Acknowledgment) 确认。

  • 超时重传(Retransmission):如果发送方未收到 ACK,会在超时后重传数据。

  • 序列号(Sequence Number):每个字节分配唯一编号,解决 乱序 和 重复 问题。

  • 校验和(Checksum):检测数据是否损坏,若校验失败则丢弃。

1、确认应答

发送方和接收方之间用来确认对方是否收到信息的机制,发送应答报文的控制位的 ACK 为有效 1。如图每次发送消息都会确认是否送达。

但是在网络中是多变的,有可能会出现 “后发先至” 的情况存在。就如下图所示由于每条数据报的发送路径不一样,会造成消息的混乱,本来要给骨干涨工资的,变成说“say you”了,为了避免出现这样的情况,就引入了 “序号和确认序号” 。

2、序列号

它会给每一条信息编号,在接收方收到消息后在返回ACK时返回收到的序号,此时也避免了发送方不知道丢失的数据报,也可以根据这个编号在缓冲区进行排序。在下图中假如发送方一直没有接收到2001的应答报文,则发送方就知道1001~2000的数据丢失。然而ACK 也会丢包,发送方没有收到ACK,那怎么知道数据到没到呢?这就要涉及下一个特性 “超时重传”

3、超时重传

超时重传是对确认应答的重要补充,主要就是针对丢包的场景。发送方没有收到ACK有两种情况,一种是发送的数据包丢包,一种是接收方返回的ACK丢包。

第一种情况,在没有收到ACK超过一定时间后,就会触发超时重传机制,这是理所应当的。

第二种情况,也会触发超时重传,但是接收方已经收到一次数据,面对接收两次数据,在操作系统维护的一个 “接收缓冲区”(内存空间)中就会根据序列号进行 “去重”,以保证接收到读取到的数据是有序且不重复的。

万一重传后右没有收到应答,则会等待更长时间后继续重传,直到达到重传时间达到上限,依旧没有成功,TCP 连接就会“重置”(涉及“复位报文”控制位RST),发送方就会单方面断开连接。

二、连接管理(Connection-Oriented)

通信前必须先 建立连接,通信后 释放连接

1、三次握手(Three-Way Handshake) 

意义:

  • 投⽯问路,验证通信链路是否畅通
  • 验证通信双方的发送能力和接收能力
  • 协商关键信息

建立连接:

  • SYN(Client → Server):SYN=1, seq=x(同步序列号)。
  • SYN+ACK(Server → Client):SYN=1, ACK=1, seq=y, ack=x+1
  • ACK(Client → Server):ACK=1, seq=x+1, ack=y+1

                Client                                 Sserver

2、四次挥手(Four-Way Handshake) 

释放连接:
  • FIN(主动方 → 被动方):FIN=1, seq=u
  • ACK(被动方 → 主动方):ACK=1, ack=u+1(半关闭状态)。
  • FIN(被动方 → 主动方):FIN=1, seq=v
  • ACK(主动方 → 被动方):ACK=1, ack=v+1(等待 2MSL 后关闭)。

TIME_WAIT

想⼀想,为什么是TIME_WAIT的时间是2MSL?

  • MSL是TCP报⽂的最⼤⽣存时间,因此TIME_WAIT持续存在2MSL的话
  • 就能保证在两个传输⽅向上的尚未被接收或迟到的报⽂段都已经消失(否则服务器⽴刻重启,可能会收到来⾃上⼀个进程的迟到的数据,但是这种数据很可能是错误的);
  • 同时也是在理论上保证最后⼀个报⽂可靠到达(假设最后⼀个ACK丢失,那么服务器会再重发⼀个FIN.这时虽然客⼾端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK);
CLOSE_WAIT

⼀般⽽⾔,对于服务器上出现⼤量的 CLOSE_WAIT 状态,原因就是服务器没有正确的关闭 socket,导致四次挥⼿没有正确完成。 这是⼀个 BUG.只需要加上对应的close即可解决问题.

值得注意的是,在四次挥手过程中,有可能只发生三次,原因是因为TCP 有延时应答机制

三、 流量控制(Fow Control)

  • 滑动窗口(Sliding Window):接收方通过 窗口大小(Window Size) 告知发送方还能接收多少数据,防止发送过快导致缓冲区溢出。

  • 零窗口探测(Zero Window Probe):如果接收方窗口为0,发送方会定期发送探测包,直到窗口恢复。

1、滑动窗口

窗口的大小就是一次发送数据的多少,在一组数据发过去之后,就会等待接收方回复ACK,这就从之前的一次等待一条回复变成一次等待多条回复,大大提高了效率。在这基础上,滑动窗口不是每次都要等到一组ACK接收到了才会发送下一组数据,而是会根据接收到的回复,立即发送下一条数据,如下图所示此时就像一个窗口向右滑动。

2、如果出现丢包咋办?

情况一:数据包到达,ACK 丢失

此时在滑动窗口下不用做任何处理,因为 ACK 有序列号确认规则,假如只收到 5001 的ACK 则表示 0~ 5000 的数据都已经收到。但是如果是最后一条ACK 则会触发确认应答、超时重传。

情况二:数据包丢失

B 反复向 A 索要没有收到的1001 这个数据 A 感知到 B 连续多次索要1001之后就会认为 1001 丢包触发重传 1001.
一旦 1001-2000 数据B收到了
此时B观察发现,自己的接受缓冲区里,已经有2001-7000 这些数据了接下来从 7001 索要即可~~

3、零窗口探测

接收端处理数据的速度是有限的.如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继⽽引起丢包重传等等⼀系列连锁反应.

  • 接收端将⾃⼰可以接收的缓冲区⼤⼩放⼊TCP⾸部中的"窗⼝⼤⼩"字段,通过ACK端通知发送端;
  • 窗⼝⼤⼩字段越⼤,说明⽹络的吞吐量越⾼;
  • 接收端⼀旦发现⾃⼰的缓冲区快满了,就会将窗⼤⼩设置成⼀个更⼩的值通知给发送端;
  • 发送端接受到这个窗⼝之后,就会减慢⾃⼰的发送速度;

当发送方知道缓冲区剩余大小为0时,就会暂停发送,直到得知接收方缓冲区不再满。这里的有两种方式得知,一是接收方主动通知,二是通过发送方周期性发送的一个零窗口探测包

四、 拥塞控制(Congestion Control)

防止网络过载,实现动态平衡的主要机制:

  1. 慢启动(Slow Start):窗口从 1 MSS(最大报文段)开始,指数增长,直到 阈值(ssthresh)

  2. 拥塞避免(Congestion Avoidance):窗口 线性增长,避免过快引发丢包。

  3. 快速重传(Fast Retransmit):收到 3个重复ACK 时立即重传(不等待超时)。

  4. 快速恢复(Fast Recovery):重传后直接进入 拥塞避免,而非慢启动。

五、延时应答

六、捎带应答

七、 基于字节流(Byte Stream)

  • 无消息边界:数据被视为 连续的字节流,应用层需自行解析(如 HTTP 用 Content-Length 或 Transfer-Encoding: chunked)。

  • 缓冲机制:TCP 在发送端和接收端维护缓冲区,提高传输效率。

粘包问题

八、 全双工通信(Full-Duplex)

  • 同一连接可 同时双向传输,双方独立维护 序列号 和 ACK

九、异常情况

TCP vs UDP

特性TCPUDP
连接方式面向连接(三次握手)无连接
可靠性可靠(ACK、重传)不可靠
流量控制滑动窗口
拥塞控制复杂算法(慢启动、拥塞避免等)
数据顺序保证按序到达不保证
头部大小20 字节(最小)8 字节
传输效率较低(协议开销大)较高
适用场景HTTP、FTP、SSH、数据库DNS、视频流、游戏、QUIC

总结

TCP 的核心目标是 可靠传输,通过 连接管理、ACK、重传、流量控制、拥塞控制 等机制实现。虽然效率不如 UDP,但适用于 要求数据完整性的场景。理解 TCP 对网络编程、性能优化、故障排查至关重要。

本篇文章的插图部分来自《图解 TCP/IP》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#使用sftp远程拷贝文件

需要下载 的包:Core.Renci.SshNet 下载依赖包的时候需要注意版本,高版本的.net环境不支持会用不了,我用的.net5,所以下载的2021.10.2 功能的核心式创建一个SftpClient,并传入所需要的参数:远程IP地址,端口…

文本预处理(NLTK)

1. 自然语言处理基础概念 1.1 什么是自然语言处理 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于…

socket编程基础

上一篇 --- 网络基础概念(下)https://blog.csdn.net/Small_entreprene/article/details/147320155?fromshareblogdetail&sharetypeblogdetail&sharerId147320155&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link 理…

CSS 解决手机浏览器默认行为(点击出现蓝色背景)

最近写了一个 Web 应用,可以兼容手机端和PC端,在PC端调试的时候没有发现这个问题,但是在手机上或者PC浏览器改成手机模式进行调试的时候就会出现下面这个场景: 这是两个 div,点击的时候,会出现一个蓝色的背…

多模态大语言模型arxiv论文略读(三十八)

Tables as Texts or Images: Evaluating the Table Reasoning Ability of LLMs and MLLMs ➡️ 论文标题:Tables as Texts or Images: Evaluating the Table Reasoning Ability of LLMs and MLLMs ➡️ 论文作者:Naihao Deng, Zhenjie Sun, Ruiqi He, A…

聊聊Spring AI Alibaba的YuQueDocumentReader

序 本文主要研究一下Spring AI Alibaba的YuQueDocumentReader YuQueDocumentReader community/document-readers/spring-ai-alibaba-starter-document-reader-yuque/src/main/java/com/alibaba/cloud/ai/reader/yuque/YuQueDocumentReader.java public class YuQueDocument…

OCR定制识别:解锁文字识别的无限可能

OCR 定制识别是什么? OCR,即光学字符识别(Optical Character Recognition) ,它就像是一个神奇的 “文字翻译器”,能把图片里的文字转化成计算机可编辑的文本。比如,你扫描一份纸质文档成图片&am…

麒麟系统(基于Ubuntu)上使用Qt编译时遇到“type_traits文件未找到”的错误

在麒麟系统(基于Ubuntu)上使用Qt编译时遇到“type_traits文件未找到”的错误,通常是由于C标准库头文件缺失或项目配置问题导致的。以下是逐步解决方案: 1. 安装C标准库和开发工具 确保系统已安装完整的开发工具链和标准库&#…

服务器上安装node

1.安装 下载安装包 https://nodejs.org/en/download 解压安装包 将安装包上传到/opt/software目录下 cd /opt/software tar -xzvf node-v16.14.2-linux-x64.tar.gz 将解压的文件夹移动到安装目录(/opt/nodejs)下 mv /opt/software/node-v16.14.2-linux-x64 /opt/nodejs …

Vue3 + Vite + TS,使用 ExcelJS导出excel文档,生成水印,添加背景水印,dom转图片,插入图片,全部代码

Vue3 Vite TS,使用 ExcelJS导出excel文档,生成水印,添加背景水印,dom转图片,插入图片,全部代码 ExcelJS生成文档并导出导出表头其他函数 生成水印设置文档的背景水印dom 转图片插入图片全部代码 ExcelJS 读取&#…

devops自动化容器化部署

devops 一、简单案例体验gitlabrunner部署静态文件二、devops企业级部署方案1、流程图2、依赖工具3、流程图4、主机规划5、安装工具软件1、安装git2、安装gitlab3、安装jenkins-server4、安装harbor5、安装web-server,也就是部署服务的机子,需要安装dock…

高级 SQL 技巧:提升数据处理能力的实用方法

在数据驱动的时代,SQL 作为操作和管理关系型数据库的标准语言,其重要性不言而喻。基础的 SQL 语句能满足日常的数据查询需求,但在处理复杂业务逻辑、进行数据分析和优化数据库性能时,就需要掌握一些高级 SQL 技巧。这些技巧不仅能提高查询效率,还能实现复杂的数据处理任务…

21.disql命令登录达梦数据库,查询并操作数据库

目录 1.连接达梦数据库 1.1 windows或linux系统 步骤(1):打开终端窗口 步骤(2):进入梦数据库安装目录下的 bin 文件夹 步骤(3):用disql命令进行登录 1.2 docker部署…

N8N MACOS本地部署流程避坑指南

最近n8n很火,就想在本地部署一个,尝尝鲜,看说明n8n是开源软件,可以在本地部署,于是就尝试部署了下,大概用了1个多小时,把相关的过程记录一下: 1、基础软件包 abcXu-MacBook-m2-Air…

qt之开发大恒usb3.0相机一

1.在大恒相机给的sample里没有看见qt开发的demo. 第一步先运行c sdk中中的demo,看了下代码,大恒使用的UI框架是MFC.然后 vs2022编译。运行结果 第一步,先用qt进行坐下页面布局,如下图(保存图片的地方做了些更改&#…

leetcode-枚举

枚举 3200. 三角形的最大高度 题目 给你两个整数 red 和 blue,分别表示红色球和蓝色球的数量。你需要使用这些球来组成一个三角形,满足第 1 行有 1 个球,第 2 行有 2 个球,第 3 行有 3 个球,依此类推。 每一行的球必…

DeepSeek智能时空数据分析(三):专业级地理数据可视化赏析-《杭州市国土空间总体规划(2021-2035年)》

序言:时空数据分析很有用,但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要,然而,三大挑战仍制约其发展:技术门槛高,需融合GIS理论、SQL开发与时空数据库等多领域知识;空…

如何用WordPress AI插件自动生成SEO文章,提升网站流量?

1. 为什么你需要一个WordPress AI文章生成插件? 每天手动写文章太耗时?SEO优化总是不达标?WordPress AI插件能帮你24小时自动生成原创内容,从关键词挖掘到智能排版,全程无需人工干预。 痛点:手动写作效率低…

鼠标指定范围内随机点击

鼠标指定范围内随机点击 点赞神器 将鼠标移动到相应位置后按F5 F6键,设置点击范围, F8开始,ESC中止。 有些直播有点赞限制,例如某音,每小时限制3千次,可以设置1200毫秒,3000次。 软件截图&#…

数据库设置外键的作用

数据库外键(Foreign Key)是关系型数据库中用于建立表与表之间关联关系的重要约束,其核心作用是确保数据的一致性、完整性和关联性。以下是外键的主要作用及相关说明: 1. 建立表间关联关系 外键通过引用另一张表的主键&#xff0…