0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【推薦】TCP為何粘包?粘包問題如何解決?

億佰特物聯(lián)網(wǎng)應(yīng)用專家 ? 2022-09-23 10:00 ? 次閱讀

我們在涉及TCP協(xié)議的應(yīng)用中,經(jīng)常會出現(xiàn)粘包的問題。所謂粘包,簡單地講,就是我有兩條消息,明明發(fā)送端的代碼是分兩次發(fā)送的,但是在接收端卻一次性就接收到了兩條消息。這個(gè)情況不管是在嵌入式行業(yè)還是在互聯(lián)網(wǎng)行業(yè),都非常的普遍。

TCP協(xié)議為什么粘包?

那就需要先了解 TCP 的定義。TCP(Transmission Control Protocol)傳輸控制協(xié)議,是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。其中跟粘包關(guān)系最大的就是基于字節(jié)流這個(gè)特點(diǎn)。字節(jié)流可以理解為一個(gè)雙向的通道里流淌的數(shù)據(jù),這個(gè)數(shù)據(jù)其實(shí)就是我們常說的二進(jìn)制數(shù)據(jù),簡單來說就是一大堆 01 串。這些 01 串之間沒有任何邊界。7dda0d04-3ab3-11ed-b180-dac502259ad0.png應(yīng)用層傳到 TCP 協(xié)議的數(shù)據(jù),不是以消息報(bào)為單位向目的主機(jī)發(fā)送,而是以字節(jié)流的方式發(fā)送到下游,這些數(shù)據(jù)可能被切割和組裝成各種數(shù)據(jù)包,接收端接收到這些數(shù)據(jù)包后沒有正確還原之前的消息,因此出現(xiàn)粘包現(xiàn)象。那為什么會出現(xiàn)不能正確還原的情況呢?主要有兩個(gè)方面的原因:

1. 發(fā)送端的原因發(fā)送端在組裝消息的時(shí)候,就把幾個(gè)小包合成一包了,這樣接收端自然無法解析出小包。這對應(yīng)的就是Nagle 算法。因?yàn)門CP和Nagle 算法都是上個(gè)世紀(jì)的產(chǎn)物了,在早期的網(wǎng)絡(luò)中這樣做,可以顯著地減小網(wǎng)絡(luò)的壓力。否則頻繁地發(fā)送僅有幾個(gè)字節(jié)的小包,會嚴(yán)重浪費(fèi)網(wǎng)絡(luò)IO性能。但是在現(xiàn)代互聯(lián)網(wǎng)中,網(wǎng)絡(luò)性能已經(jīng)有了大幅提升,似乎Nagle 算法提升的那么一點(diǎn)IO性能就不是那么重要了,反而由于等待數(shù)據(jù)來合并的操作,會導(dǎo)致傳輸延遲變大,在網(wǎng)絡(luò)游戲應(yīng)用時(shí),就會非常影響體驗(yàn)。所以現(xiàn)在一般都會關(guān)掉它。2. 接收端的原因接收端接收到消息以后,應(yīng)用層總是不能立即取走數(shù)據(jù),總是會有接收緩沖區(qū)的存在。如果兩條獨(dú)立的消息進(jìn)入緩沖區(qū)的間隔太小,應(yīng)用層不能在兩次消息中間取走上一條消息,那么下次讀取的時(shí)候,就勢必會把兩包消息同時(shí)讀出來,這也會導(dǎo)致粘包。7df3fdea-3ab3-11ed-b180-dac502259ad0.png

而且這個(gè)情況并不能通過讓發(fā)送端在時(shí)間上均勻發(fā)包來避免,因?yàn)榫W(wǎng)絡(luò)不穩(wěn)定情況的存在,即使是時(shí)間上均勻發(fā)送的數(shù)據(jù)包,在接收端看來也可能是隨機(jī)出現(xiàn)的。

如何規(guī)避粘包的負(fù)面影響?

根據(jù)以上分析,我們不難發(fā)現(xiàn),想要杜絕粘包的問題出現(xiàn),基本上是不可能的。即使發(fā)送端和接收端都能自己控制,但是網(wǎng)絡(luò)傳輸?shù)倪^程也是很難控制的。
但是即使粘包的問題存在,也不影響我們大規(guī)模的使用TCP協(xié)議。因?yàn)檫@個(gè)問題在應(yīng)用層非常好處理。大致有兩種思路:1. 在信息中加入特殊的標(biāo)志作為分隔符7e1858c0-3ab3-11ed-b180-dac502259ad0.png

這樣,當(dāng)應(yīng)用層檢測到特殊的分隔符后,便知道這是一包得到開始和結(jié)束,就可以進(jìn)行分片等操作,問題便迎刃而解。不過這樣存在一些弊端。比如定義分隔符為“12345678”,那如果消息內(nèi)容里面出現(xiàn)“12345678”的字符串呢?這樣就會導(dǎo)致消息被異常的切片,導(dǎo)致接收到的消息錯(cuò)誤。但假如自己能夠控制消息的內(nèi)容,保證里面不會出現(xiàn)“12345678”的內(nèi)容,則此方法較為靈活。2. 加入信息的長度7e2ec5e2-3ab3-11ed-b180-dac502259ad0.png根據(jù)約定好的長度的字段,讀取消息長度的信息,再根據(jù)消息長度信息讀取消息內(nèi)容。這也是一種非常常用的方法,在很多協(xié)議中都有體現(xiàn)。
3. 添加包首部發(fā)送端給每個(gè)數(shù)據(jù)包添加包首部,首部中應(yīng)該至少包含數(shù)據(jù)包的長度,這樣接收端在接收到數(shù)據(jù)后,就可以通過讀取包首部的長度字段,知道每一個(gè)數(shù)據(jù)包的實(shí)際長度。以上就是本期關(guān)于解決TCP粘包問題的內(nèi)容,小編碼字不易,求個(gè)點(diǎn)贊、分享、在看三連支持!我們下期見~~

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1324

    瀏覽量

    78755
收藏 人收藏

    評論

    相關(guān)推薦

    原來UV膠水在LED燈具接中有這么多用膠點(diǎn)

    燈具中的重要耗材,在燈具制造中膠粘劑在LED照明產(chǎn)品中,主要起到接、 密封、導(dǎo)熱、阻燃防護(hù)等功效。Chenlink作為國產(chǎn)UV膠水廠家,針對LED燈具也生產(chǎn)了一系列UV膠水,可用于玻璃接,塑料接以及金屬
    的頭像 發(fā)表于 07-26 09:23 ?251次閱讀

    esp8266讀取模擬數(shù)據(jù)并記錄到eeprom,發(fā)送tcp時(shí)無法讀取模擬如何解決?

    嗨,esp8266 讀取模擬數(shù)據(jù)并記錄到 eeprom,我正在將存儲在 eeprom 中的數(shù)據(jù)作為 tcp 發(fā)送,但在發(fā)送 tcp 時(shí)無法讀取模擬,如
    發(fā)表于 07-11 07:22

    為什么ESP8266 TCP透傳過程會丟?

    為什么ESP8266 TCP透傳過程會丟
    發(fā)表于 07-09 07:55

    tcp_client例程為何去掉發(fā)送后,一直接收就會容易出現(xiàn)數(shù)據(jù)呢?

    / portTICK_PERIOD_MS);} 代碼如下,當(dāng)我使用tcp_client例程,并且把發(fā)送數(shù)據(jù)注釋掉,再接收數(shù)據(jù)就很容易出現(xiàn)TCP數(shù)據(jù),求助 [22:43:18.32
    發(fā)表于 06-17 07:47

    lwip tcp的原因?

    使用lwip協(xié)議棧,作為客戶端應(yīng)答2幀數(shù)據(jù)時(shí),會有問題,在tcp write 后調(diào)用tcp output沒有效果,設(shè)置 #define TF_NODELAY((u8_t)0x40U
    發(fā)表于 05-10 06:51

    技術(shù)分享 | 芯片接空洞的超聲檢測

    隨著電子封裝技術(shù)向小型化發(fā)展,芯片散熱問題逐漸成為阻礙其具有高可靠性的瓶頸,特別是功率器件,芯片接空洞是造成器件散熱不良而失效的主要原因。因此,在對元器件的篩選檢測工作中,往往需要通過超聲檢測手段
    的頭像 發(fā)表于 04-11 11:48 ?924次閱讀
    技術(shù)分享 | 芯片<b class='flag-5'>粘</b>接空洞的超聲檢測

    烙鐵頭不錫的現(xiàn)象怎么解決?

    由于機(jī)械結(jié)構(gòu)、功能、用途的不同,電烙鐵的主要用途是焊接元件和導(dǎo)線。我們在進(jìn)行焊錫絲焊接的時(shí)候經(jīng)常會遇到烙鐵頭不錫的現(xiàn)象,該怎么解決呢?其實(shí)造成不錫的緣故還是很多,只能從中去尋找這些問題從而
    的頭像 發(fā)表于 01-22 17:37 ?7264次閱讀
    烙鐵頭不<b class='flag-5'>粘</b>錫的現(xiàn)象怎么解決?

    網(wǎng)絡(luò)丟問題分析

    通常會帶來嚴(yán)重的性能下降,特別是對 TCP 來說,丟通常意味著網(wǎng)絡(luò)擁塞和重傳,進(jìn)而還會導(dǎo)致網(wǎng)絡(luò)延遲增大、吞吐降低。 一、 哪里可能丟 接下來,我就以最常用的反向代理服務(wù)器 Nginx 為例,帶你一起看看如何分析網(wǎng)絡(luò)丟
    的頭像 發(fā)表于 11-13 11:24 ?793次閱讀
    網(wǎng)絡(luò)丟<b class='flag-5'>包</b>問題分析

    何解tcp通信中的問題

    一、 問題概述 1、描述背景 采用TCP協(xié)議進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳送的軟件設(shè)計(jì)中,普遍存在問題。這主要是由于現(xiàn)代操作系統(tǒng)的網(wǎng)絡(luò)傳輸機(jī)制所產(chǎn)生
    的頭像 發(fā)表于 11-11 11:40 ?1177次閱讀
    如<b class='flag-5'>何解</b>決<b class='flag-5'>tcp</b>通信中的<b class='flag-5'>粘</b><b class='flag-5'>包</b>問題

    TCP和拆包產(chǎn)生的原因

    一、TCP現(xiàn)象 what? TCP是個(gè)“流”協(xié)議,即沒有邊界。由于這個(gè)特性以及實(shí)際的網(wǎng)絡(luò)情況,在進(jìn)行數(shù)據(jù)傳輸時(shí)假設(shè)我們連續(xù)調(diào)用send分別發(fā)送兩段數(shù)據(jù)data1和data2,在接收
    的頭像 發(fā)表于 11-10 14:07 ?663次閱讀
    <b class='flag-5'>TCP</b><b class='flag-5'>粘</b><b class='flag-5'>包</b>和拆包產(chǎn)生的原因

    網(wǎng)絡(luò)丟問題解析

    數(shù)據(jù): 1.應(yīng)用程序的數(shù)據(jù),在TCP層增加TCP報(bào)文頭,形成可傳輸?shù)臄?shù)據(jù)。 2.在IP層增加IP報(bào)頭,形成IP報(bào)文。 3.經(jīng)過數(shù)據(jù)網(wǎng)卡
    的頭像 發(fā)表于 11-09 15:10 ?760次閱讀
    網(wǎng)絡(luò)丟<b class='flag-5'>包</b>問題解析

    tcp究竟會帶來多大的性能問題

    一個(gè)項(xiàng)目對接第三方接口數(shù)據(jù)。對方是TCP接口,發(fā)送數(shù)據(jù)頻率很高。平均2毫秒發(fā)送三四千個(gè)字節(jié)。由于TCP協(xié)議的問題,我這里接收到的數(shù)據(jù)
    的頭像 發(fā)表于 11-08 16:16 ?936次閱讀
    <b class='flag-5'>tcp</b>丟<b class='flag-5'>包</b>究竟會帶來多大的性能問題

    挑戰(zhàn)PI材料接困難,嘗試這個(gè)解決方案吧!

    探秘PI材料難于接之迷,應(yīng)用方案解決方法。
    的頭像 發(fā)表于 10-26 17:37 ?1897次閱讀
    挑戰(zhàn)PI材料<b class='flag-5'>粘</b>接困難,嘗試這個(gè)解決方案吧!

    芯片接失效模式和芯片接強(qiáng)度提高途徑

    芯片接質(zhì)量是電路封裝質(zhì)量的一個(gè)關(guān)鍵方面,它直接影響電路的質(zhì)量和壽命。文章從芯片接強(qiáng)度的失效模式出發(fā),分析了芯片接失效的幾種類型,并從失效原因出發(fā)對如何在芯片接過程中提高其
    的頭像 發(fā)表于 10-18 18:24 ?953次閱讀
    芯片<b class='flag-5'>粘</b>接失效模式和芯片<b class='flag-5'>粘</b>接強(qiáng)度提高途徑

    esp8266透傳tcp如何防止丟

    esp8266透傳tcp如何防止丟
    發(fā)表于 09-25 08:09