1. 程式人生 > >UDP 組播---你需要了解這些

UDP 組播---你需要了解這些

先來了解下UDP

UDP 是UserDatagram Protocol的簡稱, 中文名是使用者資料報協議,是OSI(Open System Interconnection開放式系統互聯) 參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務,IETF RFC 768是UDP的正式規範。UDP在IP報文的協議號是17。

UDP詳解:http://blog.csdn.net/ljheee/article/details/51720594

UDP資訊傳遞的方式分三類

①  單播Unicast:是客戶端與伺服器之間的點到點連線。

②  廣播BroadCast:主機之間“一對所有”的通訊模式,廣播者可以向網路中所有主機發送資訊。廣播禁止在Internet寬頻網上傳輸(廣播風暴)。

③  多播MultiCast:主機之間“一對一組”的通訊模式,也就是加入了同一個組的主機可以接受到此組內的所有資料。

這裡需要注意的是:只有UDP才有廣播、組播的傳遞方式;而TCP是一對一連線通訊。多播的重點是高效的把同一個包儘可能多的傳送到不同的,甚至可能是未知的裝置。但是TCP連線是一對一明確的,只能單播。

在Java API中,實現UDP方式的程式設計,包含客戶端網路程式設計和伺服器端網路程式設計,主要由兩個類實現,分別是:DatagramSocket和DatagramPacket。

UDP組播

         組播報文的目的地址使用DIP地址, D類地址不能出現在IP報文

的源IP地址欄位。單播資料傳輸過程中,一個數據包傳輸的路徑是從源地址路由到目的地址,利用“逐跳”的原理[路由選擇]在IP網路中傳輸。

        然而在ip組播環中,資料包的目的地址不是一個,而是一組,形成組地址。所有的資訊接收者都加入到一個組內,並且一旦加入之後,流向組地址的資料立即開始向接收者傳輸,組中的所有成員都能接收到資料包。組播組中的成員是動態的,主機可以在任何時刻加入和離開組播組。

        用同一個IP多播地址接收多播資料包的所有主機構成了一個主機組,也稱為多播組。一個多播組的成員是隨時變動的,一臺主機可以隨時加入或離開多播組,多播組成員的數目和所在的地理位置也不受限制,一臺主機也可以屬於幾個多播組。此外,不屬於某一個多播組的主機也可以向該多播組傳送資料包。  

組播地址

  1. 組播組可以是永久的也可以是臨時的。組播組地址中,有一部分由官方分配的,稱為永久組播組。永久組播組保持不變的是它的ip地址,組中的成員構成可以發生變化。永久組播組中成員的數量都可以是任意的,甚至可以為零。那些沒有保留下來供永久組播組使用的ip組播地址,可以被臨時組播組利用。
  2. 224.0.0.0~224.0.0.255為預留的組播地址(永久組地址),地址224.0.0.0保留不做分配,其它地址供路由協議使用;
  3. 224.0.1.0~224.0.1.255是公用組播地址,可以用於Internet;
  4. 224.0.2.0~238.255.255.255為使用者可用的組播地址(臨時組地址),全網範圍內有效;
  5. 239.0.0.0~239.255.255.255為本地管理組播地址,僅在特定的本地範圍內有效。

        組播是一對多的傳輸方式,其中有個組播組的 概念,傳送端將資料向一個組內傳送,網路中的路由器通過底層的IGMP協議自動將資料傳送到所有監聽這個組的終端。至於廣播則和組播有一些相似,區別是路由器向子網內的每一個終端都投遞一份資料包,不論這些終端是否樂於接收該資料包。UDP廣播只能在內網(同一網段)有效,而組播可以較好實現跨網段群發資料。

       UDP組播是採用的無連線,資料報的連線方式,所以是不可靠的。也就是資料能不能到達接受端和資料到達的順序都是不能保證的。但是由於UDP不用保證資料 的可靠性,所有資料的傳送效率是很快的。

IGMP協議

      IGMP是IP組播的基礎。在IP協議出現以後為了加入對組播的支援,IGMP產生了。IGMP所做的實際上就是告訴路由器,在這個路由器所在的子網內有人對傳送到某一個組播組的資料感興趣,這樣當這個組播組的資料到達後面,路由器就不會拋棄它,而是把他轉送給所有感興趣的客戶。假如不同子網內的A和B要 進行組播通訊,那麼位於AB之間的所有路由器必須都要支援IGMP協議,否則AB之間不能進行通訊。

組播的原理:

      組播首先由一個使用者申請一個組播組,這個組播組被維護在路由器中,其他使用者申請加入組播組,這樣當一個使用者向組內傳送訊息時,路由器將訊息轉發給組內的所有成員。如果申請加入的組不在本級路由中,如果路由器和交換機允許組播協議通過,路由器將申請加入的操作向上級路由提交。廣域網通訊要經過多級路由器和交換機,幾乎所有的網路裝置都預設阻止組播協議通過(只允許本網段內,不向上級提交),這使得廣域網上實現組播有一定侷限。

UDP組播的基本步驟

  1. 建立socket
  2. socket和埠繫結
  3. 加入一個組播組
  4. 通過sendto / recvfrom進行資料的收發
  5. 關閉socket

伺服器和客戶端必須都要加入相同的組播地址才可以

多播資料報套接字類用於傳送和接收 IP 多播包。MulticastSocket 是一種 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主機的“組”的附加功能。

多播組通過 D 類 IP 地址和標準 UDP 埠號指定。可以通過首先使用所需埠建立 MulticastSocket,然後呼叫 joinGroup(InetAddress groupAddr)方法來加入多播組。

        在JAVA中,多播一樣十分好實現,要實現多播,就要用到MulticastSocket類,其實該類就是DatagramSocket的子類,在使用時除了多播自己的一些特性外,把它當做DatagramSocket類使用就可以了。

        預設我們知道IP(UDP和TCP一樣)可以把資料包在一個網路中發到另一個裝置。更準確點就是IP把資料包從一個IP地址發到另一個IP地址。多播的決竅就是在同一時間把一個數據包傳送到多個裝置,可以把一個特定的IP地址指定為多播地址,並同時傳送到多個裝置。

        IP多播首先要知道的是隻有UDP有多播,沒有TCP多播這樣的東西,為什麼呢?多播的重點是高效的把同一個包儘可能多的傳送到不同的,甚至可能是未知的裝置。但是TCP連線可能要求丟包重發或者延時或重組順序,這些操作可能非常消耗資源,不適於許多使用多播的應用場景。(同時多播不知道發出的包是不是已經到達,這個也導致不能使用TCP)。