`
jimmee
  • 浏览: 539986 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

UDT协议-基于UDP的可靠数据传输协议的实现分析(3)-包结构说明

阅读更多

udt的包结构

1. 数据包,基本结构如下:
 

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |0|                     Packet Sequence Number                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   ~                   Application Data Payload                    ~
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


第1位为0表示是数据包,后续31位为序号,表示范围是0-(2^31 - 1)

udt-java里数据包的类DataPacket,实际的属性如下:

    // 包序号, 4字节的低31位表示
    private long packetSequenceNumber;
    // 消息号, 4字节
    private long messageNumber;
    // 时间戳, 4字节
    private long timeStamp;
    // 对等端链接的ID, 4字节
    private long destinationID;
    // 实际数据长度(字节)
    private int dataLength;
    // 实际的数据
    private byte[] data ;

 

2. 控制包,基本结构如下:

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |1|type |        Reserved       |          ACK Seq. No.         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   ~                  Control Information Field                    ~
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+



第1位为1表示是控制包,接下来的三位表示控制包类型。

UDT的ACK包使用子序号,每个ACK/ACK2包使用一个16位的序列号,使用16-31位表示,能够
表示的序号范围是0 - (2^16 - 1)。其他的控制包无子序号。

udt-java中所有控制包的基类ControlPacket,都存在的header(16字节)

        // 4字节
        System.arraycopy(PacketUtil.encodeControlPacketType(controlPacketType), 0, res, 0, 4);
        // 4字节,额外信息
        System.arraycopy(PacketUtil.encode(getAdditionalInfo()), 0, res, 4, 4);
        // 4字节,时间戳
        System.arraycopy(PacketUtil.encode(timeStamp), 0, res, 8, 4);
        // 4字节,对端的链接的id
        System.arraycopy(PacketUtil.encode(destinationID), 0, res, 12, 4);

 

udt-java中的控制包类型的定义:

   

public static enum ControlPacketType {
       
        CONNECTION_HANDSHAKE,
        KEEP_ALIVE,
        ACK,
        NAK,
        UNUNSED_1,
        SHUTDOWN,
        ACK2,
        MESSAGE_DROP_REQUEST,
        UNUNSED_2,
        UNUNSED_3,
        UNUNSED_4,
        UNUNSED_5,
        UNUNSED_6,
        UNUNSED_7,
        UNUNSED_8,
        USER_DEFINED,
       
    }

 


控制包的类型及具体的包结构如下:

TYPE 000: Protocol Connection Handshake 握手控制包
          Control Info:
          1) 32 bits: UDT version
          2) 32 bits: initial sequence number
          3) 32 bits: MSS (bytes)
          4) 32 bits: maximum flow window size (bytes)

udt-java中握手包ConnectionHandshake类的主要属性:

   

// udt版本 4字节
    private long udtVersion=4;
    // socket的类型,4字节
    private long socketType= SOCKET_TYPE_DGRAM; //stream or dgram
    // 初始序列号 4字节
    private long initialSeqNo = 0;
    // 包大小-MSS大小 4字节
    private long packetSize;
    // 流量窗口大小 4字节
    private long maxFlowWndSize;
    // 链接类型 4字节
    private long connectionType = CONNECTION_TYPE_REGULAR;//regular or rendezvous mode
    // socket id 4字节
    private long socketID;
    // cookie信息
    private long cookie=0;
    //address of the UDP socket
    private InetAddress address;

 

TYPE 001: Keep-alive
          Control Info: None
udt-java中的KeepAlive类
 
TYPE 010: Acknowledgement (ACK)
          bits 16-31: ACK sequence number
          Control Info:
          1) 32 bits: The packet sequence number to which (excluding)
                      all the previous packets have been received
          2) 32 bits: RTT (microseconds)
          3) 32 bits: RTT variance, or RTTVar (microseconds)
          4) 32 bits: Flow window size (number of packets)
          5) 32 bits: Estimated link capacity (number of packets per
                         second)
udt-java中Acknowledgement类:
   

 //the ack sequence number子序列
    private long ackSequenceNumber ;
    //the packet sequence number to which all the previous packets have been received (excluding)
    // 接收到的包的序号
    private long ackNumber ;
    //round-trip time in microseconds(RTT)
    private long roundTripTime;
    // RTT variance
    private long roundTripTimeVariance;
    //Available buffer size (in bytes)
    private long bufferSize;
    //packet receivind rate in number of packets per second
    private long pktArrivalSpeed;
    //estimated link capacity in number of packets per second
    private long estimatedLinkCapacity;

 

TYPE 011: Negative Acknowledgement (NAK)
          Control Info:
          32-bit integer array of compressed loss information
udt-java中的NegativeAcknowledgement类,丢包的控制包:

    //after decoding this contains the lost sequence numbers
    List<Integer>lostSequenceNumbers;

 

TYPE 100: Reserved.
        This type of control message is reserved for congestion
        warning that can be sent from the receiver to the sender. A
        congestion warning can be triggered by ECN, or a
        measurement of increasing trend in the packet delay.

TYPE 101: Shutdown
             Control Info: None
udt-java中的Shutdown类

TYPE 110: Acknowledgement of Acknowledgement (ACK2)
          bits 16-31: ACK sequence number
          Control Info: None
对确认包的确认,udt-java中的类Acknowledgment2,包含的属性

    //the ack sequence number
    private long ackSequenceNumber ;

 

TYPE 111: Explained by bits 4 - 15, reserved for future use.

3. udt-java中的packet的解析类PacketFactory

   

 public static UDTPacket createPacket(byte[]encodedData,int length)throws IOException{
        // 判断是否是控制包
        boolean isControl=(encodedData[0]&128) !=0 ;
        // 解析控制包
        if(isControl)return createControlPacket(encodedData,length);
        // 返回数据包
        return new DataPacket(encodedData,length);
    }

 

分享到:
评论

相关推荐

    UDT协议-基于UDP的可靠数据传输协议---UDT实现源码

    UDT协议的源码分析可以帮助我们深入理解其工作原理,如何在不牺牲可靠性的前提下实现高效的UDP数据传输。通过阅读源码,我们可以学习到如何设计和实现一个高性能的传输层协议,这对于网络编程和大数据传输领域的研究...

    UDT协议-基于UDP的可靠数据传输协议.docx

    UDT(User Datagram Transport)协议是一种基于UDP(User Datagram Protocol)的可靠数据传输协议,设计目的是为了解决在高带宽延迟乘积(Bandwidth-Delay Product, BDP)环境中,传统的TCP协议效率低下的问题。...

    UDT协议-基于UDP的可靠数据传输协议 (2).docx

    UDT(User Datagram Transport)协议是一种基于用户数据报协议(UDP)的可靠数据传输协议,设计初衷是为了在高带宽时延乘积(BDP)的网络环境中提供高效、公平和稳定的传输服务,尤其适用于大数据量传输场景,如网格...

    基于UDP的可靠传输(停等协议)

    通过这种方式,虽然基础是不可靠的UDP协议,但通过应用层的停等协议,我们可以实现可靠的数据传输,保证了数据的正确性和完整性,适用于对实时性要求较高但又需要基本可靠性的场景。在实际应用中,还可以考虑优化,...

    UDT协议UDP可靠数据传输协议.pdf

    UDT,全称为User Datagram Transport,是一种基于UDP(用户数据报协议)的可靠数据传输协议。UDP本身是一种无连接的、不可靠的传输协议,它不保证数据的顺序和完整性,也不进行拥塞控制。然而,UDT针对UDP的这些不足...

    用UDP实现的可靠传输源码

    在“udt4”这个文件中,很可能是UDT(UDP-based Reliable Transport)的源代码实现,UDT是一个开源的、高性能的、基于UDP的可靠传输协议,它结合了TCP的可靠性和UDP的低延迟,适用于大数据传输和实时应用。UDT内部...

    udt协议java版修改

    UDT(UDP-based Data Transport)协议是一种高效的数据传输协议,基于UDP(User Datagram Protocol),旨在提供类似TCP的可靠传输服务,但具有更高的带宽利用率和更低的延迟。在Java环境中,UDT通常需要通过第三方库...

    基于UDP协议之上实现通用、可靠、高效的TCP 协议

    ### 基于UDP协议之上实现通用、可靠、高效的TCP协议 #### 一、引言 随着互联网技术的发展,特别是P2P(Peer-to-Peer)技术的广泛应用,越来越多的网络应用涌现出来,如Napster、Bittorrent、eMule、Skype等。这些...

    netty-transport-udt-4.0.10.Final.zip

    UDT是一种高速的数据传输协议,它基于UDP协议,但提供了TCP般的可靠性和连接性。 【描述】"zkclient.zip" 提供的是ZooKeeper的客户端工具,ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。它是集群的...

    FILE-TRANSFER-USING-UDP.rar_The Word_udp file

    5. **UDP文件传输协议设计**:可能介绍一种或多种基于UDP的文件传输协议,如DTCP(Datagram Transport Control Protocol)或UDT(UDP-based Data Transfer Protocol),以及它们如何提供一定程度的可靠性。...

    可靠的UDP协议的实现.pdf

    在构建可靠的UDP协议时,主要目标是克服原始UDP协议中缺乏的可靠性,如顺序保证、错误检测和重传机制。以下是对实现可靠UDP协议的一些关键点的详细解释: 首先,发送端采用超时重发机制确保数据包的送达。发送缓冲...

    Android 平台上 Ad-Hoc 通信模式的研究与实现

    - UDT的实现需要考虑如何在不牺牲性能的前提下确保数据传输的可靠性,可能涉及丢包检测、拥塞控制等技术。 #### 应用程序设计 针对以上核心功能模块,本文设计了一个能够在Android设备间实现Ad-Hoc通信的应用程序...

    UDP滑动窗口代码,UDP Sliding Window Protocol

    7. **实现细节**:在`070822udt4Source`源代码中,可能会包含实现UDP滑动窗口协议的类、函数和数据结构。这些可能包括发送窗口和接收窗口的管理,序列号和确认机制的处理,以及重传和窗口调整的逻辑。 了解并掌握...

    Netty4&5源码编译所需jar包

    1. **barchart-udt-bundle-2.3.0.jar**:这是一个基于UDP的传输层库,UDT(User Datagram Transport)提供了一种高效的、面向流的、可靠的数据传输服务,适合大数据量的传输。 2. **javassist-3.17.1-GA.jar**:...

    kcp:Rust的可靠UDP库

    总之,“kcp”是一个基于Rust实现的可靠UDP库,它通过优化的数据传输策略,为需要高性能和可靠性的应用提供了新的选择。对于Rust开发者来说,掌握这个库的使用,不仅可以提升项目的性能,还能深入理解网络通信的复杂...

Global site tag (gtag.js) - Google Analytics