網絡協議之TCP和UDP

寫在前面

本文來看下TCP和UDP協議。
我們接觸這兩個協議最多的應該就是在面試中了,經典題目就是“TCP和UDP有什么區別?”,而最常得到的答案就是TCP是面向連接的,而UDP是面向無連接的。
那么這里的連接到底是什么呢?難道真的是有一條物理上的線在那里嗎?當然不是,實際上是這樣子的,我們知道,TCP想要建立連接,必須經歷三次握手的過程,三次握手其實就是在交換數據,而三次握手之后,雙方都會將這些TCP協議本身需要用到的數據使用一定的數據結構維護起來,所以連接其實就是使用一定的數據結構保存的數據,也所以連接其實就是數據了,即連接=數據。那么UDP為什么是無連接的呢,因為它不需要維護這些數據。使用這些數據來維護交互的狀態,也就是在邏輯上連接起來了,而絕非物理上的。
TCP維護連接狀態的數據都有哪些呢,比如滑動窗口信息,哪些數據發送了沒有ack,哪些數據發送了還沒有ack,哪些數據還沒有發送等。
其他區別:

TCP提供可靠交付,UDP不是
TCP是面向流的,沒頭沒尾,而UDP是基于數據包的,一個個發,一個個收
TCP有擁塞控制,UDP沒有

所以啊,可以總結來看,TCP也是一個服務,而程序分為無狀態的服務和有狀態的服務,很明顯TCP是屬于有狀態的服務了。相對應的UDP就是一個無狀態的服務。

1:UDP

UDP全稱,user diagram protocol,即用戶數據報協議,是一種無連接協議。

1.1:UDP的頭

當機器收到一個包之后,物理層首先會拆掉物理層頭部,判斷MAC地址是否匹配,如果是匹配則交給網際層,網際層獲取頭部后,發現IP地址匹配,則交給傳輸層處理,但是到底是交給哪種傳輸層協議呢,這里需要看IP頭部的具體存放使用的是TCP還是UDP的8位協議信息了,這里假定是UDP,數據到達UDP,UDP怎么知道交給哪個應用程序呢?這就需要端口號了,也就是UDP頭的如下信息:
在這里插入圖片描述
這里也可以看到UDP的頭只有8個字節,簡單到一塌糊涂。而相比之下TCP的頭就要復雜多了。
傳輸層處理完畢之后,內核的工作也就完成了。接下來只要找到監聽了目標端口號的應用程序,交給其處理就行了。

1.2:UDP適用的場景和實例

1.2.1:網絡比較好的內網環境

比如像飛鴿,飛秋等內網的聊天工具。

1.2.2:對時延敏感,且對少少量丟包不敏感應用

比如實時對戰游戲,屬于分秒必爭型的,很多職業玩家,為了進一步降低時延甚至會買專業版的鼠標和鍵盤。如果是使用TCP,可能為了等待上一個沒有到達的包,早就被爆頭了。
比如直播場景,視頻網站,少量的丟包用戶其實是沒有感知的,特別是直播追求實時性,已經丟失的包就算等到了其實也沒有意義了。

1.2.3:應用本身資源少

比如IOT物聯網,設備內部可能只是嵌入了一個很小的操作系統,終端系統資源很少,而TCP需要額外存儲一些維護連接狀態的數據,協議代價比較大。

1.2.4:廣播場景

比如DHCP。就算丟包也所謂,重發就行了。

2:TCP

TCP相對于UDP復雜多了,因為TCP要實現流量控制,順序控制,擁塞控制等,而想要實現這些控制,就需要額外存儲相關數據,這些數據自然需要保存在頭中,所以,這部分我們先從TCP的頭看起。

2.1:TCP頭

如下:
在這里插入圖片描述

  • 源端口和目標端口
    沒得說,最低配了,UDP就是如此。
  • 序號和確認序號
    序號是給包指定順序的,解決亂序問題。確認序號是用來進行確認哪個序號的包已經收到的,解決包丟失問題。
需要注意:確認序號是來確認哪個序號的包已經收到的,其和序號本身具有順序是沒有任何關系的,
即就算序號本身是隨機順序對確認序號也是沒有絲毫影響的。 
  • 常用的狀態位們
URG:緊急位,需要被優先發送的包,比如要下一個大文件,但是下載過程中突然取消下載,這個取消下載的消息就應該緊急發送到應用層。
ACK:確認包位,該位置為1時代表時一個確認包
PSH:推送
RST:連接重置包位,跳過四次揮手,直接斷開連接
SYN:三次握手建立連接位
FIN:四次回收斷開連接位

注意這些狀態位的發送會引起雙方狀態的變更。

  • 窗口大小
    做流量控制,用來告知對方自己的處理能力,別發太快了,也別發太慢了,即改用什么速度來發送數據,就是流控了。
  • 校驗和
    UDP也有,最低配了,校驗數據的完整性。

2.2:三次握手

  • 為什么是三次?
    既然要建立連接就要確定對方是在的,至少在自己發消息的那一刻是在的,而要確定是在的,就至少需要一個來回,如下:
1:A給B發消息,此時B知道A是在的
2:B給A回消息,此時A知道B是在的 

欸,這么看起來2次握手就夠了,但,握手的目的是要建立連接,而建立連接的本質就是數據的交換,這里交換的數據呢就是數據的序號了,當然這個不必過分關心,只要知道是要交換數據來構建維護連接的狀態的數據結構就行了。因此不僅要確定對方在,還要確定自己發給對方的數據對方收到了,所以過程就變為如下這樣:

1:A給B發消息并攜帶數據,此時B知道A是在的
2:B給A回消息并攜帶數據,此時A知道B在的,并且收到了自己的數據
3:A給B回消息并攜帶數據(此時其實就可以攜帶業務數據了),B就知道A收到自己的數據了

所以至少需要三次握手。你可能會說萬一三次握手之后服務掛了咋辦,這咱就控制不了了,只能是盡人事,聽天命了。參考圖:
v

2.3:四次揮手

按照正常的邏輯斷開連接的過程應該是這個樣子的:

1:A給B說,我要斷開
2:B給A回,好的,我也斷開了

這樣子其實是有問題的,因為B不能直接斷開連接,原因是這個關閉的動作應該由上層應用來被動完成,而非主動完成,因為上層應用還要釋放資源等。所以這個過程要變成如下:

1:A給B說,我要斷開
2:B給A回,好的,我已經通知上層應用了,等上層應用關閉我再通知你
3:B上層應用調用關閉方法,B再給A回,上層應用已經關閉了,我關閉了啊
4:A給B回,好的,我收到了

這個時候B已經關閉了,但是A還不能關閉,因為B的包可能還在路上,所以要等待所有的包都死翹翹了才關閉,這個時間時2MSL。如果是A很快將端口釋放出來,則來自B還在路上的包可能會被新占用了該端口的新應用收到,出現問題,當然現在可以通過時間戳等技術直接識別并丟棄端口上一任主人的包,但這里就相當于是上了個雙保險了。

為啥B不用等2MSL呢?因為A主動關閉,這個時候A不會再發業務包出去了,而在四次握手時,因為上層應用還沒有釋放資源和調用內核的關閉,所以上層應用還是有可能發出新的包的,所以A要等,而B不用等。
為啥是2MSL?一來一回的時間,A主動關閉前可能剛給B發了包,此時A發給B,B響應A,剛好2MSL。

這個過程如下圖:
在這里插入圖片描述

2.4:TCP狀態機

看圖重要
在這里插入圖片描述

2.5:消息重傳和確認

參考這里 。

2.6:滑動窗口

參考這里 。

2.7:擁塞控制

參考這里 。

寫在后面

參考文章列表

多知道一點

網絡包的單位都有哪些?

網絡傳輸是以包為單位的,二層叫幀,網絡層叫包,傳輸層叫段。我們籠統地稱為包。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919644.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919644.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919644.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt音樂播放器項目實踐:本地持久化與邊角問題處理

本音樂播放器完整項目源碼(包含各個按鈕的圖片文件): ly/Project-Code - Gitee.com 一.本地持久化 請注意,學習此部分之前需要讀者具有一定的Mysql基礎。如果讀者能夠接受無法本地持久化,那么可以跳過這部分內容,直接去看邊角問題處理。我…

基于NB-IoT技術的寵物定位跟蹤系統設計#基于STM32\物聯網\單片機技術的寵物定位跟蹤系統

基于NB-IoT技術的寵物定位跟蹤系統設計#基于STM32\物聯網\單片機技術的寵物定位跟蹤系統在設計基于NB-IoT技術的寵物定位跟蹤系統時,首先明確了系統分為感知層、網絡層和應用層三個部分。在感知層,考慮到需要獲取寵物位置和運動狀態,選用GPS定…

【入門級-算法-3、基礎算法:遞歸法】

遞歸是一種非常重要的算法思想,它指的是函數調用自身的過程。遞歸通常包含兩個主要部分:基線條件(終止條件)和遞歸條件(調用自身的條件)。 下面通過例子來理解遞歸算法: 計算階乘 階乘的遞歸定義…

【CS創世SD NAND征文】存儲芯片在工業電表中的應用與技術演進

【CS創世SD NAND征文】存儲芯片在工業電表中的應用與技術演進1.工業電表的市場背景2.技術方案分析3.核心技術特性3.1.主控芯片:APM32F465VET63.3.存儲芯片:CSNP4GCR01-DPW3.3.1. 基本概述3.3.2. 核心特性3.3.3. 優勢特點3.3.4 四大管理算法4.存儲芯片性能…

建筑施工遮擋場景漏檢率↓76%:陌訊動態融合算法實戰解析

原創聲明 本文為原創內容,技術參數及架構解析引用自《陌訊技術白皮書》,未經授權禁止轉載。 一、行業痛點:建筑施工安全監控的 "看得見" 與 "看不準" 建筑施工場景的安全監控長期面臨雙重挑戰:一方面&…

【LeetCode題解】LeetCode 209. 長度最小的子數組

【題目鏈接】 209. 長度最小的子數組 【題目描述】 【題解】 方法一:滑動窗口 本題可以使用雙指針算法,定義兩個指針l和r分別表示子數組的開始位置和起始位置,sum數組存儲的從l到r區間內所有元素的和。初始狀態下,l和r都指向下…

2025-08-21 Python進階6——迭代器生成器與with

文章目錄1 迭代器與生成器1.1 迭代器1.1.1 基本使用1.1.2 手動迭代(帶異常處理)1.1.3 自定義迭代器1.2 生成器1.2.1 工作原理1.2.2 斐波那契數列示例1.3 推導式1.3.1 列表推導式1.3.2 字典推導式1.3.3 集合推導式1.4.4 元組推導式(生成器表達…

C++——C++重點知識點復習2(詳細復習模板,繼承)

目錄 模板 函數模板 類模板 非類型模板參數 模板的特化 函數模板特化 類模板的特化 為什么普通函數可以分離? 繼承 繼承概念 基類和派生類對象賦值轉換(切割,切片) 隱藏 派生類的默認成員函數 .復雜的菱形繼承及菱形…

python 項目編號 2025821 有關于中英文數據的收集、處理

python專欄記錄:前言 批量讀取單詞 JSON 文件 → 解析出單詞、釋義、例句、短語 → 數據清洗(去掉特殊符號) → 同步更新到 MySQL 數據庫。 內容 import json import pymysql import re import time from pymysql.converters import escape_s…

Document Solutions .NET Bundle 8.2.0

Document Solutions .NET Bundle 8.2.0MESCIUS 的 Document Solutions .NET Bundle 是一套完整的 API 和查看工具,可增強文檔處理并提高效率。它包含 Excel、Word、PDF 和圖像文檔,以及 PDF 查看器、數據查看器和圖像查看器的標準許可證。它將強大的 .NE…

在職老D滲透日記day20:sqli-labs靶場通關(第27關)get報錯注入 過濾select和union ‘閉合

5.27.第27關 get報錯注入 過濾select和union 閉合function blacklist($id) { $id preg_replace(/[\/\*]/,"", $id); //strip out /* $id preg_replace(/[--]/,"", $id); //Strip out --. $id preg_replace(/[#]/,"", $id); //Strip out #. $…

Go 并發編程-channel

channel 文章目錄channel簡介基本概念類型表示法值表示法操作的特性初始化通道接收元素值Happens before發送值例1核心組件關鍵執行順序輸出示例(可能順序)設計要點例2例3關閉通道長度與容量單向通道主要用途增強代碼表達性和安全性(最重要的…

開源和免費一樣嗎?以商城系統為例為您分析~

開源和免費并不完全一樣,二者在核心定義、權利范圍和實際應用中存在顯著區別,具體可以從以下幾個方面理解: 1. 核心定義不同開源(Open Source): 指軟件的源代碼是公開可獲取的,任何人都可以查看…

CMOS知識點 MOS管飽和區電流公式

知識點16&#xff1a;同上篇一樣&#xff0c;MOS管主要有3個工作區域&#xff1a;截止區&#xff08;Cut-off Region&#xff09;&#xff1a; < &#xff0c;沒有溝道形成&#xff0c;幾乎沒有電流。線性區/三極管區&#xff08;Triode Region&#xff09;&#xff1a; &g…

【集合框架LinkedList底層添加元素機制】

在 Java 集合框架中&#xff0c;LinkedList 與 ArrayList 是兩種截然不同的線性表實現。如果說 ArrayList 像一個可以伸縮的“盒子陣列”&#xff0c;那么 LinkedList 就像一條由“節點”串聯而成的“雙向鏈條”。今天&#xff0c;我們將深入 LinkedList 的源碼&#xff0c;一步…

《P2700 逐個擊破》

題目背景三大戰役的平津戰場上&#xff0c;傅作義集團在以北平、天津為中心&#xff0c;東起唐山西至張家口的鐵路線上擺起了一字長蛇陣&#xff0c;并企圖在潰敗時從海上南逃或向西逃竄。為了就地殲敵不讓其逃走&#xff0c;指揮官制定了先切斷敵人東西兩頭退路然后再逐個殲滅…

C6.0:晶體管放大器的原理與應用(基極偏置篇)

將晶體管Q點偏置在負載線中點附近后&#xff0c;如果將一個小的交流信號耦合到基極上&#xff0c;便會產生一個交流的集電極電壓&#xff0c;交流集電極電壓與交流基極電壓波形相似&#xff0c;但是幅度要大了很多&#xff0c;即交流集電極電壓是對交流基極電壓的放大。本篇學習…

Oracle: cannot decrease column length because some value is too big

1.背景今天項目上查不到數據,查庫發現默認20位的字段被改為了200,用的還是char類型&#xff0c;填充了一堆空格 2.知識LENGTH() 函數用于計算字符串字段 長度TRIM() 函數用于去除字符串字段 column 前后的空格&#xff08;默認&#xff09;或指定字符&#xff1a;SUBSTR() 用于…

Elasticsearch 寫入全鏈路:從單機到集群

0. 先把術語擺正 Index&#xff08;索引&#xff09;&#xff1a;邏輯數據集合&#xff0c;≈ MySQL 的庫。Document&#xff08;文檔&#xff09;&#xff1a;一條 JSON 數據&#xff0c;≈ MySQL 的行。Field&#xff08;字段&#xff09;&#xff1a;文檔里的鍵值&#xff0…

Java多線程編程——基礎篇

目錄 前言 一、進程與線程 1、進程 2、線程 二、并發與并行 1、并發 2、并行 三、線程調度 1、CPU時間片 2、調度方式 ①時間片輪轉 ②搶占式調度 四、線程實現方式 1、繼承 Thread 類 Thread的多種構造函數&#xff1a; 2、實現 Runnable 接口 五、線程的核心方法 1、start() …