首頁 常見問題 tcp黏包問題怎麼處理?

tcp黏包問題怎麼處理?

Jun 28, 2020 pm 01:02 PM
tcp 黏包

tcp黏包問題處理的方法:1、定長發送法,發送端在發送資料時都以LEN為長度進行分包;2、尾部標記序列法,在每個要傳送的資料包的尾部設定一個特殊的位元組序列;3、頭部標記逐步接收法,定義一個使用者報頭,在報頭中註明每次發送的資料包大小。

tcp黏包問題怎麼處理?

tcp黏包問題處理的方法:

 1、設計方案一:定長發送

在進行資料傳送時採用固定長度的設計,也就是無論多大資料發送都分包為固定長度(為便於描述,此處定長為記為LEN),也就是發送端在發送資料時都以LEN為長度進行分包。這樣接收方都以固定的LEN進行接收,如此一來發送和接收就能一一對應了。分包的時候不一定能完整的剛好分成多個完整的LEN的包,最後一個包一般都會小於LEN,這時候最後一個包可以在不足的部分填充空白字節。

當然,這種方法會有缺陷。

1.最後一個套件的不足長度被填滿為空白部分,也即無效位元組序。那麼接收方可能難以辨別這無效的部分,它本身就是為了補位的,並無實際意義。這就為接收端處理其意義帶來了麻煩。當然也有解決辦法,可以透過增添標誌位的方法來彌補,即在每個資料包的最前面增加一個定長的報頭,然後將該資料包的末尾標記一併發送。接收方根據這個標記確認無效位元組序列,從而實現資料的完整接收。

2.在發送包長度隨機分佈的情況下,會造成頻寬浪費。例如發送長度可能為1,100,1000,4000位元組等等,則都需要按照定長最大值即4000來發送,資料包小於4000位元組的其他包也會被填充至4000,造成網路負載的無效浪費。

綜上,此方案適在傳送封包長度較為穩定(趨於某一固定值)的情況下有較好的效果。

相關學習推薦:PHP 程式設計從入門到精通

2、設計方案二:尾部標記序列

在每個要傳送的資料包的尾部設定一個特殊的位元組序列,此序列帶有特殊意義,跟字串的結束符標識”\0”一樣的含義,用來標示這個資料包的末尾,接收方可對接收的資料進行分析,透過尾部序列確認資料包的邊界。

這種方法的缺陷較為明顯:

1.接收方需要對資料進行分析,甄別尾部序列。

2.尾部序列的確定本身就是一個問題。什麼樣的序列可以像”\0”一樣來做一個結束符號呢?這個序列必須是不具備通常任何人類或程式可識別的帶含義的資料序列,就像「\0」是無效字串內容,因而可以作為字串的結束標記。那普通的網路通訊中,這個序列是什麼呢?我想一時間很難找到恰當的答案。

 

3、設計方案三:頭部標記逐步接收

這個方法是作者有限學識裡最好的方法了。它既不損失效率,也完美解決了任何大小的資料包的邊界問題。

這個方法的實作是這樣的,定義一個使用者報頭,在標頭中註明每次發送的資料包大小。接收者每次接收時先以報頭的size進行數據讀取,這必然只能讀到一個報頭的數據,從報頭中得到該數據包的數據大小,然後再按照此大小進行再次讀取,就能讀到數據的內容了。

這樣一來,每個資料包發送時都封裝一個報頭,然後接收方分兩次接收一個包,第一次接收報頭,根據報頭大小第二次才接收資料內容。 (此處的data[0]的本質是一個指針,指向資料的正文部分,也可以是一篇連續資料區的起始位置。因此可以設計成data[user_size],這樣的話。)

下面透過一張圖來展現設計想法。

 tcp黏包問題怎麼處理?

由圖看出,資料發送多了封裝標頭的動作;接收方將每個包的接收拆分成了兩次。

這方案看似精妙,實則也有缺陷:

1.報頭雖小,但每個包都需要多封裝sizeof(_data_head)的數據,積累效應也不可完全忽略。

2.接收方的接收動作分成了兩次,也就是進行資料讀取的操作被增加了一倍,而資料讀取操作的recv或read都是系統調用,這對核心而言的開銷是不能完全忽略的影響,對程式而言效能影響可忽略(系統呼叫的速度非常快)。

優點:避免了程式設計的複雜性,其有效性便於驗證,對軟體設計的穩定性要求來說更容易達標。綜上,方案三乃上上策!

以上是tcp黏包問題怎麼處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
win10如何重置tcp/ip協定? windows10重置tcp/ip協定棧的方法 win10如何重置tcp/ip協定? windows10重置tcp/ip協定棧的方法 Mar 16, 2024 am 11:07 AM

win10如何重置tcp/ip協定?其實方法很簡單的,使用者可以直接的進入到命令提示符,然後按下ctrl shift enter的組合鍵來進行操作就可以了或者是直接的執行重置命令來進行設置,下面就讓本站來為使用者來仔細的介紹一下windows10重置tcp/ip協定棧的方法吧。 windows10重置tcp/ip協定棧的方法一、管理員權限1、我們使用快捷鍵win R直接開啟運行窗口,然後輸入cmd並按住ctrl shift enter的組合鍵。 2、或者我們可以直接在開始選單中搜尋命令提示符,右鍵點

python中怎麼使用TCP實作對話客戶端和伺服器 python中怎麼使用TCP實作對話客戶端和伺服器 May 17, 2023 pm 03:40 PM

TCP客戶端一個使用TCP協定實現可連續對話的客戶端範例程式碼:importsocket#客戶端設定HOST='localhost'PORT=12345#建立TCP套接字並連接伺服器client_socket=socket.socket(socket.AF_INET,socket .SOCK_STREAM)client_socket.connect((HOST,PORT))whileTrue:#取得使用者輸入message=input("請輸入要傳送的訊息:&

活久見! TCP兩次揮手,你有看過嗎?那四次握手呢? 活久見! TCP兩次揮手,你有看過嗎?那四次握手呢? Jul 24, 2023 pm 05:18 PM

那這裡面提到的"面向連接",意味著需要 建立連接,使用連接,釋放連接。建立連線是指我們熟知的TCP三次握手。而使用連接,則是透過一發送、一確認的形式,進行資料傳輸。還有就是釋放連接,也就是我們常見的TCP四次揮手。

如何在Java中使用單一TCP連線發送多個檔案? 如何在Java中使用單一TCP連線發送多個檔案? Apr 27, 2023 am 08:49 AM

使用一個TCP連線發送多個檔案為什麼會有這篇部落格?最近在看一些相關方面的東西,簡單的使用一下Socket進行程式設計是沒有的問題的,但是這樣只是建立了一些基本概念。對於真正的問題,還是無能為力。當我需要進行檔案的傳輸時,我發現我好像只是發送過去了資料(二進位資料),但是關於檔案的一些資訊卻遺失了(檔案的副檔名)。而且每次我只能使用一個Socket發送一個文件,沒有辦法做到連續發送文件(因為我是依靠關閉流來完成發送文件的,也就是說我其實是不知道文件的長度,所以只能以一個Socket連接代表一個檔案)。

Java API 開發中使用 Netty4 進行 TCP 通信 Java API 開發中使用 Netty4 進行 TCP 通信 Jun 17, 2023 pm 11:18 PM

TCP是電腦網路通訊協定的一種,是一種連線導向的傳輸協定。在Java應用開發中,TCP通訊被廣泛應用於各種場景,例如客戶端和伺服器之間的資料傳輸、音訊視訊即時傳輸等等。 Netty4是一個高效能、高可擴展性、高效能的網路程式框架,能夠優化伺服器和用戶端之間的資料交換流程,使其更有效率可靠。使用Netty4進行TCP通訊的具體實作步驟如下:引入

Nginx怎麼配置TCP負載平衡 Nginx怎麼配置TCP負載平衡 May 19, 2023 am 08:29 AM

假設Kubernetes叢集已經配置好,我們將基於CentOS為Nginx建立一個虛擬機器。以下是實驗中設定的詳細資訊:Nginx(CenOS8Minimal)–192.168.1.50KubeMaster–192.168.1.40KubeWorker1–192.168.1.41KubeWorker2–192.168.192.168.1.41KubeWorker2–192.168.1.421)所以需要安裝e

Linux SIGPIPE訊號 Linux SIGPIPE訊號 Feb 19, 2024 pm 04:00 PM

在TCP通信雙方中,為了描述方便,以下將通信雙方用A和B代替。根據TCP協定規定,如果A關閉連線後B繼續發送數據,B會收到A的RST回應。若B繼續發送數據,系統會發出SIGPIPE訊號告知連接已斷開,停止發送。系統對SIGPIPE訊號的預設處理行為是讓B進程退出。作業系統對SIGPIPE訊號的這種預設處理行為非常不友好,讓我們來分析一下。 TCP通訊是全雙工頻道,相當於兩條單工頻道,連線兩端各負責一條。當對端「關閉」時,雖然本意是關閉整個兩條頻道,但本端只是收到FIN包。依TCP協議的規定,當一

面試官問:一個TCP連線可以發送多少個HTTP請求? 面試官問:一個TCP連線可以發送多少個HTTP請求? Feb 22, 2023 pm 12:00 PM

曾經有這麼一道經典面試題:從 URL 在瀏覽器被輸入到頁面展現的過程中發生了什麼事?相信大多數準備過的同學都能回答出來,但如果繼續問:收到的HTML 如果包含幾十個圖片標籤,這些圖片是以什麼方式、什麼順序、建立了多少連接、使用什麼協議被下載下來的呢?