精华内容
参与话题
问答
  • UDP 组播---你需要了解这些

    万次阅读 多人点赞 2016-06-20 19:11:34
    UDP 是UserDatagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768...

    先来了解下UDP

    UDP 是UserDatagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。

    UDP和TCP的区别:http://blog.csdn.net/ljheee/article/details/50823050

    UDP详解:http://blog.csdn.net/ljheee/article/details/51720594


    UDP信息传递的方式分三类

    ①  单播Unicast:是客户端与服务器之间的点到点连接。

    ②  广播BroadCast:主机之间“一对所有”的通讯模式,广播者可以向网络中所有主机发送信息。广播禁止在Internet宽带网上传输(广播风暴)。

    ③  多播MultiCast:主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据。

    这里需要注意的是:只有UDP才有广播、组播的传递方式;而TCP是一对一连接通信。多播的重点是高效的把同一个包尽可能多的发送到不同的,甚至可能是未知的设备。但是TCP连接是一对一明确的,只能单播。

     

    在Java API中,实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现,分别是:DatagramSocket和DatagramPacket。

     

    关于UDP使用的详细例子:https://github.com/ljheee/ChatUDP

     

    UDP组播

             组播报文的目的地址使用DIP地址, D类地址不能出现在IP报文的源IP地址字段。单播数据传输过程中,一个数据包传输的路径是从源地址路由到目的地址,利用“逐跳”的原理[路由选择]在IP网络中传输。

            然而在ip组播环中,数据包的目的地址不是一个,而是一组,形成组地址。所有的信息接收者都加入到一个组内,并且一旦加入之后,流向组地址的数据立即开始向接收者传输,组中的所有成员都能接收到数据包。组播组中的成员是动态的,主机可以在任何时刻加入和离开组播组。

            用同一个IP多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。此外,不属于某一个多播组的主机也可以向该多播组发送数据包。  

    组播地址

    1. 组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。
    2. 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
    3. 224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;
    4. 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
    5. 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。

            组播是一对多的传输方式,其中有个组播组的 概念,发送端将数据向一个组内发送,网络中的路由器通过底层的IGMP协议自动将数据发送到所有监听这个组的终端。至于广播则和组播有一些相似,区别是路由器向子网内的每一个终端都投递一份数据包,不论这些终端是否乐于接收该数据包。UDP广播只能在内网(同一网段)有效,而组播可以较好实现跨网段群发数据。

           UDP组播是采用的无连接,数据报的连接方式,所以是不可靠的。也就是数据能不能到达接受端和数据到达的顺序都是不能保证的。但是由于UDP不用保证数据 的可靠性,所有数据的传送效率是很快的。


    IGMP协议

          IGMP是IP组播的基础。在IP协议出现以后为了加入对组播的支持,IGMP产生了。IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有人对发送到某一个组播组的数据感兴趣,这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。假如不同子网内的A和B要 进行组播通信,那么位于AB之间的所有路由器必须都要支持IGMP协议,否则AB之间不能进行通信。

    组播的原理:

          组播首先由一个用户申请一个组播组,这个组播组被维护在路由器中,其他用户申请加入组播组,这样当一个用户向组内发送消息时,路由器将消息转发给组内的所有成员。如果申请加入的组不在本级路由中,如果路由器和交换机允许组播协议通过,路由器将申请加入的操作向上级路由提交。广域网通信要经过多级路由器和交换机,几乎所有的网络设备都默认阻止组播协议通过(只允许本网段内,不向上级提交),这使得广域网上实现组播有一定局限。

    UDP组播的基本步骤

    1. 建立socket
    2. socket和端口绑定
    3. 加入一个组播组
    4. 通过sendto / recvfrom进行数据的收发
    5. 关闭socket

    服务器和客户端必须都要加入相同的组播地址才可以

    多播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。

    多播组通过 D 类 IP 地址和标准 UDP 端口号指定。可以通过首先使用所需端口创建 MulticastSocket,然后调用 joinGroup(InetAddress groupAddr) 方法来加入多播组。

            在JAVA中,多播一样十分好实现,要实现多播,就要用到MulticastSocket类,其实该类就是DatagramSocket的子类,在使用时除了多播自己的一些特性外,把它当做DatagramSocket类使用就可以了。

            默认我们知道IP(UDP和TCP一样)可以把数据包在一个网络中发到另一个设备。更准确点就是IP把数据包从一个IP地址发到另一个IP地址。多播的决窍就是在同一时间把一个数据包发送到多个设备,可以把一个特定的IP地址指定为多播地址,并同时发送到多个设备。

            IP多播首先要知道的是只有UDP有多播,没有TCP多播这样的东西,为什么呢?多播的重点是高效的把同一个包尽可能多的发送到不同的,甚至可能是未知的设备。但是TCP连接可能要求丢包重发或者延时或重组顺序,这些操作可能非常消耗资源,不适于许多使用多播的应用场景。(同时多播不知道发出的包是不是已经到达,这个也导致不能使用TCP)。

     最后给出一个实例:https://github.com/ljheee/Multicast_UDP

    展开全文
  • 深入理解TCP、UDP协议及两者的区别

    万次阅读 多人点赞 2018-11-14 13:03:24
    所谓的字节流服务(Byte Stream Service) 是指, 为了方便传输, 将大块数据分割成以报文段(segment) 为单位的数据包进行管理。 而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 即TCP 协议为了更容易...

    GitHub:https://github.com/JDawnF

    一、TCP协议:

           位于传输层, 提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service) 是指, 为了方便传输, 将大块数据分割成以报文段(segment) 为单位的数据包进行管理。 而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 即TCP 协议为了更容易传送大数据才把数据分割, 而且 TCP 协议能够确认数据最终是否送达到对方。所以,TCP连接相当于两根管道(一个用于服务器到客户端,一个用于客户端到服务器),管道里面数据传输是通过字节码传输,传输是有序的,每个字节都是一个一个来传输。

    (1)、三次握手:握手过程中使用了 TCP 的标志(flag) —— SYN(synchronize) 和ACK(acknowledgement) 。

    • 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
    • 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
    • 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,完成三次握手。

    若在握手过程中某个阶段莫名中断, TCP 协议会再次以相同的顺序发送相同的数据包。
     (2)、四次挥手:由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。先进行关闭的一方将执行主动关闭,而另一方被动关闭。

    • 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
    • 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
    • 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
    • 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

    三次握手和四次挥手:在TCP连接中,服务器端的SYN和ACK向客户端发送是一次性发送的,而在断开连接的过程中, B端向A
    端发送的ACK和FIN是分两次发送的。因为在B端接收到A端的FIN后, B端可能还有数据要传输,所以先发送ACK,等B端处理完自己的事情后就可以发送FIN断开连接了。

    (3)、深入理解TCP连接: 

    由于TCP是全双工的,因此在每一个方向都必须单独关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这个方向上没有数据流动,一个TCP连接在接收到一个FIN后仍能发送数据。 首先进行关
    闭的一方将执行主动关闭,而另一方执行被动关闭。
    TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。简单来说,是“先关读,再关写” ,总共需要4个阶段。以客户机发起关闭连接为例:1.服务器读通道关闭;2.客户端写通道关闭;3.客户端读通道关闭;4.服务器写通道关闭。
    关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段,直到接收到对方发送的FIN,且对方收到了接收确认的ACK之后,双方的数据通信完全结束,过程中每次都需要返回确认数据段ACK。

    (4)、TCP使用滑动窗口机制来进行流量控制。
    建立连接时,各端分配一个缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端。接收方发送的确认消息中包含了自己剩余的缓冲区尺寸。剩余缓冲区空间的数量叫做窗口。其实就是建立连接的双虎互相知道彼此剩余的缓冲区大小。

     (5)、拥塞控制

    拥塞控制:防止过多的数据注入到网路中,这样可以使网络中的路由器或链路不至于阻塞。拥塞控制是一个全局性的过程,和流量控制不同,流量控制是点对点的控制。

    1、慢开始:发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态的变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接收方的接收能力,发送窗口可能小于拥塞窗口。思路就是:不要一开始就发送大量的数据,先试探一下网络的拥塞程度,也就是说由小到大增加拥塞窗口的大小。

    为了防止cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。 ssthresh的方法如下:
    当cwnd < ssthresh时,开始使用慢开始算法;当cwnd > ssthresh, 改用拥塞避免算法;当cwnd = ssthresh时,慢开始与拥塞算法任意。
     2.拥塞避免:

    拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按照线性规律缓慢增长。无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为⽆法判定,所以都当作拥塞处理),就把慢开始门限设置为出现拥塞时的发送窗口的一半,然后把拥塞窗口设置为1,执行慢开始算法:

    此外,还有快速重传和快速恢复,停止-等待协议,回退N帧协议,选择重传协议等。 

    二、UDP协议:

    无连接协议,也称透明协议,也位于传输层。

    两者区别:

    1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。
    2) TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输。
    3) TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。
    4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。


    三、长连接和短连接

           HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。

    在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

    而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:

    Connection:keep-alive
    

    在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

    HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

    https://www.cnblogs.com/gotodsp/p/6366163.html

    此外,如果想更进一步学习网络相关的知识,可以参照:https://blog.csdn.net/striveb/article/details/84062700

     

    觉得有收获的,可以来一波赞赏!

    展开全文
  • QT UDP组播的实现

    热门讨论 2014-04-18 16:53:31
    QT实现UDP的接收和发送,包括组播的加入和相关操作
  • Java UDP 组播实现

    千次阅读 2016-06-27 10:34:43
    UDP(User Datagram Protocol,用户数据报协议)是传输层的另一种协议,它比TCP具有更快的传输速度,但是不可靠。 UDP发送的数据单元称为UDP数据报,当网络传输UDP数据报时,无法保证数据报一定到达目的地,也无法保证...

    源代码: https://git.oschina.net/chesian/Chat-UDP


    UDP(User Datagram Protocol,用户数据报协议)是传输层的另一种协议,它比TCP具有更快传输速度,但是不可靠

    UDP发送的数据单元称为UDP数据报,当网络传输UDP数据报时,无法保证数据报一定到达目的地,也无法保证各个数据报按发送的顺序到达目的地

    当发送方先发送包含字符串“hello“的数据报,再发送包含字符串”everyone“的数据报,接收方有可能先接收到字符串”everyone“,再接收到字符串”hello“;也有可能什么数据也没有接收到,因为发送方发送的数据有可能在传输途中都丢失了。

    在Java中,java.net.DatagramSocket负责接收和发送UDP数据报,java.net.DatagrampPacket表示UDP数据报。每个DatagramSocket与一个本地地址(包括本地主机的IP地址和本地UDP端口)绑定,每个DatagramSocket可以把UDP数据报发送给任意一个远程DatagaramSocket,也可以接收来自任意一个远程DatagramSocket的UDP数据报。在UDP数据报中包含了目的地址的信息,DatagramSocket更具该信息把数据报发送到目的地。

    UDP协议是无连接的协议,客户端的DatagramSocket与服务器端的DatagramSocket不存在一一对应关系,两者无需建立连接,就能交换数据报。

    DatagramSocket提供了接收和发送数据报的方法

    public void receive(DatagramPacket dst)throws IOException  //接收数据报

    public void send(DatagramPacket src)throws IOException  //发送数据报。

    DtatgamPacket表示数据报,它的构造方法可以分为两类:

    一类构造方法创建的DatagamPacket对象用来接收数据

    还有一类构造方法创建的DatagramPacket对象用来发送数据

    两类构造方法的主要区别是,用来发送数据的构造方法需要设定数据报到达的目的地址,而用于接收矩的构造方法无需设定地址。

    n 用于接收数据的构造方法包括:

    public DatagramPacket(byte[] data,int length)

    public DatagramPacket(byte[] data,int offset, int length)

    n 以上data参数用来存放接收到的数据,参数length指定要接收的字节数,参数offset指定在data中存放数据的起始位置,即data[offset]。如果没有设定参数offset,那么起始位置为data[0]。

    n 用于发送数据的构造方法包括:

    n public DatagramPacket(byte[] data,int offset, int length,InetAddress address,int port)

    n public DatagramPacket(byte[] data,int offset,int length,SocketAddress address)

    n public DatagramPacket(byte[] data,int length,InetAddress address,int port)

    n public DatagramPacket(byte[] data,int length,SocketAddress address)

    n 以上data参数中存放了要发送的数据,参数length指定要发送的字节数,参数offset指定要发送的数据在data中的起始置,即data[offset]。如果没有设定参数offset,那么起始位置为data[0]。

    n 选择数据报大小的通用原则是:

    n 如果网络非常不可靠,如分组无线电网络,则要选择较小的数据报,以减少传输中遭破坏的可能性

    n 如果网络非常可靠,而且传输速度很快,就应当尽可能使用大的数据报。

    n 对于多数网络,8K是一个很好的折衷方案

    数据报中只能存放字节形式的数据。在发送方,需要把其他格式的数据转换为字节序列。可以利用byteArrayOutputStream和DataOutputStream来把其他格式的数据转换为字节序列。

    例如以下longToByte()方法把long型数据转换为字节序列,存放在一个字节数组中,再将其返回:

    public byte[] longToByte(long data) throws Exception {

          ByteOutputStream dos = new ByteArrayOutputStream();

       DataOutputStream dos = new DataOutputStream(dos);

       dos.writeLong(data);

    dos.close();

    return dao.toByteArray();

    }

    在接收方,需要把字节序列转换为原来格式的数据。可以利用ByteArrayInputSream和DataInputStream来把字节序列转换为原来格式的数据。

    public long byteToLong(byte[] data) throws Exception {

          ByteArrayInputStream bai = new ByteArrayInputStream(data);

          for (int i=0;i<8;i++) {

               result[i] = dis.readLong();

    }

    return result;

    }

    n 同一个DatagramPacket对象可以被重用,用来多次发送或接收数据。

    n DatagramSocket负责接收和发送数据报。

    n 每个DatagramSocket对象都会与一个本地端口绑定,在此端口监听发送过来的数据报。

    n 在客户程序中,一般由操作系统为DatagramSocket分配本地端口,这种端口也称为匿名端口;在服务器程序中,一般由程序显式的为DatagramSocket指定本地端口。

     

    n DatagramSocket的send()方法负责发送一个数据报,该方法的定义如下:

    public void send(DatagramPacket dp)throws IOException

    n 值得注意的是,UDP协议提供不可靠的传输,如果数据报没有到达目的地,send()方法不会抛出任何异常,因此发送方程序无法知道数据报是否被接收方接收到,除非双方通过应用层的特定协议来确保接收方未收到数据报时,发送方能重发数据报。

    n DatagramSocket的receive()方法负责接收一个数据报,该方法的定义如下:

    public void receive(DatagramPacket datagramPacket)throws IOException

    n 此方法从网络上接收一个数据报。如果网络上没有数据报,执行该方法的线程会进入阻塞状态,直到收到数据报为止。

    管理连接

    n 两个TCP Socket之间存在固定的连接关系,而一个DatagramSocket可以与其他任意一个DatagramSocket交换数据报。

    n 在某些场合,一个DatagramSocket可能只希望与固定的另一个远程DatagramSocket通信。例如NFS客户只接收来自与之通信的服务器的数据报,再例如在网络游戏中,一个游戏网家只接收他的游戏搭档的数据报。

    n 从JDK1.2开始,DatagramSocket添加了一些方法,利用这些方法,可以使一个DatagramSocket只能与另一个固定的DatagramSocket交换数据报:

    n (1)public void connect(InetAddress host,int port)

    n (2)public void disconnect()

    n (3)public int getPort()

    n (4)public InetAddress getInetAddress()

    n (5)publicSocketAddress getRemoteSocketAddress()

     

    网络数据传播按照接收者的数量,可分为以下三种方式:

    单播: 提供点对点的通信

    广播: 发送者每次发送的数据可以被广播范围内的所有接受者接收。

    组播:发送者每次发送的数据可以被小组内的所有接收者接收。

     

    组播组内的所有主机共享同一个地址,这种地址称为组播地址,组播地址是范围在224.0.0.0~239.255.255.255之间的IP地址。此范围内的所有地址的前4个二进制为都是“1110“。组播地址也被称为D类IP地址,与其它的A类、B类和C类地址相区别。组播组是开放的,主机可以在任何时候进入或离开组。

    IANA(Internet Assigned Numbers Authority)组织负责分发永久组播地址。

    组播与单播UDP的区别在于,前者必须考虑TTL(Time to live)值,它用IP数据包的头部的一个字节表示。

    TTL通过限制IP包被丢弃前通过的路由器数目,来决定IP包的生存时间。IP包每通过一个路由器TTL就减一,当TTL变为0,这个包就被丢弃

    TTL的一个作用是防止配置有误的路由器把包在路由器之间无限的来回传递,还有一个作用是限制组播的地理范围

    java.net.MulticastSocket具有组播的功能,它是DatagramSocket的子类:

    public class MulitcastSocket extends DatagramSocket和DataSocket一样,MulticastSocket业余DatagramPacket搭配使用,DatagramPacket用来接收和发送的组播数据报。

    如果要接收组播数据报,只需要创建一个MulticastSocket,把它加入到组播组,就能接收发送到该组的组播数据

    发送组播数据报与发送单播数据报非常相似,只需创建一个MulticastSocket,无需把它加入组播组(当然也可以把它加入到组播组),就能向一个组播组发送数据

     

    与组播通信

    MulticastSocket支持以下四种操作:

    1)         加入到组播组:joinGroup方法

    2)         想组中成员发送数据报:send()方法

    3)         接收发送到组播组的数据报:receive()方法

    4)         离开组播组: leaveGroup()方法

    5)         MuliticastSocket类提供了两组用于设置和读取网络接口的方法。MuliticastSocket只会对该网络接口中的组收发组播数据:

    //第1组方法

    public void setInterface(InetAddress address)throws SocketException

    public InetAddress getInterface()throws SocketException

    //第2组方法

    public void setNetworkInterface(NetworkInterface interface)throws SocketException

    public NetworkInterface getNetworkInterface() throws SocketException

    展开全文
  • UDP

    2015-12-10 21:44:19
    ...UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconn

    http://baike.baidu.com/link?url=uD-TWf5J-JFZzr1QqA1zaTV_aM6cawxJbxE2EAkzMcx9KkPSIzXQ2OuKVdYODDOcD2uQB_GLhBT_lJwaFO2ODq


    UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。
    UDP协议全称是用户数据报协议[1]  ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。
    与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
    中文名
    用户数据报协议
    外文名
    User Datagram Protocol
    特    点
    不可靠快速传输
    简    称
    UDP

    协议编辑

    UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成[2]  ,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序
    UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。常用的UDP端口号有:
    应用协议 端口号
    DNS 53
    TFTP 69
    SNMP 161
    UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
    UDP在IP报文中的位置如图所示。

    使用编辑

    在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。

    报头编辑

    UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:
    UDPUDP
    端口号
    目标端口号
    数据报长度
    校验值
    UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据包通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。
    数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。
    UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。
    许多链路层协议都提供错误检查,包括流行的以太网协议,也许你想知道为什么UDP也要提供检查和校验。其原因是链路层以下的协议在源端和终端之间的某些通道可能不提供错误检测。虽然UDP提供有错误检测,但检测到错误时,UDP不做错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。
    UDP Helper是实现对指定UDP端口广播报文的中继转发,即将指定UDP端口的广播报文转换为单播报文发送给指定的服务器,起到中继的作用.

    功能编辑

    为了在给定的主机上能识别多个目的地址,同时允许多个应用程序在同一台主机上工作并能独立地进行数据包的发送和接收,设计用户数据报协议UDP。
    使用UDP协议包括:TFTPSNMP、NFS、DNS、BOOTP
      UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提供报文到达确认、排序、及流量控制等功能。

    报文格式编辑

    每个UDP报文分UDP报头和UDP数据区两部分。报头由四个16位长(2字节)字段组成,分别说明该报文的源端口、目的端口、报文长度以及校验值。

    分层封装编辑

    在TCP/IP协议层次模型中,UDP位于IP层之上。应用程序访问UDP层然后使用IP层传送数据报。IP层的报头指明了源主机和目的主机地址,而UDP层的报头指明了主机上的源端口和目的端口。

    分解操作编辑

    UDP的复用、分解与端口
    UDP软件应用程序之间的复用与分解都要通过端口机制来实现。每个应用程序在发送数据报之前必须与操作系统协商以获得协议端口和相应的端口号。
      UDP分解操作:从IP层接收了数据报之后,根据UDP的目的端口号进行分解操作。
      UDP端口号指定有两种方式:由管理机构指定端口和动态绑定的方式。

    配置命令编辑

    1.1.1 display udp-helper server
    【命令】
    display udp-helper server[interfaceinterface-type interface-number]
    【视图】
    任意视图
    【缺省级别】
    2:系统级
    【参数】
    interfaceinterface-type interface-number:显示指定接口的UDP中继转发相关信息。interface-type interface-number为接口类型和接口编号。
    【描述】
    display udp-helper server命令用来显示UDP中继转发的相关信息。
    如果不选择参数,则显示所有接口的UDP中继转发相关信息。
    【举例】
    # 显示VLAN接口1的UDP中继转发相关信息。
    <Sysname> display udp-helper server interface vlan-interface 1
    Interface name Server address Packets sent
    Vlan-interface1 192.1.1.2 0
    以上显示信息表示VLAN接口1对应的目的服务器的IP地址为192.1.1.2,中继转发到该目的服务器的报文数为0。
    1.1.2 reset udp-helper packet
    【命令】
    reset udp-helper packet
    【视图】
    用户视图
    【缺省级别】
    2:系统级
    【参数】
    【描述】
    reset udp-helper packet命令用来清除UDP中继转发的报文统计数目。
    【举例】
    # 清除UDP中继转发的报文统计数目。
    <Sysname> reset udp-helper packet
    1.1.3 udp-helper enable
    【命令】
    udp-helper enable
    undo udp-helper enable
    【视图】
    系统视图
    【缺省级别】
    2:系统级
    【参数】
    【描述】
    udp-helper enable命令用来使能UDP Helper功能,设备会将指定UDP端口的广播报文转换为单播报文发送给指定的目的服务器,起到中继的作用。undo udp-helper enable命令用来关闭UDP Helper功能。
    缺省情况下,UDP Helper功能处于关闭状态。
    【举例】
    # 使能UDP Helper功能。
    <Sysname> system-view
    [Sysname] udp-helper enable
    1.1.4 udp-helper port
    【命令】
    udp-helper port{port-number|dns|netbios-ds|netbios-ns|tacacs|tftp|time}
    undo udp-helper port{port-number|dns|netbios-ds|netbios-ns|tacacs|tftp|time}
    【视图】
    系统视图
    【缺省级别】
    2:系统级
    【参数】
    port-number:需要中继转发的UDP端口号,取值范围为1~65535(不支持67和68)。
    dns:对DNS的数据报文进行中继转发,对应的UDP端口号为53。
    netbios-ds:对NetBIOS数据报服务的数据报文进行中继转发,对应的UDP端口号为138。
    netbios-ns:对NetBIOS名字服务的数据报文进行中继转发,对应的UDP端口号为137。
    tacacs:对终端访问控制器访问控制系统的数据报文进行中继转发,对应的UDP端口号为49。
    tftp:对简单文件传输协议的数据报文进行中继转发,对应的UDP端口号为69。
    time:对时间服务的数据报文进行中继转发,对应的UDP端口号为37。
    【描述】
    udp-helper port命令用来配置需要中继转发的UDP端口。undo udp-helper port命令用来取消对需要中继转发的UDP端口的配置。
    缺省情况下,没有配置中继转发的UDP端口。
    关闭UDP Helper功能后,所有已配置的UDP端口都被取消。
    【举例】
    # 配置对目的UDP端口号为100的广播报文进行中继转发。
    <Sysname> system-view
    [Sysname] udp-helper port 100
    1.1.5 udp-helper server
    【命令】
    udp-helper serverip-address
    undo udp-helper server[ip-address]
    【视图】
    三层以太网接口视图/VLAN接口视图
    【缺省级别】
    2:系统级
    【参数】
    ip-address:目的服务器的IP地址,为点分十进制形式。
    【描述】
    udp-helper server命令用来配置中继转发的目的服务器。undo udp-helper server命令用来删除中继转发的目的服务器。
    缺省情况下,没有配置中继转发的目的服务器。
    目前,一个接口上最多可以配置20个中继转发的目的服务器。
    需要注意的是,undo udp-helper server命令后不加参数时,将会删除该接口下配置的所有目的服务器。
    相关配置可参考命令display udp-helper server[3] 

    特性编辑

    (1) UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当
    UDPUDP
    它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
    (2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
    (3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
    (4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
    (5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。
    (6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
    虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、在屏幕上显示航空信息等等。UDP也用在路由信息协议RIP(Routing Information Protocol)中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。UDP广泛用在多媒体应用中,例如,Progressive Networks公司开发的RealAudio软件,它是在因特网上把预先录制的或者现场音乐实时传送给客户机的一种软件,该软件使用的RealAudio audio-on-demand protocol协议就是运行在UDP之上的协议,大多数因特网电话软件产品也都运行在UDP之上。

    对比编辑

    UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。
    UDPUDP
    TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议
    相对于TCP协议,UDP协议的另外一个不同之处在于如何接收突发性的多个数据报。不同于TCP,UDP并不能确保数据的发送和接收顺序。例如,一个位于客户端的应用程序向服务器发出了以下4个数据报
    D1
    D22
    D333
    D4444
    但是UDP有可能按照以下顺序将所接收的数据提交到服务端的应用:
    D333
    D1
    D4444
    D22
    事实上,UDP协议的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才有可能发生。

    应用编辑

    既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。
    关于UDP协议的最早规范是RFC768,1980年发布。尽管时间已经很长,但是UDP协议仍然继续在主流应用中发挥着作用。包括视频电话会议系统在内的许多应用都证明了UDP协议的存在价值。因为相对于可靠性来说,这些应用更加注重实际性能,所以为了获得更好的使用效果(例如,更高的画面帧刷新速率)往往可以牺牲一定的可靠性(例如,画面质量)。这就是UDP和TCP两种协议的权衡之处。根据不同的环境和特点,两种传输协议都将在今后的网络世界中发挥更加重要的作用。

    程序设计编辑

    UDP Server程序

    编写程序

    (1)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。
    (2)初始化sockaddr_in结构的变量,并赋值。sockaddr_in结构定义:
    struct sockaddr_in {
    uint8_t sin_len ;
    sa_family_t sin_family;
    in_port_t sin_port ;
    structin_addrsin_addr;
    char sin_zero[8];
    };
    这里使用“8888”作为服务程序的端口,使用“INADDR_ANY”作为绑定的IP地址即任何主机上的地址。
    (3)使用bind()把上面的socket和定义的IP地址和端口绑定。这里检查bind()是否执行成功,如果有错误就退出。这样可以防止服务程序重复运行的问题。
    (4)进入无限循环程序,使用recvfrom()进入等待状态,直到接收到客户程序发送的数据,就处理收到的数据,并向客户程序发送反馈。这里是直接把收到的数据发回给客户程序。

    程序内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include<sys/socket.h>
    #include<unistd.h>
    #include<string.h>
    #include<stdio.h>
    #include<arpa/inet.h>
    #include<stdlib.h>
    #defineMAXLINE80
    #defineSERV_PORT8888
     
    voiddo_echo(intsockfd,structsockaddr*pcliaddr,socklen_tclilen)
    {
    intn;
    socklen_tlen;
    charmesg[MAXLINE];
    for(;;)
    {
    len=clilen;
    /*waitingforreceivedata*/
    n=recvfrom(sockfd,mesg,MAXLINE,0,pcliaddr,&len);
    /*sentdatabacktoclient*/
    sendto(sockfd,mesg,n,0,pcliaddr,len);
    }
    }
    intmain(intargc,char*argv[])
    {
    intsockfd;
    structsockaddr_inservaddr,cliaddr;
    sockfd=socket(AF_INET,SOCK_DGRAM,0);/*createasocket*/
    /*initservaddr*/
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    servaddr.sin_port=htons(SERV_PORT);
    /*bindaddressandporttosocket*/
    if(bind(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))==-1)
    {
    perror("binderror");
    exit(1);
    }
    do_echo(sockfd,(structsockaddr*)&cliaddr,sizeof(cliaddr));
    return0;
    }
    UDP Client程序
    1、编写UDP Client程序的步骤
    (1)初始化sockaddr_in结构的变量,并赋值。这里使用“8888”作为连接的服务程序的端口,从命令行参数读取IP地址,并且判断IP地址是否符合要求。
    (2)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。
    (3)使用connect()来建立与服务程序的连接。与TCP协议不同,UDP的connect()并没有与服务程序三次握手。上面说了UDP是非连接的,实际上也可以是连接的。使用连接的UDP,kernel可以直接返回错误信息给用户程序,从而避免由于没有接收到数据而导致调用recvfrom()一直等待下去,看上去好像客户程序没有反应一样。
    (4)向服务程序发送数据,因为使用连接的UDP,所以使用write()来替代sendto()。这里的数据直接从标准输入读取用户输入。
    (5)接收服务程序发回的数据,同样使用read()来替代recvfrom()。
    (6)处理接收到的数据,这里是直接输出到标准输出上。
    udpclient.c程序内容
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include<sys/socket.h>
    #include<unistd.h>
    #include<string.h>
    #include<stdio.h>
    #include<arpa/inet.h>
    #include<stdlib.h>
    #defineMAXLINE80
    #defineSERV_PORT8888
     
    voiddo_cli(FILE*fp,intsockfd,structsockaddr*pservaddr,socklen_tservlen)
    {
    intn;
    charsendline[MAXLINE],recvline[MAXLINE+1];
    /*connecttoserver*/
    if(connect(sockfd,(structsockaddr*)pservaddr,servlen)==-1)
    {
    perror("connecterror");
    exit(1);
    }
    while(fgets(sendline,MAXLINE,fp)!=NULL)
    {
    /*readalineandsendtoserver*/
    write(sockfd,sendline,strlen(sendline));
    /*receivedatafromserver*/
    n=read(sockfd,recvline,MAXLINE);
    if(n==-1)
    {
    perror("readerror");
    exit(1);
    }
    recvline[n]=0;/*terminatestring*/
    fputs(recvline,stdout);
    }
    }
    intmain(intargc,char**argv)
    {
    intsockfd;
    structsockaddr_inservaddr;
    /*checkargs*/
    if(argc!=2)
    {
    printf("usage:udpclient\n");
    exit(1);
    }
    /*initservaddr*/
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(SERV_PORT);
    if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)
    {
    printf("[%s]isnotavalidIPaddress\n",argv[1]);
    exit(1);
    }
    sockfd=socket(AF_INET,SOCK_DGRAM,0);
    do_cli(stdin,sockfd,(structsockaddr*)&servaddr,sizeof(servaddr));
    return0;
    }

    例子程序

    1、编译例子程序
    使用如下命令来编译例子程序:
    gcc -Wall -o udpserv udpserv.c
    gcc -Wall -o udpclient udpclient.c
    编译完成生成了udpserv和udpclient两个可执行程序。
    2、运行UDP Server程序
    执行./udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
    tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
    tcp 0 0127.0.0.1:631 0.0.0.0:* LISTEN
    udp 0 0 0.0.0.0:32768 0.0.0.0:*
    udp 0 0 0.0.0.0:8888 0.0.0.0:*
    udp 0 0 0.0.0.0:111 0.0.0.0:*
    udp 0 0 0.0.0.0:882 0.0.0.0:*
    可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。
    如果这时再执行./udpserv &命令,就会看到如下信息:
    bind error: Address already in use
    说明已经有一个服务程序在运行了。

    运行程序

    执行./udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:
    Hello,World!
    Hello,World!
    this is a test
    this is a test
    ^d
    输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。
    如果服务程序没有启动,而执行客户程序,就会看到如下信息:
    $ ./udpclient 127.0.0.1
    test
    read error: Connection refused
    说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果使用tcpdump程序来抓包,会发现收到的是ICMP的错误信息。

    UDP的分组结构编辑

    偏移 字节 0 1 2 3                                                        
    字节 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    0 0 来源连接端口 目的连接端口
    4 32 报长 检查码


    展开全文
  • UDP组播调试(使用TCP&UDP调试工具)

    万次阅读 2018-12-09 22:29:32
    如何使用调试工具进行UDP组播调试 一、下载UDP&amp;TCP调试工具 二、双击打开调试工具并建立端口 2.1 创建组播客户端1  类型:UDP(组播模式);目标IP:225.0.0.20;端口:60000;本机端口制定:60002  ...
  • LabVIEW使用UDP组播发送数据

    千次阅读 2016-12-22 12:22:02
    最近在架构下位机程序,为了满足其他用户程序随时能使用下位机所采集的数据, 考虑到数据接口的通用性和懒人(少编程)的原则,增加了UDP的通信方式,由于网络中还有其他设备也使用了UDP通信,为避免网络带宽的...
  • UDP 组播---基本概念

    万次阅读 2017-06-09 18:24:32
       本文章已收录于: ...先来了解下UDP ...UDP 是UserDatagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输
  • 关于UDP 中的组播问题

    千次阅读 2014-03-11 15:34:33
    根据查询的资料来看,UDP广播只能在内网(同一网段)有效,而组播可以较好实现跨网段群发数据。 简介  IP网络传输方式共分为单播,组播(多播),广播三种。平时我们最常用的一对一的网络传输方式...
  • TCP 和 UDP 的区别

    万次阅读 多人点赞 2018-08-04 21:57:42
    UDP TCP TCP 的三次握手 TCP 四次挥手 累计确认 顺序问题和丢包问题 流量控制的问题 拥塞控制的问题 总结及面试问题 前言 前端的面试中经常问的 TCP 和 UDP 的区别,网上也有好多内容,比如 TCP 和 ...
  • UDP组播服务器

    千次阅读 2018-08-19 18:27:29
    组播传输数据发送者(源数据)将同一数据发送到多个接受者(组播组成员)。无论有多少个接受者,在整个网络链路上,只有一份该数据(在特殊场合,可以节省带宽,减少主干网络阻塞)。 组播报文的目的地址使用的是D类IP...
  • 局域网发现之UDP组播

    万次阅读 2017-02-15 14:55:42
    局域网发现 udp单播、组播、广播
  • 系列文章: Android 使用socket.io 实现实时通信 在上章中,我们学习了 socket 的基本使用。...与 TCP 不同,UDP 是一个面向数据包的传输层协议,进程的每一个输出操作都正好产生一个UDP数据报,并组装成一份待...
  • UDP实现可靠数据传输

    万次阅读 2012-05-11 16:37:15
    UDP没有Delievery Garuantee,也没有顺序保证,所以如果你要求你的数据发送与接受既要高效,又要保证有序,收包确认等,你就需要在UDP协议上...下面分别介绍三种使用UDP进行可靠数据传输的协议 RUDP RTP UDT R
  • java UDP协议和组播实现

    千次阅读 2014-06-25 11:38:41
    java UDP协议和组播实现 UDP(User Datagram Protocol,用户数据报协议)是传输层的另一种协议,它比TCP具有更快的传输速度,但是不可靠。 UDP发送的数据单元称为UDP数据报,当网络传输UDP数据报时,无法保证数据报...
  • windows下UDP组播

    千次阅读 2018-08-12 18:19:57
    最近研究下UDP组播,首先上网看看各种组播的含义,以下是总结的:  多播,也称为“组播”,将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此...
  • 计算机网络协议(三)——UDP、TCP、Socket

    万次阅读 多人点赞 2019-09-04 08:39:53
    底层网络知识详解:最重要的传输层概述一、UDP协议二、TCP协议2.1 TCP的三次握手 概述 这个专栏的计算机网络协议,我是在极客时间上学习 已经有三万多人购买的刘超老师的趣谈网络协议专栏,讲的特别好,像看小说...
  • UDP协议

    万次阅读 多人点赞 2017-06-21 12:31:05
    UDP协议UDP协议简介UDP(User Datagram Protocol),用户数据报协议,是OSI(Open System Interconnection,...UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据UDP传输的可靠性由应用层
  • Android设备一对多录屏直播--(UDP组播连接,Tcp传输)

    千次阅读 热门讨论 2018-09-17 11:12:06
    近期需要学习流媒体知识,做一个Android设备相互投屏...这位博主介绍了Android之间互相的录屏直播 –点对点传输(tcp长连接发送h264),详细介绍了h264的数据结构,对于刚学习流媒体的人来说是很好的福利,不多说...
  • UDP通讯接收案例(组播方式

    千次阅读 2016-12-15 15:24:08
    1.通讯类: namespace AddMyUtility {  public class UDPClientClass  {  public UDPClientClass(string groupIP, int Port, int timeOut)  {  _UdpClient = new UdpClient(Port)
  • QT UDP数据传输

    千次阅读 2019-01-18 14:41:08
    (一)计算机网络 通过某种方式将多台计算机进行连接,实现多台计算机彼此之间的互联以及数据的交换。即在不同的计算机上编写一些实现了网络连接的程序,这些程序可以实现位于...在进行数据传输时要求发送的数据...
  • udp

    2010-12-10 10:30:00
    udp是一个简单的、面向数据报的无连接的协议,提供了快速但是不一定可靠的传输服务。 与tcp一样,UDP也是构建于底层ip协议之上的传输层协议。与tcp相比,UDP有如下一些特点: 首先,UDP协议基于无...
  • UDP协议组播

    2009-12-04 17:00:00
    利用UDP组播能在intarnet,internet上也数据报的形式进行数据的组播(在internet上进行组播,要求路由器支持IGMP(internet网关管理协议,这个协议是在IP出现以后,为了支持组播而出现的)).相对于极度消耗网络带宽的广播来...
  • 于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限。 部分代码如下 1 package com.hsocket.Udp; 2 3 import java.io.IOException; 4 import java.net.Datag...
  • 终于懂了TCP和UDP协议区别

    万次阅读 多人点赞 2020-03-26 12:03:28
    终于懂了TCP和UDP协议区别
  • TCP和UDP传输方式对比

    千次阅读 2019-05-09 10:57:45
    UDP (User Datagram Protocol )用户数据报协议,是一种面向无连接的传输方式,不提供复杂的控制机制, 如果传输过程中出现丢包, UDP 也不负责重发. 甚至当出现包到达顺序乱掉时候也没有纠正的功能. 由于 UDP 面向无...

空空如也

1 2 3 4 5 ... 20
收藏数 423,505
精华内容 169,402
关键字:

udp组播方式进行数据传输时的要求