1.什么是UDP?
这里简单介绍一下,UDP,即用户数据报协议,一种无连接的传输层协议,提供不可靠的消息服务。UDP协议利用端口号为不同的应用预留自己的数据传输通道,这一点非常重要。与TCP相比,它占用的资源更少,传输速度更快。
2.了解UDP单播、广播和多播
单播:将UDP数据报发送到单播地址时,数据报只能由指定的IP主机接收,同一子网下的其他主机不会接收到数据报。单播过程(假设子网地址为192.168.10,子网下有两台主机:192.168.10.2、192.168.10.3,向192.168.10.2发送数据报)
1.向主机192.168.10.2的8060端口发送数据报,通过以太网中的ARP将IP数据报的目标IP解析为MAC地址,然后将MAC地址设置为目标地址发送出去。
2.当子网下的主机以太网接口看到数据帧时,它会比较自己的MAC地址,如果不同,它会忽略数据帧。
3.直到192.168.10.2,当主机看到数据帧,发现MAC一致,就读入数据帧,然后在IP层比较目标IP和原生IP,在UDP层比较端口号是否一致,最后收到数据帧。
广播:将UDP数据报发送到一个广播地址,广播网络中的所有主机都会受到影响,主机会根据端口号判断是否丢弃数据。广播过程(假设子网地址为192.168.10,该网络的广播地址为192.168.10.255,该子网下有两台主机:192.168.10.2、192.168.10.3,航向192.168.10.3
1.在8060向192.168.10.255的主机端口发送一个数据报,通过以太网中的ARP将IP数据报的目标IP解析为MAC地址,然后将MAC地址设置为目标地址发送出去。
2.192.168.10.2和192.168.10.3的主机接口将与此广播地址成功匹配。直到数据报进入传输层,根据端口是否匹配,判断是否丢弃数据。如果端口是8060,数据将被保留,否则数据将被丢弃。
组播:将UDP数据报发送到一个组播地址,这组网络中的所有主机都会受到影响,主机会根据端口号判断是否丢弃数据。多播过程的原理类似于广播。
3.dgram模块应用编程接口介绍
该模块用于创建UDP数据报套接字,并继承事件发射器。该模块的应用编程接口如下:
3.UDP单播实现
上面已经提到了单播的原理,这里就不描述了。
服务器端:
const dgram=require(' dgram ');const server=dgram . CreateSocket(' UDP 4 ');Server.on ('close ',)={ console . log(' socket closed ');});server.on('error ',(err)={ console . log(err);});Server.on('侦听',()={console.log('套接字正在侦听.');});server.on('message ',(msg,rinfo)={ console.log(`接收来自$ { rinfo . address } : $ { rinfo . port }的消息');server.send('exit ',rinfo.port,rinfo . address)});server . bind(' 8060 ');客户:
const dgram=require(' dgram ');const client=dgram . CreateSocket(' UDP 4 ');Client.on ('close ',)={ console . log(' socket closed ');});client.on('error ',(err)={ console . log(err);});client.on('message ',(msg,rinfo)={ if(msg==' exit ')client . close();console.log(`接收来自$ { rinfo . address } : $ { rinfo . port }的消息`);});client.send(`hello `,8060,' 1 . 1 . 1 . 69 ');3.UDP广播的实现
要实现UDP广播,必须知道广播地址。如何计算广播地址?您可以使用ipconfig(windows)或ifconfig(*unix)获取ip地址和掩码地址,然后使用ip地址和掩码子网掩码获取网络地址,其中主机位都是1,即广播地址,例如:
Ip :149.88.160.58掩码k :1111111111 . 11100000 . 000000 IP掩码获取网络地址:149.88.128.0/18网络号表示所有主机位都是0,即149.88。
接着实现用户数据报协议(用户数据报协议)广播,我机子的互联网协议(互联网协议)为1.1.1.69,掩码为255.255.255.0,因此广播地址为1.1.1.255,服务端向广播地址的8061端口发送数据报,客户端绑定本机的8061端口,如下所示:
服务端:
const dgram=require(' dgram ');const server=dgram。create socket(' UDP 4 ');server.on('close ',()={ console.log('socket已关闭');});server.on('error ',(err)={ console。日志(err);});服务器. on('侦听,()={ console.log('套接字正在监听中.');server.setBroadcast(!0);//开启广播服务器。settl(128);server.send('大家好啊,我是服务端.',8061,'1.1.1.255');});server.on('message ',(msg,rinfo)={ console . log(` 0接收来自$ { rinfo。地址} : $ { rinfo。港口}的消息');});server.bind('8060,' 1。1 .1 .69 ');客户端:
const dgram=require(' dgram ');const client=dgram。create socket(' UDP 4 ');client.on('close ',()={ console.log('socket已关闭');});client.on('error ',(err)={ console。日志(err);});client.on('侦听,()={ console.log('socket正在监听中.');});client.on('message ',(msg,rinfo)={ console.log(`接收来自$ { rinfo。地址} : $ { rinfo。港口}的消息:$ { msg } `);});client.bind(8061,' 1。1 .1 .69 ');3、UDP组播实现
组播地址是实现用户数据报协议(用户数据报协议)组播的关键,因此了解组播地址是重点。什么是组播地址?互联网地址编码分配机构(互联网号码分配机构)将D类地址(224.0.0.0-239.255.255.255)分配给互联网协议(互联网协议)组播,用来标识一个互联网协议(互联网协议)组播组,由IGMP(组管理协议)协议维护组成员关系,其中:
224.0.0.0~224.0.0.255为永久组地址,地址224.0.0.0保留不做分配,其它地址供路由协议使用;
224.0.1.0~224.0.1.255是公用组播地址,可以用于互联网;
224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。
向组播地址发送数据报,只有该组成员才会接收此数据报。
dgram模块的addMembership()方法将窝加入组播组中,dropMembership()方法退出组播组。下面以组播地址224.100.100.100来实现用户数据报协议(用户数据报协议)组播,如下所示:
服务端:
const dgram=require(' dgram ');const server=dgram。create socket(' UDP 4 ');const多播地址=' 224。100 .100 .100 ';server.on('close ',()={ console.log('socket已关闭');});server.on('error ',(err)={ console。日志(err);});服务器. on('侦听,()={ console.log('套接字正在监听中.');服务器。addmembership(多播地址);服务器。setmulticast TTL(128);setInterval(()={ SendMSg();},1500);});server.on('message ',(msg,rinfo)={ console . log(` 0接收来自$ { rinfo。地址} : $ { rinfo。港口}的消息');});函数sendMsg(){ server.send('大家好啊,我是服务端。8061,multicastAddr);}server.bind('8060 ',1。1 .1 .69 ');客户端:
const dgram=require(' dgram ');const client=dgram。create socket(' UDP 4 ');const多播地址=' 224。100 .100 .100 ';client.on('close ',()={ console.log('socket已关闭');});client.on('error ',(err)={ console。日志(err);});client.on('侦听,()={ console.log('socket正在监听中.');客户。addmembership(多播地址);});client.on('message ',(msg,rinfo)={ console.log(`接收来自$ { rinfo。地址} : $ { rinfo。港口}的消息:$ { msg } `);});client.bind(8061,' 1。1 .1 .69 ');另外用户数据报协议(用户数据报协议)内网穿透相关的内容,大家也可自行了解一下。希望对大家的学习有所帮助,也希望大家多多支持我们。