傳輸層協議UDP原理

端口號回顧

? ? ? ? 端口號的作用類似pid,用來標識進程的唯一性。只是為了與系統解耦,所以有了端口號。

通過ip來確定唯一主機,再通過端口號找到指定的進程。就可以讓全網內唯一的兩個進程通信了。

????????所以一個完整的報文至少要攜帶ip和端口號,ip是在網絡層協議來維護的本章不做講解,而端口號是在傳輸層協議中維護的,傳輸層協議常用的兩種:UDP協議和TCP協議,本章將要講解的是UDP協議,TCP協議在下一期進行講解。

端口號:2字節(16個比特位)其中:

  • 0 - 1023: 知名端口號, HTTP, FTP, SSH 等這些廣為使用的應用層協議, 它們的端口號都是固定的。
  • 1024 - 65535: 操作系統動態分配的端口號. 客戶端程序的端口號, 就是由操作系統從這個范圍分配的

認識知名端口號
有些服務器是非常常用的, 為了使用方便, 人們約定一些常用的服務器), 都是用以下這些
固定的端口號:

  • ssh 服務器, 使用 22 端口
  • ftp 服務器, 使用 21 端口
  • telnet 服務器, 使用 23 端口
  • http 服務器, 使用 80 端口
  • https 服務器, 使用 443 端口

執行下面的命令, 可以看到知名端口號:

?cat /etc/services

思考:

  1. 一個進程是否可以 bind 多個端口號?
  2. 一個端口號是否可以被多個進程 bind?

? ? ? ? 答1:一個進程是可以綁定多個端口號的,當一個進程提供多個不同服務時,就可以通過綁定多個端口來優化。只要一個端口能確定唯一進程就行。

? ? ? ? 答2:不能。要保證一個端口確定唯一進程。

UDP協議端格式

  • 16位源端口和16位目的端口用來確定兩個唯一進程,這沒啥說的。
  • 16位UDP長度:數據字段的大小不是固定的,所以該字段來表示整個數據報(UDP 首部+UDP 數據)的長度。
  • 16位UDP檢驗和:不保證可靠性,校驗和是唯一確定數據是否有效的機制。因為在數據傳輸過程中物理干擾、路由錯誤等可能導致數據損壞。

UDP協議特點

  • 無連接: 知道對端的 IP 和端口號就直接進行傳輸, 不需要建立連接。
  • 不可靠:報文發出去任務就完成了,報文是否丟失不關心。注意這不是缺點,是特點!
  • 面向數據報:發10次,收10次。而TCP協議是面向字節流的,類似自來水。
  • 緩沖區:UDP沒有發送緩沖區,直接發(TCP有發送緩沖區是為了方便重傳)。有接收緩沖區,出于效率考量,忙的時候,可以緩一緩。緩沖區滿了就把報文丟棄。為全雙工。

內核源碼

UDP協議格式其實就是一個結構體,源碼如下:

struct udphdr {unsigned short	src_port;unsigned short	dst_port;unsigned short	len;unsigned short	chksum;
};

????????在把數據交付給傳輸層時,數據在應用層必做序列化和反序列化。當然可直接用結構體變量代替,但非常不推薦(結構體存在內存對齊有內存浪費,與其他語言不兼容,需要考慮字節序問題等等)。

? ? ? ? 注:即使通信雙方操作系統完全不同,但網絡內核部分一定相同(所以能夠通信)。操作系統內核都是使用c語言實現。

????????在OS內部一定會同時存在大量的報文,而這些報文可分布在各個協議層,OS必須管理這些報文。如果管理?先描述,再組織。如何描述:內核源碼中結構體 struct sk_buff,如下:

struct sk_buff 
{struct sk_buff	* next;			/* Next buffer in list 				*/struct sk_buff	* prev;			/* Previous buffer in list 			*/struct sk_buff_head * list;		/* List we are on				*/
#if CONFIG_SKB_CHECKint		magic_debug_cookie;
#endifstruct sk_buff	*link3;			/* Link for IP protocol level buffer chains 	*/struct sock	*sk;			/* Socket we are owned by 			*/unsigned long	when;			/* used to compute rtt's			*/struct timeval	stamp;			/* Time we arrived				*/struct device	*dev;			/* Device we arrived on/are leaving by		*/union {struct tcphdr	*th;struct ethhdr	*eth;struct iphdr	*iph;struct udphdr	*uh;unsigned char	*raw;/* for passing file handles in a unix domain socket */void *filp;} h;union {	/* As yet incomplete physical layer views */unsigned char 	*raw;struct ethhdr	*ethernet;} mac;struct iphdr	*ip_hdr;		/* For IPPROTO_RAW 				*/unsigned long 	len;			/* Length of actual data			*/unsigned long	csum;			/* Checksum 					*/__u32		saddr;			/* IP source address				*/__u32		daddr;			/* IP target address				*/__u32		raddr;			/* IP next hop address				*/__u32		seq;			/* TCP sequence number				*/__u32		end_seq;		/* seq [+ fin] [+ syn] + datalen		*/__u32		ack_seq;		/* TCP ack sequence number			*/unsigned char	proto_priv[16];	        /* Protocol private data			*/volatile char 	acked,			/* Are we acked ?				*/used,			/* Are we in use ?				*/free,			/* How to free this buffer			*/arp;			/* Has IP/ARP resolution finished		*/unsigned char	tries,			/* Times tried					*/lock,			/* Are we locked ?				*/localroute,		/* Local routing asserted for this frame	*/pkt_type,		/* Packet class					*/pkt_bridged,		/* Tracker for bridging 			*/ip_summed;		/* Driver fed us an IP checksum			*/
#define PACKET_HOST		0		/* To us					*/
#define PACKET_BROADCAST	1		/* To all					*/
#define PACKET_MULTICAST	2		/* To group					*/
#define PACKET_OTHERHOST	3		/* To someone else 				*/unsigned short	users;			/* User count - see datagram.c,tcp.c 		*/unsigned short	protocol;		/* Packet protocol from driver. 		*/unsigned short	truesize;		/* Buffer size 					*/atomic_t	count;			/* reference count				*/struct sk_buff	*data_skb;		/* Link to the actual data skb			*/unsigned char	*head;			/* Head of buffer 				*/unsigned char	*data;			/* Data head pointer				*/unsigned char	*tail;			/* Tail pointer					*/unsigned char 	*end;			/* End pointer					*/void 		(*destructor)(struct sk_buff *);	/* Destruct function		*/__u16		redirport;		/* Redirect port				*/
};

封包和解包的本質理解

在以上源碼中我們主要關注兩個部分:

該字段說明報文用了鏈表結構來維護,對報文進行操作的本質就是鏈表的增刪改查。

怎么體現不同協議層報文呢?如下字段:

變量指向位置功能
head緩沖區的起始地址指向整個數據包內存的頭部(包括預留的“頭空間”)。
data當前協議層頭部隨著協議棧處理,動態移動:
接收時:從MAC頭 → IP頭 → TCP(或UDP)頭 → 應用數據。
發送時:反向移動。
tail當前有效數據的末尾標識實際數據的結束位置(如應用層數據的末尾)。
end緩沖區的結束地址指向整個數據包內存的尾部(包括預留的“尾空間”)。

[head,end]:緩沖區大小。

[data,tail]:報文。封裝和解包本質:移動data指針在緩沖區的位置,加減對應層協議長度。

非常感謝您能耐心讀完這篇文章。倘若您從中有所收獲,還望多多支持呀!74c0781738354c71be3d62e05688fecc.png

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

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

相關文章

【牛客刷題】小紅的數字刪除

文章目錄 一、題目介紹1.1 題目描述1.2 輸入描述:1.3 輸出描述:1.4 示例11.5 示例2二、解題思路2.1 核心觀察2.2 關鍵問題處理三、算法實現四、算法分析4.1 算法流程圖4.2 為什么這么設計算法?4.3 算法復雜度五、模擬演練數據示例1: "103252"示例2: "333&quo…

《大數據技術原理與應用》實驗報告三 熟悉HBase常用操作

目 錄 一、實驗目的 二、實驗環境 三、實驗內容與完成情況 3.1 用Hadoop提供的HBase Shell命令完成以下任務 3.2 現有以下關系型數據庫中的表和數據,要求將其轉換為適合于HBase存儲的表并插入數據: 四、問題和解決方法 五、心得體會 一、實驗目的…

微服務初步入門

服務拆分原則 單一職責原則 單一職責原則原本是面向對象設計的一個基本原則,是指一個類應該專注于單一的功能,不要存在多于一個導致類變更的原因 在微服務架構中,是指一個微服務只負責一個功能或者業務領域,每個服務應該由清晰的定…

Liunx操作系統筆記5

用戶管理命令: useradd命令: useradd命令的功能是創建并設置用戶信息。使用useradd命令可以自動完成用戶信息、基本組、家目錄等的創建工作,并在創建過程中對用戶初始信息進行定制。語法格式:useradd 參數 用戶名常用參數: -M 不建立用…

spring-ai-alibaba 接入Tushare查詢股票行情

最近spring-ai-alibaba主干分支新增了對Tushare的支持&#xff0c;一起來看看如何使用簡單樣例老樣子&#xff0c;分三步進行&#xff1a;第一步&#xff1a;添加依賴<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-aliba…

Java使用Langchai4j接入AI大模型的簡單使用(一)

一、LangChain4j 簡介 LangChain4j 是 Java 生態中的 LangChain 實現&#xff0c;是一個用于構建大語言模型(LLM)應用程序的框架。它提供了與各種LLM服務集成的能力&#xff0c;并簡化了構建復雜AI應用的過程。 LangChain4j官方文檔&#xff1a;Integrations | LangChain4j …

Linux —— A / 基礎指令

建議學習路徑&#xff1a;Linux系統與系統編程 ? Linux網絡和網絡編程 ? MySQL一、初識shell命令 1.1、關于 Linux 桌面很多同學的 Linux 啟動進?圖形化的桌?. 這個東西?家以后就可以忘記了。以后的工作中沒有機會使用圖形界面。思考: 為什么不使用圖形界面? 1.2、下…

[論文閱讀] 人工智能 + 軟件工程 | 用大語言模型+排名機制,讓代碼評論自動更新更靠譜

LLMCup&#xff1a;用大語言模型排名機制&#xff0c;讓代碼評論自動更新更靠譜 LLMCup: Ranking-Enhanced Comment Updating with LLMsarXiv:2507.08671 LLMCup: Ranking-Enhanced Comment Updating with LLMs Hua Ge, Juan Zhai, Minxue Pan, Fusen He, Ziyue Tan Comments: …

悲觀鎖 樂觀鎖

悲觀鎖 樂觀鎖 在沒有加鎖的秒殺場景下 每秒打進來的請求是巨大的 高并發場景下 我們發現不僅異常率高的可怕 庫存竟然還變成了負數 這產生的結果肯定是很大損失的 那為什么會出現超賣問題呢 我們假設有下面兩個線程線程1查詢庫存&#xff0c;發現庫存充足&#xff0c;創建訂單…

如何使用Cisco DevNet提供的免費ACI學習實驗室(Learning Labs)?(Grok3 回答)

Cisco DevNet 提供的免費 ACI&#xff08;Application Centric Infrastructure&#xff09;學習實驗室&#xff08;Learning Labs&#xff09;是幫助用戶學習和實踐 Cisco ACI 技術&#xff08;包括 APIC 控制器&#xff09;的優秀資源&#xff0c;適合網絡工程師、開發者和準備…

Combine的介紹與使用

目錄一、Combine 框架介紹二、核心概念三、基礎使用示例3.1、創建 Publisher & 訂閱3.2、操作符鏈式調用3.3、Subject 使用&#xff08;手動發送值&#xff09;3.4、網絡請求處理3.5、組合多個 Publisher3.6、錯誤處理四、核心操作符速查表 Operator五、UIKit 綁定示例六、…

【Java筆記】七大排序

目錄1. 直接插入排序2. 希爾排序3. 選擇排序4. 堆排序(重要)5. 冒泡排序6. 快速排序&#xff08;重要&#xff09;6.1 Hoare 法6.1.1 Hoare 法優化6.2 挖坑法&#xff08;重點&#xff09;6.3 快速排序的非遞歸寫法7. 歸并排序海量數據的排序問題8. 總結1. 直接插入排序 時間復…

H.264編解碼(NAL)

在我們的日常生活中&#xff0c;比如有緩存電影或者是發送視頻的需求。如果沒有視頻壓縮&#xff0c;一部手機只能存幾分鐘視頻&#xff0c;1TB 硬盤也裝不下幾部電影&#xff0c;用 4G 網絡發一段 1 分鐘視頻&#xff0c;可能需要幾十分鐘&#xff08;甚至傳不完&#xff09;&…

新手向:Python自動化辦公批量重命名與整理文件系統

本文將詳細介紹如何使用Python實現一個強大的文件批量重命名與整理工具&#xff0c;幫助開發者自動化這一繁瑣過程。本教程面向Python初學者&#xff0c;通過一個完整的項目案例&#xff0c;講解文件系統操作的核心技術。我們將構建的工具將具備以下功能&#xff1a;基于正則表…

C++ 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例

C 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例一、左值右值1.左值2.右值二、左值引用右值引用1.左值引用2.右值引用總結三、integral_constant四、integral_constant的元模板使用案例1.求最大整數2.內存對齊alignof關鍵字元模板計算內存…

c++算法一

1.雙指針總結&#xff1a;1.復寫0這道題&#xff0c;告訴我們要正難其反&#xff0c;我們從后向前進行重寫&#xff0c;刪除某些數字的時候&#xff0c;我們可以從前向后遍歷&#xff0c;但是增加一些數字的時候會對后面的數據進行覆蓋&#xff0c;所以要從后向前進行2.快樂數涉…

LeetCode-283. 移動零(Java)

283. 移動零 給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。 示例 1: 輸入: nums [0,1,0,3,12] 輸出: [1,3,12,0,0] 示例 2: 輸入: n…

【數據庫】慢SQL優化 - MYSQL

一、數據庫故障的關鍵點 引起數據庫故障的因素有操作系統層面、存儲層面&#xff0c;還有斷電斷網的基礎環境層面&#xff08;以下稱為外部因素&#xff09;&#xff0c;以及應用程序操作數據庫和人為操作數據庫這兩個層面&#xff08;以下稱內部因素&#xff09;。這些故障中外…

桶排序算法深度剖析

&#x1f50d; 桶排序算法深度剖析 &#x1f3af; 核心原理圖解?? 完整算法流程 #mermaid-svg-LyB6SpaZ132X4Wtn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LyB6SpaZ132X4Wtn .error-icon{fill:#552222;}#mer…

對S32K144做的BMS安裝快速開發Simulink庫及BMS例程介紹

前言 本章介紹BMS硬件功能及SimuLink庫為主&#xff0c;捎帶介紹一些例程內容 注意&#xff1a;例程所用的協議均是自定義的 自做的SimuLink庫也會不定期更新 BMS例程的內容不定期維護添加 當前的BMS沒有主動均衡功能&#xff0c;這個有考慮后期加上&#xff0c;當前還處于…