UDP 组播---你需要了解这些
先來了解下UDP
UDP?是UserDatagram Protocol的簡稱, 中文名是用戶數據報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768是UDP的正式規范。UDP在IP報文的協議號是17。
UDP和TCP的區別:http://blog.csdn.net/ljheee/article/details/50823050
UDP詳解:http://blog.csdn.net/ljheee/article/details/51720594
UDP信息傳遞的方式分三類
①? 單播Unicast:是客戶端與服務器之間的點到點連接。
②? 廣播BroadCast:主機之間“一對所有”的通訊模式,廣播者可以向網絡中所有主機發送信息。廣播禁止在Internet寬帶網上傳輸(廣播風暴)。
③? 多播MultiCast:主機之間“一對一組”的通訊模式,也就是加入了同一個組的主機可以接受到此組內的所有數據。
這里需要注意的是:只有UDP才有廣播、組播的傳遞方式;而TCP是一對一連接通信。多播的重點是高效的把同一個包盡可能多的發送到不同的,甚至可能是未知的設備。但是TCP連接是一對一明確的,只能單播。
?
在Java API中,實現UDP方式的編程,包含客戶端網絡編程和服務器端網絡編程,主要由兩個類實現,分別是:DatagramSocket和DatagramPacket。
?
關于UDP使用的詳細例子:https://github.com/ljheee/ChatUDP
?
UDP組播
? ? ? ? ?組播報文的目的地址使用D類IP地址, D類地址不能出現在IP報文的源IP地址字段。單播數據傳輸過程中,一個數據包傳輸的路徑是從源地址路由到目的地址,利用“逐跳”的原理[路由選擇]在IP網絡中傳輸。
? ? ? ? 然而在ip組播環中,數據包的目的地址不是一個,而是一組,形成組地址。所有的信息接收者都加入到一個組內,并且一旦加入之后,流向組地址的數據立即開始向接收者傳輸,組中的所有成員都能接收到數據包。組播組中的成員是動態的,主機可以在任何時刻加入和離開組播組。
? ? ? ? 用同一個IP多播地址接收多播數據包的所有主機構成了一個主機組,也稱為多播組。一個多播組的成員是隨時變動的,一臺主機可以隨時加入或離開多播組,多播組成員的數目和所在的地理位置也不受限制,一臺主機也可以屬于幾個多播組。此外,不屬于某一個多播組的主機也可以向該多播組發送數據包。 ?
組播地址
? ? ? ? 組播是一對多的傳輸方式,其中有個組播組的 概念,發送端將數據向一個組內發送,網絡中的路由器通過底層的IGMP協議自動將數據發送到所有監聽這個組的終端。至于廣播則和組播有一些相似,區別是路由器向子網內的每一個終端都投遞一份數據包,不論這些終端是否樂于接收該數據包。UDP廣播只能在內網(同一網段)有效,而組播可以較好實現跨網段群發數據。
? ? ? ?UDP組播是采用的無連接,數據報的連接方式,所以是不可靠的。也就是數據能不能到達接受端和數據到達的順序都是不能保證的。但是由于UDP不用保證數據 的可靠性,所有數據的傳送效率是很快的。
IGMP協議
? ? ? IGMP是IP組播的基礎。在IP協議出現以后為了加入對組播的支持,IGMP產生了。IGMP所做的實際上就是告訴路由器,在這個路由器所在的子網內有人對發送到某一個組播組的數據感興趣,這樣當這個組播組的數據到達后面,路由器就不會拋棄它,而是把他轉送給所有感興趣的客戶。假如不同子網內的A和B要 進行組播通信,那么位于AB之間的所有路由器必須都要支持IGMP協議,否則AB之間不能進行通信。
組播的原理:
? ? ? 組播首先由一個用戶申請一個組播組,這個組播組被維護在路由器中,其他用戶申請加入組播組,這樣當一個用戶向組內發送消息時,路由器將消息轉發給組內的所有成員。如果申請加入的組不在本級路由中,如果路由器和交換機允許組播協議通過,路由器將申請加入的操作向上級路由提交。廣域網通信要經過多級路由器和交換機,幾乎所有的網絡設備都默認阻止組播協議通過( 只允許本網段內,不向上級提交),這使得廣域網上實現組播有一定局限。UDP組播的基本步驟
服務器和客戶端必須都要加入相同的組播地址才可以。
多播數據報套接字類用于發送和接收 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)。
?最后給出一個實例:https://github.com/ljheee/Multicast_UDP
總結
以上是生活随笔為你收集整理的UDP 组播---你需要了解这些的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中try...except.
- 下一篇: WIFI 一键配置原理-ESP8266