1. 程式人生 > >廣播、多播與單播的原理

廣播、多播與單播的原理

Question

這是計算機網路非常基礎的概念,在這裡重點記錄它們的原理和實現方式。我最不能理解的是組播的實現。

基本概念

IP地址的分類

IP地址分為四個級別,A類、B類、C類、D類

  • A類是IP地址首位以“0”開始的地址,第1至第8位為它的網路標誌,後24為是主機標識,那麼一個A類地址就能有(2^24-2)個主機(16,777,214個)。

  • 以此類推,B類IP地址是前兩位為“10”的地址。第1至第16位是它的網路標識,剩下的為主機標識。

  • C類地址前三位為“110”,從第1為到第24位是其網路標識,後8位為 主機表示,一個網段容納254個主機。是個人最常用的IP地址。上面那些一般都分配給足夠龐大的機構使用。

  • D類地址前四位為“1110”。從第1為到32位為網路表示。D類主機沒有主機標示,一般用於多播(組播)

注意:在一個主機地址分配過程中,主機表示全為0或1時是有特殊作用的。全為0表示對應網路地址或IP地址不可獲知的情況下才使用。全為1則為廣播地址。

廣播

廣播地址用於在同一個鏈路中互相連線的主機之間傳送資料包。將IP地址中的主機地址部分全部設定為1,就成了廣播地址。例如:

10101100.00010100.00000000.00000000 (子網172.20.0.0/16)

主機標識全設定為1:

10101100.00010100.11111111.11111111(廣播地址172.20.255.255)

乙太網中如果將MAC地址的所有位設定1,則形成FF:FF:FF:FF:FF:FF的廣播地址。因此,廣播的IP包以資料鏈路的幀的形成傳送時,是通過這樣的MAC廣播地址進行傳播的。

廣播分兩種,本地廣播和直接廣播。

  • 本地廣播:主機直接使用子網廣播地址作IP地址,直接在鏈路中進行廣播。這樣的IP包會被閘道器直接遮蔽掉,不會發送到其它子網中去。

  • 不同網路見的廣播叫做直接廣播。傳送主機通過配置特定的IP地址,例如:192.168.1.255/24.路由其可以轉發這個資料包到指定的子網中(192.168.1.0/24),然後在這個子網中進行本地廣播。

單播

單播是最常用,也是最直觀的實現。這裡我就不多說的。接著講多播。

多播

為什麼要多播?

當一個主機需要向N個主機發送資料時(有的不屬於同一子網),假如使用單播,那麼將對傳送主機產生非常大的效能消耗,同時需要傳送主機有足夠強大的主機。假如使用廣播,那麼意味著就運算元網中不是目的主機的主機也要接收資料包,對非目的主機產生不必要的消耗。而且,廣播還不能跨越子網傳送。所以假如可以指定一個組的主機進行傳送,那就非常好了。所以就有了多播。

路由器和主機如何確認這是一個多播地址?

多播與地址

多播使用D類地址。所以IP目的地址以“1110”開頭的就被認為為多播地址。而剩下的28位可以成為多播的組編號。多播地址還有很多是被預定的了。部分預定如下:

地址 內容
224.0.0.0 (預定)
224.0.0.1 子網內所有的系統
224.0.0.2 子網內所有的路由器
224.0.0.5 OSPF路由器

多播的具體實現還需要依靠IGMP等協議的支援。

路由器怎麼知道哪裡有需要接受多播分組的主機?

這是多播最核心的問題。路由器面對一個IP地址為多播地址的資料包時,該怎麼樣判斷這個資料包的轉發方向呢?假如路由器上每一個主機都接收多播分組,那麼可以採用廣播方式進行擴散。但是簡單的擴散會產生迴路——解決方法:逆向路徑廣播。

逆向路徑廣播規定:當一個路由器收到一個源地址S發往組G的多播分組時,僅當接收該分組的介面位於從路由器到源主機S的最短路徑上時才擴散該分組。

這個規定有效地防止了多播資料包的迴圈轉發。整體來看,我們可以理解為一個多播的傳播過程就像一些資料不停地從一個樹的根節點往葉子節點進行傳播的過程。那麼,在這棵多播傳播網路樹中,也許有一些子樹是不含有接收多播分組主機的,那麼最後在傳播樹中,最後就不要有那一部分的子樹。於是,逆向路徑廣播協議就有了“剪枝”行為了。

定義:對於基於一個源地址的多播流,如果路由的所有下游介面均沒有該組成員或已被剪枝,則它通過其雙親鏈路向上傳送剪枝訊息(訊息意思是:上游的路由器啊,我這邊不接收多播分組資料,你不要傳給我了!)。路由器不會把多播分組從剪枝介面轉發出去。

當然,這個剪枝行為是不能恆定的,因為隨時可以有主機登記為多播目的主機。所以就有與剪枝相對應的行為——嫁接。實現原理很簡單:路由器定時刪除剪枝資訊,下游重新對上剪枝。

通過逆向路徑廣播的技術,我們可以知道路由器是如何轉發多播資料包的。那麼在這裡我們可以再引出一個問題:怎麼知道一個主機是多播接收主機呢?那就是IGMP的工作了。

多播與IGMP協議

IGMP譯名為:Internet組管理協議。用於路由器查詢與它直連的網路上是否存在組成員。

IGMP是多播技術的一個基本模組。我們可以想象一個多播路由器的工作情況,當它接收到一個多播資料包(假設是224.1.2.3),需要轉發時,那麼它就要選擇合適的介面進行轉發。從上文可知,假如介面le1不存在224.1.2.3的多播主機,那麼路由器就無需在這個介面中轉發。對於一個多播路由器而言,IGMP的功能主要就是維護這個資訊:介面是否存在多播主機。

IGMP主要是兩個功能:
    1、主機加入多播組
    2、IGMP報告和查詢,維護多播組轉發表

簡略的介紹一下過程,詳細可以參考 《TCP/IP詳解》

主機加入多播組

主機中,某一個程序希望可以加入多播組(例如,我開啟一個直播,意味著主機希望假如這個多播組,以獲得直播的資料)。那麼,它會定時地傳送一個IGMP報告。在這個報文中:

欄位 資料
報文型別 IGMP報告
IGMP組地址 組地址
目的IP地址 組地址
源IP地址 主機IP地址

當多播路由器在某個介面中接收到這個報文時。那麼就證明,這個介面存在這個多播組的接收主機。以後它就懂得轉發它的資料包了。

IGMP的報告與查詢

多播是動態的,意味著隨時會有主機加入多播組或退出多播組。所以IGMP必需可以合理維護多播組的資訊,所以多播路由器必需每隔一段時間就傳送查詢訊息,保證介面中存在多播主機,並以此維護自己的多播分組轉發路由表。查詢報文簡要記述如下:

欄位 資料
報文型別 IGMP查詢
IGMP組地址 0
目的IP地址 224.0.0.1
源IP地址 路由器IP地址

其中,224.0.0.1意味著它想所有多播組的主機發送查詢。每一個允許多播的主機都必要先加入224.0.0.1這個多播組。至此,我們瞭解完IGMP的兩個重要工作後,我們已經可以完全理解:一個主機加入多播分組或離開多播分組的原理。

多播總結

分析到這裡,筆者已經由不懂多播,慢慢地開始理解多播了。整體工作原理作一下總結。
 多播最大的工作,其實就是維護多播分組的資訊。路由器有了這個資訊,就知道該如何轉發多播資料報(目的IP地址為多播地址的資料包)。維護多播分組的資訊的協議就為IGMP協議。
 一個路由器知道該在哪個介面傳送多播分組還不行,我們還應該優化多播分組的轉發模式。在稠密模式下,就有了逆向路徑廣播這個擴散約定,使用這個約定的協議有DVMRP(距離向量多播路由協議,利用RIP協議)和PIM-DM(協議無關多播協議)。逆向路徑廣播的約定保證了擴散路徑是一個樹,不會產生迴路。
 與稠密模式相對的稀疏模式,這樣的網路我們希望多播的時候可以更注意效率,因為網路中的多播主機不多,再使用擴散的方式會產生較大的路由控制壓力。於是又有了PIM-SM協議,這是稀疏模式下的協議無關多播協議,是先確定轉發路由,然後再進行轉發的演算法。具體方式同時是維護一個多播樹,具體的優化方案這裡就不多說了。

博文總結

花了一整天的時間,終於把多播的原理給弄懂了。原來多播背後還有這麼多技術的,並不想廣播和單播那樣簡單。使用廣播和單播的工作方式是無法解釋多播的,多播最大的工作不是單純地轉發資料報,而是有效地維護多播組和多播樹。不知不覺擴充套件了這麼多,難免會有點錯漏,若有發現,希望大家可以提出。

相關推薦

廣播原理

Question 這是計算機網路非常基礎的概念,在這裡重點記錄它們的原理和實現方式。我最不能理解的是組播的實現。 基本概念 IP地址的分類 IP地址分為四個級別,A類、B類、C類、D類 A類是IP地址首位以“0”開始的地址,第1至

UDP廣播

在Linux中使用多播技術,與使用UDP給單個使用者傳送訊息,沒有多大的區別,只是你要使用一個特殊的多播IP地址,還有一些環境需要改變一下。   一般的網絡卡,都是支援多播技術的,但是作業系統不一定。Linux一般在預設狀態編譯時,可能都不支援Multicast,你需要從新配置和編譯你的核心,使它支援多播,然

34.條件變量線程()

[] 指針 編號 對象 創建 ++ notify join get 1 #define _CRT_SECURE_NO_WARNINGS 2 #include <iostream> 3 #include <thread> 4 #includ

5-高級路由:RIP被動接口更新

pass 邊界 如果 ip add 分享圖片 com 圖片 http work 一、實驗拓撲:總結:1、RIP比較特殊,設為被動接口後:只收不發;其它協議設為被動接口:不收不發。2、邊界路由器端口如果連接PC,推薦設置為被動接口。3、把接口設為被動接口,不影響其對網段的宣告

【TCP/IP】

三種IP地址:       單播地址、廣播地址和組播地址廣播和多播僅應用於UDP。        TCP是一個面向連線的協議,TCP一定是點對點的,一點是兩個主機來建立連線的,TCP肯定是單播。只有UDP才會使用廣播和組播。        有時一個主機要向網上的所有其它主機發

80211 組速率及組

表示 網絡接口 通過 sage tca 提高 解決方案 所有 ast 轉:http://jingyan.baidu.com/article/ff411625963a7912e4823789.html WLAN無線網絡理論上就是實現一個二層的接入網絡,而這個二層網絡通常直

Question20180104 對比編譯器解釋器Javac編譯原理

即時編譯 inf ali pro 友好 pre 目標 缺點 java、 編譯器與Javac編譯原理   在前文我們知道了Java是一種編譯語言和解釋語言,它的源代碼經過編譯器Javac編譯為能夠被JVM識別的二進制語言,然後JVM將其解釋為能夠被平臺識別的機器語言。那麽什

虛擬記憶體swap,使用者使用者,64位32位

一、虛擬記憶體和swap分割槽: 這兩個概念分別對應windows和linux: windows:虛擬記憶體 linux:swap 在windows中即使實體記憶體沒有用完也會去用到虛擬記憶體,而Linux不一樣 Linux只有在實體記憶體用完的時候才

頁面頁面應用的區別

雖然接觸web開發有一段時間了,但從頭開始構建一個完整的web專案的機會非常少,對於一些概念還很模糊,今天首先來梳理一下在應用開發中,單頁面應用和多頁面應用的區別。 其實從字面意思上理解,就很好理解了。 單頁面,顧名思義只有一個介面。 介面是通過URL來定位的,所以單頁面應用從頭到尾

sturts2 action

struts 2的Action是多例項的並非單例,也就是每次請求產生一個Action的物件。原因是:struts 2的Action中包含資料,例如你在頁面填寫的資料就會包含在Action的成員變數裡面。如果Action是單例項的話,這些資料在多執行緒的環境下就會相互影響,例如

前後端分離模板引擎頁模式

隨著不同終端(Pad/Mobile/PC)的興起,對開發人員的要求越來越高,純瀏覽器端的響應式已經不能滿足使用者體驗的高要求,往往需要針對不同的終端開發定製的版本,為了提升開發效率,前後端分離的需要越來越被重視,後端負責業務/資料介面,前端負責展現、互動邏輯,同一份資料介面,可用於多個終端。 傳統的前後端:

Machine Learning--week3 邏輯迴歸函式(分類)決策邊界邏輯迴歸代價函式分類(邏輯迴歸和線性迴歸的)正則化

Classification It's not a good idea to use linear regression for classification problem. We can use logistic regression algorism, which is a classificati

一篇很好的Hadoop入門文章:Hadoop是什麼核心HDFSMapReduce的原理

Hadoop一直是我想學習的技術,正巧最近專案組要做電子商城,我就開始研究Hadoop,雖然最後鑑定Hadoop不適用我們的專案,但是我會繼續研究下去,技多不壓身。 《Hadoop基礎教程》是我讀的第一本Hadoop書籍,當然在線只能試讀第一章,不過對Hadoop歷史、

【影象基礎】相似性變換放射變換應性

本篇博文整合了幾篇博文,意在說明放射變換與透視變換的原理,首先感謝參考文獻中的博主以及還有未提及的博主,如侵犯你的權利請聯絡我刪除 後續博文由於不方便編輯直接給出圖片。具體的文章我寫到有道雲筆記上,連結如下: 平移變換:translation,2個自由度 旋轉變換:ro

Android應用開程序程序跑應用

一、Android應用多程序正常情況下,一個apk啟動後只會執行在一個程序中,其程序名為AndroidManifest.xml檔案中指定的應用包名,所有的基本元件都會在這個程序中執行。但是如果需要將某些元件(如Service、Activity等)執行在單獨的程序中,就需要用

html中url路徑請求的六種方式:無斜槓斜槓(/)點+斜槓(./)點點+斜槓(../)個點點+斜槓(../../)全路徑

  圖一:專案結構  圖二:rootPath.html內容 說明:圖一為專案結構,圖二為rootPath.html內容。 我在做專案過程中路徑寫錯,跳轉不到目標頁面,花了好長時間才發現原因,鑑於自己的慘痛經歷,就把這幾種url路徑總結了一下,配上了我的具體專案結構圖和

夯實Java基礎系列23:一文讀懂繼承封裝型的底層實現原理

本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫裡檢視 https://github.com/h2pl/Java-Tutorial 喜歡的話麻煩點下Star哈 文章首發於我的個人部落格: www.how2playlife.com 從JVM結構開始談多型 Jav

廣播

交換機 電子 orm 數據流 優點 網上 size qos 電視機 組播=多播 單播、組播、廣播是網絡中結點的3種通訊方式。 1、單播 1)定義: 主機之間一對一的通訊模式。網絡中的交換機和路由器對數據只轉發,不復制。網絡中的路由器和交換機根據目標地址選擇傳輸路徑。

(組)和廣播的區別

本文來自百度文庫的一篇文件,放在部落格供自己和各位朋友學習和了解 單播”(Unicast)、“多播”(Multicast)和“廣播”(Broadcast)這三個術語都是用來描述網路節點之間通訊方式的術語。那麼這些術語究竟是什麼意思?區別何在?    1.單播:網路節點之間的通

ZStack廣播具體操作原理資料整理

// Register the endpoint description with the AF afRegister( &GenericApp_epDesc ); 3.在需要傳送資料的地方,執行如下程式碼: if ( AF_DataRequest( &GenericApp_DstAddr,