tcp和udp使用總結

最愛媽媽本尊發表於2017-12-14

TCP與Udp的區別

tcp和udp使用總結

tcp:

TCP 是面向連線的,並且是一種可靠的協議,在基於 TCP 進行通訊時,通訊雙方需要先建立一個 TCP 連線,建立連線需要經過三次握手,握手成功才可以進行通訊

1、基於連線的,可靠性高

2、有連線過程(3次握手過程),會有延時,實時性較差,

3、傳輸相同的資料時,TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組,TCP報頭比UDP複雜,故實際包含的使用者資料較少。TCP無丟包,而UDP有丟包,故TCP的開銷大,UDP開銷較小。

4、每一條TCP連線只能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通訊

udp:

是一種面向無連線,且不可靠的協議,在通訊過程中,它並不像 TCP 那樣需要先建立一個連線,只要(目的地址,埠號,源地址,埠號)確定了,就可以直接傳送資訊報文,並且不需要確保服務端一定能收到或收到完整的資料。它僅僅提供了校驗和機制來保障一個報文是否完整,若校驗失敗,則直接丟棄報文,不做任何處理。

應用場景:

tcp和udp使用總結

協議對比:

tcp和udp使用總結

TCP粘包、分包的解決辦法

粘包的原因:

(1)傳送方引起的粘包是由TCP協議本身造成的,TCP為提高傳輸效率,傳送方往往要收集到足夠多的資料後才傳送一包資料。若連續幾次傳送的資料都很少,通常TCP會根據優化演算法把這些資料合成一包後一次傳送出去,這樣接收方就收到了粘包資料。

(2)接收方引起的粘包是由於接收方使用者程式不及時接收資料,從而導致粘包現象。這是因為接收方先把收到的資料放在系統接收緩衝區,使用者程式從該緩衝區取資料,若下一包資料到達時前一包資料尚未被使用者程式取走,則下一包資料放到系統接收緩衝區時就接到前一包資料之後,而使用者程式根據預先設定的緩衝區大小從系統接收緩衝區取資料,這樣就一次取到了多包資料。

粘包的解決辦法————封包:

封包就是給一段資料加上包頭,這樣一來資料包就分為包頭和包體兩部分內容了。包頭其實上是個大小固定的結構體,其中有個結構體成員變數表示包體的長度,這是個很重要的變數,其他的結構體成員可根據需要自己定義。根據包頭長度固定以及包頭中含有包體長度的變數就能正確的拆分出一個完整的資料包。

拆包: 根據封包的包頭規則解析出每一個完整的資料包,然後做相應的業務處理。

一篇介紹封包和拆包的文章

UDP分包傳送和接收方重組資料包

分包: 分包傳送(封裝包的首部,包括包的大小、型別、序號、數量等)

1、在客戶端將你要傳送的內容(檔案什麼的都可以)分塊,每塊內容進行編號,然後傳送;

2、服務端在接收到你的分塊資料以後,根據你的客戶端資料類容的編號重新組裝;

3、一般我們在傳送資料的時候,儘量採用比較小的資料塊的方式(我的都沒有超過1024的),資料塊太大的話容易出現傳送和接收的資料時間長,匹配出問題。

組包:

假設一個埠只接收固定一個對方資料來源,這樣,收到一個資料包放到緩衝裡,然後在緩衝里根據幀的序號排序(每一幀的大序號是相同的,自己可以給每一個小片加上小序號,包頭裡可以加上本次資料幀一共分多少片,收到一片就統計一下,判斷是否收齊)。 當收齊後,這個幀去掉包頭回撥給上層。當在一定時間內該幀資料還沒有收齊,就說明傳輸過程有丟包了,把已收到的都丟掉就可以。 當上層的應該收到回撥的資料後,可以進行解碼播放。不過在解碼之前,先判斷一下幀序列是否連續。做為視訊資料,

如果中間有缺少的,就把這一序列都丟掉,直到下一個I幀。每個幀的序號,最好收發之間協商好,在傳送的時候帶上。

相關文章