单播,组播(多播),广播以及任播
目錄[+]
單播(unicast): 是指封包在計算機網絡的傳輸中,目的地址為單一目標的一種傳輸方式。它是現今網絡應用最為廣泛,通常所使用的網絡協議或服務大多采用單播傳輸,例如一切基于TCP的協議。
組播(multicast): 也叫多播, 多點廣播或群播。 指把信息同時傳遞給一組目的地址。它使用策略是最高效的,因為消息在每條網絡鏈路上只需傳遞一次,而且只有在鏈路分叉的時候,消息才會被復制。
廣播(broadcast):是指封包在計算機網絡中傳輸時,目的地址為網絡中所有設備的一種傳輸方式。實際上,這里所說的“所有設備”也是限定在一個范圍之中,稱為“廣播域”。
任播(anycast):是一種網絡尋址和路由的策略,使得資料可以根據路由拓樸來決定送到“最近”或“最好”的目的地。
在Linux運行ifconfig, 如果網卡信息中包含UP BROADCAST RUNNING MULTICAST,則支持廣播和組播。
詳細介紹
(來自維基百科)
單播:
每次只有兩個實體相互通信,發送端和接收端都是唯一確定的。
在IPv4網絡中,0.0.0.0到223.255.255.255屬于單播地址。
你對小月月喊“小月月”,那么只有小月月回過頭來答應你。
組播
“組播”這個詞通常用來指代IP組播。IP組播是一種通過使用一個組播地址將數據在同一時間以高效的方式發往處于TCP/IP網絡上的多個接收者的協議。此外,它還常用來與RTP等音視頻協議相結合。
互聯網架構師戴夫·克拉克是這樣描述IP組播的:“你把數據包從一頭放進去,網絡就會試圖將它們傳遞到想要得到它們的人那里。”
組播報文的目的地址使用D類IP地址, D類地址不能出現在IP報文的源IP地址字段。
你在大街上大喊一聲“美女”, 會有一群女性回頭看你。
廣播
并非所有的計算機網絡都支持廣播,例如X.25網絡和幀中繼都不支持廣播,而且也沒有在“整個互聯網范圍中”的廣播。IPv6亦不支持廣播,廣播相應的功能由任播(anycast)代替。
通常,廣播都是限制在局域網中的,比如以太網或令牌環網絡。因為廣播在局域網中造成的影響遠比在廣域網中小得多。
以太網和IPv4網都用全1的地址表示廣播,分別是ff:ff:ff:ff:ff:ff和255.255.255.255。
令牌環網絡使用IEEE 802.2控制域中的一個特殊值來表示廣播。
你在公司大喊一聲“放假了”, 全部同事都會響應,大叫爽死了。
任播
任播是與單播、廣播和組播不同的方式。
在單播中,在網絡位址和網絡節點之間存在一一對應的關系。
在廣播和組播中,在網絡位址和網絡節點之間存在一對多的關系:每一個目的位址對應一群接收可以復制資訊的節點。
在任播中,在網絡位址和網絡節點之間存在一對多的關系:每一個位址對應一群接收節點,但在任何給定時間,只有其中之一可以接收到傳送端來的資訊。
在互聯網中,通常使用邊界網關協議來實現任播。
作為老板,你在公司大喊一聲“開發組的過來一個人”, 總會有一個人灰溜溜去響應, 挨批還是發錢?。?/p>
組播地址
參考iana
組播組可以是永久的也可以是臨時的。組播組地址中,有一部分由官方分配的,稱為永久組播組。永久組播組保持不變的是它的ip地址,組中的成員構成可以發生變化。永久組播組中成員的數量都可以是任意的,甚至可以為零。那些沒有保留下來供永久組播組使用的ip組播地址,可以被臨時組播組利用。
224.0.0.0~224.0.0.255為預留的組播地址(永久組地址),地址224.0.0.0保留不做分配,其它地址供路由協議使用;
224.0.1.0~224.0.1.255是公用組播地址,Internetwork Control Block;
224.0.2.0~238.255.255.255為用戶可用的組播地址(臨時組地址),全網范圍內有效;
239.0.0.0~239.255.255.255為本地管理組播地址,僅在特定的本地范圍內有效。
永久的組播地址:
224.0.0.0 基準地址(保留)
224.0.0.1 所有主機的地址 (包括所有路由器地址)
224.0.0.2 所有組播路由器的地址
224.0.0.3 不分配
224.0.0.4 dvmrp路由器
224.0.0.5 所有ospf路由器
224.0.0.6 ospf DR/BDR
224.0.0.7 st路由器
224.0.0.8 st主機
224.0.0.9 rip-2路由器
224.0.0.10 Eigrp路由器
224.0.0.11 活動代理
224.0.0.12 dhcp 服務器/中繼代理
224.0.0.13 所有pim路由器
224.0.0.14 rsvp封裝
224.0.0.15 所有cbt路由器
224.0.0.16 指定sbm
224.0.0.17 所有sbms
224.0.0.18 vrrp
以太網傳輸單播ip報文的時候,目的mac地址使用的是接收者的mac地址。但是在傳輸組播報文時,傳輸目的不再是一個具體的接收者,而是一個成員不確定的組,所以使用的是組播mac地址。組播mac地址是和組播ip地址對應的。iana(internet assigned number authority)規定,組播mac地址的高24bit為0x01005e,mac 地址的低23bit為組播ip地址的低23bit。
由于ip組播地址的后28位中只有23位被映射到mac地址,這樣就會有32個ip組播地址映射到同一mac地址上。
廣播地址
廣播地址(Broadcast Address)是專門用于同時向網絡中所有工作站進行發送的一個地址。在使用TCP/IP 協議的網絡中,主機標識段host ID 為全1 的IP 地址為廣播地址,廣播的分組傳送給host ID段所涉及的所有計算機。例如,對于10.1.1.0 (255.255.255.0 )網段,其廣播地址為10.1.1.255 (255 即為2 進制的11111111 ),當發出一個目的地址為10.1.1.255 的分組(封包)時,它將被分發給該網段上的所有計算機。
本地廣播地址為255.255.255.255。
Java,單播,組播與廣播
單播
UDP協議的全稱是用戶數據報協議,在網絡中它與TCP協議一樣用于處理數據包,是一種無連接的協議。在OSI模型中,在第四層——傳輸層,處于IP協議的上一層。UDP有不提供數據包分組、組裝和不能對數據包進行排序的缺點,也就是說,當報文發送之后,是無法得知其是否安全完整到達的。UDP用來支持那些需要在計算機之間傳輸數據的網絡應用。包括網絡視頻會議系統在內的眾多的客戶/服務器模式的網絡應用都需要使用UDP協議。UDP協議從問世至今已經被使用了很多年,雖然其最初的光彩已經被一些類似協議所掩蓋,但是即使是在今天UDP仍然不失為一項非常實用和可行的網絡傳輸層協議。
與所熟知的TCP(傳輸控制協議)協議一樣,UDP協議直接位于IP(網際協議)協議的頂層。根據OSI(開放系統互連)參考模型,UDP和TCP都屬于傳輸層協議。
UDP首部字段由4個部分組成,其中兩個是可選的。各16bit的來源端口和目的端口用來標記發送和接受的應用進程。因為UDP不需要應答,所以來源端口是可選的,如果來源端口不用,那么置為零。在目的端口后面是長度固定的以字節為單位的長度域,用來指定UDP數據報包括數據部分的長度,長度最小值為8byte。首部剩下地16bit是用來對首部和數據部分一起做校驗和(Checksum)的,這部分是可選的,但在實際應用中一般都使用這一功能。
TCP和UDP的區別。
| TCP(傳輸控制協議) | UDP(用戶數據報協議) | |
|---|---|---|
| 是否連接 | 面向連接 | 面向非連接 |
| 傳輸可靠性 | 可靠的 | 不可靠的 |
| 應用場合 | 傳輸大量的數據 | 少量數據 |
| 速度 | 慢 | 快 |
單播有UDP和TCP兩種方式。 Java中 TCP socket編程就是單播的方式, ServerSocket/Socket。
Java中UDP也可以使用單播發送數據報:
|
1 2 3 4 5 6 7 8 9 10 11 |
//sending data to host and its port InetAddress address = InetAddress.getByName(host); // Initialize a datagram packet with data and address DatagramPacket packet = new DatagramPacket(message, message.length, address, port); // Create a datagram socket, send the packet through it, close it. DatagramSocket dsocket = new DatagramSocket(); dsocket.send(packet); dsocket.close(); |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//receiving data from its port DatagramSocket dsocket = new DatagramSocket(port); // Create a buffer to read datagrams into. If a // packet is larger than this buffer, the // excess will simply be discarded! byte[] buffer = new byte[2048]; // Create a packet to receive data into the buffer DatagramPacket packet = new DatagramPacket(buffer, buffer.length); // Now loop forever, waiting to receive packets and printing them. while (true) { // Wait to receive a datagram dsocket.receive(packet); // Convert the contents to a string, and display them String msg = new String(buffer, 0, packet.getLength()); System.out.println(packet.getAddress().getHostName() + ": " + msg); // Reset the length of the packet before reusing it. packet.setLength(buffer.length); } |
組播
多播數據報套接字類用于發送和接收 IP 多播包。MulticastSocket 是一種 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主機的“組”的附加功能。
播組通過 D 類 IP 地址和標準 UDP 端口號指定。D 類 IP 地址在 224.0.0.0 和 239.255.255.255 的范圍內(包括兩者)。地址 224.0.0.0 被保留,不應使用。
可以通過首先使用所需端口創建 MulticastSocket,然后調用 joinGroup(InetAddress groupAddr) 方法來加入多播組:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// join a Multicast group and send the group salutations ... String msg = "Hello"; InetAddress group = InetAddress.getByName("228.5.6.7"); MulticastSocket s = new MulticastSocket(6789); s.joinGroup(group); DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(), group, 6789); s.send(hi); // get their responses! byte[] buf = new byte[1000]; DatagramPacket recv = new DatagramPacket(buf, buf.length); s.receive(recv); ... // OK, I'm done talking - leave the group... s.leaveGroup(group); |
將消息發送到多播組時,該主機和端口的所有預定接收者都將接收到消息(在數據包的生存時間范圍內,請參閱下文)。套接字不必成為多播組的成員即可向其發送消息.
當套接字預定多播組/端口時,它將接收由該組/端口的其他主機發送的數據報,像該組和端口的所有其他成員一樣。套接字通過 leaveGroup(InetAddress addr) 方法放棄組中的成員資格。多個 MulticastSocket 可以同時預定多播組和端口,并且都會接收到組數據報。
|
1 2 3 4 5 6 7 8 9 10 11 |
//UDP servers InetAddress group = InetAddress.getByName("228.5.6.7"); MulticastSocket s = new MulticastSocket(6789); byte[] arb = new byte[1024]; s.joinGroup(group);//加入該組 while(true){ DatagramPacket datagramPacket =new DatagramPacket(arb,arb.length); s.receive(datagramPacket); System.out.println(arb.length); System.out.println(new String(arb)); } |
|
1 2 3 4 5 6 7 |
//UDP sender int port = 6789; String sendMessage="hello multicast"; InetAddress inetAddress = InetAddress.getByName("228.5.6.7"); DatagramPacket datagramPacket = new DatagramPacket(sendMessage.getBytes(), sendMessage.length(), inetAddress, port); MulticastSocket multicastSocket = new MulticastSocket(); //it is client, it won't join group multicastSocket.send(datagramPacket); |
廣播
在Java中,在Java UDP中單播與廣播的代碼是相同的,要實現具有廣播功能的程序只需要使用廣播地址即可。
Netty與單播,組播
廣播的例子
例子Quote of the Moment是一個廣播的例子。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public final class QuoteOfTheMomentServer { private static final int PORT = Integer.parseInt(System.getProperty("port", "7686")); public static void main(String[] args) throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(group) .channel(NioDatagramChannel.class) .option(ChannelOption.SO_BROADCAST, true) .handler(new QuoteOfTheMomentServerHandler()); b.bind(PORT).sync().channel().closeFuture().await(); } finally { group.shutdownGracefully(); } } } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public final class QuoteOfTheMomentClient { static final int PORT = Integer.parseInt(System.getProperty("port", "7686")); public static void main(String[] args) throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(group) .channel(NioDatagramChannel.class) .option(ChannelOption.SO_BROADCAST, true) .handler(new QuoteOfTheMomentClientHandler()); Channel ch = b.bind(0).sync().channel(); // Broadcast the QOTM request to port 8080. ch.writeAndFlush(new DatagramPacket( Unpooled.copiedBuffer("QOTM?", CharsetUtil.UTF_8), new InetSocketAddress("255.255.255.255", PORT))).sync(); // QuoteOfTheMomentClientHandler will close the DatagramChannel when a // response is received. If the channel is not closed within 5 seconds, // print an error message and quit. if (!ch.closeFuture().await(5000)) { System.err.println("QOTM request timed out."); } } finally { group.shutdownGracefully(); } } } |
組播
SocketOptions定義組播和廣播的一些常量。
IP_MULTICAST_IF / networkInterface: The name of the interface on which outgoing multicast packets should be sent. When a host has multiple network interfaces, this tends to be quite important.
IP_MULTICAST_IF2 / networkInterface: The same as IP_MULTICAST_IF but defined again for good measure.
IP_MULTICAST_LOOP / loopbackModeDisabled: Defines if multicast packets should be received by the sender of the same.
SO_BROADCAST / broadcast: Enables or disables a DataGramSocket's ability to send broadcast messages,
參照netty的測試套件。
單播
參看netty的測試套件
參考
http://zh.wikipedia.org/wiki/%E5%96%AE%E6%92%AD
http://zh.wikipedia.org/wiki/%E5%A4%9A%E6%92%AD
http://zh.wikipedia.org/wiki/%E5%BB%A3%E6%92%AD_(%E7%B6%B2%E8%B7%AF)
http://zh.wikipedia.org/wiki/%E4%BB%BB%E6%92%AD
http://li-sir.iteye.com/blog/837344
總結
以上是生活随笔為你收集整理的单播,组播(多播),广播以及任播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不能访问共享的文件,电脑提示“您没有权限
- 下一篇: 15.小区选择和重选准则-流程