UDP:
英文:User Datagram Protocal,缩写为UDP。 是一种用户数据报协议,又叫用户数据报文协议。
是一个简单的面向数据报的传输层协议,正式规范为RFC 768。
用户数据协议,非连接协议。他不需要两个客户端一定是连接的。
为什么不可靠?
TCP是面向连接的,是传输可靠的。UDP是面向数据报的。
他一旦把应用程序发给网络层的数据发送出去,就不保留数据备份。即在UDP的数据层面,他只管发送或者是接受数据,而不对这些数据进行保存,备份,重发等等。
UDP在IP数据报的头部仅仅加入复用和数据校验(字段)。
发送端生成数据,接收端从网络中抓取数据。所以他们两者是不需要进行连接的。UDP当中是没有标准的客户端和服务器端。
结构简单、无校验、数独快、容易丢包、可广播。
UDP能做什么?
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位存储的是头部和数据校验。
UDP包最大的长度是?
16位->2字节,存储长度信息。
2^16-1 = 64K-1 = 65536-1=65535个字节长。
自身协议占用:32+32位 = 64位 = 8字节。
65535-8 = 65507 byte
API-DatagramSocket:
用于接受与发送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() 关闭释放资源。复制代码
API-DatagramPacket:
用于处理报文。通过他来指定你具体的接受着的信息,他的信息是什么?是通过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广播就是所有的设备都发送信息。例如你给局域网发送信息或者局域网以外发送信息。就是你直接在你所在的网段发送一条信息,至于这个网段之内那些设备会对你这个信息感兴趣,那就是对应设备该做的处理了。最先出来的单播,然后是广播,最后是多播。多播比广播更优越。
IP地址类别:
广播地址:
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.255IP 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个10-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不应该回送之后就停止,他应该是一个持续的过程,它能够持续一段时间之内都能够处于一个收到信息回送的这样一个功能,这就是一个发现模式。