网络编程6——TCP协议的两大特性:面向字节流 + 异常情况 + 沾包BUG解决方案

news2024/12/22 23:48:57

文章目录

  • 前言
  • 一、TCP协议段与机制
    • TCP协议的特点
    • TCP报头结构
    • TCP协议的机制与特性
  • 二、TCP协议的 面向字节流特性
    • TCP协议接发数据的流程
    • TCP协议面向字节流导致的BUG
  • 三、TCP协议的 异常情况
  • 总结


前言

本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下!

本文讲解了TCP的两大特性以及沾包问题的解决方案


一、TCP协议段与机制

TCP协议的特点

特点说明
有连接刻意保存对端的相关信息
可靠传输尽全力将数据传输过去不是百分百成功,自己会知道数据传输是否成功
面向字节流以一个字节为基本单位(一个数据可以分成几份 多次发多次收)
有接收缓冲区,也有发送缓冲区接收缓冲区:接收方用一个特殊的数据结构来组织接收到的数据,使用数据就从接收缓冲区拿,然后接收缓冲区就会删除已经拿走的数据。
发送缓冲区:发送方将要发送的数据存入发送缓冲区,等发送缓冲区满了,才会集中发送一次,可能会导致BUG(数据写到了发送缓冲区而没有发送出去),因此代码中发送数据时尽量刷新缓冲区
大小不受限对于要传输的数据大小没有要求
全双工一条通信路径,双向通信。(可以同时发送和接收数据)

TCP报头结构

在这里插入图片描述

6位标志位
在这里插入图片描述


TCP协议的机制与特性

TCP的协议段格式,比UDP的协议段格式复杂一万倍!😵😵
所以他的机制与功能也比UDP更加强大!!😇😇

TCP对数据传输提供的管控机制,主要体现在两个方面: 安全和效率
这些机制和多线程的设计原则类似: 保证数据传输安全的前提下,尽可能的提高传输效率

TCP协议的机制与特性
1️⃣确认应答
2️⃣超时重传
3️⃣连接管理
4️⃣滑动窗口
5️⃣流量控制
6️⃣拥塞控制
7️⃣延时应答
8️⃣捎带应答
9️⃣面向字节流
🔟异常处理

  • 1️⃣-5️⃣是TCP协议保证数据传输安全的 安全机制 TCP协议的三大安全机制
  • 6️⃣-8️⃣是TCP协议提高传输效率的 效率机制 TCP协议的五大效率机制
  • 9️⃣-🔟是TCP协议的 两大特性

二、TCP协议的 面向字节流特性

TCP协议接发数据的流程

创建一个TCP的Socket,同时在内核中创建一个 发送缓冲区 和一个 接收缓冲区。
因此TCP协议的发送接收数据就有以下几个特点。

发送数据时
1️⃣调用write时,数据以字节流的形式会先写入发送缓冲区中。
2️⃣如果发送的字节数太长,会被拆分成多个TCP的数据包发出。
3️⃣如果发送的字节数太短,就会先在缓冲区里等待,等到缓冲区长度差不多了,或者其他合适的时机发送出去。

接收数据时
4️⃣数据也是从网卡驱动程序到达内核的接收缓冲区。
5️⃣然后应用程序可以调用read以字节流的形式从接收缓冲区拿数据。


TCP协议面向字节流导致的BUG

因为有接收缓冲区与发送缓冲区的存在。

TCP协议在发送数据时,实际上是发送方将数据写入到了发送缓冲区,由发送缓冲区来完成发送数据。

TCP协议在接收数据时,实际上是由接收缓冲区来接收数据,然后接收方再从接收缓冲区来读取数据。

那么这就导致了两个BUG。
1️⃣BUG原因: 我要发送的数据如果太小,可能会存入接收缓冲区中,而没有发送到对端

解决方案: 很简单,通过响应的输出流对象来调用flush()方法,强制刷新发送缓冲区,以达到发送的目的

2️⃣BUG原因 我读取数据是从接收缓冲区中直接拿数据,他与UDP协议不同

UDP协议采用数据报进行发送接收,每条数据都单独装在一个数据报里,因此可以很容易的区分每条数据

TCP协议会针对每个对端都分配,接收缓冲区,发送缓冲区,专门针对这两个设备间的输入输出流

TCP协议接收数据是从网卡驱动程序到达内核的对应的接收缓冲区(到达接收缓冲区时,已经把TCP报头分用过了,就剩应用层数据了 ),再从接收缓冲区中采用专门的输入流来读取数据,
如果对端发送过来多条数据,每条数据大小不一,此时就会出现沾包问题(读了半条数据,读了一条半数据,即读不到一条完整的数据)

解决方案: 导致出现沾包问题的原因就是:每条数据之间没有明显的界限。因此解决方案就是自定义一个应用层协议来给每条数据一个明显的界限。(应用层协议还有许多其他功能,不单单是为了解决沾包问题,后续文章会为大家介绍的)

常用两种方法:
1️⃣分隔符:在结尾处加上分隔符来区分每条数据。
2️⃣约定长度:规定每条数据前四个字节为整条数据的长度,然后根据前四个字节在读取时,读取对应长度。


三、TCP协议的 异常情况

此处的异常情况指的是一些特殊情况下一端断开连接,另一端如何处理。

1️⃣进程关闭 / 进程崩溃

此时,进程没了,Socket这个文件也随之关闭了,但是连接还在,仍然可以正常的完成四次挥手来断开连接。


2️⃣主机关机(正常流程关机)

主机关机会先杀死所有的用户进程,此时就同上,进程仍然会
触发四次挥手。

1. 主机向对端发送FIN
2. 对端收到返回ACK
3. 对端向主机发送FIN
4. 主机收到返回ACK


但是有两种情况。
关机前完成了四次挥手

也就是说这四次手正常挥完,然后断开连接。

四次挥手还没完成就已经关机了

可能第一 / 二 / 三次挥手完成之后,主机就关机了。
也就是说主机没有向对端返回ACK,不用担心。

那么此时对端会怎么做呢?

对端触发超时重传,重新发送FIN =》重传几次仍没有收到ACK,尝试重置连接 =》仍收不到ACK,释放连接

也就是无论四次手挥没挥完都会达到断开连接的效果。


3️⃣主机(台式机)突然断电

主机突然断电,那么此时就来不及做任何操作,因此就无法完成四次挥手来断开连接。

此时就分为两种情况:
断电主机为接收方,对端是发送方

那么此时对端仍然进行发送操作,但是此时接收方断电,因此就无法返回ACK,而对端收不到ACK,就会执行下列操作。

对端触发超时重传 =》重传几次仍没有收到ACK,尝试重置连接 =》仍收不到ACK,释放连接

断电主机为发送方,对端是接收方

这就不太好办了,不知道他是没发消息,还是掉线了,那么要如何区分呢?

别担心,TCP大佬替我们解决了。
TCP内置了一个保活定时器,会定期的向对端发送一个数据包(心跳包),查看对方是否还在线,如果不在,就会把连接释放掉。

无论哪一方突然断电,TCP都会断开连接。


4️⃣网线断开
同上


总结

以上就是今天要讲的内容,本文介绍了TCP协议的两大特性以及沾包问题的解决方案。

路漫漫不止修身,也养性。

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

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

相关文章

DHorse v1.2.1 发布,基于k8s的发布平台

综述 DHorse是一个简单易用、以应用为中心的云原生DevOps系统,具有持续集成、持续部署、微服务治理等功能,无需安装依赖Docker、Maven、Node等环境即可发布Java、Vue、React应用,主要特点:部署简单、操作简洁、功能快速。 优化内…

TypeScript 学习笔记(三):函数

一、函数定义 函数是由一连串的子程序(语句的集合)所组成的,可以被外部程序调用,向函数传递参数之后,函数可以返回一定的值。 通常情况下,TypeScript 代码是自上而下执行的,不过函数体内部的代…

【说明书】TA3001信号隔离器使用说明书

-为了方便需要的时候查阅分享说明书,特将其整理到CSDN。- 一、产品介绍: 给现场的变送器提供隔离电源,接收变送器输出的电流信号,隔离后输出给系统。该产品需要独立供电。 二、主要技术参数 1、供电电压:18~36 VDC 2、消耗电流…

python的字符串操作

1、字符串的驻留机制 字符串 在Python中字符串是基本数据类型,是一个不可变的字符序列什么叫字符串驻留机制呢? 仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝&…

想知道MLGO是如何工作的吗?看完这篇文章你就懂了

在当今软件开发领域,代码优化对于提高性能和减小代码体积至关重要。在这方面,内联(Inlining)被认为是一项关键的优化技术之一。而MLGO能够在编译过程中智能地做出内联/非内联的决策,从而提供更高效、更紧凑的代码。本文…

apk应用完整性校验

测试客户端程序是否对自身完整性进行校验。攻击者能够通过反编译的方法在客户端 程序中植入自己的木马,客户端程序如果没有自校验机制的话,攻击者可能会通过篡改客 户端程序窃取手机用户的隐私信息。 用 ApkTool 将目标 APK 文件解包,命令如…

linux下实现串口功能

1.先从wiringpi库复制一个串口代码 2.查看串口类型 3.将代码修改成ttyS5 4.改完代码后打开串口助手然后编译 代码示例&#xff1a; #include <stdio.h> #include <string.h> #include <errno.h> #include <pthread.h> #include <wiringPi.h> #i…

Ubuntu18.04.6本地部署PaddleSpeech实验代码(CPU版)

前言 因为本人不是搞python和AI的&#xff0c;所以部署这个项目是耗时耗力&#xff0c;本地部署还是挺麻烦的&#xff0c;发现了很多问题&#xff0c;关键就是权限和源代码路径问题&#xff0c;经历了14天&#xff08;大部分时间扔在做系统&#xff0c;装环境&#xff0c;代码阅…

【数学建模】常微分方程

常微分方程 博客园解释 https://www.cnblogs.com/docnan/p/8126460.html https://www.cnblogs.com/hanxi/archive/2011/12/02/2272597.html https://www.cnblogs.com/b0ttle/p/ODEaid.html matlab求解常微分方程 https://www.cnblogs.com/xxfx/p/12460628.html https://www.cn…

使用FreeMarker生成word文件自定义每页页眉或页脚

最新工作中遇到生成word中表格时&#xff0c;要求文档中每页头部和底部都是固定格式的表格&#xff0c;但是内容不一样&#xff0c;头部信息在word中画样式的时候就可以设置为“在各页顶端以标题形式重复出现”&#xff0c;而底部就没有办法这样设置了&#xff0c;之后就想着在…

【GPT模型】遥感云大数据在灾害、水体与湿地领域中的应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

TypeScript 中【class类】与 【 接口 Interfaces】的联合使用解读

导读&#xff1a; 前面章节&#xff0c;我们讲到过 接口&#xff08;Interface&#xff09;可以用于对「对象的形状&#xff08;Shape&#xff09;」进行描述。 本章节主要介绍接口的另一个用途&#xff0c;对类的一部分行为进行抽象。 类配合实现接口 实现&#xff08;impleme…

为什么Mate X3手机屏幕有水也不影响操作?

我知道现在的手机大多都防水&#xff0c;但没想到连折叠屏手机Mate X3在湿水状态下都丝毫不影响操作&#xff0c;现在的华为手机防水都做到这种程度了&#xff1f; 众所周知&#xff0c;如果手机屏幕上有水珠&#xff0c;那么手机的触屏就会变得飘忽不定。 这种“飘忽不定”是…

局域网聊天软件都有哪些?几款常用的局域网聊天软件推荐

随着科技的不断发展&#xff0c;人们在日常生活和工作中越来越需要高效便捷的沟通工具。而局域网聊天软件就是一种在局域网内使用的聊天工具&#xff0c;它能够帮助用户在同一网络内的设备之间进行即时通讯&#xff0c;无需依赖于互联网连接&#xff0c;安全又可靠。下面将为大…

学无止境·MySQL⑥(数据库备份和还原)

数据库备份和还原 备份和还原练习1、创建库和表2、使用mysqldump命令备份数据库中的所有表3、备份booksDB数据库中的books表4、使用mysqldump备份booksDB和test数据库5、使用mysqldump备份服务器中的所有数据库6、使用mysql命令还原第二题导出的book表7、进入数据库使用source命…

“快速批量去除文件夹名称中多余重复文字!轻松实现文件夹改名优化,提升整理效率!“

在日常的电脑使用中&#xff0c;我们常常面临着大量的文件和文件夹需要整理&#xff0c;而其中一个常见的问题就是文件夹名称中存在重复的文字&#xff0c;让整个文件夹结构变得混乱而不易管理。为了解决这一问题&#xff0c;我们自豪地推出了全新的文件夹改名工具&#xff0c;…

华为配置LLDP基本功能

华为配置LLDP基本功能 1.什么是lldp协议 定义 LLDP(Link Layer Discovery Protocol)是IEEE 802.1ab中定义的链路层发现协议。LLDP是一种标准的二层发现方式,可以将本端设备的管理地址、设备标识、接口标识等信息组织起来,并发布给自己的邻居设备,邻居设备收到这些信息后将…

产品新升级!MODBUS/SNMP智能协议转换器

“MODBUS TCP”是一种基于 TCP协议的工业控制设备通信协议&#xff0c;其主要功能是实现现场设备的远程控制。MODBUS TCP采用远程通讯的方式&#xff0c;通过 IP网络进行数据传输&#xff0c;因此其传输速率更快、网络负载更小、灵活性更高。 “ SNMP”是一种用于网络管理的…

如何考过PMP? 备考经历分享

考PMP的目的 周围很多同事、朋友都在学习PMP课程或者已获得证书&#xff0c;在日常工作中发现有些词语已经听不懂&#xff0c;比如项目集、项目组合&#xff0c;比如PM等&#xff0c;为了提升自己也为了能在侃大山时也能参与其中脱离“一清二白”的状态&#xff0c;所以下定决…

0基础学习云计算难吗?

很多人经常会问云计算是什么&#xff1f;云计算能干什么&#xff1f;学习云计算能做什么工作&#xff1f;其实我们有很多人并不知道云计算是什么&#xff0c;小知今天来给大家讲讲学习云计算能做什么。 中国的云计算行业目前正处于快速发展阶段&#xff0c;随着互联网和数字化…