UDP是什么
- 英文:User Datagram Protocol,缩写为UDP
- 一种用户数据报协议,又称用户数据报文协议
- 是一个简单的面向数据报的传输层协议,正式规范为RFC 768
- 用户数据协议,非连接协议
为什么不可靠
- 它一旦把应用层发给网络层的数据发送出去,就不保留数据备份
- UDP在IP数据报的头部仅仅加入了复用和数据校验(字段)
- 发送端生产数据,接收端从网络中抓取数据
- 结构简单、无校验、速度快、容易丢包、可广播
UDP能做什么
- DNS(域名解析)、TFTP(文件传输协议)、SNMP(网络数据传输过程中监控的协议)
- 视频、音频、普通数据(无关紧要数据)
UDP包最大长度
- 2字节存储长度信息
- 2字节能存储的最大长度是65535,其中自身协议占用64位,即8字节,所以最大发送内容长度是 65535 - 8 个字节
UDP核心API讲解
DatagramSocket
- 用于接收与发送UDP的类
- 负责发送某一个UDP包,或者接收UDP包
- 不同于TCP,UDP并没有合并到Socket API中
- DatagramSocket()创建简单实例,不指定端口与IP
- DatagramSocket(int port)创建监听固定端口的实例
- DatagramSocket(int port, InetAddress, localAddr)创建固定端口指定IP的实例
- receive(DatagramSocket d):接收
- send(DatagramSocket d):发送
- setSoTimeOut(int timeOut):设置超时时间,毫秒
- close():关闭、释放资源
DatagramPacket
- 用于处理报文
- 将byte数组、目标地址、目标端口号等数据包装成报文或者将报文拆卸成byte数组
- 是UDP的发送实体,也是接收实体
- DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
- 前3个参数指定buf的使用区间
- 后面2个参数指定目标机器地址与端口
- DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
- 前3个参数指定buf的使用区间
- SocketAddress相当于InetAddress + Port
- setData(byte[] buf, int offset, int length)
- setData(byte[] buf)
- setLength(int length)
- getData(), getOffset(), getLength()
- setAddress(InetAddress address), setPort(int iport)
广播地址
- 255.255.255.255为受限广播地址
- C网广播地址一般为:xxx.xxx.xxx.255(比如:192.168.1.255)
- D类IP地址为多播预留
广播地址运算
- IP:192.168.124.7
- 子网掩码:255.255.255.0
- 网络地址:192.168.124.0,计算方式:IP 和 子网掩码进行 与 运算
- 广播地址:192.168.124.255,计算方式:网络地址最后一个网段
是不是所有广播地址的最后一位都是255呢?
- IP:192.168.124.7
- 子网掩码:255.255.255.192
- 网络地址:192.168.124.0
- 广播地址:192.168.124.63
广播地址运算
- 255.255.255.192 -> 11111111.11111111.11111111.11000000
- 可划分网段:2*2 (最后一位有几个1,就是几次方) = 4个
- 0-63、64-127、128-191、192-255
- 自己的IP设备:192.168.124.7处于第一个网段0-63,第一个网段最后一位就是广播地址,所以广播地址是:192.168.124.63
广播通信问题
- 主机一:192.168.124.7,子网掩码:255.255.255.192
- 主机二:192.168.124.100,子网掩码:255.255.255.192,问:这两台主机能通信吗
- 主机一广播地址:192.168.124.63,主机二广播地址:192.168.124.127,广播地址不一样,不能通信
案例实操-局域网搜索案例
- UDP接收消息并回送功能实现
- UDP局域网广播发送实现
- UDP局域网回送消息实现