免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3824 | 回复: 0
打印 上一主题 下一主题

UDT - 带有重传机制和排序机制的UDP数据传送协议 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-01 15:04 |只看该作者 |倒序浏览

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP