# TCP與UDP
一,分析TCP與UDP報文
TCP與UDP都是位于OSI模型傳輸層的兩個協議
(1)UDP的報文頭:

如上圖:UDP基本組成包括16位的源埠號和目的埠號+資料
通過源埠號和目的埠號來進行傳輸;資料部分為保存的具體內容
UDP的特點:
1,溝通簡單,不需要處理邏輯、和資料結構;
2,不會建立連接,但是會監聽這個地方,誰的資料都接收,也會傳輸資料給別人;
3,二愣子,傳輸完資料不管是否丟包,是否會擁塞;
基于UDP實作例子
①直播,直播對實時性的要求比較高,寧可丟包,也不要卡頓的,所以很多直播應用都基于 UDP 實作了自己的視頻傳輸協議,
②實時的游戲,游戲的特點也是實時性比較高,在這種情況下,采用自定義的可靠的 UDP 協議,自定義重傳策略,能夠把產生的延遲降到最低,減少網路問題對游戲造成的影響,
③物聯網,一方面,物聯網領域中斷資源少,很可能知識個很小的嵌入式系統,而維護 TCP 協議的代價太大了;另一方面,物聯網對實時性的要求也特別高,比如 Google 旗下的 Nest 簡歷 Thread Group,推出了物聯網通信協議 Thread,就是基于 UDP 協議的,
(2)TCP報文頭
網路傳輸層中,TCP是面向連接、可靠的、位元組流傳輸,
TCP協議通信雙方必須先建立連接,通信雙方必須為該連接分配必要的內核資源,以管理連接的狀態和連接上資料的傳輸,TCP是全雙工的,即雙方的資料讀寫可通過一個連接進行,完成資料交換之后,通信雙方都必須斷開連接以釋放系統資源,
TCP協議的這種連接是一對一的,它的位元組流服務是多對多的,所以基于廣播和多播(目標是多個主機地址)的應用程式不能使用TCP服務,而無連接的UDP則十分適合這種廣播和多播,

從上往下看報文結構,分析如下:
首先,可以看到16位源埠和目標埠號,和UDP一樣
包的序號:解決亂序問題,先來后到
32位確認號(acknowledgement number):用作對另一方發送來的TCP報文段的回應,其值是收到的TCP報文段的序號值加1,
6位標志位作用如下:
URG標志:表示緊急指標(urgent pointer)是否有效,
ACK標志:表示確認號是否有效,我們稱攜帶ACK標識的TCP報文段為確認報文段,
PSH標志:提示接收端應用程式應該立即從TCP接識訓沖區中讀走資料,為接收后續資料騰出空間(如果應用程式不將接收
到的資料讀走,它們就會一直停留在TCP接識訓沖區中),
RST標志:表示要求對方重新建立連接,我們稱攜帶RST標志的TCP報文段為復位報文段,
SYN標志:表示請求建立一個連接,我們稱攜帶SYN標志的TCP報文段為同步報文段,
FIN標志:表示通知對方本端要關閉連接了,我們稱攜帶FIN標志的TCP報文段為結束報文段,
狀態位,SYN是發起一個鏈接,ACK是回復,RST是重新連接,FIN是結束連接,
因為TCP是面向連接的,因此需要雙方維護連接的狀態,不然雙方連接狀態的變化會直接導致出錯;
視窗的大小設定,進行流量控制,標識自己當前的處理能力;它告訴對方本端的TCP接識訓沖區還能容納多少位元組的資料,這樣對方就可以控制發送資料的速度,
其次,TCP 的順序問題,丟包問題,流量控制都是通過滑動視窗來解決的
擁塞控制時也是通過擁塞視窗來解決的,
延伸常談的一些問題:順序問題、擁塞控制、丟包問題、連接維護、流量控制
二,TCP 的三次握手
首先建立連接,連接后需要連接維護,同時商量如何順序發送包,也就是處理好包的序號問題
TCP 的建立連接稱為三次握手,簡單來說就是鄰居之間日常問候,①老張對老李說;吃飯了不;②老李看到老張訊息,回復說:吃了沒吃飽啊,還要整點夜宵不;③老張收到老李訊息:可以啊,走起,
理解來說就是,老張發送了吃飯請求也收到了老力吃了的回應,老李收到了老張請求訊息并回應了老張的請求,雙方有來有回,和打太極一樣,
詳解分析具體程序

分析圖中的具體欄位意思:closed(未連接)、listen(監聽)、SYN-SENT(同步發送)、SYN-RCVD(同步收到)、ESTABLISHED(建立連接)
分析程序:
①初始狀態,客戶端和服務器都處于 CLOSED 狀態,然后這時服務端主動監聽某個埠,處于 LISTEN 狀態,
②客戶端主動發起連接 SYN(請求建立連接),之后處于 SYN-SENT 狀態,被服務器端監聽到,
③服務端接收了客戶端發起的連接,并回傳 SYN(請求建立連接),并且 ACK ( 確認 ) 客戶端的 SYN,然后處于 SYN-SENT 狀態,
④客戶端接收到服務端發送的 SYN 和 ACK ,確認了服務端的請求即ACK了,進入了ESTABLISHED狀態,然后將它確認連接的訊息發送給了服務器,
⑤服務器收到了客戶端的ACK,也進入ESTABLISHED狀態,至此這兩兄弟建立友誼連接;
四,TCP與UDP的區別
- TCP 是面向連接的,UDP 是面向無連接的
- UDP程式結構較簡單,TCP程式結
- TCP 是面向位元組流的,UDP 是基于資料報的
- TCP 保證資料正確性,UDP 可能丟包
- TCP 保證資料順序,UDP 不保證
五,為什么說TCP可以實作可靠連接
(1) 排好隊,一個一個來,按部就班的進行,有條不紊; TCP 報文頭里面的序號能使 TCP 的數 據按序到達,從而使傳輸的資料無差錯的,不丟失,不重復,且按順序到達,
(2)誰遲到,誰沒來,都要明確;報文頭里面的確認序號能保證不丟包,累計確認及超時重傳機制
(3)飯量時時管控好,不然肉肉來找抱;報文頭的視窗大小,進行流量控制,標識自己當前的處理能力;它告訴對方本端的TCP接識訓沖區還能容納多少位元組的資料,這樣對方就可以控制發送資料的速度,
各位道友學習之后有建議可以共同探討探討哦
一步兩步往上沖~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296492.html
標籤:其他
