精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
UDT支持两种不同的建立连接的方法:传统的C/S模式和会合模式。
在会合模式下,两个UDT的socket,几乎在同一时刻向对方发出连接请求。
UDT客户端(在会合模式下,对等实体双方都是客户端),向服务器或者对等实体发送 一个握手请求(Type = 0x0的控制包)。
握手的控制包包含一下信息域(假设UDT Socket A发送握手包给B):
1) UDT版本:该值用来支持协议的兼容。当前版本号是4。
2) Socket类型:流(0)或者数据包(1)。
3) 初始的数据包序列号:该值是用于Socket A发出的第一个数据包的包序列号。该值 应当是随机数。
4) 最大包大小:一个数据包的最大大小(包括协议栈的所有头),该值通常是MTU。
5) 最大流量窗口大小:该值可以是非必要的。但是,目前该值用在协议的参考实现里。
6) 连接类型:该信息用来区分不同的连接模式和保持连接的请求/应答。
7) Socket ID:客户端A的UDT Socket ID。
8) Cookie:该Cookie值用来避免SYN flooding attack [RFC4987]。
9) 对等实体的IP地址:B的IP地址。
一个UDT实体首先作为服务器启动监听。服务器接受并处理输入的连接请求,然后为 每一个新连接创建一个新的UDT Socket。
一个客户端连接服务器时,首先发送握手控制包。在每一个常量时间间隔,当客户端从 服务器端接收到握手响应或者EXP超时,客户端将继续发送握手控制包。
当服务器接收到客户端的连接请求时,服务器根据密钥和客户端的地址产生一个 Cookie值,然后将Cookie值发回给客户端。客户端必须接着将接收到的Cookie值再发 回给服务器。
当接收到握手控制包(携带正确的Cookie值)时,服务器比较握手包的最大包大小和 自身的最大流量窗口大小,并且用二者的较小值作为服务器的流量窗口大小。比较结果的较 小值,和服务器的初始数据包序列号一起,作为握手应答控制包发回给客户端。
当完成握手响应后,服务器准备接收/发送数据。然而,只要从同一个客户端收到保持 连接的握手请求时,服务器就必须发回应答控制包。
一旦接收到服务器的握手应答控制包,客户端可以开始发送/接收数据。
如果接收到服务器的保持连接的握手响应时,客户端忽略该握手响应。
客户端发送连接请求时,将控制包信息域的连接类型设置为1;服务器响应连接请求 时,将控制包信息域的连接类型设置为-1。
客户端将检查发送响应的服务器是否和期望接受请求的服务器一致。
在该连接模式下,两个客户端在同一时刻向对方发送连接请求。控制包的初始连接类型 设置为0。
一旦一个对等实体接收到一个连接请求,它发回一个响应。如果连接类型是0,发出的 应答控制包设置为-1;如果连接类型是-1,发出的应答控制包设置为-2。如果对等实体收到 的控制包的连接类型是-2,不生成响应。
会合连接的对等实体对握手消息进行相同的检查(版本、最大包大小和最大流量窗口大 小等等),如同7.1节的描述。另外,对等实体只处理它发出连接请求的地址发出的连接请 求。最后,会合连接的请求将被C/S服务器的监听拒绝。
当收到-1的应答控制包时,对等实体初始化会合连接。
当对等实体处在防火墙后面时,建立会合连接是很有帮助的。当监听服务器不令人满意 时,会合连接也可以提供较好的安全性和易用性。
当已经建立UDT连接的一个实体关闭连接时,它将向目标对等实体发送一个关闭消 息。目标实体在接收到关闭消息后,也关闭连接。
这个关闭消息,以UDP的报文模式,被对等实体只发送一次,并且不保证一定会被 接收到。
如果未接收到关闭消息,目标实体将在连续16个EXP超时之后关闭连接。然而,总 超时值应该在最小阈值和最大阈值之间。在协议的参考实现里,分别使用3秒和30秒。