Socket网络编程学习笔记 UDP的定义API单播广播多播

Posted 鮀城小帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket网络编程学习笔记 UDP的定义API单播广播多播相关的知识,希望对你有一定的参考价值。

1. UDP定义

UDP(User Datagram Protocol,缩写为UDP),是一种用户数据报协议,又成用户数据报文协议。

它是一个简单的面向数据报的传输层协议,正式规范为RFC 768,是用户数据协议,也是非连接协议。(TCP是连接协议)

UDP是不可靠的,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份。UDP在IP数据报的头部仅仅加入了复用和数据校验(字段)。

UDP的数据传输方式,发送端生产数据,接收端从网络中抓取数据。

UDP的特点,具有结构简单、无校验、速度快、容易丢包、可广播。

2. UDP的用途

(1)可作为DNSTFTPSNMP

(2)可用于视频、音频、普通数据的传输。

3. UDP报文

UDP报文头

UDP的报文头长度,如上图,第二行、第三行分别为32个bit的长度,总共为64位。0~15存储发送源的数据,16~31存储的是接受者的数据。32~47存储的是字节的长度。48~63存储的是头部与数据的校验字段。

UDP包最大长度

可存储 16位 -> 2字节长度的信息;即 2^16-1 = 64k-1 = 65536-1=65535。但由于自身协议占用了:32+32位 = 64位 = 8字节,所以UDP分包后最大的一次传输数据大小为: 65535-8= 65507byte。

4. API

(1) DatagramSocket

这是用于接收与发送UDP的类,主要作用是负责发送某一个UDP包,或者接收UDP包。注意,UDP的API并没有合并到Socket API中。

  • DatagramSocket()     创建简单实例,不指定端口和IP
  • DatagramSocket(int port)     创建监听固定端口的实例
  • DatagramSocket(int port, InetAddress localAddr)    创建固定端口指定IP的实例
  • receive( DatagramSocket d) : 接收
  • send(DatagramSocket d) : 发送
  • setSoTimeout(int timeout): 设置超时,毫秒
  • close() : 关闭、释放资源

(2)DatagramPacket

其主要用于处理报文。即将 byte 数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成 byte 数组。它既是UDP的发送实体,也是接收实体。

  • DatagramPacket(byte[] buf,int offset, int length, InetAddress address, int port)  前面3个参数指定 buf 的使用区间,后面两个参数指定目标机器地址与端口
  • DatagramPacket(byte[] buf,int length, SocketAddress address)   前面3个参数指定 buf 的使用区间, SocketAddress 相当于 InetAddress+Port
  • setData(byte[] buf, int offset, int length)  指定 buf 中有效的那部分数据
  • setData(byte[] buf)   不指定有效长度,从0开始
  • setLength(int length)  单独设置 buf 有效的区间有多长
  • getData() 、getOffset()、 getLength()   data、offset、length的返回
  • setAddress( InetAddress iaddr) 、setPort(int iport) 设置目标的地址和端口
  • getAddress()、getPort()   返回目标的地址和端口
  • setSocketAddress(SocketAddress address)   SocketAddress 相当于 InetAddress+Port
  • getSocketAddress() 

5.UDP单播、多播、广播

所谓单播,就是两台电脑之间进行点对点的传输数据,这两台电脑之间传输数据的整个过程,是不为其他电脑(主机)所感知的。

所谓多播,也可以叫组播。是同时给一组设备发送信息。

所谓广播,就是给所有的设备都发送信息。比如:给局域网内的所有设备都发送相同的数据。

三种方式的区别主要是在IP地址上,其IP地址类别如下:

6. 广播地址

(1)受限的广播地址:  255.255.255.255 ,该地址只能被局域网内的设备主动去接收到。

(2)C网广播地址一般为: XXX.XXX.XXX.255(192.168.1.255)

(3)D类IP地址为多播预留

7. 网络信息

上图中的 Subnet Mask也就是子网掩码可知,当前网络数据C类IP地址。

8. IP地址构成

一个ip地址是由4个比特,也就是32个字节长度,即一个 int值所构成。

9.广播地址运算

  • 比如IP地址为: 192.168.124.7,
  • 子网掩码就是: 255.255.255.0,由IP地址可知为C类IP地址,从而得出子网掩码
  • 网络地址为 192.168.124.0 ,用子网掩码与IP地址进行与运算可得出网络地址
  • 广播地址为: 192.168.124.255,由 255.255.255.0 的最后一位可知其最后一个字节全是0,最大可为255,也就是广播地址为 192.168.124. xxx  的 xxx=255。
  • 如果子网掩码不为255.255.255.0,比如: 子网掩码为 : 255.255.255.192,那么广播地址就是 192.168.124.63.
  • 广播地址运算方式为:
    •  255.255.255.192 -> 11111111.11111111.11111111.11000000
    • 可划分网段: 2^2 = 4个 (两个1)
    • 0~63(4个字节长度)、64~127、128~191、 192~255
    • 所以广播地址最后一位不一定是255

10. 广播通信问题

主机一: 192.168.124.7,子网掩码: 255.255.255.192

主机二: 192.168.124.100,子网掩码:255.255.255.192

主机一广播地址: 192.168.124.63

主机二广播地址: 192.168.124.127

上述的两个广播地址之间是无法互通的。

以上是关于Socket网络编程学习笔记 UDP的定义API单播广播多播的主要内容,如果未能解决你的问题,请参考以下文章

Socket网络编程学习笔记 网络编程Socket与TCP/UDP

Socket网络编程学习笔记 UDP案例-消息接收回送与局域网广播回送

python学习笔记day8socket网络编程

C# socket编程 使用udp实现单对单的连接对话

Socket网络编程学习笔记 UDP辅助TCP实现点对点传输案例 -- UDP广播搜索获取IP/Port

Socket网络编程学习笔记 TCP快速入门