英文:User Datagram Protocal,缩写为UDP。 是一种用户数据报协议,又叫用户数据报文协议。数组
是一个简单的面向数据报的传输层协议,正式规范为RFC 768。bash
用户数据协议,非链接协议。他不须要两个客户端必定是链接的。服务器
TCP是面向链接的,是传输可靠的。UDP是面向数据报的。网络
他一旦把应用程序发给网络层的数据发送出去,就不保留数据备份。即在UDP的数据层面,他只管发送或者是接受数据,而不对这些数据进行保存,备份,重发等等。框架
UDP在IP数据报的头部仅仅加入复用和数据校验(字段)。ui
发送端生成数据,接收端从网络中抓取数据。因此他们二者是不须要进行链接的。UDP当中是没有标准的客户端和服务器端。spa
结构简单、无校验、数独快、容易丢包、可广播。code
DNS TFTP(文件传输的协议) SNMP(网络数据传输当中的一个监控协议) 视频、音频、普通数据(可有可无数据)视频
Bit# | 0 7 | 8 15 | 16 23 | 24 31 |
0 Source Port | Destination Port
32 Length | Header and Data Checksum
复制代码
加在一块儿就是64位。前面用了32位保存端口号,端口号用短整型来存储,紧接着16位是用了存储后面数据的长度,也是短整型存储,后16位存储的是头部和数据校验。资源
16位->2字节,存储长度信息。
2^16-1 = 64K-1 = 65536-1=65535个字节长。
自身协议占用:32+32位 = 64位 = 8字节。
65535-8 = 65507 byte
用于接受与发送UDP的类。
负责发送某一个UDP包,或者接受UDP包。
不一样于TCP,UDP并无合并到SocketAPI当中。在UDP当中是没有服务器与客户端的概念,你的DatagramSocket便是你的服务器也是你的客户端。 他能够发送也能够接受,他不须要去监听某一个客户端,由于他涉及客户端跟他的链接,他不像TCP同样须要先去监听一个TCP的来源,而后链接TCP,而后再进行通讯。UDP通讯就至关于两个服务器之间的传输或者连个客户端之间的传输,他没有服务器端也没有客户端,他便是服务器也是客户端。
DatagramSocket()建立简单实例,不指定端口与IP。他会复用你本机可用的端口,IP就是你本机的IP。
DatagramSocket(int port)建立监听固定端口的实例,这个端口指的是你接受数据的端口。
DatagramSocket(int port, InetAddress localAddr)建立固定端口指定IP的实例,当你的本地有多个IP地址的时候有效,你能够指定只监听你
局域网某一个端口,或者你是想监听互联网某一个IP的端口,由于你的电脑可能具有多个IP地址。
receive(DatagramSocket d) 接受。
send(DatagramSocket d) 发送。
setSoTimeout(int timeout):设置超时时间,毫秒。
close() 关闭释放资源。
复制代码
用于处理报文。经过他来指定你具体的接受着的信息,他的信息是什么?是经过DatagramPacket来进行设置。
将byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成byte数组。
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)。
前面3个参数指定buf的使用区间。
后面2个参数指定目标机器地址与端口。
SocketAddress至关于InetAddress+Port。
setData(byte[] buf, int offset, int length)
setData(byte[] buf)
setLength(int length)
getData()、getOffset()、getlength()
setAddress(InetAddress iaddr),setPort(int port)
getAddress(),getPort()
setSocketAddress(SocketAddress address)
getSocketAddress()
复制代码
UDP单播就是点对点,两个点之间的通讯不会被其余点所感知。
UDP多播应该叫组播,他是给某一组设备发送。例如说全部的男生请过来,那么这个时候男生就是一组,女生以及其余性别无关 他们不会收到信。 他可以给指定的一组设备发送信息。例如我看着广场下面有男生,女生,我直接过去把全部的男生都挑出来,挑出来以后,我直接对这一部分 男生说,我虽然也是直接对一批人说,可是我提早会进行筛选,提取出我真正有用的这一部分设备,而后我再对这一部分设备进行发送信息,这时候我这一部分设备必定是对这信息感兴趣的。 UDP广播就是全部的设备都发送信息。例如你给局域网发送信息或者局域网之外发送信息。就是你直接在你所在的网段发送一条信息,至于这个网段以内那些设备会对你这个信息感兴趣,那就是对应设备该作的处理了。最早出来的单播,而后是广播,最后是多播。多播比广播更优越。
广播地址:
255.255.255.255为受限的广播地址。其实只有你局域网内的设备可以收到你发送的这个信息,至于他对这个信息感不感兴趣就看他对没对2000端口进行监听。
C网的广播地址通常为:XXX.XXXX.XXX.255(192.168.1.255),若是你要给你所在局域网发送广播信息,地址能够是255.255.255.255或192.168.1.255通常而言广播地址就是最后为255。
D类IP地址为多播预留。
IP地址构成: 8+8+8+8=32 Bits
广播地址运算: 广播地址是不固定的是运算出来的。
IP 192.168.124.7
子网掩码 255.255.255.0
网络地址 192.168.124.0
广播地址:192.168.124.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 = 4个,由于11000000中有2个1
0-64,64-127,128-191,192-255
个人IP是192.168.124.7,7是第一个网段,这时个人保留地址是192.168.124.0,广播地址就是最后一位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实际上是有客户端也有服务端的功能,具体表现为何样的呢?
好比机器A,机器B,两台计算机之间想要发送一个广播,怎么实现的呢?
首先A发送一个消息给B,B是否是必定可以接受呢?不是。
若是这么简单的A往B发送消息就能实现的话,那么我往局域网发送一个消息,局域网的其余的全部设备都能收到这个消息并可以处理这个消息的话,那么咱们的传输会致使咱们整个传输互联网框架的一个瘫痪,那么它确定要遵循必定的守则,守则是什么样的呢?首先咱们认为B计算机应该要监听一个端口(2000),那么他在监听这个端口的时候,全部到到这个端口上的UDP信息,那么他将会处理,这个时候A往B2000端口发送一条消息,这个时候B就能接受到并处理这条消息。固然他在处理这条消息的时候,前面有说过,咱们的一个UDP包当中他有64位前面有存储发送源的端口和目标源的端口,目标源就是2000,发送端的话多是一个随机端口(1000),当B收到消息的时候,他就已经知道A的端口号了,同理在B获得这个端口以后的话,那么B能够基于这个1000端口回送一条消息,至于A是否有能力去接受这个消息,由A本身决定,A若是在发送以后,咱们紧接着进行了一次接受的操做,而且就在当前的链接上面进行接受的话,B回送了一个消息,那么A将会受到,这就实现了一个AB之间的一个信息的交互的过程。
A与B C D属于同一个局域网。
B C D都是提供者的身份,都监听各自的20000端口,A能够发送一条信息到受限广播地址,那么B C D都会收到这条消息,3个收到消息以后,紧跟着A发送的消息当中,A能够告诉他说你给我回送到30000端口上来,B收到消息以后 若是解析成功的话,那么给A的30000端口回送一条消息,C和D都同样 会回送一条消息,回送回来消息,那么A要作一件什么事情呢?A他首先在发送我前面这条搜索消息以前他先要监听30000端口,他必需要先处于一个30000端口的监听状态下,他才能收到B C D3台设备发送过来的信息,固然这不是必然,有可能A刚刚发送完成以后马上进行一个30000端口的监听,这也是能够的,可是他不保证100%的可行,咱们为了让他保证必定的成功率的话,能够先进行一个30000端口的监听,而后给局域网内全部的设备发送20000端口的一个指定的信息,这个指定的信息就是约定好的信息格式,也就是咋们的一个口令,口令信息发送出去以后,可以被B CD设备所解析,解析完成 以后B C D可以回送一个消息回来,那么回送呢,他也是一个口令模式,那么首先要作的事情就是设定口令,而且要监听,而后发送,发送以后B C D要可以收到消息,收到消息以后要可以持续回送,同事B C D不该该回送以后就中止,他应该是一个持续的过程,它可以持续一段时间以内都可以处于一个收到信息回送的这样一个功能,这就是一个发现模式。