- 论坛徽章:
- 0
|
udt 报文是在udp报文的基础上,在udp的payload中拿出8个字节来进行对报文的再次封装。udt报文分为控制报文和数据报文。数据报文的格式如下:
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 ~
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
控制报文的包头格式如下:
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 控制原理
udt协议主要是根据控制报文来对数据的发送流程进行控制。根据控制报文的包头格式示意图可以看出,所有的控制报文的payload中的第一个字节的第一个比特都是1。1-3位为控制报文类型。16-32位两个字节位ACK的序号。后面4个字节位控制信息区域。具体分为:
TYPE 000: 建立连接握手信号控制报文(24字节)
控制信息区域的具体含义:
1) 32 bits: UDT version
2) 32 bits: initial sequence number
3) 32 bits: MSS (bytes)
4) 32 bits: maximum flow window size (bytes)
TYPE 001: 保持连接控制报文(12字节)
Control Info: None
TYPE 010: 确认(ACK)控制报文 (28字节)
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)
TYPE 011: 拒绝(NAK) 控制报文()
Control Info:
32-bit integer array of compressed loss information
(see Section 3.9).
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: 关闭控制报文(12字节)
Control Info: None
TYPE 110: ACK的ACK确认控制报文(ACK2) (12字节)
bits 16-31: ACK sequence number
Control Info: None
TYPE 111: 保留。可以由(4-15比特来决定具体含义.)
本程序中扩展这个控制报文位打洞报文,穿透NAT的作用。
发送端流程:
UDTSOCKET serv = UDT::socket(AF_INET, SOCK_STREAM, 0);
int mss = 1052;
UDT::setsockopt(serv, 0, UDT_MSS, &mss, sizeof(int));
UDT::bind(serv, (sockaddr*)&my_addr, sizeof(my_addr));//本地地址
//设置打洞报文的目的地址:punchAddr,
CUDT::listen(serv, 1, &punchAddr);//开始侦听并每隔一秒发送一个打洞报文
fhandle = UDT::accept(serv, (sockaddr*)&their_addr, &namelen));
//accept函数返回新的套接字,用来发送和接收数据.本程序中实际返回的还是第一次
//创建的套接字serv
UDT::close(serv);//关闭套接字。本程序中没有关闭套接字,实际上只是释放UDTSOCKET
//中别的属性所占用的资源。
UDT::sendfile(fhandle, ifs, 0, size);//发送ifs文件.ifs为ifstream。
CUDT::close(fhandle,true); //释放资源并且关闭套接字
注释:
1。由于在teltel客户端传送文件的时候,存在NAT穿透问题。所以我扩展
listen函数。使得listen在侦听连接的同时向外发送打洞数据包。知道接收到连接时关闭打洞数据包的发送。
2。由于在发送文件的时候我们只能利用一个端口,就是说我们用一个端口创立一个套接字后,不能象tcp那样accept一个连接后在创建一个新的套接字发送和接收数据,而把侦听套接字关闭。这样实际上传送一个文件就用了两个套接字。造成资源的浪费。所以我改造了一下accept函数和close函数。使accept函数返回的套接字实际上是继续使用侦听的那个套接字。而close函数则添加一个bool参数,默认情况下只删除udtsocket的资源,而不关闭套接字。只有参数为true的情况下才关闭套接字。这样子程序就能利用一个套接字发送一个文件。
3。修改udt::close(bool)函数。把Sleep(1)改为Sleep(100),主要是为了降低cpu的利用率。
2 发送控制原理
3 接收控制原理
4 总结
具体可以参见udt的帮助文档:
文件:
draft-gg-udt-01.rar
大小:
11KB
下载:
下载
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/14840/showart_79790.html |
|