UDP是什么
- 全称 User Datagram Protocol
- 一种用户数据报协议,又称用户数据报文协议
- 是一个简单的面向数据报的传输层协议,正式规范为RFC 768
- 用户数据协议、非连接协议
UDP为什么不可靠
- 它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份
- UDP在IP数据报的头部,仅仅加入了复用和数据校验(字段)
- 发送端生产数据,接收端从网络中抓取数据
- 结构简单、无校验、速度快、容易丢包、可广播
UDP能做什么
- DNS TFTP SNMP
- 视频、音频、普通无关紧要数据
UDP报文头
- 两组0-32,一共64为bit
- 第一组
- 0-15 Source Port 发送端口号
- 16-31 Destination Port 接受端口号
- 第二组
- 0-15 Length 长度
- 16-31 Header and Data Checksum 头部和数据校验
- UDP包最大长度
- 16位->2字节 存储长度信息
- 2^16-1 = 64K - 1 = 65536 - 1 = 65535
- 自身协议占用:32+32位 = 64位 = 8字节
- 65535 - 8 = 65507 byte
Java UDP API
DatagramSocket
作用
- 用于接收与发送UDP的类, 负责发送某一个UDP包,或者接受UDP包
- 不同于TCP,UDP并没有合并到SocketAPI中
API
- DatagramSocket() 创建简单实例,不指定端口与IP
- DatagramSocket(int port) 创建监听固定端口的实例
- DatagramSocket(int port, InetAdderss loaclAddr)创建固定端口指定IP的实例,当本地存在多个IP的情况下
- receive(DatagramPacket d) 接受
- send(DatagramPacket d) 发送
- setSoTimeout(int timeout) 设置超时,毫秒
- close() 关闭、释放资源
DatagramPacket
作用
- 用于处理报文
- 将byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成byte数组
- 是UDP的发送实体,也是接收实体
API
- DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
- 前面3个参数指定buf的使用区间
- 后面2个参数指定目标机器地址与端口
- DatagramPacket(byte[] buf, int length, SocketAddress address)
- 前面3个参数指定buf的使用区间
- SocketAddress相当于InetAddress + Port
- setData(byte[] buf, int offset, int length)
- setData(byte[] buf)
- setLength(int length)
- setAddress(InetAddress iaddr)
- setPort(int iport)
- setSocketAddress(SocketAddress address)