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(User Datagram Transport)协议是一种基于UDP(User Datagram Protocol)的可靠数据传输协议,设计目的是为了解决在高带宽延迟乘积(Bandwidth-Delay Product, BDP)环境中,传统的TCP协议效率低下的问题。...
UDT(User Datagram Transport)协议是一种基于用户数据报协议(UDP)的可靠数据传输协议,设计初衷是为了在高带宽时延乘积(BDP)的网络环境中提供高效、公平和稳定的传输服务,尤其适用于大数据量传输场景,如网格...
通过这种方式,虽然基础是不可靠的UDP协议,但通过应用层的停等协议,我们可以实现可靠的数据传输,保证了数据的正确性和完整性,适用于对实时性要求较高但又需要基本可靠性的场景。在实际应用中,还可以考虑优化,...
UDT,全称为User Datagram Transport,是一种基于UDP(用户数据报协议)的可靠数据传输协议。UDP本身是一种无连接的、不可靠的传输协议,它不保证数据的顺序和完整性,也不进行拥塞控制。然而,UDT针对UDP的这些不足...
在“udt4”这个文件中,很可能是UDT(UDP-based Reliable Transport)的源代码实现,UDT是一个开源的、高性能的、基于UDP的可靠传输协议,它结合了TCP的可靠性和UDP的低延迟,适用于大数据传输和实时应用。UDT内部...
UDT(UDP-based Data Transport)协议是一种高效的数据传输协议,基于UDP(User Datagram Protocol),旨在提供类似TCP的可靠传输服务,但具有更高的带宽利用率和更低的延迟。在Java环境中,UDT通常需要通过第三方库...
### 基于UDP协议之上实现通用、可靠、高效的TCP协议 #### 一、引言 随着互联网技术的发展,特别是P2P(Peer-to-Peer)技术的广泛应用,越来越多的网络应用涌现出来,如Napster、Bittorrent、eMule、Skype等。这些...
UDT是一种高速的数据传输协议,它基于UDP协议,但提供了TCP般的可靠性和连接性。 【描述】"zkclient.zip" 提供的是ZooKeeper的客户端工具,ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。它是集群的...
5. **UDP文件传输协议设计**:可能介绍一种或多种基于UDP的文件传输协议,如DTCP(Datagram Transport Control Protocol)或UDT(UDP-based Data Transfer Protocol),以及它们如何提供一定程度的可靠性。...
在构建可靠的UDP协议时,主要目标是克服原始UDP协议中缺乏的可靠性,如顺序保证、错误检测和重传机制。以下是对实现可靠UDP协议的一些关键点的详细解释: 首先,发送端采用超时重发机制确保数据包的送达。发送缓冲...
- UDT的实现需要考虑如何在不牺牲性能的前提下确保数据传输的可靠性,可能涉及丢包检测、拥塞控制等技术。 #### 应用程序设计 针对以上核心功能模块,本文设计了一个能够在Android设备间实现Ad-Hoc通信的应用程序...
7. **实现细节**:在`070822udt4Source`源代码中,可能会包含实现UDP滑动窗口协议的类、函数和数据结构。这些可能包括发送窗口和接收窗口的管理,序列号和确认机制的处理,以及重传和窗口调整的逻辑。 了解并掌握...
1. **barchart-udt-bundle-2.3.0.jar**:这是一个基于UDP的传输层库,UDT(User Datagram Transport)提供了一种高效的、面向流的、可靠的数据传输服务,适合大数据量的传输。 2. **javassist-3.17.1-GA.jar**:...
总之,“kcp”是一个基于Rust实现的可靠UDP库,它通过优化的数据传输策略,为需要高性能和可靠性的应用提供了新的选择。对于Rust开发者来说,掌握这个库的使用,不仅可以提升项目的性能,还能深入理解网络通信的复杂...