1. 程式人生 > >網路協議學習記錄一

網路協議學習記錄一

一,網際網路協議

osi七層協議
tcp/ip五層協議
tcp/ip四層協議

資料傳輸過程:08249E4144A9EDD1113DA5F0D9325A8B

傳輸層: TCP\UDP協議
TCP\UDP的區別:
tcp協議:面向連線,訊息可靠,相對udp來講,傳輸速度慢,訊息是面向流的,無訊息保護邊界0
udp協議:面向無連線,訊息不可靠,傳輸速度快,訊息是面向包的,有訊息保護邊界.

三次握手與四次揮手過程

TCP與UDP下socket差異對比

92D144E1AD29E89A747EA8205A45F03E

緩衝區

26477429606A8C33A70EAD42D78E0372
緩衝區: 暫時存放傳輸資料的,防止你的程式在傳送資料的時候卡住,提高程式碼執行效率
輸入緩衝區:recv
輸出緩衝區:send
緩衝區有長度限制
MTU:最大傳輸單元,網路層限制是1500B,每次傳送資料

的時候不要超過這個數

粘包

須知:只有TCP有粘包現象,UDP永遠不會粘包
粘包不一定會發生,如果發生了:1.可能在客戶端已經粘了2.客戶端沒有粘的話就是在服務端粘了
第一種:連續傳送小的資料,間隔時間短,可能一次就接收到了這幾個連續的拼接在一起的小資料(傳送端需要等緩衝區滿才傳送出去,造成粘包-傳送資料時間間隔很短,資料量很小,會當做一個包發出去產生粘包)
首先需要掌握一個socket收發訊息的原理:

應用程式所看到的資料是一個整體,或說是一個流(stream),一條訊息有多少位元組對應用程式是不可見的,因此TCP協議是面向流的協議,這也是容易出現粘包問題的原因。(因為TCP是流式協議,不知道啥時候開始,啥時候結束)。而UDP是面向訊息的協議,每個UDP段都是一條訊息,應用程式必須以訊息為單位提取資料,不能一次提取任意位元組的資料,這一點和TCP是很不同的。怎樣定義訊息呢?可以認為對方一次性write/send的資料為一個訊息,需要明白的是當對方send一條資訊的時候,無論底層怎樣分段分片,TCP協議層會把構成整條訊息的資料段排序完成後才呈現在核心緩衝區。

所謂粘包問題主要還是因為接收方不知道訊息之間的界限,不知道一次性提取多少位元組的資料所造成的。
  • 原因:為了提高tcp傳輸效率,內部提供了一個叫做Nagel演算法,就是為了避免你連續傳送小的資料
    第二種:當一次接收的資料小於你一次傳送的資料長度,那麼一次接收完剩下的資料會在下一次接收資料的時候被一起接收.
  • 原因:面向流的傳輸

粘包的根本原因: 兩端互相不知道對方傳送資料的長度,所以解決粘包的方法就是解決如何讓傳送端在傳送資料前,把自己將要傳送的位元組流總大小讓接收端知曉,然後接收端來一個死迴圈接受完所有資料。

針對上面的原因有兩種解決粘包的方案

  1. 在傳送資料前,先發送資料的長度,那麼接收根據資料的長度來進行接收資料