文章目錄
- 1、TCP與UDP的比較
- 1.1 對比
- 1.2 總結
- 2、UDP
- 3、TCP
- 3.1 三次握手
- 3.2 四次揮手
- 4、問題
1、TCP與UDP的比較
1.1 對比
| UDP | TCP | |
|---|---|---|
| 是否連接 | 無連接 | 面向連接 |
| 是否可靠 | 不可靠 | 可靠,流量控制,擁塞控制 |
| 連接物件個數 | 混合 | 一對一 |
| 傳輸方式 | 報文 | 位元組流,不保存邊界 |
| 首部開銷 | 小,8位元組 | 最小20位元組,最大60位元組 |
| 適用場景 | 實時應用(直播) | 可靠傳輸(檔案傳輸) |


簡述 TCP 的報文頭部結構
1.2 總結
- TCP向上提供面向連接可靠服務,UDP向上提供無連接不可靠服務,
2、UDP
它的不可靠體現在無連接,傳輸資料不需要像 TCP 一樣三次握手,想咋發就咋發,并且只對資料拆分和拼接,
UDP 無擁塞控制,不會因為網路原因改變自己發送速率,弊端網路阻塞時會發生丟包,好處某些高實時性場景需要 UDP,
UDP盡最大努力交付

頭部開銷小,使 UDP 傳輸資料報文賊快,

UDP 頭部資料:
- 兩個 16 位埠號,源埠,目標埠
- 資料報文長度
- 資料報文校驗和,用于發現頭部資訊和資料中錯誤
只有 8 位元組,相比于 TCP 至少 20 位元組,傳數報文快的一批,
3、TCP
當我們瀏覽網頁時,不希望看的到是頁面一部分, TCP 連接就派上用場,
3.1 三次握手
【我可以連你嗎?可以,那我連了,】

- Client 發出 TCP 請求,將報文首部
同步位SYN置 1 ,表明這是一個 TCP 請求報文段,序號欄位seq置 x ,作為 TCP 客戶行程的初始序號, - Server 同意建立請求,向 Client 發送 請求確認報文段,并進入同步已接受狀態,首部
同步為SYN / 確認位ACK置 1,表明這是一個 TCP 請求確認報文段 ,序號欄位seq置 y,作為 TCP服務行程的初始序號,確認號欄位ack置 x+1, - Client 收到 TCP 請求確認報文,再向 Server 發送一個 確認報文,并進入 ESTABLISHED 狀態,首部
確認位ACK置 1,表明這是一個普通 TCP確認報文段,序列號seq置 x+1,確認號欄位ack置 y+1,Server 接受這個報文后,也進入 ESTABLISHED 狀態,連接建立完畢,
3.2 四次揮手
【給我關閉連接,老大我去關閉,老大關閉好了,確認關閉好了你走吧】

- Client 主動關閉連接,發送 TCP釋放報文段,并進入終止等待1狀態,首部
終止位FIN / 確認位/ACK置 1,表明這是一個 TCP 釋放報文段,同時對之前收到的報文進行確認,序列號seq置 u(Client 之前已發送資料的最后一個位元組序號 + 1),確認號ack置 v (Client 之前已接受資料的最后一個位元組序號 + 1), - Server 收到 TCP 釋放報文后,發送一個普通 TCP 確認報文,并進入關閉等待狀態,首部
確認位ACK置 1,表明這是一個普通 TCP 確認報文段,序號seq置 v(Server 之前已發送資料的最后一個位元組序號 + 1),確認號ack置 u+1,對 TCP 釋放報文的確認,Client 收到 TCP 確認報文后進入終止等待2狀態, - Server 發送 TCP 釋放報文,并進入最后確認狀態,首部
終止位FIN / 確認位ACK置 1,表明這是一個 TCP 釋放報文段,同時對之前收到的報文進行確認,序號seq置 w,因為在半關閉狀態 Server 又發送了一些資料,確認號ack置 u+1,對之前收到的報文重復確認, - Client 收到 TCP 釋放報文段后,發送普通 TCP 確認報文段,并進入時間等待狀態,首部
ACK置 1,序號seq置 u+1,因為 Client 最開始發送 TCP 連接釋放報文沒有攜帶資料,但是消耗了一個序號,確認號ack置 w+1,對收到的 TCP 連接釋放報文段的確認,Server 收到該報文后就進入關閉狀態,而 Client 還需經過 2MSL 后才能關閉,
TCP 規定終止位FIN為1的報文段即使不攜帶資料,也要消耗一個序號,
4、問題
為什么連接的時候是三次握手,關閉的時候卻是四次握手?
- 三次握手:
服務端接受到客服端發送的 SYN 請求連接后,可以直接回復 SYN + ACK,SYN 用來同步,ACK 用來確認, - 四次揮手:
客服端發起 FIN 請求關閉時,服務端只能回復 ACK 同意關閉(因為客服端發起關閉,表示客服端不再發報文了,但服務端可能有報文沒發完,故現在不能直接關閉),等待服務端把所有報文發送完,再發送 FIN 請求關閉,
為什么要有 TIME_WAIT 狀態?
經過 2MSL 時間,可以使本次連接所有報文段消失,這樣下一個新的 TCP 連接中不會接受到上一個連接的報文,
如果沒有此狀態,客戶端發送完 TCP 確認報文直接關閉,假如中途報文丟失了,那么服務端會一直發送超時重傳給客戶端,可客戶端早就關閉了,
TCP 的 Keep-Alive
TCP 使用存活計數器決定何時發送探測報文,TCP 服務器收到客服端發送的報文,則會重置保活計時器(2小時),
保活計時器作業原理
如果兩個小時沒收到客戶端發送的資料,會向客戶端發送探測報文,以后每隔 75s 發送一次,若發送了 10 次探測報文后仍無回應,則關閉連接,
TCP keep-alive 與 HTTP keep-alive的區別
HTTP協議的Keep-Alive意圖在于TCP連接復用,同一個連接上串行方式傳遞請求-回應資料;TCP的Keepalive機制意圖在于探測連接的對端是否存活,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/343128.html
標籤:其他
上一篇:用gin來代理靜態請求
