单播,组播(多播),广播以及任播
目錄[+]
單播(unicast): 是指封包在計算機網(wǎng)絡(luò)的傳輸中,目的地址為單一目標(biāo)的一種傳輸方式。它是現(xiàn)今網(wǎng)絡(luò)應(yīng)用最為廣泛,通常所使用的網(wǎng)絡(luò)協(xié)議或服務(wù)大多采用單播傳輸,例如一切基于TCP的協(xié)議。
組播(multicast): 也叫多播, 多點廣播或群播。 指把信息同時傳遞給一組目的地址。它使用策略是最高效的,因為消息在每條網(wǎng)絡(luò)鏈路上只需傳遞一次,而且只有在鏈路分叉的時候,消息才會被復(fù)制。
廣播(broadcast):是指封包在計算機網(wǎng)絡(luò)中傳輸時,目的地址為網(wǎng)絡(luò)中所有設(shè)備的一種傳輸方式。實際上,這里所說的“所有設(shè)備”也是限定在一個范圍之中,稱為“廣播域”。
任播(anycast):是一種網(wǎng)絡(luò)尋址和路由的策略,使得資料可以根據(jù)路由拓樸來決定送到“最近”或“最好”的目的地。
在Linux運行ifconfig, 如果網(wǎng)卡信息中包含UP BROADCAST RUNNING MULTICAST,則支持廣播和組播。
詳細(xì)介紹
(來自維基百科)
單播:
每次只有兩個實體相互通信,發(fā)送端和接收端都是唯一確定的。
在IPv4網(wǎng)絡(luò)中,0.0.0.0到223.255.255.255屬于單播地址。
你對小月月喊“小月月”,那么只有小月月回過頭來答應(yīng)你。
組播
“組播”這個詞通常用來指代IP組播。IP組播是一種通過使用一個組播地址將數(shù)據(jù)在同一時間以高效的方式發(fā)往處于TCP/IP網(wǎng)絡(luò)上的多個接收者的協(xié)議。此外,它還常用來與RTP等音視頻協(xié)議相結(jié)合。
互聯(lián)網(wǎng)架構(gòu)師戴夫·克拉克是這樣描述IP組播的:“你把數(shù)據(jù)包從一頭放進去,網(wǎng)絡(luò)就會試圖將它們傳遞到想要得到它們的人那里。”
組播報文的目的地址使用D類IP地址, D類地址不能出現(xiàn)在IP報文的源IP地址字段。
你在大街上大喊一聲“美女”, 會有一群女性回頭看你。
廣播
并非所有的計算機網(wǎng)絡(luò)都支持廣播,例如X.25網(wǎng)絡(luò)和幀中繼都不支持廣播,而且也沒有在“整個互聯(lián)網(wǎng)范圍中”的廣播。IPv6亦不支持廣播,廣播相應(yīng)的功能由任播(anycast)代替。
通常,廣播都是限制在局域網(wǎng)中的,比如以太網(wǎng)或令牌環(huán)網(wǎng)絡(luò)。因為廣播在局域網(wǎng)中造成的影響遠比在廣域網(wǎng)中小得多。
以太網(wǎng)和IPv4網(wǎng)都用全1的地址表示廣播,分別是ff:ff:ff:ff:ff:ff和255.255.255.255。
令牌環(huán)網(wǎng)絡(luò)使用IEEE 802.2控制域中的一個特殊值來表示廣播。
你在公司大喊一聲“放假了”, 全部同事都會響應(yīng),大叫爽死了。
任播
任播是與單播、廣播和組播不同的方式。
在單播中,在網(wǎng)絡(luò)位址和網(wǎng)絡(luò)節(jié)點之間存在一一對應(yīng)的關(guān)系。
在廣播和組播中,在網(wǎng)絡(luò)位址和網(wǎng)絡(luò)節(jié)點之間存在一對多的關(guān)系:每一個目的位址對應(yīng)一群接收可以復(fù)制資訊的節(jié)點。
在任播中,在網(wǎng)絡(luò)位址和網(wǎng)絡(luò)節(jié)點之間存在一對多的關(guān)系:每一個位址對應(yīng)一群接收節(jié)點,但在任何給定時間,只有其中之一可以接收到傳送端來的資訊。
在互聯(lián)網(wǎng)中,通常使用邊界網(wǎng)關(guān)協(xié)議來實現(xiàn)任播。
作為老板,你在公司大喊一聲“開發(fā)組的過來一個人”, 總會有一個人灰溜溜去響應(yīng), 挨批還是發(fā)錢啊?
組播地址
參考iana
組播組可以是永久的也可以是臨時的。組播組地址中,有一部分由官方分配的,稱為永久組播組。永久組播組保持不變的是它的ip地址,組中的成員構(gòu)成可以發(fā)生變化。永久組播組中成員的數(shù)量都可以是任意的,甚至可以為零。那些沒有保留下來供永久組播組使用的ip組播地址,可以被臨時組播組利用。
224.0.0.0~224.0.0.255為預(yù)留的組播地址(永久組地址),地址224.0.0.0保留不做分配,其它地址供路由協(xié)議使用;
224.0.1.0~224.0.1.255是公用組播地址,Internetwork Control Block;
224.0.2.0~238.255.255.255為用戶可用的組播地址(臨時組地址),全網(wǎng)范圍內(nèi)有效;
239.0.0.0~239.255.255.255為本地管理組播地址,僅在特定的本地范圍內(nèi)有效。
永久的組播地址:
224.0.0.0 基準(zhǔn)地址(保留)
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 服務(wù)器/中繼代理
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
以太網(wǎng)傳輸單播ip報文的時候,目的mac地址使用的是接收者的mac地址。但是在傳輸組播報文時,傳輸目的不再是一個具體的接收者,而是一個成員不確定的組,所以使用的是組播mac地址。組播mac地址是和組播ip地址對應(yīng)的。iana(internet assigned number authority)規(guī)定,組播mac地址的高24bit為0x01005e,mac 地址的低23bit為組播ip地址的低23bit。
由于ip組播地址的后28位中只有23位被映射到mac地址,這樣就會有32個ip組播地址映射到同一mac地址上。
廣播地址
廣播地址(Broadcast Address)是專門用于同時向網(wǎng)絡(luò)中所有工作站進行發(fā)送的一個地址。在使用TCP/IP 協(xié)議的網(wǎng)絡(luò)中,主機標(biāo)識段host ID 為全1 的IP 地址為廣播地址,廣播的分組傳送給host ID段所涉及的所有計算機。例如,對于10.1.1.0 (255.255.255.0 )網(wǎng)段,其廣播地址為10.1.1.255 (255 即為2 進制的11111111 ),當(dāng)發(fā)出一個目的地址為10.1.1.255 的分組(封包)時,它將被分發(fā)給該網(wǎng)段上的所有計算機。
本地廣播地址為255.255.255.255。
Java,單播,組播與廣播
單播
UDP協(xié)議的全稱是用戶數(shù)據(jù)報協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無連接的協(xié)議。在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層。UDP有不提供數(shù)據(jù)包分組、組裝和不能對數(shù)據(jù)包進行排序的缺點,也就是說,當(dāng)報文發(fā)送之后,是無法得知其是否安全完整到達的。UDP用來支持那些需要在計算機之間傳輸數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用。包括網(wǎng)絡(luò)視頻會議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都需要使用UDP協(xié)議。UDP協(xié)議從問世至今已經(jīng)被使用了很多年,雖然其最初的光彩已經(jīng)被一些類似協(xié)議所掩蓋,但是即使是在今天UDP仍然不失為一項非常實用和可行的網(wǎng)絡(luò)傳輸層協(xié)議。
與所熟知的TCP(傳輸控制協(xié)議)協(xié)議一樣,UDP協(xié)議直接位于IP(網(wǎng)際協(xié)議)協(xié)議的頂層。根據(jù)OSI(開放系統(tǒng)互連)參考模型,UDP和TCP都屬于傳輸層協(xié)議。
UDP首部字段由4個部分組成,其中兩個是可選的。各16bit的來源端口和目的端口用來標(biāo)記發(fā)送和接受的應(yīng)用進程。因為UDP不需要應(yīng)答,所以來源端口是可選的,如果來源端口不用,那么置為零。在目的端口后面是長度固定的以字節(jié)為單位的長度域,用來指定UDP數(shù)據(jù)報包括數(shù)據(jù)部分的長度,長度最小值為8byte。首部剩下地16bit是用來對首部和數(shù)據(jù)部分一起做校驗和(Checksum)的,這部分是可選的,但在實際應(yīng)用中一般都使用這一功能。
TCP和UDP的區(qū)別。
| TCP(傳輸控制協(xié)議) | UDP(用戶數(shù)據(jù)報協(xié)議) | |
|---|---|---|
| 是否連接 | 面向連接 | 面向非連接 |
| 傳輸可靠性 | 可靠的 | 不可靠的 |
| 應(yīng)用場合 | 傳輸大量的數(shù)據(jù) | 少量數(shù)據(jù) |
| 速度 | 慢 | 快 |
單播有UDP和TCP兩種方式。 Java中 TCP socket編程就是單播的方式, ServerSocket/Socket。
Java中UDP也可以使用單播發(fā)送數(shù)據(jù)報:
|
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); } |
組播
多播數(shù)據(jù)報套接字類用于發(fā)送和接收 IP 多播包。MulticastSocket 是一種 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主機的“組”的附加功能。
播組通過 D 類 IP 地址和標(biāo)準(zhǔn) UDP 端口號指定。D 類 IP 地址在 224.0.0.0 和 239.255.255.255 的范圍內(nèi)(包括兩者)。地址 224.0.0.0 被保留,不應(yīng)使用。
可以通過首先使用所需端口創(chuàng)建 MulticastSocket,然后調(diào)用 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); |
將消息發(fā)送到多播組時,該主機和端口的所有預(yù)定接收者都將接收到消息(在數(shù)據(jù)包的生存時間范圍內(nèi),請參閱下文)。套接字不必成為多播組的成員即可向其發(fā)送消息.
當(dāng)套接字預(yù)定多播組/端口時,它將接收由該組/端口的其他主機發(fā)送的數(shù)據(jù)報,像該組和端口的所有其他成員一樣。套接字通過 leaveGroup(InetAddress addr) 方法放棄組中的成員資格。多個 MulticastSocket 可以同時預(yù)定多播組和端口,并且都會接收到組數(shù)據(jù)報。
|
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中單播與廣播的代碼是相同的,要實現(xiàn)具有廣播功能的程序只需要使用廣播地址即可。
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
總結(jié)
以上是生活随笔為你收集整理的单播,组播(多播),广播以及任播的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不能访问共享的文件,电脑提示“您没有权限
- 下一篇: 15.小区选择和重选准则-流程