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 Port32                 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个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不应该回送之后就停止,他应该是一个持续的过程,它能够持续一段时间之内都能够处于一个收到信息回送的这样一个功能,这就是一个发现模式。

Socket IO与NIO(二)相关推荐

  1. Socket IO与NIO(三)

    Socket-TCP快速入门: TCP是什么? 英语:Transmission Control Protocal,缩写为TCP [træns'mɪʃən]n. 传动装置,[机] 变速器:传递:传送:播 ...

  2. Netty介绍及实战(二)之IO与NIO和多路复用与零拷贝

    Netty介绍及实战(一) 一.Netty到底是什么?什么是多路复用?什么叫做零拷贝? Netty是一个NIO客户端服务器框架,可以快速.轻松地开发协议服务器和客户端等网络应用程序.它极大地简化和简化 ...

  3. io读取一个文件再写入socket技术_JAVA中IO与NIO面试题

    BIO.NIO有什么区别? BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低. NIO:New IO 同步非阻塞 IO,是传统 IO ...

  4. SOCKET编程 IO与NIO

    socket是网络编程的基础,通过socket不同的计算机之间可以进行数据的交互. JAVA中IO操作是阻塞的,每个操作都要创建一个线程,容易对资源造成浪费.而NIO的出现解决了这一点,NIO可以通过 ...

  5. Java之IO,BIO,NIO,AIO

    2019独角兽企业重金招聘Python工程师标准>>> 参考文献一 IO基础知识回顾 java的核心库java.io提供了全面的IO接口.包括:文件读写.标准设备输出等.Java中I ...

  6. 五.Java IO、NIO、文件、通讯

    2019独角兽企业重金招聘Python工程师标准>>> Java 的 I/O 大概可以分成四组: 基于字节操作的 I/O :InputStream 和 OutputStream 基于 ...

  7. Java NIO:IO与NIO的区别

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

  8. IO: BIO ? NIO ? AIO?

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  9. Java与汽车_Java NIO:IO与NIO的区别

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

最新文章

  1. R语言可视化包ggplot2在一张图中画出两条线实战
  2. 【跃迁之路】【535天】程序员高效学习方法论探索系列(实验阶段292-2018.07.25)...
  3. 数据分析系列:绘制折线图(matplotlib)2
  4. 设置更改root密码 ,连接mysql,mysql常用命令
  5. C++ primer 第10章 泛型算法
  6. 面积积分_袁颖妍:用定理积分求平面区域面积(有代表性的9个例题)
  7. 前后端分离的用户验证原理及Spring Boot + JWT的框架搭建(附完整的框架代码)之一
  8. bzoj 1293: [SCOI2009]生日礼物
  9. 老人机java游戏模拟器_Java模拟器
  10. matlab 向量转置,matlab中向量和矩阵怎么转置 值得收藏
  11. python表情包合集_python——简单生成表情包
  12. Matlab底层算法实现图像的平移
  13. python实例练习(15)搜索关键词自动提交
  14. 文末赠书 | 豆瓣评分9.2,Python 畅销书作者再出新作!
  15. 3dMax 入门(高脚杯)
  16. 如何使用ABP进行软件开发(2) 领域驱动设计和三层架构的对比
  17. 从“被动挖光缆”到“主动剪网线”,蚂蚁金服异地多活的微服务体系
  18. 【顺丰科技】2019校园招聘在线笔试编程题
  19. 他打算上计算机课程 英文翻译,计算机专业课程名称英文翻译
  20. 学区房 | 入学要求房产面积大于60平的小学周边有多少小区

热门文章

  1. 《计算机原理》教案,计算机原理及应用教案
  2. 语义分割--Attention to Scale: Scale-aware Semantic Image Segmentation
  3. ubuntu报错解决:The following packages have unmet dependencies:
  4. Java线程池详解学习:ThreadPoolExecutor
  5. 在树莓派上安装AdGuardHome当DNS服务器,来屏蔽广告和追踪的DNS请求
  6. 服务器查看gpu状态_如何查看服务器gpu
  7. java ojdbc 还需要装 oracle client 吗,c# 连接Oracle数据库必须安装客户端吗
  8. mysql 主从复制 position_mysql 主从复制原理及步骤。
  9. mongoTemplate 条件查询
  10. C++_pointer-like classes,function-like classes