tcp流式服务和粘包问题

目录

 1.概念

2.流式服务

3.粘包问题


 1.概念

套接字是一个全双工的

使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写,双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输.

TCP连接是全双工的,即双方的数据读写可以通过一个连接进行,完成数据交换之后,通信双方都必须断开连接以释放系统资源.

TCP协议的这种连接是一对一的,所以基于广播和多播(目标是多个主机地址)的应用程序不能使用TCP服务.而无连接协议UDP则非常适合于广播和多播. 

2.流式服务

tcp的服务特点:

tcp是一个字节流服,TCP 字节流的特点,发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,应用程序对数据的发送和接收是没有边界限制的。

 因此,TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数之间没有固定的数量关系即,发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,这就是字节流的概念.应用程序对数据的发送和接收是没有边界限制的.

3.粘包问题

 粘包问题有时候有影响,有时候没有影响;

沾包(粘包)有影响就解决,没有影响就不用解决(比如文件传输就没有影响);

演示粘包:

如果我们将服务器的代码改动一下,将一次接收127个字符改为一次接收1个字符;

int n=recv(c,buff,1,0);

 第二次服务器返回的确认信息只有一个ok,但是客户端发送的数据长度并不是1。

 原因如下:

利用netstat命令我们可以看到在接收缓冲区中有6个字节的数据,说明服务器发送的确认信息是先发送到缓冲区的,没来的及打印。所以上图中只有一个“ok”,还有3个在缓冲区中。

因为TCP是面向流,没有边界,而操作系统在发送TCP数据时,会通过缓冲区来进行优化,例如缓冲区为1024个字节大小。如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题。如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分头多次发送,这就是拆包。

粘包要解决吗?如何解决?(常见的面试题目)

没有影响就不用处理(如文件发送),有影响尤其是多个数据是并列的关系,就必须要处理格式化数据,发送长度等等

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

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

相关文章

【C语言】linux内核ip_local_out函数

一、讲解 这个函数 __ip_local_out 是 Linux 内核网络子系统中的函数,部分与本地出口的 IPv4 数据包发送相关。下面讲解这段代码的每一部分: 1. 函数声明 int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb): -…

剪枝例题一道

例题一 Code force round 我的思路,DFS遍历所有x,y,然后用set记录所有k,但是TLE了,最后发现,可以应用剪枝,如果一个x,y得出的k已经在set中存在了,那么不用再继续DFS后续…

react实战——react旅游网

慕课网react实战 搭建项目问题1.按照官网在index.tsx中引入antd出错?2.typescript中如何使用react-router3.react-router3.1 V63.2 V53.3V6实现私有路由 4.函数式组件接收props参数时定义数据接口?5.使用TypeScript开发react项目:6.要使一个组…

SQLite3中的callback回调函数注意的细节

调用 sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)该例程提供了一个执行 SQL 命令的快捷方式, SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。 在这里, 第一个参数 sqlite3 是打开的数据库对…

代码随想录算法训练营第day41|背包理论基础、416. 分割等和子集

目录 a.背包理论基础——01背包 1.二维数组的01背包表示 2.一维滚动数组表示 b. 416. 分割等和子集 - 力扣(LeetCode) a.背包理论基础——01背包 背包问题分类: 对于面试的话,其实掌握01背包,和完全背包&#xff…

Excel F4键的作用

目录 一. 单元格相对/绝对引用转换二. 重复上一步操作 一. 单元格相对/绝对引用转换 ⏹ 使用F4键 如下图所示,B1单元格引用了A1单元格的内容。此时是使用相对引用,可以按下键盘上的F4键进行相对引用和绝对引用的转换。 二. 重复上一步操作 ⏹添加或删除…

SSM框架,MyBatis-Plus的学习(下)

条件构造器 使用MyBatis-Plus的条件构造器,可以构建灵活高效的查询条件,可以通过链式调用来组合多个条件。 条件构造器的继承结构 Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装&#xf…

首屏性能优化:提升用户体验的秘籍

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

复盘-excel

excel-选列没有用,选小标题才可以 将簇状柱形图放置在一个新表上##### excel: 添加数据模型时,要通过套用表格格式与外部断开连接 透视分析2010年人数未解决(第四套) 通过日期显示星期几 判断星期几 因为前面已经通过星期六&#xff0c…

03_Tomcat

文章目录 Tomcat概念自制简易的服务器JavaEE规范Tomcat安装Tomcat启动Tomcat的资源部署直接部署虚拟映射 Tomcat的设置 Tomcat 概念 服务器:两层含义。 软件层面:软件,可以将本地的资源发布到网络中,供网络上面的其他用户来访问…

WPF 防止按钮Click时间多次点击响应

可能不是最好的办法,但是用起来效果也还是可以的。 原理:通过IsEnabled属性来控制按钮状态。btnConfirm.IsEnabled / this.IsEndbled 这两种方式是等价的。 案例比较简单,如果后期做开发的话代码量变大,只在结尾添加 this.IsEn…

网络综合布线

综合布线的英文表达为Structured Cabling System(通俗表达为Cabling System,简称CSC,最早由AT&T提出)或Premises Distribution System(PDS,目前国标采用这一称法)。   综合布线起源与发展…

Druid数据库连接池配置

客户端DruidDataSource 配置项描述建议值maxWait从连接池中获取connetion的最长等待时间10s TimeBetweenEvictionRunsMillis 轮询检查数据库连接池状态的间隔60s MinEvictableIdleTimeMillis 躺在连接池没有干活的空闲状态的最小值300s MaxEvictableIdleTimeMillis 1.躺在连接…

grafana table合并查询

注:本文基于Grafana v9.2.8编写 1 问题 默认情况下table展示的是一个查询返回的多个field,但是我想要的数据在不同的metric上,比如我需要显示某个pod的读写IO,但是读和写这两个指标存在于两个不同的metirc,需要分别查…

LeetCode27: 移除元素

题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

【DevOps基础篇】容器化架构基础设施监控方案

【DevOps基础篇】容器化架构基础设施监控方案 目录 【DevOps基础篇】容器化架构基础设施监控方案要监视什么不同监控系统方案比较1. Datadog2. Prometheus3. ELK(Elasticsearch、Logstash、Kibana)4. Sysdig5. 自行打造!如何选择总结推荐超级课程: Docker快速入门到精通 当…

Android谈谈ArrayList和LinkedList的区别?

Android中的ArrayList和LinkedList都是Java集合框架中的List接口的实现,但它们在内部数据结构和性能特性上有所不同: 1. **内部数据结构**: - ArrayList是基于动态数组(可调整大小的数组)实现的。它在内存中是连续…

ActivityRecord中Activity生命周期变化

本文基于AOSP13分析 ActivityRecord一些关键的属性: final class ActivityRecord extends WindowToken implements WindowManagerService.AppFreezeListener {// pause 超时时间private static final int PAUSE_TIMEOUT 500;// stop 超时时间private static fina…

Android中的抽象类与接口的区别是什么?谈谈List, Set, Map的区别?

目录 抽象类与接口的区别是什么? 谈谈List, Set, Map的区别? Android抽象类与接口的区别是什么? Android抽象类和接口在Java中都是用来实现多态和继承的重要特性,但它们之间存在一些关键的区别: 1. **定义和使用场…

多种方法求解数组排序

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…