DTLS主要特性概述和实现分析
背景
    近年来出现了许多实用数据报传输的应用程序。这些应用包括实时视频会议,internet电话和在线游戏,比如Quack和Startcraft。这些应用都是延迟敏感的,并且使用了不可靠的数据报传输。TCP之上的应用可以用TLS来保证安全,但是TLS不能用来保证UDP的安全。Datagram TLS试图在现存的TLS协议架构上提出扩展,使之支持UDP,即成为TLS的一个支持数据报传输的版本。 
TLS简介
    TLS是最为广泛部署的协议,它用来保障网络安全通信。TLS用来保护Web 通信和email协议(诸如IMAP,POP)。TLS的主要优势是它通过向应用层和网络层之间(即OSI模型中的会话层)插入TLS来保证应用的安全。然而,TLS要求一个可靠的传输信道—典型的是TCP—因此不能用来保证数据报通信的安全。 
    当部署TLS的时候,大家还没有充分认识到这个局限性的严重程度,因为当时大多数应用运行在TCP之上。即使今天也是这样。然而情况正在改变。在过去几年中,不断增长的应用层协议,比如SIP  (session initial protocol),RTP (real time protocol), MGCP (the Media Gateway Control Protocol),还有许多游戏协议都基于UDP传输而设计。 
    目前,这些应用的设计者面对着许多用来保证安全性的选择,但却无法令人满意。首先,他们可以使用IPsec。然而, IPsec不适合于Client-Server应用模型,且难以同应用程序结合,因为IPsec运行在系统内核 。其次,他们自己设计一个特有的应用层安全协议。例如,SIP使用了S/MIME的一个变体来保证安全通信。将S/MIME嫁接到SIP中比使用TLS上的TCP版本的SIP变体更费劲。第三,可以把应用移植到TCP之上,然后使用TLS。不幸的是,许多这样的应用依赖于UDP语义,当运行在诸如TCP之类的流协议上性能将无法令人接受。 
    DTLS是TLS的一个修改版本, 这样函数能够运行在数据报通信上,该方法有两个主要优势:首先,既然DTLS非常类似于TLS,可以重用以前的协议架构和实现方法。为了便于展示,我们通过对OpenSSL库的添加实现了DTLS。总共添加了7000行代码,其中的60%从OpenSSL复制和粘贴。其次,既然DTLS向通用安全层提供了相似的接口,就易于调整协议来使用它。TLS的经验显示,这种易于调整性是扩大部署的关键。 
DTLS实现可靠传输方法
为了支持消息丢失,重传,分片,DTLS修改了TLS1.1握手报头: 
struct { 
        HandshakeType msg_type; 
        uint24 length; 
        uint16 message_seq;                               // New field 
        uint24 fragment_offset;                          // New field 
        uint24 fragment_length;                          // New field 
        select (HandshakeType) { 
      case hello_request: HelloRequest; 
      case client_hello:  ClientHello; 
      case hello_verify_request: HelloVerifyRequest;     // New type 
      case server_hello:  ServerHello; 
      case certificate:Certificate; 
      case server_key_exchange: ServerKeyExchange; 
      case certificate_request: CertificateRequest; 
      case server_hello_done:ServerHelloDone; 
      case certificate_verify:  CertificateVerify; 
      case client_key_exchange: ClientKeyExchange; 
      case finished:Finished; 
       } body; 
      } Handshake; 
    每次握手中传输的第一条信息中,message_seq总是为0。每产生一个新消息时,message_seq值按1递增。当重传一条信息时,使用相同的message_seq值。即,由message_seq保证传输可靠性。
在CAPWAP隧道中DTLS应用
wKiom1LcravzAuJ3AADqwTI7xf4927.jpg
spacer.gif
在UDP和Capwap隧道之间加入了DTLS的包头,在报文末尾加入DTLS报尾;