SSL编程的相关调研,ssl对libev的支持以及存在的问题

SSL传输数据时,是根据记录进行传输的socket(tcp)是面向流的协议。原因估计是要加密与解密。

比如:一端SSL_write(ssl,buf, size)之后再SSL_write(ssl, buf, size)

另一端SSL_read(ssl,buf, size-n)之后再SSL_read(ssl, buf, 2*size),此时buf中只有n个数据。

这是与socket不同的一点。

 

SSL的错误处理与socket错误处理方式不同,SSL 调用返回值描述中没有关于设置errno。

SSL协议是在socket之上的的协议,有SSL自己的握手与关闭过程

客户端,在connect成功返回后,若要加密传输,可先通知服务端要进行加密传输,需要先发送给服务端一段选择数据,之后则处理scoket描述符调用SSL_connect进行握手。

服务端,在accept成功返回后,先接收一段选择数据,如要加密传输,则要处理socket描述符之后调用SSL_accept进行握手

 

SSL io目前发现两个,SSL_read和SSL_write

SSL_read:基于SSL/TLS记录,记录有个最大值(man中是16KB)。仅当一个记录完全接收完后,SSL_read才能处理。SSL_read读数据是按记录(最大16kb)进行读取,如果底层io是blocking,SSL_read会在完成读或发生错误是返回。除非发生重新协商。调用SSL_get_error()查看错误原因

         SSL_write:按记录进行写,如果写的数据size比最大记录(16kb)大,就会将数据分成多个记录写入,直到写完size个数据后返回。如果底层io是blocking的,SSL_write会在完成写或出错时返回,除非发生重新协商。调用SSL_get_error()查看错误。

 

Libev支持:

         Libev库中的事件是监视socket描述符进行的,当socket描述符对应的连接缓冲区有数据时,事件被触发,而SSL是在socket(tcp)之上的的一层协议,在使用的时候与socket是有区别的,SSL就像是在socket(tcp) 之上作的一层应用,这层应用有自己的IO函数(SSL_read,SSL_write),同样的是,SSL层还有自己的缓冲区。SSL使用libev的问题就出在SSL缓冲区这一块,比如出现这种情况:socket(tcp)缓冲区中有4KB字节,此时触发libev事件,调用回调函数,回调函数中的IO使用的是SSL_read,通过SSL_read读,size参数是2KB,所以只读取了2KB字节就返回,此时socket缓冲区中可能已经没有了数据,即4KB字节的数据全被SSL读到自己的缓冲区中了,这样,没有通过SSL_read读出的剩下2KB字节就无法触发libev事件,这样回调函数就无法被调用,剩下的2KB字节就无法读出。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值