设计心得——网络包的处理

一、介绍

在程序的开发中,网络开发是一个重要的应用场景。毕竟这些年IT行业之所以火,主要还是互联网(移动互联网)带来的。网络开发,有各种平台、框架以及系统和库提供的API,如果说网络开发是一个特别复杂和困难的场景(前提了高并发等以上的场景),估计做过这类项目和有过接触的开发人员都会赞同。
本文不介绍网络开发中的各种异常、问题以及一些开发经验,只从设计的角度分析一下,网络开发人员经常提到的网络数据包(指TCP/IP)的粘包和分包的情况。

二、粘包和分包

从TCP/IP的设计角度看,做为一种数据流的传输,根本就没有什么 粘包和分包的问题。所谓粘包和分包其实是面向应用层的一种说法,而UDP的开发中由于协议本身设计和消息传输的特性不存在这类问题。给大家举一个例子,大家都有过快递收发的经验,大家会认为自己发送一个小快递(比如一件衣服),快递公司会专门安排一辆车给你送到客户手中么?反过来来也一样,要发送一个非常多的成套的产品,快递公司也不会因为这个去购买一个更大的车去运送而是会根据情况将其拆开用多辆车来发送。明白了这个,就明白了网络包为什么会有粘包和分包了。
TCP/IP发送为了兼顾效率和性能,在处理一些小数据包比如IM通信中的互相打招呼发个字母时,就会合并其它的一些数据再发送;而如果双方发送一些大数据时(不考虑单独传输),又会拆开为多个包进行发送。而不同的平台和系统可能网络的缓冲区也有所不同,那么接收到的数据就可能需要进行拆分,恢复成小的包或等待数据最终形成一个完整的包。
这个在前面分析Nagle算法时,给大家分析过。

三、如何处理

那么在设计上如何应对这种情况呢?
首先,在数据传输的格式上,就要考虑IP包的大小,与其尽量适配(比如固定大小)。不要设计出过大或过小的包,但这样做也有其缺点,比如不灵活,小包浪费带宽等等。
其次,对网络的原始通信配置进行修改,比如禁止诸如Nagle算法的应用,但这样做的缺点是可能导致一些性能上的损失。
最后,设计一些规则,允许网络通信中对粘包和分包不敏感,比如自描述的数据,网络只需将数据保存成功即可,不考虑数据包的内容。同样,这样做的缺点一个是场景应用有限,另外引入了额外的复杂性。
不过话说回来,网络的应用千差万别,光从设计上是无法完全处理粘包和分包的,只能说是尽量完善。最终对其的处理,仍然需要开发者自行进行相关的数据处理。或者可以这样理解,解决粘包这类问题,是要进行整体上的考虑的,在设计上、协议栈上和缓冲区以及应用层的处理上等等进行一个全面的处理和解决。

四、总结

这里只是从设计角度对粘包和分包进行了处理,而诸如常见的在开发的层次进行处理如增加分隔符、自定义格式(消息头/消息体)等等这些都没有讨论。之所以这样,目的就是让大家明白设计在抽象层面的作用与实际开发层面的作用的不同。
很多东西不是简单的一刀就能切开,往往是你中有我,我中有你。但在设计得的心中,得有设计这个抽象的想法一直存在!

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

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

相关文章

sqli-labs通关笔记-第30关GET字符注入(WAF绕过 双引号闭合 手工注入+脚本注入两种方法)

目录 一、源码分析 1、index.php代码审计 2、login.php代码审计 3、java_implimentation函数 4、whitelist函数 5、SQL安全性分析 二、渗透实战 1、进入靶场 2、WAF探测 (1)触发WAF (2)绕过WAF 3、手工注入 &#xf…

【openlayers框架学习】九:openlayers中的交互类(select和draw)

文章目录openlayers进阶28 openlayers中的事件29 openlayers中select交互类的使用30 openlayers中select常见的配置选项31 openlayers中绘制交互类(Draw)openlayers进阶 28 openlayers中的事件 常用进行事件交互的对象:map\view\source29 o…

Java企业级应用性能优化实战

在企业级Java应用开发中,性能优化是确保系统稳定运行的关键因素。本文将从多个维度深入分析Java应用性能瓶颈,并提供实战优化方案。 🎯 性能优化核心领域 1. 对象操作性能优化 在企业应用中,对象拷贝是一个高频操作,特别是在分层架构中的DO、DTO、VO转换。选择合适的拷…

LLM Prompt与开源模型资源(3)如何写一个好的 Prompt

学习材料:https://www.hiascend.com/developer/courses/detail/1935520434893606913 (3.5)学习时长: 预计 60 分钟学习目的: 了解提示工程的定义与作用熟悉提示工程的关键技术相关概念掌握基于昇腾适配的大模型提示工程…

日志管理工具 ——ELK Stack

一、ELK Stack 概述1.1 核心组件ELK Stack(现更名为 Elastic Stack)是一套开源的日志收集、存储、分析和可视化平台,由三个核心组件构成:Elasticsearch:分布式搜索引擎,负责日志数据的存储、索引和快速查询…

SpringAI:AI工程应用框架新选择

Spring AI 是一个用于 AI 工程的应用框架 Spring AI 是一个用于 AI 工程的应用框架。其目标是将可移植性和模块化设计等 Spring 生态系统设计原则应用于 AI 领域,并推广使用 POJO 作为应用程序的构建块到 AI 领域。 Spring AI 的核心是解决 AI 集成的基本挑战:将企业数据和…

Kettle 开源ETL数据迁移工具从入门到实战

ETL(Extract, Transform, Load)工具是用于数据抽取、转换和加载的软件工具,用于支持数据仓库和数据集成过程。Kettle作为传统的ETL工具是纯 java 开发的开源的 ETL工具,用于数据库间的数据迁移 。可以在 Linux、windows、unix 中运…

Maven中的bom和父依赖

maven最全避坑指南写完后,发现自己对于bom和父pom的理解还是不够深入,特此转载DeepSeek的回答,和大家一起学习了。 在 Maven 的依赖管理中,父 POM (Parent POM) 和 BOM (Bill of Materials) 都是用于实现集中化管理和控制的核心机…

Python 操作 Word 文档:主流库对比与选择指南

在办公自动化、报告生成、数据处理等领域,利用 Python 程序化地创建、读取或修改 Microsoft Word 文档 (.docx 格式) 是一项非常实用的技能。Python 生态中有多个优秀的库可以完成这项任务,但它们各有侧重和优缺点。选择哪一个“最好用”,关键…

怎么修改论文格式呢?提供一份论文格式模板

注!!!本文内容是作者自己整理的一份模板,仅供参考,各位如何修改,还需要看学校的要求。 一、参考文献 1、有一定数量的近几年参考文献、不宜过多中文文献 英文期刊模板 [1] Taesoo K, Sooyoung K, Kyunghan L, et al. Special issue on 6G and satellite communication…

MVC 发布

MVC 发布 引言 MVC(Model-View-Controller)模式是一种广泛应用于软件开发的架构模式。它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这种模式不仅提高了代码的可维护性和可扩展性,而且使得开发者可以更加专注于各个组件的开发。本文…

arkui 动画曲线

参考文档 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-curve#curvesinterpolatingspring10 可视化工具网站 https://easingwizard.com/ https://www.desmos.com/calculator/k01p40v0ct?langzh-CN 基本介绍 import { curves } from kit.A…

大语言模型(LLM)技术架构与工程实践:从原理到部署

在自然语言处理领域,大语言模型(LLM)已成为颠覆性技术。从 GPT 系列到 LLaMA、ChatGLM,这些参数规模动辄百亿甚至万亿的模型,不仅实现了流畅的自然语言交互,更在代码生成、逻辑推理等复杂任务中展现出惊人能力。本文将从技术底层拆解 LLM 的核心架构,分析训练与推理的关…

python后端之DRF框架(上篇)

一、DRF框架介绍 1、web应用开发模式 1.1、前后端不分离1.2、前后端分离2、RESTful介绍 RESTful是目前最流行的API设计风格 , REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。 1、每一个URI代表1种资源; 2、客…

信创数据库-DM(达梦)数据库安装教程

官方安装文档在这:安装前准备 | 达梦技术文档 本文也是基于这个来写的,微调了一下。 1,下载安装包 体验版直接到官方下载即可:产品下载 | 达梦在线服务平台 如果是有需要商业版等,需要联系客服申请。 安装包要选择CPU…

docker常用命令集(6)

接前一篇文章:docker常用命令集(5) 本文内容参考: Docker login/logout 命令 | 菜鸟教程 Docker命令_docker login-CSDN博客 特此致谢! 9. docker login 简介 docker login命令用于登录到docker注册表&#xff08…

[LINUX操作系统]shell脚本之循环

1.编写脚本for1.sh,使用for循环创建20账户,账户名前缀由用户从键盘输入,账户初始密码由用户输入,例如:test1、test2、test3......[rootmaster ~]# vim for1.sh #!/bin/bashread -p "请输入账户名称前缀:" prefixread -p…

空间设计:不是餐厅的装饰游戏

餐厅空间设计,是通过布局规划与环境营造,将功能需求、品牌调性与顾客体验融合的系统性工程 —— 它不仅决定顾客「坐得舒不舒服」,更影响「愿不愿意再来」「会不会主动分享」的消费决策。体验感知的第一触点:顾客进门 3 秒内&…

XSS-DOM 2

目录 1 DOMPurify 1.1 漏洞源码 1.2 加载框架 ​编辑 setTimeout 1.3 ok? 1.4 window和document 1.5 Overwrite(document.x) 1.5.1 打印cookie 1.6 Overwrite2(document.x.y) 1.6.1 form表单 1.7 toString…

从数据丢失到动画流畅:React状态同步与远程数据加载全解析

在前端开发中,数据状态管理与界面同步始终是核心挑战。近期我在处理一个书签管理应用时,遇到了远程数据加载后无法显示、界面更新异常,甚至动画闪烁等一系列问题。经过多轮调试与优化,最终实现了数据的正确加载与流畅的界面交互。…