前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >网络原理一>TCP协议详解,一文搞懂几大核心机制,连接管理,粘包问题,超时重传,延时应答等等

网络原理一>TCP协议详解,一文搞懂几大核心机制,连接管理,粘包问题,超时重传,延时应答等等

作者头像
用户11305962
发布于 2025-02-02 13:25:31
发布于 2025-02-02 13:25:31
1960
举报
文章被收录于专栏:学习学习

UDPTCP都是应用层中的重要协议,如果做基础架构开发,会用得多一些。 这一篇我们聊一下TCP协议,TCP我们通过其几个核心机制来进行阐述

TCP协议的结构图: 我们知道TCP是一种有连接,面向字节流,全双工,可靠传输特性的网络协议。 TCP我们就是围绕,可靠传输来展开的,要实现可靠传输肯定有很多机制。


一.TCP部分简单的结构说明:

1.源端口和目的端口: 我们知道端口号标识了一个主机上进行通信的不同的应用程序,在应用层上的 要想进行一次通信,就必须涉及 “五元组”--->源端口,目的端口,源IP,目的IP,协议号 这里的源端口和目的端口号,就是应用层的核心内容


2. 4位部首长度 和 选项: 占4个比特位,表示TCP协议报头的长度 选项部分的存在导致TCP报头是,可变的


3.保留位: UDP长度不可变,但是TCP设计就很注意这一点,保留位先不用就是先占个位置


4.TCP6个标志位: TCP6个标志位是TCP协议最核心的部分,标志了建立连接断开连接,和一些状态包等等,下面讲解TCP核心机制时会具体展开。


5.校验和: 校验数据是否修改的手段 为了防止,传输过程中的比特翻转 比特翻转就是传输过程中,光电信号或者电磁波二进制信号,从0->1, 1->0


6.怎么用校验和来判断是否发生比特翻转呢? 首先发送之前,通过数据包中的数据,先计算好一个校验和,然后把校验和连带整个数据报的数据都发送到对端; 对端通过接受到的数据,再算一遍校验和,一比对,如果发现校验和不一样就发送了比特翻转,就丢弃这个TCP数据报。 补:校验和是通过CRC (循环冗余校验)的简算法来校验的,会有比特翻转其实也是小概率事件。



二. TCP十大核心机制:

TCP的可靠性,是尽可能让对端收到信息,但是不是100%


核心机制之一确认应答: TCP给传输的数据进行编号,需要接收方返回一个应答报文,来确认传输是否可靠 TCP6个标志位中 ACK标志位为 1 就表示这个是个应答报文。 1.1. 32位确认序号和32位序号: TCP是面向字节流,所以编号时候是按照字节为单位,每个字节分配一个序号一次递增


1.2. 32位确认序号填法: 把收到的载荷最后一个字节的序号加1返回填到确认序号中,下次从这个序号开始发送



核心机制之二超时重传: 超时重传是针对丢包的情况做出处理,网络上传输数据报是有时间限制的,为网络错综复杂 数据包,数据包太多会导致路由器转发不过来,接收缓冲区满了就丢包了。


2.1.丢包情况: 第一种:传输的ack丢了 第二种:发送的数据丢了 发送方区分不了是哪一种情况都是进行重传

第一种情况,B端收到了两个相同的数据,这里不用担心排序也会同时进行


注意这里纠正一下网上资料的错误: TCP可靠传输的关键机制是三次握手和四次挥手->这个说法是错误的。 正确的是:TCP可靠传输的关键机制是确认应答和超时重传

核心机制之三连接管理: 建立连接 -->三次握手;断开连接 --> 四次挥手


3.1.三次握手: 三次握手通俗说就是发送一个和业务不相关的数据,来和对方打招呼要求和对方建立关系。 在和对方建立连接,就需要和对方同步的保存数据,这个就是依靠TCP6个标志位中 syn 标志位为 1 就表示


三次握手过程理解图:


详细状态图: listen状态,启动服务器时候就有 established状态,表示连接建立完成


三次握手的作用: 1.投石问路,确认网络通信是否通畅。 2.验证双方发送能力和接收能力是否正常 3.协商一些关键信息 (序号从多少开始)

3.2.四次挥手: TCP6个标志位中 fin 标志位为 1 就表示挥手数据报。 断开连接过程:


四次挥手可以变成三次挥手吗? 不能,以为中间的ACK和FIN,两次交互是不同的。 这里ACK在内核进行的; 而这里发FIN是在程序员写的应用程序触发的


四次挥手具体状态图:

谁主动发起FIN,谁就进入TIME_WAIT状态 谁被动发起FIN,谁就进入CLOSE_WAIT状态


CLOSE_WAIT状态:就是应用程序代码等待你调用CLOSE方法。 也就是你的hasNext,到调用close之间,就是CLOSE_WAIT状态

这里如果你的服务器,大量的处于CLOSE_WAIT状态那可能就是出bug了


TIME_WAITE状态 : 就是防止四次挥手丢包问题 这里最棘手就是最后一个,ACK丢了, A主动释放了连接,B收不到ACK就会一直发FIN

这里TIME_WAITE状态就是,让A端多等待一行,确认B没有重传FIN再释放连接。


核心机制之四 滑动窗口: 可靠传输保证了,那效率还没有得到改善,滑动窗口就是针对效率进行改善 滑动窗口就是把,发送的数据,分为一大份一大份来发,就可以用一份等待ACK的时间,发多份提升效率


传输过程中也会丢包 情况一:发送的ACK丢了是不用管的,因为后一个ACK涵盖前一个ACK的信息


情况二:发送的数据丢了,会触发快速重传,快速重传就是只管把丢掉的数据,重新传输即可。 注意:超时重传是发送数据少的情况,快速重是一次发送数据多的时候也就是滑动窗口时会触发

核心机制之五.流量控制: 滑动窗口,窗口越大效率越高,但是不能无限大,太大可靠性就无法保证


流量控制就相当于一个蓄水池,控制进水速度来控制整个流量;在TCP中可以根据接收方的处理速度,来控制发送方的速度。


流量控制依赖于,TCP中16位窗口大小 上面的蓄水池就相当于,接收缓冲区,根据接收缓冲区剩余空间的大小,把这个大小填入TCP16位窗口大小 属性当中。


16位窗口大小的空间大小: 大小最大并不是64kb,而是指数型的增长,理论来说,最大值为2的16次方减一这么大,但是实际上TCP“选项”属性那里有,窗口扩展因子,可以扩展16位窗口大小,远远大于2的16次方


注意:这里如果窗口大小为0,发送方会发一个,窗口探测包,为了触发ACK看看接收方怎么样了 (接收缓冲区的情况还是要依靠接收方的ACK告知,不然发送方不知道缓冲区情况,就不发做出正确的流量控制!)

核心机制之六. 拥塞控制: 拥塞控制就是根据,传输链路的某个设备的转发能力进行限制; 如果不好看某个设备,就以整个设备作为整体,以做实验的方式进行展开


做实验就是:先按照小的窗口来转发数据,如果出现丢包,就减小窗口,没有丢包就加大窗口


大概描述: 先慢启动窗口大小以指数型增长,窗口大小到一个初始值ssthresh,会改变为线性增长,出现丢包的时候就会减小窗口大小,重新慢启动,经过多次这样后,下次丢包不会重新慢启动,而是根据上一次初始值ssthresh,进行线性增长,再经过这个流程多次,最后窗口大小区域稳定。

核心机制之七.延时应答: 一般来说,接收方收到数据报第一瞬间会返回一个ACK,但是我们先不返回ACK,先让接收缓冲区消耗一些数据,再返回ACK,可以提高一定效率。

核心机制之八.捎带应答: 返回业务数据的时候,顺便把上次的ACK也返回去

核心机制之九. 面向字节流: 说到面向字节流,就有一个值得讨论的问题粘包问题


粘包问题:就是通过字节流方式的传输很容易混淆包与包之间的边界,不知道从哪个字节开始是一个完整的应用层数据包。(粘包问题粘的是应用层数据包)


解决: 方法一:约定包与包之间的分隔符:用 "\n"分隔开 方法二:约定包的长度:约定每个包开头4个字节来说明包的长度


上述的解决办法,在应用层协议,HTTP请求中就有体现:GET请求一般没有body,使用空行最为结束标记;POST请求有body的时候,使用Content-Length决定body的长度

核心机制之十.异常情况的处理: TCP在通信过程中存在特殊情况: 1.某个进程崩溃了: 进程崩溃和主动退出没有本质区别,都会释放进程->就是回收文件描述符表的每个资源-->调用socket的close方法,这个时候进程虽然没了,但是断开连接这个时候四次挥手可以正常进行


2.主机关机了: 正常流程的关机本质也是会杀死用户进程和情况一差不多; 但是如果关机时候四次挥手没有全部挥手完成如图,假设A是主机关机状态

B最终也会把连接释放掉


3.主机掉电: 站在四次挥手层面, 3.1.接收方突然掉电: 如果是接收方突然掉电,接收方就不会发送ACK,发送方会先触发超时超时重传,解决不了,会主动 " 重置TCP连接 ", 发送一个复位报文, TCP6个标志位中 RST 标志位为 1 就表示复位报文 ,此时也会有ACK,发送方会主动单方面释放连接


3.2.发送方掉电: 接收方收不到ACK时,会等待一会儿,然后发送一个 "心跳包",看对方是否存活,如果存活就继续等待,没有存活就,像上面接收方掉电一样,发RST复位报文,还是没有反应就单方面释放连接。


4.无线断开了: 中间网线断开,接收方和发送方相当于 “阴阳两隔” ,只需站在不同角度看即可:站在发送方就是相当于“接收方掉电”,反之亦然。

补充:16为紧急指针位 一般TCP一般是按照序号发送和接收的,但是也有例外,16为紧急指针位主要配合TCP6个标志位中 URG 标志位使用,当这个标志位为1 时紧急指针才有效,这个时候就代表某个报文段中存在紧急数据需要处理,直接read到引应用程序中即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Word域的应用和详解
■第一章 域基础 一、域的作用   微软的文字处理软件Microsoft Word系列,其方便和自动化程度是其他任何文字处理软件所望尘莫及的。究其原因,其一,微软有强大的软件开发技术人员队伍。其二,Word与其本公司的操作系统 Windows的密切结合。微软至今也没有公布Windows 操作系统和Word 文字处理软件的源代码,就是为了保住自己的垄断地位。其三,在 Word 中引入了域和宏,将某些特殊的处理方法用函数或编程的的形式交给用户,大大提高了文字处理的灵活性、适应性和自动化程度。   由于域和宏的引入,Word 文档易受病毒的攻击。此外,要灵活使用域和宏,要求用户学习一定的编程基础知识。一提到编程,有的人就感到头痛。其实,Word中的域和宏所包含的知识是非常基础的,也是比较容易学会的。   域相当于文档中可能发生变化的数据或邮件合并文档中套用信函、标签的占位符。   通过域,可以调用宏 命令;也可以通过宏的语句在文档中插入域。   现在我们通过举例来简单了解一下Word 中的域能干些什么:    1. 给段落自动编号,如:1. 2. 3. ,一、二、三、,1.1.1,1.1.2,等等。    2. 插入用常规方法无法实现的字符,如:
全栈程序员站长
2022/07/01
7K0
Word域的应用和详解
Word 域代码:TOA(引文目录)域「建议收藏」
建立一个目录。TOC 域根据标题级别、指定样式或由 TC(目录项)域指定的项目来收集目录项。在使用“插入”菜单中“引用”子菜单中的“索引和目录”命令时,Microsoft Word 将插入 TOC 域。
全栈程序员站长
2022/09/02
2.7K0
一篇文章学会ChIP-seq分析(下)
写在前面:《一篇文章学会ChIP-seq分析(上)》《一篇文章学会ChIP-seq分析(下)》为生信菜鸟团博客相关文章合集,共九讲内容。带领你从相关文献解读、资料收集和公共数据下载开始,通过软件安装、数据比对、寻找并注释peak、寻找motif等ChIP-seq分析主要步骤入手学习,最后还会介绍相关可视化工具。 第五讲:测序数据比对 比对就很简单的了,各种mapping工具层出不穷,我们一般常用的就是BWA和bowtie了,我这里就挑选bowtie2吧,反正别人已经做好了各种工具效果差异的比较,我们直接用就
生信技能树
2018/03/08
12.3K0
一篇文章学会ChIP-seq分析(下)
ESP定律原理详解,只看这一篇文章就够了
闲着也是闲着,在逆向某软件时深入了解了下ESP定律,然后就想写个文章记录并分享下。
Java程序猿
2023/02/22
1.5K0
有 Bug 不会调试 ? 这篇文章很详细 !
Debug 用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用 Debug 模式可以分析定位异常发生的位置,以及在运行过程中参数的变化。通常我们也可以启用 Debug 模式来跟踪代码的运行流程去学习三方框架的源码。
哲洛不闹
2019/11/07
7770
有 Bug 不会调试 ? 这篇文章很详细 !
Word设置“第X页共Y页”页码且不计目录、前言等的页数
  本文介绍在Word文档中,不考虑封面、目录、前言等的页数,为正文添加“第X页,共X页”样式页码的方法。
疯狂学习GIS
2024/01/30
4100
Word设置“第X页共Y页”页码且不计目录、前言等的页数
Markdown如何学习,看完这篇文章就够了。
不论是开发者还是写文章的博主。现在主流编辑器是Markdown,所以学习Markdown语法对提升技能很有帮助。想要学习Markdown,这篇文章就够了。
Python兴趣圈
2023/11/10
4320
Markdown如何学习,看完这篇文章就够了。
一篇文章学会使用 gitk,排查 Git 问题就靠它了
现在软件开发已经离不开版本控制系统。版本控制系统不仅能保留每个文件所有版本的历史信息,还能够方便查找。另外,也能够让团队协作不受空间和时间的限制。
DevOps时代
2020/02/11
7.3K0
一篇文章学会使用 gitk,排查 Git 问题就靠它了
IntelliJ IDEA 2019 快捷键终极大全
常用的有fori/sout/psvm+Tab即可生成循环、System.out、main方法等boilerplate样板代码 。
乔戈里
2019/08/26
2.7K0
一篇文章让你彻底掌握 Shell
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
硬件开源小站
2023/04/07
2.2K0
一篇文章带你了解HTML语法
在做web开发时,我们必不可少的要使用到Html,因为它包含了最基础的网页结构,虽然Html只能帮助我们构建静态网页,但是却是我们最不能缺少的部分,如果把网页比作一个房子,那么Html就是地基,也就是第一件要做的事,可见它的重要性。那么,现在大家就跟随我的脚步去学习下吧。
前端皮皮
2020/11/26
2.7K0
一篇文章带你了解HTML语法
idea快捷键大全最新文档(ctrl快捷键大全截图)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127575.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/25
9480
万字长文!超详细的IntelliJ IDEA 教程!
工欲善其事,必先利其器。在Java开发中挑选一款好的Ide环境能大大提升我们的开发效率,IntelliJ IDEA正是一个不二选择。本教程会介绍怎么对idea进行配置、使用idea进行debug和经常使用的快捷键,最后会推荐几个牛逼的idea插件,大大提升开发体验和效率。
dizhiguo
2022/09/30
4K0
万字长文!超详细的IntelliJ IDEA 教程!
word文档页码不连续编号怎么办_怎样给论文加页码
像下面这个文档,对页面分成了两栏,如果现在想给每一栏都添加一个页码序号,也就是在第1页的左右两栏分别显示第1页和第2页,在第2页的左右两栏分别显示第3页和第4页,这样的效果该如何设置呢?
全栈程序员站长
2022/11/17
2.5K0
Markdown笔记 | 一篇最详细的Markdown 教程 --> 收好
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。Markdown具有一系列衍生版本,用于扩展Markdown的功能(如表格、脚注、内嵌HTML等等),这些功能原初的Markdown尚不具备,它们能让Markdown转换成更多的格式,例如LaTeX,Docbook。Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具,如Pandoc;要么基于网站,如GitHub和Wikipedia,在语法上基本兼容,但在一些语法和渲染效果上有改动。
野原测试开发
2019/07/10
30.9K0
Sublime Text 快捷键
ctrl+shift+t:重新打开最近关闭文件 快捷键功能 ctrl+shift+n 打开新Sublime ctrl+shift+w 关闭Sublime,关闭所有打开文件 ctrl+shift+t 重新打开最近关闭文件 ctrl+n 新建文件 ctrl+s 保存 ctrl+shift+s 另存为 ctrl+f4 关闭文件 ctrl+w 关闭 ctrl+k, ctrl+b 切换侧边栏显示状态 f11 切换全屏状态 shift+f11 免打扰模式状态切换 bac
deepcc
2018/05/16
1.2K0
windows10切换快捷键_Word快捷键大全
今天与大家分享一下最全的Windows10键盘快捷键汇总,包括:Windows10系统快捷键、Windows10内置应用快捷键、Windows10辅助功能快捷键、Microsoft Surface Hub快捷键、Win10手机Continuum模式快捷键,并且本文会随着Win10版本的更新和新快捷键的增加而持续更新。
全栈程序员站长
2022/11/10
5.9K0
一篇极其容易上手的 LaTex 学习文档
LaTeX 有一些列自定义的书写规则组成,有特定的语法,比如Markdown,但语法和变量比前者多。本篇文章,适合刚学习LaTex的小白同学,会对下列几个方面进行介绍:
前端修罗场
2022/07/29
2.7K0
一篇极其容易上手的 LaTex 学习文档
IntelliJ IDEA 2019 快捷键终极大全,速度收藏!
常用的有fori/sout/psvm+Tab即可生成循环、System.out、main方法等boilerplate样板代码 。
芋道源码
2019/08/06
9910
IDEA日常配置和操作小结
本文系统的介绍了开发工具 IDEA 的常用操作,从开发过程中的编码,到运行调试,循序渐进;结合实际项目开发,从常用配置、快捷键使用、编码技巧及调试技巧、常用插件等角度,系统介绍如何高效的使用 IDEA 开发项目。
程序员Leo
2023/08/07
1.5K0
IDEA日常配置和操作小结
相关推荐
Word域的应用和详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档