想学习一下dtls,是因为想以后没有公司免费VPN可用的时候,我能买一个主机,自己建一个VPN。

1.介绍

Web, email大多用TLS协议来做安全的网络传输,它们必须跑在可靠的TCP传输通道里。

如果传输的是实时媒体数据,那么重传丢掉的包就没有意义,这个时候,我们希望它是跑在UDP传输通道里。

再有,应用层协议SIP可以用TCP或UDP来传,但我们更希望是UDP的。于是有了DTLS。

2. TLS有一些不同:

1)TLS不能单独对某个记录进行完整性检查,如果记录N没收到,那记录N+1无法被认证。因为MAC值是通过序列号计算的,而记录里并没有显示的包含序列号段。

2)TLS握手协议不用考虑丢包的问题

3.DTLS是跑在UDP上的TLS,这做了一些改变解决了几个问题

1) 禁止流加密。这样可以保证记录间加密上下文的独立性。

2) 给记录增加一个显示的序列号字段用来做重放攻击保护和记录数据认证。

3) 给握手包加入重传机制。为了requeset启用一个timer,如果没有收到response,而timer超时,那就重传request.

4) 保证握手包的顺序。每个握手包是有序列号的,如果不是期望收到的握手包,那么把它放入队列。如果是,立刻处理。

5) 消息的size。UDP包如果大于1500会被分片。所以每个DTLS握手报文包含一个段偏移和段长,如此便可还原被分片的握手报文。

6)重放保护。维护一个接收报文的bitmap window。过老的报文或者收到过的包都被扔掉。

4. DTLS记录的格式。除了上面提到的一些不同,很多字段和应用场景与TLS相同。

5. DTLS握手协议。DTLS握手协议基本与TLS相同,只有三个变化:

1) 加入一个无状态的cookie交换,以防止dos攻击。(就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复报文,就丢弃它)

2) 修改握手包头来处理丢包,重排序和IP包分片问题。

3) 重传timer,来处理丢包丢传问题。

6. DTLS握手包头,body较多不贴图了,细节参见RFC.

7. 握手流程

8.我写了一个简单的例子,client用dtls协议发送一个字符串到server的5000端口,在Mac OS上编译通过,正常工作。

https://github.com/andyhu-hz/mycode/tree/master/dtls_test

9.openssl中关于SSL_pending的一个错误认识。

开始以为SSL_pending是用来检测有数据到来的,当SSL_pending返回一个非零正整数时,再调用SSL_Read从buffer中读取数据。

事实上SSL_pending一直返回零,有人也遇到了类似的问题。见这里http://stackoverflow.com/questions/6616976/why-does-this-ssl-pending-call-always-return-zero

You are using SSL_pending() the completely wrong way. OpenSSL uses a state machine, whereSSL_pending() indicates if the state machine has any pending bytes that have been buffered and are awaiting processing. Since you are never calling SSL_read(), you are never buffering any data or advancing the state machine.

If the SSL_pending function returns a return code of 0, it does not necessarily mean that there is no data immediately available for reading on the SSL session. A return code of 0 indicates that there is no more data in the current SSL data record. However, more SSL data records may have been received from the network already. If the SSL_pending function returns a return code of 0, issue the select function, passing the file descriptor of the socket to check if the socket is readable. Readable means more data has been received from the network on the socket.

DTLS学习笔记 -- RFC 4347- 6347的更多相关文章

  1. ICE学习笔记 -- RFC 5245

    RFC 5245 ICE   1, offer/answer model 2, ICE Step:    1) 产生候选地址(1.公网 2.NAT反射 3.Relay转发地址) Generate ca ...

  2. SIP学习笔记 -- RFC 3261

    1.SDP (rfc 4566)    1)用于交换参数    2)内容分三部分Session description, Time description and Media description ...

  3. XMPP学习笔记 -- RFC 6120

    XMPP - Extensible Messaging and Presence Protocol 1. 中文版3920 http://wiki.jabbercn.org/RFC3920 2. 大部分 ...

  4. RTP/RTCP学习笔记 -- RFC 3550

    The MTU of RTP package payload is (IP) - (UDP) - = 1472   #define DEFAULT_MAX_PACKET_SIZE 1200 video ...

  5. dtls_srtp学习笔记

    注:以下为rfc5764的学习笔记,不保证完全正确. DTLS-SRTP是DTLS的一个扩展,将SRTP加解密与DTLS的key交换和会话管理相结合.从SRTP的角度看,是为其提供一种新的key协商管 ...

  6. squid 学习笔记

    Squid学习笔记 1.安装前的配置 编译安装之前需要校正的参数主要包括File Descriptor和Mbuf Clusters. 1.File Descriptor 查看文件描述符的限制数目: u ...

  7. Requests:Python HTTP Module学习笔记(一)(转)

    Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...

  8. TCP/IP详解学习笔记 这位仁兄写得太好了

      TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...

  9. HTTP协议学习笔记(二)

    HTTP协议学习笔记(二) 1.HTTP报文 HTTP报文:用于HTTP协议交互的信息.请求报文:请求端(客户端)的HTTP报文叫做请求报文.响应报文:响应端(服务端)的HTTP报文叫做响应报文. H ...

随机推荐

  1. ES6 的Object.assign(target, source_1, ···)方法与对象的扩展运算符

    一.基本概念 Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target).它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象. Ob ...

  2. 洛谷—— P3807 【模板】卢卡斯定理

    https://www.luogu.org/problemnew/show/3807 题目背景 这是一道模板题. 题目描述 给定n,m,p(1\le n,m,p\le 10^51≤n,m,p≤105) ...

  3. 分享Kali Linux 2017年第11周镜像文件

     分享Kali Linux 2017年第11周镜像文件 Kali?Linux官方于3月12日发布2017年的第11周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KDE ...

  4. PyTorch学习笔记之计算图

    1. **args, **kwargs的区别 def build_vocab(self, *args, **kwargs): counter = Counter() sources = [] for ...

  5. win7 32位安装pyqt

    参考 http://blog.csdn.net/fairyeye/article/details/6607981 http://www.cnblogs.com/toSeek/p/6363036.htm ...

  6. 谈oracle数据比对(DBMS_COMPARISON)

    今天是2014-08-19,我今天收到csdn给我发的申请博客专家的邀请,自己感觉实在羞愧啊. 自从换了工作也一直没有精力在写点东西了.今天我一个同事,在群里贴出了一个数据比对的包(DBMS_COMP ...

  7. C++简单介绍

    一.怎样用C++的源文件产生一个可运行程序 一个C++程序由一个或者多个编译单元组成.每一个编译单元都是一个独立的源码文件.一般是一个带.cpp的文件,编译器每次编一个文件编译单元,生成一个以.obj ...

  8. log4j:WARN Please initialize the log4j system properly解决的方法

    要解决问题很easy,建立LOG4J 的配置文件就可以. 在src 文件夹下创建配置文件,选 一.择菜单File > New > File,文件名称输入log4j.properties,文 ...

  9. C语言变长数组 struct中char data[0]的用法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...

  10. sqlite数据库改动及升级

    今天是上班的第二天.听说我近期的任务就是改bug.唉,权当学习了,遇到的一些问题都记录下来. sqlite数据库是android中很经常使用的数据库.今天帮别人改bug,遇到一些问题记录下来. 1.改 ...