設計心得——網絡包的處理

一、介紹

在程序的開發中,網絡開發是一個重要的應用場景。畢竟這些年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
英文地址,請注明出處:http://en.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狀態同步與遠程數據加載全解析

在前端開發中,數據狀態管理與界面同步始終是核心挑戰。近期我在處理一個書簽管理應用時,遇到了遠程數據加載后無法顯示、界面更新異常,甚至動畫閃爍等一系列問題。經過多輪調試與優化,最終實現了數據的正確加載與流暢的界面交互。…