《TCP/IP詳解 卷一》第10章 UDP 和 IP 分片

目錄

10.1 引言

10.2 UDP 頭部

10.3 UDP校驗和

10.4 例子

10.5 UDP 和 IPv6

10.6 UDP-Lite

10.7?IP分片

10.7.1 例子:IPV4 UDP分片

10.7.2 重組超時

10.8 采用UDP的路徑MTU發現

10.9 IP分片和ARP/ND之間的交互

10.10 最大UDP數據報長度

10.11 UDP服務器的設計

10.11.1 IP地址和UDP端口號

10.11.2 限制本地IP地址

10.11.3 使用多地址

10.11.4 限制遠端IP地址

10.11.5 每端口多服務器的使用

10.11.6 跨越地址族:IPv4和IPv6

10.11.7 流量和擁塞控制的缺失

10.12 UDP/IPV4和UDP/IPV6數據報的轉換

10.13 互聯網中的UDP

10.14 與UDP和IP分片相關的攻擊

10.15 總結


10.1 引言

UDP(User Datagram Protocol):用戶數據報協議。一種傳輸層協議。

????????IPv4中協議字段值:17。

????????????????特點:

????????????????????????有消息邊界。

????????????????????????開銷更小,因為沒有TCP復雜機制。

當UDP應用程序每次調用send/write,就發出一個UDP數據報。

而TCP不一定,因為TCP可能分段,重組。

即TCP應用程序執行多次send/write調用會組合成一個數據包發送,或可能一個send/write調用被分成多個數據包發送。

10.2 UDP 頭部

頭部格式如下:

字段:

????????源端口

????????目的端口

????????長度:UDP報文總長度,包括頭部和數據。

????????校驗和:校驗整個UDP報文。

每個socket在創建時必須指定協議類型(TCP或UDP),并綁定到特定端口。

因此,一個套接字不能同時監聽TCP/UDP相同端口。

一個主機可以創建兩個socket,分別監聽TCP和UDP的相同端口號,表示兩種不同服務。

10.3 UDP校驗和

UDP校驗和:校驗范圍覆蓋UDP頭部、UDP數據,偽頭部。

偽頭部(pseudo-header):

????????計算UDP校驗和時,根據IP頭信息生成的虛擬頭部。

????????偽頭部格式通常包括:

????????????????源IP、目標IP、協議類型(UDP),UDP數據報總長等。

????????作用:提供更多信息,確保校驗更精確。

偽頭部細節如下圖:

NAT會改變報文IP和端口,所以經過NAT后需要重新校驗和。

IPv4頭中也有校驗和,但只校驗IPv4頭內容,不包括IP載荷。

????????在每跳都要重新計算,因為TTL字段值減小。

小結:

????????IPv4頭的校驗和字段:只校驗IPv4頭內容。

????????傳輸層TCP/UDP頭的校驗和字段:校驗范圍不僅包含傳輸層頭,還有載荷。

10.4 例子

10.5 UDP 和 IPv6

IPv6中TCP/UDP都需要偽頭部來計算校驗和。

Teredo隧道:

????????IPv6數據被封裝成IPv4 UDP數據報后,發給Teredo中繼,中繼解封裝后把IPv6報文轉發給主機。

Teredo和GRE對比:

????????通用性:

????????????????GRE更通用,可封裝任何類型數據包。

????????????????Teredo只用于IPv4 UDP封裝IPv6數據。

????????實現方式:

????????????????GRE:不需要服務器或中繼。

????????????????Teredo:需要服務器和中繼。

10.6 UDP-Lite

UDP:校驗是可選的,要么校驗整個UDP報文,要么不校驗。

UDP-Lite:對UDP數據一部分校驗,而不是整個數據報校驗。

????????所以未校驗部分,容忍比特差錯。

UDP-Lite:有單獨的IPv4協議和IPv6協議號。算是一種新的傳輸層協議。

所以UDP- Lite有一個校驗和覆蓋范圍字段,表示需要校驗哪部分數據。

????????最小值為8,即只校驗UDP-Lite頭。

????????特殊值:0,表示校驗整個負載。

socket簡化程序舉例,設置UDP-Lite校驗和覆蓋范圍:

int main() {

????????int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE);

????????int send_cscov = 8; // 只校驗UDP-Lite頭。

????????setsockopt(sockfd, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, &send_cscov, sizeof(send_cscov)) ;

????????

????????int recv_cscov = 0; // 校驗整個負載

????????setsockopt(sockfd, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, &recv_cscov, sizeof(recv_cscov));

}

10.7?IP分片

IPv6只允許源主機分片,不允許中間轉發設備分片,可減少中間設備負擔。

IPv4既允許源主機分片,也允許中間路由器分片。

IP數據報大于MTU則分片。

被分片IP數據報,到了目的地才會重組,這樣設計有兩個原因:

????????1. 減輕中間路由器轉發負擔。

????????2. 同一數據報的不同分片可能經不同路徑到達目的地,此時路徑上路由器不能收到所有分片,搜到沒有能力重組原始數據。

10.7.1 例子:IPV4 UDP分片

數據報分片后,每個分片IPv4頭中的總長度字段被修改成該分片的總長度。

任一分片丟失,整個IP數據報無法完整接收。

當TCP報文的一個分片丟失了,TCP協議棧會重傳整個TCP報文段,所以通常盡量避免TCP分片。

除最后一個分片外所有分片數據部分應是8字節倍數。

tcpdump為了能打印除了第一個分片外的其他分片的端口號,嘗試重組其他分片的數據報,以恢復只出現在第一個分片的UDP頭部中的端口號。

10.7.2 重組超時

當任一分片最先到達時,IP層就啟動計時器。

若超時前未收到所有分片,無法重組源報文,會丟棄所有分片,防止緩存耗盡。

超時時間:一般30s,60s。

只有接收到了第一個分片并且分片重組失敗時,才產生ICMP錯誤。

10.8 采用UDP的路徑MTU發現

PMTU:路徑MTU 。

PMTUD:路徑MTU發現。

????????作用:發現路徑中MTU的最小值。發送報文不超過MTU,防止分片。

UDP PMTUD原理:

????????源端發送一個較大UDP數據報,并設置 DF(Don't Fragment)標志,確保不被分片。

????????某個中間路由器發現數據報超過其出接口MTU,則丟棄該數據報并回復"Packet Too Big" 的ICMP 錯誤消息給源端。

????????源端收到ICMP錯誤消息后,得到其中指示的MTU。于是重新發送較小的UDP數據報。

????????重復該過程就獲得一個可在所有路由器通過的MTU,即路徑最小MTU,PMTU。

IP層會基于每個目的地址緩存一個PMTUD值,有到該目的地報文則更新,否則超時需要重新嘗試PMTUD。

PPPoE MTU:1492

? ? ? ? 1500字節去除了6字節PPPoE頭部,2字節PPP頭部。

10.9 IP分片和ARP/ND之間的交互

10.10 最大UDP數據報長度

理論一個IPv4數據報的最大長度是65535字節。

但實際存在限制,如:

????????1. 系統,setsocketopt設置收發緩存大小。

????????2. 應用程序。read/write指定讀寫大小數目小于一個UDP數據報,大多數時候發生API截斷數據報,丟棄數據報里超過接收應用程序指定字節數的數據。

MSG_TRUNC標志位:

????????當socket收到超過recv函數指定接收緩沖區大小時,如果設置該標志位,系統將丟棄緩沖區以外數據,并且不報告任何錯誤,而是正常返回已接收數據長度。

MSG_TRUNC使用方法:

????????len = recvfrom(sockfd, buf, BUF_SIZE, MSG_TRUNC, (struct sockaddr *)&client_addr, &client_len);

如何獲取截斷數據大小:

????????socklen_t optlen = sizeof(recv_len);

????????getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &recv_len, &optlen);

而TCP是連續的字節流,沒有消息邊界,不會被截斷。

10.11 UDP服務器的設計

10.11.1 IP地址和UDP端口號

SO_REUSEADDR:

????????一個socket選項,當一個socket被關閉后,它的端口號會繼續一段時間的被占用。

????????在這個時間內,其他程序無法綁定相同端口號,出現"Address already in use"錯誤。

????????設置SO_REUSEADDR選項后,當socket關閉后,立即可以被其他程序綁定,無需等待一段時間。

如何設置SO_REUSEADDR屬性:

????????int reuse = 1;

????????setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));

10.11.2 限制本地IP地址

兩種策略:

????????1. 只有報文目的IP地址是該接收接口的IP時,才接收數據。

????????2. 任何本地接口均可接收到目的IP是某本地接口之一的數據。

10.11.3 使用多地址

一臺主機上,可以開啟多個服務器進程,都使用同一個端口號,但每個服務器進程使用不同本機IP地址。

????????通過ip addr add給本機設備配置多個IP地址。

此時需要用SO_REUSEADDR選項告訴系統允許重用相同的端口。

10.11.4 限制遠端IP地址

可設置是否只接收來自指定源IPv4地址和端口號的UDP數據報。

10.11.5 每端口多服務器的使用

10.11.6 跨越地址族:IPv4和IPv6

10.11.7 流量和擁塞控制的缺失

UDP沒有流量和擁塞控制機制。

10.12 UDP/IPV4和UDP/IPV6數據報的轉換

10.13 互聯網中的UDP

UDP占據了的互聯網流量的10% ~ 40%,隨著P2P應用增加,UDP流量也在上升。

互聯網總體流量只有極少是分片的(大約分組數的0.3%,字節數的0.8%),而其中分片流量的68.3%是UDP。

常見分片流量如:

????????多媒體視頻流量(應用層大包)

????????VPN隧道中封裝/隧道流量(多層封裝)

10.14 與UDP和IP分片相關的攻擊

常見UDP DoS攻擊:

????????1. 短時間大流量。UDP沒有流控。

????????2. 放大攻擊。偽造IP源成受害者地址,并設置目的地址為廣播。于是廣播目的地都回復報文給該受害者。

????????3. 淚滴攻擊。構造一個重疊偏移分片,可覆蓋前一分片部分數據。

????????4. 發送不帶任何數據的分片,攻擊IPv4重組程序。

10.15 總結

UDP是簡單協議。

需要組播廣播時使用UDP,可避免連接開銷。

UDP使用場景:多媒體,P2P。

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

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

相關文章

【java、微服務、nacos】nacos學習筆記

Nacos服務分級存儲模型 ① 一級是服務,例如userservice ②二級是集群,例如杭州或上海 ③ 三級是實例,例如杭州機房的某臺部署了userservice的服務器 配置實例集群屬性 改變服務的yml文件 spring:cloud:nacos:discovery:cluster-name: H…

Docker將本地的鏡像上傳到私有倉庫

使用register鏡像創建私有倉庫 [rootopenEuler-node1 ~]# docker run --restartalways -d -p 5000:5000 -v /opt/data/regostry:/var/lib/registry registry:2[rootopenEuler-node1 ~]# docker images REPOSITORY TAG IMAGE…

Day 60 | 動態規劃 647. 回文子串 、 516.最長回文子序列 、動態規劃總結篇

647. 回文子串 題目 文章講解 視頻講解 class Solution {public int countSubstrings(String s) {char[] chars s.toCharArray();int len chars.length;boolean[][] dp new boolean[len][len];int result 0;for (int i len - 1; i > 0; i--) {for (int j i; j < l…

基于React低代碼平臺開發:構建高效、靈活的應用新范式

文章目錄 一、React與低代碼平臺的結合優勢二、基于React的低代碼平臺開發挑戰三、基于React的低代碼平臺開發實踐四、未來展望《低代碼平臺開發實踐&#xff1a;基于React》編輯推薦內容簡介作者簡介目錄前言為什么要寫這本書 讀者對象如何閱讀本書 隨著數字化轉型的深入&…

library cache lock/pin

【故障現象】 某些session執行操作被堵塞&#xff0c;檢查event發現’library cache lock/pin’等待&#xff1b; 【可能故障原因】 library cache lock/pin發生在多個session對相同library cache對象進行爭用發生&#xff0c;一般來說在存儲過程編譯過程中發生并堵塞編譯。 …

SOA與微服務的區別

SOA&#xff08;面向服務的架構&#xff09;和微服務是兩種不同的架構風格&#xff0c;它們有一些相似之處&#xff0c;但也存在一些區別。 1. 規模和粒度&#xff1a;SOA是一種面向企業級應用的架構風格&#xff0c;它關注的是將整個企業的功能劃分為一組自治的服務。這些服務…

內核中的Kconfig文件

Kconfig解析 編譯內核時用于配置的Kconfig文件 以內核中的ttyprintk.c為例&#xff0c;其位于/kernel-sources/dirver/char/ttyprintk.c 如何將其編譯進內核&#xff1f; 在char目錄下有Kconfig文件&#xff0c;其中有如下內容 tristate 表示該模塊可以選擇 Y N M(以.ko形…

華為od機試C卷-最長表達式求值

1 題目描述 提取字符串中的最長合法簡單數學表達式子串&#xff0c;字符串長度最長的&#xff0c;并計算表達式的值&#xff0c;如果沒有返回0。簡單數學表達式只能包含以下內容0-9 數字&#xff0c;符號* 說明: 1.所有數字&#xff0c;計算結果都不超過 long 2.如果有多個長…

遞歸實現n的k次方(C語言)

編寫一個函數實現n的k次方&#xff0c;使用遞歸實現。 下面來說一下思路 5的3次方&#xff1a;就是5*(5的3-1次方) 7的4次方&#xff1a;就是7*&#xff08;7的4-1次方&#xff09; 以此類推 n的k次方就是&#xff1a;n* n的&#xff08;k-1&#xff09;次方 int Func(int n,…

HOOPS Communicator對3D大模型輕量化加載與渲染的4種解決方案

今天給大家介紹一些關于3D Web輕量化引擎HOOPS Commuicator的關鍵概念&#xff0c;這些概念可以幫您在HOOPS Communicator流緩存服務器之上更好地構建您自己的模型流服務器。如果您是有大型數據集&#xff0c;那么&#xff0c;使用流緩存服務器可以極大地幫助您最大限度地減少內…

Unity-PDF分割器(iTextSharp)

PDF分割器 Unity-PDF分割器前言核心思路解決過程一、Unity安裝iTextSharp二、運行時計算將要生成文件的大小三、分割核心代碼四、使用StandaloneFileBrowser五、其他的一些腳本六、游戲界面主體的構建MainWindowWarningPanel & FinishPanel By-Round Moon Unity-PDF分割器 …

VMware虛擬機安裝詳細指南

在多任務和多環境開發的需求日益增長的當下&#xff0c;虛擬機技術憑借其靈活性和高效性成為了IT行業的一大利器。VMware作為虛擬化技術的領軍者&#xff0c;其提供的VMware Workstation Pro軟件允許用戶在一臺物理機上運行多個獨立的虛擬機&#xff0c;每個虛擬機都可以擁有自…

基于主從模式的Reactor的仿muduo網絡庫

&#x1f307;個人主頁&#xff1a;平凡的小蘇 &#x1f4da;學習格言&#xff1a;命運給你一個低的起點&#xff0c;是想看你精彩的翻盤&#xff0c;而不是讓你自甘墮落&#xff0c;腳下的路雖然難走&#xff0c;但我還能走&#xff0c;比起向陽而生&#xff0c;我更想嘗試逆風…

【.NET Core】.NET中的流(Stream)

【.NET Core】.NET中的流&#xff08;Stream&#xff09; 文章目錄 【.NET Core】.NET中的流&#xff08;Stream&#xff09;一、流&#xff08;Stream&#xff09;1.1 FileStream類1.2 IsolatedStorageFileStream類1.3 MemoryStream類1.4 BufferedStream類1.5 NetworkStream類…

谷歌瀏覽器打開,圖片糊了

現象&#xff08;問題&#xff09;&#xff1a;早上開機&#xff0c;打開谷歌瀏覽器發現里面的所有圖片相關的都糊了&#xff0c;離譜&#xff01; 查閱一番資料后發現&#xff1a; 谷歌瀏覽器的硬件加速模式被打開了 解決&#xff1a; 打開谷歌瀏覽器->設置->系統->…

【C++從練氣到飛升】01---C++入門

&#x1f388;個人主頁&#xff1a;庫庫的里昂 ?收錄專欄&#xff1a;C從練氣到飛升 &#x1f389;鳥欲高飛先振翅&#xff0c;人求上進先讀書。 目錄 推薦 前言 什么是C C的發展史 &#x1f4cb;命名空間 命名空間定義 命名空間使用 命名空間的嵌套 std命名空間的使用 &#…

編譯 qsqlmysql.dll QMYSQL driver not loaded

Qt 連接MySQL數據庫&#xff0c;沒有匹配的qsqlmysql.dll, 需要我們跟進自己Mysql 以及QT版本自行編譯的。異常如下圖&#xff1a; 安裝環境為 VS2019 Qt5.12.12&#xff08;msvc2017_64、以及源碼&#xff09; 我的安裝地址&#xff1a;D:\Qt\Qt5.12.12 Mysql 8.1.0 默認安…

Java 定時器

Java 定時器 package com.su.test.threadtest; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; /** 在這里插入代碼片使用定時器指定定時任務。timer&#xff1a;計時器…

2023年下半年教師資格證考試《教育知識與能力》(中學)題

3.李老師在初二選擇了人數、性別比例、學習成績、教材各方面情況相同的兩個班進行教學&#xff0c;對其中一班采用講授法&#xff0c;對另一個班采用自學輔導法&#xff0c;經過一個階段的教學后進行測驗&#xff0c;以比較兩種方法教學效果&#xff0c;李老師采用的方法屬于&a…

RMSNorm 類中引入一些參數

在 RMSNorm 類中&#xff0c;引入可學習的參數&#xff0c;以增強模型的表達能力和適應性。以下是一些常見的方法&#xff1a; 可學習的縮放參數&#xff08;Scale&#xff09;&#xff1a; 除了 self.weight&#xff0c;可以為每個維度引入一個可學習的縮放參數。這可以通過創…