在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何讓接收端知道發送端將要發送的字節流長度?

冬至配餃子 ? 來源:多蘭多 ? 作者:Toranto ? 2022-08-19 09:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

粘包現象展示

一上來就枯燥的文字,難免容易犯困,所以我先演示一下粘包現象:

pYYBAGL-5cuAOVptAACt-k3cEww678.pngpYYBAGL-5dKAQaAaAACFAIai1xo613.png

我們的預期是,服務端打印出hello,I am Toranto這兩個字符串,兩個字符串經編碼之后的字節總長度為17個字節,但是我們看結果:

pYYBAGL-5eiAZO4uAAClEv3pYXI844.png

ps:b''是表示字節的意思,和我們之前用的f''(format)格式化用法是一樣的,單、雙、三引號一樣??梢粤私庖幌拢?/p>

pYYBAGL-5fmAJFgWAADuKMsMuyQ976.png

好了回歸粘包現象,我們看到上圖,我們采用兩次接收數據的方式,兩次都接收20個字節,但是發送端發送的兩次總字節只有17個字節長度,所以,tcp基于流式的協議,會先發送第一段字節到一個緩沖區,如果時間間隔很短,則tcp會等第二段字也發送到這個緩沖區再統一發送到接收端這邊,兩次內容的粘合沒有達到我們預期的效果,這就是粘包現象。

粘包

粘包是一種現象,而且只有tcp會出現粘包現象,udp不會,這是基于tcp的

流式傳輸

導致的,tcp是傳輸數據流。

tcp會將數據量較小,且發送時間間隔較短的數據一起打包發送,那么這里所講的時間較短是相比網絡延遲來說的。比如我們兩次發送間隔為0.00001s,那么網絡延遲為0.001s,這個時候兩次的數據就會打包發送,這是一種優化機制,但也就是這個優化機制導致粘包現象。

首先我們需要了解一下socket收發數據的原理:

pYYBAGL-5hOAUFCWAAB4BXjjpO0413.png


發送端可以是1K1K地發送數據,而接收端的應用程序可以兩K兩K地提走數據,當然也有可能一次提走3K或6K數據,或者一次只提走幾個字節的數據,也就是說,應用程序所看到的數據是一個整體,或說是一個流(stream),一條消息有多少字節對應用程序是不可見的,因此TCP協議是面向流的協議,這也是容易出現粘包問題的原因。

UDP是面向消息的協議,每個UDP段都是一條消息,應用程序必須以消息為單位提取數據,不能一次提取任意字節的數據,這一點和TCP是很不同的。怎樣定義消息呢?可以認為對方一次性write/send的數據為一個消息,需要明白的是當對方send一條信息的時候,無論底層怎樣分段分片,TCP協議層會把構成整條消息的數據段排序完成后才呈現在內核緩沖區。

例如基于tcp的套接字客戶端往服務端上傳文件,發送時文件內容是按照一段一段的字節流發送的,在接收方看來,根本不知道該文件的字節流從何處開始,在何處結束。

所謂粘包問題主要還是因為接收方不知道消息之間的界限,不知道一次性提取多少字節的數據所造成的。

此外,發送方引起的粘包是由TCP協議本身造成的,TCP為提高傳輸效率,發送方往往要收集到足夠多的數據后才發送一個TCP段。若連續幾次需要send的數據都很少,通常TCP會根據優化算法把這些數據合成一個TCP段后一次發送出去,這樣接收方就收到了粘包數據。

粘包解決

很遺憾,socket并沒有給我們提供內置解決方法。

那我們需要如何解決?

問題的根源在于,接收端不知道發送端將要發送的字節流的長度。

我們可以基于此點想解決辦法,如何讓接收端知道發送端將要發送的字節流長度(提前獲知)?

我們可以在發送端寫一個提前告知的代碼,并且在接收端循環判定,是否達到預定字節流長度,達到了再一并打印出來:

發送端和接收端(關鍵)要結合起來看:

poYBAGL-5liADeynAACWEief7aM603.pngpoYBAGL-5maASjQyAAC99PDfsRo576.png

接下來我把源碼放上來,我加了一些判斷條件:

poYBAGL-5pyAGUpLAAEN4Em8_V4145.pngpoYBAGL-5qKADGyrAACxqV0zfe0603.pngpYYBAGL-5qeAaPxNAADr_s6XptU956.png

演示一下結果:

pYYBAGL-5-uAA8XNAAFN4_KPLZM724.pngpYYBAGL-5_CAFcRvAABXEcoRNqU369.png



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編解碼
    +關注

    關注

    1

    文章

    145

    瀏覽量

    20062
  • 字符串
    +關注

    關注

    1

    文章

    589

    瀏覽量

    21228
  • 網絡編程
    +關注

    關注

    0

    文章

    72

    瀏覽量

    10593
  • TCP協議
    +關注

    關注

    1

    文章

    101

    瀏覽量

    12399
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    FPGA高速收發器的GTX發送解析

    每一個收發器擁有一個獨立的發送,發送有PMA(Physical Media Attachment,物理媒介適配層)和PCS(PhysicalCoding Sublayer,物理編碼
    的頭像 發表于 11-20 11:27 ?7205次閱讀
    FPGA高速收發器的GTX<b class='flag-5'>發送</b><b class='flag-5'>端</b>解析

    ZYNQ進階:PLUART 發送設計案例

    在 ZYNQ進階之路2 中我們講解了PLPWM呼吸燈的設計,本節我們講解PL實現串口UART的發送設計; 首先新建一個串口發送的工程,工程建立在ZYNQ進階之路1中已經講述,這里不
    的頭像 發表于 11-25 17:26 ?3923次閱讀
    ZYNQ進階:PL<b class='flag-5'>端</b>UART <b class='flag-5'>發送</b>設計案例

    HDMI信號的接收發送與PD的DFP和UFP有對應關系嗎?

    HDMI信號的接收發送與PD的DFP和UFP有對應關系嗎? 例如:一作為HDMI的接收
    發表于 02-29 07:46

    TCP通信的接收發送字符串的這個原理是什么???謝謝!

    一個是 服務器的 接收部分,一個是 客戶發送部分。發送部分是不是: 先發送字符串的 長度
    發表于 05-06 15:52

    can總線發送大于八個字節數據代碼怎實現

    將要發送IP報文所以將要發送的數據遠遠大于8個字節……現在的思路就是構造一個新的數據幀,包含頭和尾還有數據的
    發表于 06-17 14:32

    LWIP UDP如何發送長度超過1500字節的數據?

    環境:STM32F7 + FREERTOS + LWIP UDP在使用UDP發送數據時,發現發送長度比較大的數據時PC的網絡助手收不到數據,一直找BUG,最后看到網上說UDP
    發表于 05-23 19:28

    如何解決lwip的netconn客戶發送問題

    我的板子做客戶,用的lwip,現在在與服務器連接成功后,發送有個問題1,在網絡調試助手中設置20ms不停發送1字節,板子客戶
    發表于 07-15 04:36

    CC2500不能接收發送數據

    。發送前TXBYTES能讀到寫進TX_FIFO中的字節數,發送完成后讀到的是0.發送接收兩邊
    發表于 03-27 10:22

    如何在發送發送逗號?

    將使用逗號檢測和對齊模塊。但現在我有點困惑。如何在發送發送逗號? 如果我只是使用GTP傳輸PRBS并接收PRBS,我是否必須使用逗號來對齊字節
    發表于 06-10 08:56

    如何兩片89C51實現串行通信,發送將0~f循環發送接收并在接收顯示?

    如何兩片89C51實現串行通信,發送將0~f循環發送接收并在
    發表于 09-30 06:27

    在消息列隊中初始化時怎么知道發送消息的長度

    問題:假設串口1接收了200個字節,串口接收完成后,通過消息列隊把這200個數據發送給處理線程1,線程1怎么知道串口中斷發過來的是200個
    發表于 03-24 09:26

    載波發送接收端接口電路

    接口電路的實現  根據上述的理論分析與建立的數學模型,可設計出低壓電力線通信發送的接口電路,如圖2所示。?
    發表于 10-13 13:54 ?2319次閱讀
    載波<b class='flag-5'>發送</b><b class='flag-5'>端</b>與<b class='flag-5'>接收</b>端接口電路

    基于系數可調FFE的10Gb_s發送的設計

    基于系數可調FFE的10Gb_s發送的設計_陳功
    發表于 01-07 21:39 ?2次下載

    STM32F4發送接收長度數據的判斷

    STM32F4 串口收發使用DMA還是很方便的。但是配置DMA時需要配置數據長度,這一點對于發送來說可以預估計自己發送長度來配置DMA發送
    發表于 11-08 16:25 ?6657次閱讀

    字節流和字符流有什么區別?看完就知道!

    字節流和字符流有什么區別?看完就知道字節流和字符流是Java I/O系統中的兩個重要概念,用于處理輸入和輸出的數據。 首先,字節流是以字節
    的頭像 發表于 12-09 14:57 ?1937次閱讀
    主站蜘蛛池模板: 天天操夜夜操狠狠操 | 国产成人三级视频在线观看播放 | 性videofree极品另类 | 一级视频在线观看免费 | 草久视频在线观看 | 国产视频一区二 | 扛着高跟鞋丝袜腿呻吟视频 | 国产高清视频免费最新在线 | 久久精品操 | 亚洲精品mv在线观看 | 亚洲视频一二 | 中文字幕二区三区 | 欧美一级黄色影片 | 天堂最新版 | 在线资源天堂 | 久久久噜噜噜久久网 | 国产日韩精品一区二区在线观看 | 午夜国产理论 | 美女黄色一级片 | 在线资源天堂 | 欧美日韩你懂的 | 高清视频一区二区三区 | 亚洲www.| 成年人一级片 | 日日摸夜夜爽 | 2018天堂视频免费观看 | 午夜亚洲| 日本一区高清视频 | 毛片一区二区三区 | 簧片地址 | 欧美日韩一卡2卡三卡4卡新区 | 天天色天天做 | 免费在线看视频 | 男人j进女人j免费视频视频 | 上色天天综合网 | 日韩一级在线视频 | 看片在线 | 天天天操天天天干 | 欧美视频在线观在线看 | 欧美大狠狠大臿蕉香蕉大视频 | 国产午夜精品片一区二区三区 |