UDP、广播、多播与IGMP(七)
(參考文獻)TCP/IP詳解,卷1:協議
UDP是一個簡單的面向數據報的運輸層協議:進程的每個輸出操作都正好產生一個UDP數據報,并組裝成一份待發送的IP數據報。UDp數據報封裝成IP數據報格式如下圖:
?
UDP首部
UDP首部的各個字段如下圖:
?
?端口號表示發送進程和接收進程。由于IP層已經把數據報分配給TCP或者UDP(根據IP首部中協議字段值),因此TCP端口號有TCP查看,UDP端口號由UDP查看。TCP端口號與UDP端口號時是相對獨立的。
UDP長度字段指的是UDP首部和UDP數據的字節長度。該字段的最小值為8字節(即沒有數據時的情況)。
UDP和TCP在首部中都有覆蓋他們首部和數據的校驗和。UDP校驗和是可選的,而TCP校驗和是必須的。
?
IP分片
物理網絡層一般要限制每次發送數據幀的最大長度。任何時候IP層收到一份要發送的IP數據報時,他要判斷向本地哪個接口發送數據(選路),并查詢該接口獲取MTU。IP把MPU和數據報進行比較較,如果需要。則進行分片。分片可以發生在原始發送端上,也可以發送在中間路由器上。
把一數據報進行分片后,只有到達目的地才進行重新組裝(這里的重新組裝與其他網絡協議不同,他們要求下一站就進行重新組裝,而不是在最終目的地)。重新組裝由目的地的IP層來完成。已經分過片的數據報有可能再次進行分片。IP首部中包含的數據位分片和重組提供了足夠的信息。
如上圖,對于發送端發送的每份IP數據報來說,其標識字段都包含一個唯一值。該值在數據報分片時被復制到每個片中。標志字段用一個比特位來表示“更多的片”。除了最后一片外,其他每個組成數據報的片都要把該比特置一。片偏移字段指的是該片偏移原始數據報開始處的位置。另外,該數據報被分片后,每個片的總長度值要為該片的長度值。
最后,標志字段中有一個比特稱作“不分片”位。如果將這一比特置1,IP將不對數據報進行分片。相反把數據報丟棄并發送一個ICMP差錯報文(需要進行分片但設置了不分片比特)給起始端。
當IP數據報被分片后,每一片都成為一個分組,具有自己的IP首部,并在選擇路由時和其他分組獨立。這樣,當數據報到達目的端時有可能失序,但是在IP首部中有足夠的信息讓接收端能正確組裝這些數據片。
IP數據報與分組
IP數據報是指IP層端到端的傳輸單元(在分組之前和重新組裝之后)。分組是指在IP層和鏈路層之間傳送的數據單元,一個分組可以是一個IP數據報,也可以是IP數據報的一個分片。
廣播和多播
IP 地址分三種:單播地址、廣播地址和多播地址。
廣播和多播僅應用于UDP,它們對需將報文同時傳往多個接收者的應用來說十分重要。TCP是一個面向連接的協議,它意味著分別運行于兩主機內的兩進程間存在一連接。
考慮包含多個主機的共享信道網絡,如以太網。每個以太網幀包含源主機和目的主機的以太網地址(48bit)。通常每個以太網幀僅發往單個目的主機,目的地址指往單個接收接口,因而稱為單播。
然而,有時候一個主機要向網絡上的所有主機發送幀,這就是廣播。通過ARP和RARP可以看到這一過程。多播處于單播和廣播之間,幀只發送屬于多播組的多個主機。
要了解廣播和多播,需要了解主機對由信道傳送過來幀的過濾過程。
首先,網卡查看由信道傳送過來的幀,確定是否接受該幀,若接收后就把他傳往設備驅動程序。通常網卡僅接收那些目的地址為網卡物理地址或廣播地址的幀。另外,多數接口被設置為混雜模式,這種模式能夠接收每個幀的一個復制。
目前,大多數的網卡經過配置都能接收目的地址為多播地址或某些子網多播地址的幀。對于以太網,當地址中最高啊字節的最低位設置為1時表示改地址是一個多播地址,用十六進制可表示為01:00:00:00:00:00(以太網廣播地址ff:ff:ff:ff:ff:ff可以看做是以太網多播地址的特例)。
如果網卡收到一個幀,這個幀將被傳送給設備驅動程序(如果幀檢驗和錯,網卡就會丟棄該幀)。設備驅動程序將進行另外的幀過濾。首先,幀類型中必須指定要使用的協議(IP、ARP等等),其次,進行多播過濾來檢查該主機是否屬于多播地址說明的多播組。
設備驅動程序隨后將數據幀傳送給上一層,比如,當幀類型指定為IP數據報時,就傳往IP層。IP根據IP地址中的源地址和目的地址進行更多的過濾監測。如果正常,就把數據報再傳送給上一層(TCP或UDP層)。
每次UDP收到有IP傳送過來的數據報,就根據目的端口號,有時還根據源端口號進行數據報過濾。如果當前沒有進程使用目的端口號,就丟棄該數據報,并產生一個ICMP不可到達 報文(TCP根據端口號做相似的處理)。如果UDP數據報出現檢驗和錯,數據報將被丟棄。
多播之于廣播出現的原因
使用廣播的問題在于,它增加了對廣播數據不感興趣主機的處理負荷。拿一個使用UDP廣播應用作為例子。如果網絡內有50個主機,但僅有20個參與該應用,每次這20個主機中的一個發送UDP廣播數據時,其余30個主機不得不處理這些廣播數據報。一直到UDP層收到的廣播數據報才會被丟棄。這30個主機丟棄該數據報的原因是因為這些主機沒有使用該目的端口。
多播的出現減少了對應用不感興趣主機的處理負荷。使用多播,主機可以加入一個或者多個多播組,這樣網卡就僅接收主機所在多播組的那些數據幀。
廣播
廣播地址主要有4種:受限的廣播、指向網絡的廣播、指向子網的廣播、指向所有子網的廣播。
受限的廣播
受限的廣播地址是255.255.255.255。該地址用于主機配置過程中IP數據報的目的地址,此時,主機可能還不知道它所在網絡的網絡掩碼甚至連他的IP地址也不知道。
在任何情況下,路由器都不轉發目的地址為受限的廣播地址的數據報,這樣的數據報僅出現在本地網絡中。
指向網絡的廣播
指向網絡的廣播地址是主機號全為1的地址。A類網絡廣播地址為netid.255.255.255,其中netid為A類網絡的網絡號。
一個路由器必須轉發指向網絡的廣播,但它也必須有一個不進行轉發的選擇。
指向子網的廣播
指向子網的廣播地址為主機號全為1且有特定子網號的地址。作為子網直接廣播地址的IP地址需要了解子網的掩碼。例如,如果路由器收到發往128.1.2.255的數據報,當B類網絡128.1的子網掩碼為255.255.255.0時,該地址就是指向子網的廣播地址;但如果該子網的掩碼為255.255.254時,該地址就不是指向子網的廣播地址。
指向所有子網的廣播
???指向所有子網的廣播也需要了解目的網絡的子網掩碼,以便于指向網絡的廣播地址區分開。指向所有子網的廣播地址的子網號及主機號全為1例如如果目的地址子網掩碼為255.255.255.0,那么IP地址128.1.255.255是一個指向所有子網的廣播地址。然而,如果網絡沒有劃分子網,這就是一個指向網絡的廣播。
多播
IP多播提供兩類服務:
1.? 向多個目的地址傳送數據。有許多向多個接收者傳遞信息的應用:例如交互式會議系統或向多個接收者分發郵件或新聞。如果不采用多播,目前這些應用都采用TCP來完成(向每個目的地址傳送一個單獨的數據復制)。然而,即使使用多播,某些應用任然采用TCP來保證他的可靠性。
2.? 客戶對服務器的請求。例如,無盤工作站需要確定啟動引導服務器,目前這項服務是通過廣播來提供的,但是如果采用多播,則可以降低不提供這項服務主機的負擔。
多播組地址
不像其他IP地址(A、B、C類地址),分配的28bit均用作多播組號,而不再表示其他。
多播組地址包括為1110的最高4bit和多播組號。它表示的地址范圍從224.0.0.0到239.255.255.255 。這個地址段是保留個本地網絡分段網絡協議的,類似廣播報文,路由器是不會轉發多播報文的。
能夠接收發往一個特定多播組地址數據的主機集合稱為主機組。一個主機組可跨越多個網絡。主機組中成員可隨時加入或離開主機組。主機組中對主機的數量沒有限制,同時不屬于某一主機組的主機可以向該組發送信息。
一些多播組地址被IANA確定為知名地址。他們也被當做永久主機組,這和TCP和UDP中的熟知端口相似。例如:224.0.0.1代表“該子網內的所有系統組”,224.0.0.2代表“該子網內的所有路由器組”。多播組地址224.0.1.1用作網絡時間協議NTP。
多播組地址到以太網地址的轉換
同單播地址和廣播地址一樣,多播IP地址也需要相應的多播MAC地址在本地網絡中實際傳輸幀。根據IANA規定,多播MAC地址以十六進制值01-00-5E打頭,余下的6個十六進制是根據IP多播組地址的最后23位轉換得到的。
由于多播組號中的最高5bit在映射過程中被忽略,因此每個以太網多播地址對于的多播組是不唯一的。32個不同的多播組號被映射為一個以太網地址。例如,多播地址224.128.64.32(十六進制e0.80.40.20)和224.0.64.32(十六進制e0.00.40.20)都映射為同一個以太網地址01:00:5e:00:40:20? 。
既然地址映射不是唯一的,那么設備驅動程序或者IP層就必須對數據報進行過濾。因為網卡可能接收到主機不想接收的多播數據幀。另外,如果網卡不提供足夠的多播數據過濾功能,設備驅動程序就必須接收所有多播數據幀,然后對他們進行過濾。
D類IP地址到以太網多播地址的映射:
?
單個物理網絡的多播是簡單的。多播進程將目的ip地址指明為多播地址,設備驅動程序將它轉換為相應的以太網地址,然后把數據發出去。當一個主機接收到多播數據報時,他必須向屬于那個多播組的每個進程均傳送一個復制。這個單個進程收到單播UDP數據報的UDP不同。使用多播,一個主機上可能存在多個屬于同一多播組的進程。
當把多播擴展到單個物理網絡以外需要通過路由器轉發多播數據時,需要有一個協議讓多播路由器了解確定網絡中屬于確定多播組的任何一個主機。這個協議就是Internet組管理協議(IGMP)。
IGMP:Internet組管理協議
一般情況下,多播數據只在局域網內傳播,當需要將多播數據通過路由器轉發時,就需要用到IGMP協議。
IGMP協議(加入一個多播組)
多播的基礎就是一個進程的概念,該進程在一個主機給定的接口上加入了一個多播組。在一個給定接口上的多播組中的成員是動態的——他隨時因進程加入和離開多播組而變化。
這里暗示一個主機通過組地址和接口來識別一個多播組。主機必須保留一個表,表中包含所有至少含有一個進程的多播組以及多播組中的進程數量。
IGMP報告和查詢
多播路由器使用IGMP報文來記錄與該路由器相連網絡中組成員的變化情況,IGMP報文通過IP數據報來進行傳輸,如:
1)????? 當第一個進程加入一個多播組時,主機就發送一個IGMP報告。如果一個主機的多個進程加入同一組,只發送一個IGMP報告。
2)????? 進程離開一個組時,主機不發送IGMP報告,即使是組中的最后一個進程離開。主機知道在確定的組中不再有組成員后在隨后收到多播路由器的IGMP查詢中就不再發送報告報文。
3)????? 多播路由器定時發送IGMP查詢來了解是否還有任何主機包含有屬于多播組的進程。多播路由器必須向每個接口發送一個IGMP查詢。因為路由器希望主機對他加入的每個多播組均發回一個報告。
4)????? 主機通過IGMP報告來響應一個IGMP查詢,對每個至少包含一個進程的組都要發回一個IGMP報告。
使用這些查詢和報告報文,多播路由器對每個接口保持一個表,表中記錄接口(這里的接口是的是一個socket套接字)上至少還包含一個主機的多播組。當路由器收到要轉發的多播組數據報時,他只將數據報轉發到還擁有屬于那個組主機的接口上。
IGMP實現細節
為了改進IGMP協議的效率,有許多實現的細節需要考慮。首先,當一個主機首次發送IGMP報告(當第一個進程加入一個多播組)時,并不保證該報告被可靠接收(因為ip協議的不可靠性)。所以下一個報告將在間隔一段時間后發送。這個時間間隔由主機在0到10秒的范圍內隨機選擇。
??? 其次,當一個主機收到一個從路由器發出的查詢后,并不立即響應,而是進過一定的時間間隔才發出一些響應。既然參加同一個多播組的多個主機均能發送一個報告,可將他們的發送時間間隔設為隨機延時。在一個物理網絡中的所有主機將收到同組其他主機發送的所有報告(因為IGMP的目的地址是所有主機組地址:224.0.0.1)。這意味著,如果一個主機在等待發送的過程中,卻收到了來自其他主機的相同報告,則該主機的相應就可以不必發送了。因為多播路由器并不關心有多少主機屬于該組,而只關心該組是否還至少擁有一個主機。也就是說,一個多播路由器甚至不關心哪個主機屬于一個多播組。它僅僅想知道在給定的接口上的多播組中是否還至少有一個主機。
IGMP生存時間字段
一般情況下IGMP報告和查詢的生存時間(TTL)均設置為1 。在默認情況下,待傳多播數據報的TTL被設置為1,這將使多播數據報僅局限在同一子網內傳輸。更大的TTL值將被多播路由器轉發。
對發往一個多播地址的數據報從不會產生ICMP差錯。當TTL值為0時,。多播路由器也不會產生ICMP“超時”差錯。
所有主機組
多播路由器的IGMP報文會被送到目的IP地址224.0.0.1。該地址被稱為所有主機地址。
總結
以上是生活随笔為你收集整理的UDP、广播、多播与IGMP(七)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ./configure --with-
- 下一篇: TCP:传输控制协议简单讲解(八)