精华内容
下载资源
问答
  • 基于UDP的数据传输协议是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差,控制UDP的流量和拥塞控制如何解决,请参考下
  • UDP传输协议

    千次阅读 2016-01-19 17:55:46
    UDP传输过程及代码实现1、UDP协议介绍UDP协议在IP协议上增加了复用、分用和差错检测功能。UDP的特点: A)是无连接的。相比于TCP协议,UDP协议在传送数据前不需要建立连接,当然也就没有释放连接。 B)是尽最大...

    UDP传输过程及代码实现

    1、UDP协议介绍

    UDP协议在IP协议上增加了复用、分用和差错检测功能。UDP的特点:
    A)是无连接的。相比于TCP协议,UDP协议在传送数据前不需要建立连接,当然也就没有释放连接。
    B)是尽最大努力交付的。也就是说UDP协议无法保证数据能够准确的交付到目的主机。也不需要对接收到的UDP报文进行确认。
    C)是面向报文的。也就是说UDP协议将应用层传输下来的数据封装在一个UDP包中,不进行拆分或合并。因此,运输层在收到对方的UDP包后,会去掉首部后,将数据原封不动的交给应用进程。
    D)没有拥塞控制。因此UDP协议的发送速率不送网络的拥塞度影响。
    E)UDP支持一对一、一对多、多对一和多对多的交互通信。
    F)UDP的头部占用较小,只占用8个字节。

    2、UDP数据报文结构


    这里写图片描述
    IP报文段首部
    这里写图片描述
    UDP报文段首部

    16位UDP长度:包含头部和数据部分 16位UDP检验和:覆盖UDP首部和UDP数据
    UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的,伪首部包含IP首部中的一些字段。
    TCP有超时重传机制,UDP没有。

    3、Java代码实现

    发送过程:
    (引用自:http://blog.csdn.net/wintys/article/details/3525643)
    这里写图片描述
    这里写图片描述

    /**
     * 服务端
     *
     */
    class UDPServer{
        public static void main(String[] args)throws IOException{
            //定义udp数据套接字
            DatagramSocket  server = new DatagramSocket(5050);
            //定义数据接收数组缓冲区
            byte[] recvBuf = new byte[100];
            //定义接收数据包
            DatagramPacket recvPacket 
                = new DatagramPacket(recvBuf , recvBuf.length);
            //接收数据,并放到DatagramPacket
            server.receive(recvPacket);
            //获取实体数据
            String recvStr = new String(recvPacket.getData() , 0 , recvPacket.getLength());
            System.out.println("Recv-收到:" + recvStr);
            /*定义数据发送*/
            //通过接收到的数据包获取发送方的端口
            int port = recvPacket.getPort();
            //通过接收到的数据包获取发送方的ip地址
            InetAddress addr = recvPacket.getAddress();
            //定义发送内容
            String sendStr = "Recv Msg";
            //定义发送的数组
            byte[] sendBuf;
            sendBuf = sendStr.getBytes();
            //封装需要发送的udp数据包
            DatagramPacket sendPacket 
                = new DatagramPacket(sendBuf , sendBuf.length , addr , port );
            //发送数据包
            server.send(sendPacket);
            //关闭套接字
            server.close();
        }
    }
    /**
     * 发送端
     *
     */
    class UDPClient{
        public static void main(String[] args)throws IOException{
            //创建接收发送socket套接字
            DatagramSocket client = new DatagramSocket();
            //定义发送内容
            String sendStr = "Send Msg";
            byte[] sendBuf;
            sendBuf = sendStr.getBytes();
            InetAddress addr = InetAddress.getByName("127.0.0.1");
            int port = 5050;
            DatagramPacket sendPacket 
                = new DatagramPacket(sendBuf ,sendBuf.length , addr , port);
            //发送
            client.send(sendPacket);
            /*数据接收*/
            //定义数据接收缓冲区
            byte[] recvBuf = new byte[100];
            //定义用于接收数据的数据包
            DatagramPacket recvPacket
                = new DatagramPacket(recvBuf , recvBuf.length);
            //接收数据
            client.receive(recvPacket);
            //获取数据实体
            String recvStr = new String(recvPacket.getData() , 0 ,recvPacket.getLength());
            System.out.println("收到:" + recvStr);
            //关闭
            client.close();
        }
    }

    4、注意事项

    1、关于外网与内网通,两个内网通信信共享一个socket对象的问题
    2、关于net打洞的问题

    展开全文
  • 几种UDP网络库的整理Raknet,UDT,ENet,lidgren-network-gen3 http://blog.csdn.net/u014630768/article/details/34895367 UDT库 https://sourceforge.net/projects/udt/?source=directory C#包装:...

    几种UDP网络库的整理Raknet,UDT,ENet,lidgren-network-gen3

    http://blog.csdn.net/u014630768/article/details/34895367

    UDT库 https://sourceforge.net/projects/udt/?source=directory

        C#包装:https://github.com/dump247/udt-net

        

    • UDT协议是什么?是一种基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)。

    • UDT协议的主要作用是什么?UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。

    • 那么UDT与UDP的区别又是什么?UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。

    • UDT的使用场景是什么?由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。

      (以上问题的答案均摘自wikipedia)当然我今天也不是来当知识搬运工的,而是结合以上UDT协议的基本定义来深入到UDT协议内部去解析它。

       

      UDT协议的主要特性有哪些?

    • 基于UDP的应用层协议: 有基本网络知识的朋友都知道TCP和UDP的区别和使用场景,但是有没有一种协议能同时兼顾TCP协议的安全可靠和UDP协议的高效,那么UDT就是一种。

    • 面向连接的协议:面向连接意味着两个使用协议的应用在彼此交换数据之前必须先建立一个连接,当然UDT是逻辑上存在的连接通道。这种连接的维护是基于握手、Keep-alive(保活)以及关闭连接。

    • 可靠的协议:依靠包序号机制、接收者的ACK响应和丢包报告、ACK序号机制、重传机制(基于丢包报告和超时处理)来实现数据传输的可靠性。

    • 双工的协议:每个UDT实例包含发送端和接收端的信息。

    • 单播的数据流。

    • 新的拥塞算法,并且具有可扩展的拥塞控制框架:新的拥塞控制算法不同于基于窗口的TCP拥塞控制算法(慢启动和拥塞避免),是混合的基于窗口的、基于速率的拥塞控制算法。可扩展的拥塞控制框架开源的代码和拥塞控制的C++类架构,可支持开发者派生专用的拥塞控制算法。

    • 带宽估计:UDT使用对包(PP -- Packet pair)的机制来估计带宽值。即每16个包为一组,最后一个是对包,即发送方不用等到下一个发送周期内再发送。接收方接收到对包后对其到达时间进行记录,可结合上次记录的值计算出链路的带宽(计算的方法称为中值过滤法), 并在下次ACK中进行反馈。

       

    ★★★ENET库(photon的可靠udp) https://github.com/lsalzman/enet

    c#包装1:https://github.com/RainsSoft/enetcs

    c#包装2:https://github.com/RainsSoft/ENetSharp

    大家都知道UDP这个东西太不可靠了,存在着乱序,丢包,包重复等缺点,但它的速度快,包有界等优点,但在实际编程中要自己处理乱序啊之类的问题会发疯 的。也许大家说用TCP就得了,第一点TCP的速度比较慢,第二个TCP是一个数据流一样的东西,我们要传数据的话还得处理数据的分界问题,也挺麻烦的。

    针对这个问题,ENET这个库实现了一个性能介于TCP与UDP之间,完成可靠(不丢包,按序),保持数据的分界的优点。编程起来也挺方便的。

    下载地址:http://enet.bespin.org/SourceDistro.html

     

    RakNet库  https://github.com/OculusVR/RakNet

    c#包装:https://github.com/RainsSoft/RakNet-C-Sharp-binding-project

    RakNet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。

    RakNet有以下特点:

    l 高性能 在同一台计算机上,RakNet可以实现在两个程序之间每秒传输25,000条信息;

    l 容易使用 RakNet有在线用户手册,视频教程。每一个函数和类都有详细的讲解,每一个功能都有自己的例程;

    l 跨平台,当前RakNet支持Windows, Linux, Macs,可以建立在Visual Studio, GCC, Code,Blocks, DevCPP 和其它平台上。

    l 在线技术支持 RakNet有一个活跃的论坛,邮件列表,你只要给他们发信,他们可以在几小时之内回复你。

    l 安全的传输 RakNet在你的代码中自动使用SHA1, AES128, SYN,用RSA避免传输受到攻击

    l 音频传输 用Speex编码解码,8位的音频只需要每秒500字节传输。

    l 远程终端 用RakNet,你能远程管理你的程序,包括程序的设置,密码的管理和日志的管理。

    l 目录服务器 目录服务器允许服务器列举他们自己需要的客户端,并与他们连接。

    l Autopatcher Autopatcher系统将限制客户端传输到服务端的文件,这样是为了避免一些不合法的用户将一些不合法的文件传输到服务端。

    l 对象重载系统

    l 网络数据压缩 BitStream类允许压缩矢量,矩阵,四元数和在-1到1之间的实数。

    l 远程功能调用

    l 强健的通信层 可以保障信息按照不同的信道传输

     

    UDT基于一种基于带宽速率控制的拥塞控制算法进行设计,主要用在小数量的bulk源共享富裕带宽的情况下,最典型的例子就是建立在光纤广域网上的网格计算,而在ISP提供带宽有限的情况下运行却显得消耗资源并性能不足。甚至可能被防火墙,或ISP服务商判断为恶意带宽使用攻击。

    RakNet是为游戏应用而设计,对于实时性等游戏相关的网络需求有很好的支持,对于大批量数据传输却有点力所不及。raknet的缺点是不支持组播

     

     

    ★★★★ KCP - A Fast and Reliable ARQ Protocol

     

    源码: https://github.com/skywind3000/kcp

    c#包装:https://github.com/RainsSoft/kcp-csharp

    KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。

    整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。

    KCP协议比较

     

    如果网络从来不丢包,那么你直接用 TCP就行了,甚至直接裸UDP都没关系,但是网络因为丢包造成卡顿,特别是高峰时期丢包会上到10%的情况,移动设备上这个情况更糟糕。

    我自己评测过很多,asio_kcp 的作者做过比较详细的评测,在网络变糟糕的情况下,KCP的延迟比 libenet低三倍以上:

    worst network lag happen: asio: 10:51.21 291  295   269   268   231   195   249   230   225   204  enet: 10:51.21 1563   1520    1470    1482    1438    1454    1412    1637    1588    1540

    更详细的评测可以看这里:benchmark,感谢 asio_kcp 的作者 zhangyuan 详细对比了 UDT, libenet和 kcp,并给出结论如下:

    • ASIO-KCP has good performace in wifi and phone network(3G, 4G).
    • The kcp is the first choice for realtime pvp game.
    • The lag is less than 1 second when network lag happen. 3 times better than enet when lag happen.
    • The enet is a good choice if your game allow 2 second lag.
    • UDT is a bad idea. It always sink into badly situation of more than serval seconds lag. And the recovery is not expected.

    其他可以左右你选择的情况:

    • enet has the problem of lack of doc. And it has lots of functions that you may intrest.
    • kcp's doc is chinese.
    • Good thing is the function detail which is writen in code is english. And you can use asio_kcp which is a good wrap.
    • The kcp is a simple thing. You will write more code if you want more feature.
    • UDT has a perfect doc. UDT may has more bug than others as I feeling.

    我当年主要测试了 KCP和 TCP/UDT的比较,扫了一眼 libenet觉得协议实现中规中矩,缺乏很多现代传输协议的技术,所以并没有详细测试。而 asio-kcp的作者同时给出了KCP/enet/udt三者的详细比较,为犹豫选择的人提供了更多指引。

     

    The bench mark is for realtime pvp game. For example, the multiplayer first person shooting game.
    The requirement of realtime pvp game is packet is small and frequently. 
    It wants a minimal delay. And the worst delay should be not so worse. 
    The test client send 500 bytes in every 50 milliseconds. And the server send it back after receiving immediately.

    Three frameworks were tested,

    • UDT - UDP-based Data Transfer Protocol
    • kcp - A Fast and Reliable ARQ Protocol
    • enet - Reliable UDP networking library

     

    lidgren-network-gen3 

    https://github.com/RainsSoft/lidgren-network-gen3

    纯C#实现的UDP开源库,可用于游戏,支持NAT,内部使用的可靠ARQ协议算法没仔细去研究,不知道WIFI以及3G/4G下的表现怎么样,暂时没有测试数据

    UDT协议详解:http://blog.csdn.net/bytxl/article/details/44979669

    RakNet:http://blog.csdn.net/ww506772362/article/details/51076890
    ENET库(可靠UDP):http://blog.csdn.net/yuanchunsi/article/details/70244338

     

     

    其他参考:

    KCP同 UDT/ENET的性能比较
    http://blog.csdn.net/kxg99/article/details/50696336 
      

     

    KCP —— 快速可靠的网络传输协议
    https://www.oschina.net/p/kcp  
      

     

    http://blog.csdn.net/skywind/article/details/8804912  
      

    展开全文
  • 设计一种基于UDP的可靠传输协议,江苏大学网络工程的课程设计,基于C#实现的socket通信,带用户上下线的显示,有没有用户管理功能忘了。带两个独立的程序,一个客户端,一个服务端。基于C#的用户界面
  • UDP_TransferNT 测试UDP传输协议((从CJ-Vision TCP可能切换 )
  • ESP8266 UDP Publisher订阅服务器客户端 使用发布-订阅模型(如MQTT)但具有UDP传输协议的esp8266 wifi微控制器库。 执照 麻省理工学院
  • 可靠UDP传输协议总结

    千次阅读 2019-06-09 15:07:39
    可靠UDP传输协议总结 TCP/IP协议栈中,TCP和UDP属于传输层,负责实现数据的传输。其中TCP是面向连接的和基于单个字节流的、保证顺序的可靠传输协议,UDP是 无连接的、不可靠的、面向报文的协议。 在实际应用中,TCP...

    可靠UDP传输协议总结

    TCP/IP协议栈中,TCP和UDP属于传输层,负责实现数据的传输。其中TCP是面向连接的和基于单个字节流的、保证顺序的可靠传输协议,UDP是无连接的、不可靠的、面向报文的协议。

    在实际应用中,TCP由于简单可靠,被大部分应用层协议使用,特别是HTTP,所以占据了互联网流量的主要部分。由于TCP的广泛应用,并且是实现在操作系统中,在参数和算法调整上比较受限,难以进行一些激进的改进和定制。另外TCP的NAT穿越比较困难,一些P2P应用也只能使用UDP,所以就有了各种各样的可靠UDP协议。

    可靠传输的原理

    实现可靠传输一般有两种途径,一是基于ARQ(Automatic Repeat reQuest)的确认和重传机制,二是使用前向纠错(FEC)。

    FEC是纠删码在通信中的应用,一般在链路层用的比较多,特别是无线通信中(包括WiFi,移动通信、卫星通信等)。可靠UDP传输主要还是依靠重传机制,个别协议会用FEC作为辅助手段,所以本文中主要介绍重传相关的技术。

    ARQ

    ARQ包括停等式、回退N帧、选择重传等机制。由于停等式的效率太低,TCP和可靠UDP协议一般使用的是基于回退N帧机制和滑动窗口协议的连续式ARQ,TCP后来也引入了SACK,以提高性能。

    滑动窗口

    滑动窗口是一种流量控制技术,接收方可以通过反馈来指示发送方调节数据发送的速度。TCP中使用滑动窗口协议来控制发送的数据量,达到理想的传输速度。

    拥塞算法

    TCP早期没有拥塞控制,直到1986年由于拥塞导致网络瘫痪,所以拥塞控制被引入到TCP中。拥塞算法主要是计算和调整接收窗口、发送窗口、拥塞窗口的大小,从而控制传输速度,既充分利用带宽,又避免网络出现拥塞。

    最早的拥塞算法是Tahoe,后来的改进版有Reno、NewReno、BIC、CUBIC等。Linux在2.6.8之前使用的是Reno/NewReno,2.6.8到2.6.18之间使用BIC,2.6.19开始使用CUBIC。

    拥塞算法的核心机制有:

    • 慢启动

    在连接刚建立时接收窗口以指数方式增加,直到达到慢启动的阀值,或者是遇到丢包,开始进入拥塞回避阶段。

    • 拥塞回避

    在此阶段会使用AIMD(Additive Increase Multiplicative Decrease)方式调整窗口大小,通过线性增加和指数衰减,逐渐逼近和收敛到一个理想值,从而达到充分利用带宽但又不引起拥塞的状态。

    • 快重传

    发送方如果收到连续3次重复的ACK确认,就认为出现了丢包,而不需要等到重传计时器超时。这样可以更早的检测到丢包,提高算法效率。

    • 快恢复

    Tahoe检测到丢包后,会回到初始状态,然后进入慢启动阶段,导致传输效率太低。Reno对此作了改进,在检测到丢包后,直接进入拥塞回避阶段,将窗口大小调整为原来的一半,避免了慢启动的开销。

    拥塞算法分类

    TCP的拥塞算法有很多种,按照拥塞检测的机制,可以分为三类:

    • 基于丢包

    路由器和交换机在要转发的报文超过负载时会丢弃部分报文,所以丢包可以作为网络出现拥塞的一个标志,这也是TCP中主流的拥塞检测机制。从最早的Tahoe和改进版的Reno、NewReno、HSTCP、STCP、BIC、CUBIC等,都是基于丢包的,也是主流的拥塞检测机制。

    • 基于延时

    现在的路由器和交换机的缓存比较大,对于超出负载的报文会先缓存起来,而不是立即丢弃。直到负载超过缓存大小,才会丢弃报文。所以当网络出现拥塞时,并不是马上丢包,而有报文丢失时,网络的拥塞已经比较严重。这样,前面基于丢包的拥塞检测机制就不够准确,于是,就有了基于延时的检测算法。

    虽然这类算法可以更早的检测出拥塞,使得整个网络更有效率,但在跟基于丢包的算法竞争时,却由于过早的避让,导致性能较差,无法保证算法的公平性,所以影响了它们的应用。

    这类的算法有Vegas和Fast TCP,其中Fast TCP是一种商业方案,有专利保护,在一些单边加速的场景中有应用。Vegas由于公平性的问题,没有被广泛使用。

    Google新推出的BBR算法,虽然也可以归为基于延时类的,但跟传统算法有较大区别。传统算法通过AIMD来逼近理想传输速度,效率较低,而且受丢包和抖动的影响较大。BBR通过RTT和带宽乘积(BDP)来作为调整发送窗口的基础,避免了这些问题,从而提高性能和避免拥塞。

    • 显式拥塞通知(Explicit Congestion Notification)

    通过IP头中2个bit的ECN标识和TCP头中的ECN-Echo位,可以在各节点以及中间设备之间显式的传递拥塞信号,从而达到避免拥塞的目的。不过由于一些终端和中间设备(路由器、交换机、网关等)并不支持ECN,导致ECN并没有广泛应用。

    可靠UDP协议

    UDT(UDP-based Data Transfer Protocol)

    UDT的主要目的是支持高速广域网上的海量数据传输,所以除了在UDP之上实现类似TCP的协议和算法之外,UDT还对TCP的拥塞算法做了一些细节上的调整,包括Negative-ACK(NAK)、ACK to ACK(ACK2)、基于对数的动态AIMD等。不过UDT的重传效率较低,无效报文,实际效果并不理想。

    KCP

    KCP是一个很简单的ARQ的实现,包括选择重传和快重传等机制,对上层提供一个可靠的字节流。应用层可以使用多流复用的框架来实现对多个流的支持。另外,KCP增加了可配置启用的加密和FEC选项,FEC用的是Reed-Solomon纠删码,例如可以配置发送10%的冗余数据,来减少丢包时需要的重传,从而降低数据传输的延时。

    QUIC

    QUIC是Google实现的一种可靠UDP传输协议,并且已经被选择作为HTTP/3的基础。它的特点有:

    • 内建安全性,集成TLS
    • 连接建立过程和TLS协商过程合并,减少往返请求次数,提高连接速度
    • 集成多种拥塞算法,包括最新的BBR
    • 多流支持,每个流有独立的拥塞控制,避免单个流中的丢包阻塞其它所有流(Head-of-line Blocking问题),更好的支持类似HTTP/2中的乱序请求
    • 连接迁移:QUIC可以通过连接ID来唯一标识一个连接,当用户在有线、无线、移动网络之间切换时,可以保持上层连接的有效性,不需要再进行重连。

    另外,早期的QUIC还使用了一种基于异或的FEC算法,不过在新版本中已经去掉。

    uTP

    uTP是BitTorrent中新增加的一种UDP传输协议,主要特点是使用了LEDBAT(Low Extra Delay Background Transport)拥塞算法。这种算法基于延时来检测网络拥塞,可以更早的探测到拥塞和更早的以及更大幅度的进行避让,从而避免影响用户上网操作的进行,保持后台下载跟前台操作的和平共处。

    FASP(Aspera)

    FASP是Aspera公司(已被IBM收购)的私有UDP解决方案,提供加密的可靠传输,拥塞算法估计是类似BBR,直接使用RTT和带宽来作为调节速度的参考。但FASP主要用于高速的文件传输,所以不需要保证报文的顺序,避免乱序重组时占用的内存开销,而且也避免了因为内存有限而丢弃的部分乱序报文,从而减少不必要的重传,提高传输速度。也就是说,完全避免了Head-of-line Blocking问题。

    SCTP(Stream Control Transmission Protocol,流控制传输协议)

    准确的说,SCTP不是一种可靠UDP协议,而是一种跟TCP/UDP平级的传输层协议,是IETF在2000年指定的标准协议。目前Linux和部分UNIX已经集成,Windows和Mac需要使用第三方包来实现。SCTP最初主要用于电信系统,此外,WebRTC中的DataChannel也用到这个协议。它的特点有:

    • 跟TCP一样面向连接,提供可靠传输
    • 跟UDP一样面向消息
    • 多流支持
    • 每个流可以配置成接受有序或无序的消息
    • Multi-Homing:可以配置多个地址,利用多条网络传输通道
    • 更好的安全性:要求四次握手,避免TCP的SYN Flooding攻击
    展开全文
  • 基于UDP传输协议的包丢失和失序处理的一篇论文
  • UDP/IP传输协议

    千次阅读 2019-06-29 21:15:23
    UDP协议简单,是面向无连接的传输协议,传输速度快但传输不可靠。可以将UDP协议看作IP协议暴露在传输层的一个接口。 UDP协议同样以数据报(datagram)的方式进行数据传输,而且UDP协议提出了端口(port)的概念。IP...

    一、传输层最重要的协议就是TCP和UDP。TCP协议复杂,是面向连接的传输协议且传输可靠;而UDP协议简单,是面向无连接的传输协议,传输速度快但传输不可靠。可以将UDP协议看作IP协议暴露在传输层的一个接口。

    UDP协议同样以数据报(datagram)的方式进行数据传输,而且UDP协议提出了端口(port)的概念。IP协议进行的是IP地址到IP地址的传输。但是每台计算机有多个通信通道,并将多个通信通道分配给不同的进程(例如QQ、WEB等),这样一个端口就代表一个通信通道。UDP协议实现了端口到端口的数据传输服务,UDP的数据报也是被封装成“应用层-UDP-IP”的形式进行传输的。


    二、UDP的数据报:UDP数据包分为头部(header)和数据(payload)两部分。UDP是传输层的协议,这意味着UDP数据包需要经过IP协议的封装,然后通过IP协议传输到目的电脑。随后UDP数据包在目的电脑上进行拆封,并将信息送到对应的端口缓存中。应用层则可以根据socket等编程接口获取相关端口的数据包信息,用于上层的进一步应用。

    如上图所示为UDP协议数据的头部信息,包括源端口(可选的,端口不用置0即可)、目的端口报文长度校验和(其覆盖UDP的头部信息和数据信息,在IPV4中,checksum可以为0;IPV6中必须进行校验)。其中报文长度用来指定UDP数据报包括数据部分的长度(最小值为8字节,且包括IP头等数据)。UDP传输协议相比于TCP协议有以下优点:①当使用广播或多播时,一般使用UDP协议而不是TCP协议。②UDP协议是面向无连接的,协议实现简单且速度较快。


    三、IP的数据报:IP协议是不可靠且无连接的网络层传输协议。所有的TCP、UDP等数据都是以IP数据报的形式进行传输的。IP协议通过IP地址进行目的电脑的识别与连接。待传输的数据经过UDP头部信息的封装后,还需进一步经过IP头部信息的封装,进而通过IP协议传输到目的电脑。

    4位版本信息:IPv4为0100,IPv6为0110。

    4位首部长度:用于标识首部的长度(单位为4字节),所以首部的最大长度为15*4字节=60字节。

    8位服务类型:包括3位优先权字段,4位TOS字段,1位始终为0。

    16位总长度(字节数):整个IP数据报的长度。IP数据报中的数据长度=IP数据报总长度-IP首部长度。

    16位标识:唯一地标识主机发送的每一份数据。

    3位标志:用于IP数据报分片,第1位未用;第二位是DF位,DF=1表明IP不对该数据报分片;第3位是MF位,当对数据报分片时,除了最后一片外,其他每个数据报片都要将此位设1。

    13位偏移:用于IP数据报分片。单位为8字节,表明该片相对于原始数据报开始处的位置,能表示的最大偏移为。

    8位生存时间(TTL):设置数据报可以经过的最多路由器的数量,每经过一个路由器,该值就减去1,当该值为0时,数据报被丢弃,通常设置为32或64。

    8位协议:表示上层传输层所用的协议类型,1表示ICMP协议,2表示IGMP协议,3表示TCP协议,17表示UDP协议。

    16位首部校验和:用于对IP首部的正确性进行校验,但是并不包括数据部分,这与TCP/UDP的首部校验和有所区别。

    32位源IP地址:发送端的32位IP地址。

    32位目的IP地址:接收端的32位IP地址。

    选项(如果有):可变长度的可选信息,若IP首部不包括这个可选部分,则IP首部长度为20字节


    四、IP首部校验和的计算:

    发送端对IP首部校验和的计算步骤:

    Ⅰ将IP数据报首部的校验和字段置为0。

    Ⅱ把IP数据报的首部看成16位为单位的数字组成,依次进行二进制反码求和,然后将求和结果取反。

    Ⅲ将得到的2个字节数据存入首部校验和位置即可。

    接收端对IP首部校验和的校验步骤:

    Ⅰ把首部看成16位为单位的数字组成,依次进行二进制反码求和,然后将求和结果取反。

    Ⅱ如果结果为0,则表示校验和校验通过,否则校验失败。

     

    展开全文
  • 基于UDP协议的视频图像传输研究与实现.pdf
  • 1、java socket 2、UDP传输协议 3、json数据格式 4、简易聊天室程序实现
  • 主要为大家详细介绍了python实现UDP协议下的文件传输,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 有名的开源的“可靠UDP传输协议”有哪些,怎么选择? 问题背景: 1、两台主机只能单向传输,即A只能到B,这是在硬件层面上的限制,所以没有丢包等反馈 2、因为要应用到实际生产环境中,所以要求传输速率蛮,要达到...
  • 这是用MFC编写的用UDP协议实现的局域网内的文件传输,服务器和客户端是同一个程序,含有代码和可执行程序
  • 可靠UDP传输协议的实现 RUDP is an object-oriented implementation of a reliable, in-order, transport protocol over UDP based on the Internet Draft by Bova, Krivoruchka, and Cisco Systems (1999) titled ...
  • 主要介绍了Python树莓派学习笔记之UDP传输视频帧操作,结合实例形式详细分析了Python树莓派编程中使用UDP协议进行视频帧传输的相关操作技巧与注意事项,需要的朋友可以参考下
  • 该示例演示了如何使用UDP协议传输一段数据,以及演示了 UDP的不保证正确性.最好将发送端和接收端布置到不同电脑上(经过互联网最佳),以演示丢包的可能性.在本机环路(127.1.1.1)上测试时,发送1001个包,收到1001个...
  • 基于UDP协议的视频传输

    热门讨论 2013-01-03 15:42:46
    基于udp协议和openCV编程实现的视频传输程序,具有自动获取本地IP地址功能,客户端输入服务器端IP,点击发送,服务器端可实现实时的接收和播放,在可靠的局域网环境下,多次测试传输可靠,除此以外具有原理简单,可...
  • UDP协议学习:利用UDP协议传输文件

    千次阅读 2020-07-13 11:46:32
    中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768 [1] 是UDP的正式规范。UDP在IP报文的...
  • 简单易懂,高速的UDP协议的图传、视频传输,一个发送端文件,一个接收端文件,因为udp协议的缺点,所以高码率传输时可能会有色差干扰。
  • 初识UDP协议传输和接收数据

    千次阅读 2019-02-25 16:58:47
    初识UDP协议传输和接收数据简单的自我介绍一,UDP协议发送数据:二,UDP协议接收数据三,几个注意事项和说明: 简单的自我介绍 作为一个还在潜修学习Java的学生,这是我第一次学习Java,也是自己第一次写博文。谈不...
  • 传输层作用:负责数据能够从发送端传输接收端 。 1. 端口 根据网络传输中所说,传输层注重的是端口号,那就关注一下端口号的概念: 就是标识了一个主机上进行通信的不同应用程序,通俗点说就相当于插线板(主机...
  • 用c++ 的基础udp API实现了停等协议,在应用层实现了可靠udp传输,用MFC编写界面,带文档,可用于计算机网络课程设计
  • 使用Java语言编写程序,设计UDP服务器。考虑到实时性,采用UDP协议。 1.设计一个简单的界面,使得程序能够流畅的完成视频文件的传输
  • udp通讯协议以及案例

    千次阅读 2020-10-13 11:24:59
    UDP是一个无连接协议传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力...
  • 基于FPGA的UDP点对点传输协议实现
  • 基于socket UDP协议实现文件传输(windows vc++源代码) UDP传1GB的文件仅需15秒 该代码包含 根据文件内容长度生成MD5码,以供校验文件完整性 本代码包含windows vc++编写dll的代码
  • 基于UDP协议的基本传输

    千次阅读 2018-05-14 22:37:19
    基于UDP协议的通信是不安全的,因为输出的包没有标记,接收方无法判别文件是否丢失UDP协议两个最重要的关键字为:datagramsocket和datagrampacketdatagrampacket是用来打包数据的,将接收方的IP地址和接口都写进包内...
  • UDP协议的详细解析

    万次阅读 多人点赞 2018-12-26 17:16:34
    UDP数据报 一、UDP的概述 二、UDP的首部格式 UDP校验

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 214,961
精华内容 85,984
关键字:

udp传输协议