[ipsec][strongswan] VirtualPN隧道网络加速FEC(forward error correction)
引用
跟一个网友就有关IPsec的网络加速以及降低延迟等问题进行了一些讨论,并总结了一写粗浅的看法。
因为FEC的资料并不多,所以分享出来,希望能被有需要的人看见:)
先说一下FEC。
我们使用ipsec的本质,就是在IP层之上建立一条软件的点到点通信链路。通过internet到底任意地方。
由于internet的广域性,或者传输介质或者距离的限制等,倒是数据包的丢失,损坏,高延迟扥各种问题。
对比于专线的方案。我们可是改善介质,做链路保障等提高服务质量。
那么在VirtualPN软件的层面上我们又能做些什么呢? 试想在存储的解决方案中,我们引入和RAID增加冗余
的方法来提高容错能力。那么在网络传输中,是否也可以同样引入呢?
从一个更宏观的角度上,存储和网络本质上是一直的,都是通信。只不过前者跨越的是时间,后者跨越的是
空间。
现在引入我们在网络传输上的解决方案,它就是FEC和channel coding。
不知道为什么这方面的资料并不多,但是我个人却觉得它既有趣又有价值。
https://en.wikipedia.org/wiki/Forward_error_correction
[author: class_tong, date: 20190915]
正文
由于我实在是太懒了。在征得对方同意后分享邮件内容如下,不再进行整理:
嗯。xdp也是在内核里的。主要是用eBPF处理包流转的加速。因为要double esp的包,可能会与netfilter+xfrm面临着同样的内存管理问题? 另外,关于数据面,kernel bypass也有很多手段,可以参考一下:https://blog.cloudflare.com/kernel-bypass/ 祝顺利。 On // : AM, xxx wrote:
> hi
> 感谢回复!我会 再深入研究下的;
> 对于 数据平面,目前都是基于kernel xfrm,绕不开kernel, 我倒是看到有新的研究基于XDP的课题:http://vger.kernel.org/netconf2019_files/xfrm_xdp.pdf
>
> 以上
>
>
>> On Sep , , at : PM, Cao Tong <tony.caotong@gmail.com> wrote:
>>
>> 你好,
>>
>> 非常高兴跟你一起讨论这个问题,让我有机会思考新的问题。
>>
>> 我刚刚花了一下时间简短的了解了一下这部分内容,相信一定不会比你了解的更多,接下来我说一下我的思路,希望对你能有所帮助。
>>
>> . 先说一下strongswan相关的。
>>
>> 我在strongswan里没有看见与FEC有关的任何内容。也就是说我相信它是不能配置的。再进一步,即使它能配置,它也没有把ESP包double的
>>
>> 这个能力。因为所有包的流转都是用linux kernel做的(我们以strongswan跑着linux kernel上为例)。
>>
>> 首先要分清楚一个概念,就是数据和控制。控制是指VirtualPN信道的创建、删除,维护等。数据就理解为ESP/AH包。strongswan只是一个管理工具
>>
>> 它通过与kernel通信,来进行配置。信道的保持和数据包流转,都在kernel里完成。
>>
>> 所以,现在可以确定你的问题和strongswan或者其他任何swan都没有关系。
>>
>>
>> 。 数据通路
>>
>> 1里边我假设了,数据通路是在linux kernel上完成的。实际上,这并不是唯一的选择。取决于你们的方案是什么样的。比如跑在BSD上。或者storngswan
>>
>> 有一个自己开发的数据通路插件。或者你们自己开发了数据面软件。这些都和linux kernel没有关系了。
>>
>> 我看了linux kernel和BSD,应该都没有FEC的功能。所以,无论数据面的方式是什么样的,FEC功能怕是都需要自己开发。
>>
>>
>> . 开发思路
>>
>> VirtualPN的场景分两类,site to site,peer to site/peer。 对于端点设备就两种可能site、peer。为了表达方便现在把功能简单化为数据包的double
>>
>> 对于site场景,就两种方式:封ESP前做,封ESP后做。对于peer模式,还多出一种在应用程序上处理的方式,就是在进入ESP封包前。也就是net-speader
>>
>> 这种方式。(我们聚焦在virtualpn gateway上,所以不讨论这种情况。)
>>
>> 于是,考虑到性能,自然选择ESP封装后进行FEC功能的实现。
>>
>>
>> . kernel上的FEC事项
>>
>> 如果你没有自研可控的数据面实现。那么现在只能聚焦在linux kernel上。
>>
>> 这个时候有是三个选择
>>
>> 。 在内核态做,改kernel。
>>
>> 。 在用户态做,如你说的网卡抓包的方法。回去其他,方法很多
>>
>> . 在virtualpn gateway的出口处加一台专用设备做FEC功能。
>>
>>
>> 按照你的思路我们讨论1。基于以上的分析,我觉得在esp_out() / ah_out()的时候做FEC是非常合理的一件事情,但是
>>
>> 我们并不仅仅是做发包double,而是要做FEC,所以,在收包的时候也是要处理的,还有要综合考虑。
>>
>> 另外,多倍发包势必牵扯到内存管理问题,这个复杂度可能一下就上来了。 除了netfiler的hook,还可以再关心一下xfrm module。
>>
>> 这里边怕是有很多细节。kernel我也不是特别了解,帮助有限。
>>
>>
>> . 其他
>>
>> 其实,综合考虑的话,我觉得4里边的2,3是一个很好的选择,可以将其统合成一个统一的方案,整理部署就是2,考虑高性能的部署就是3。
>>
>> 写成统一的程序。毕竟用户态开发要比内核态省事很多,成本并不一定会变高。
>>
>> 另外,这一切都是在kernel的前提下讨论的。如果有可控的数据通路软件的话,就完全是另外一回事了。
>>
>>
>> 以上,希望有所帮助。
>>
>>
>>
>> On // : PM, xxxx wrote:
>>> Hi here:
>>> 事情是这样的,目前有个基于IPSec 隧道的需求,国内网络环境对于UDP、跨运营商之间穿透是比较差的,UDP包可能被无差别直接丢弃。特别是高峰时间段或者国际网络的传输线路上,结果就是UDP具有较高的丢包率和网络抖动,
IPSec上的应用就不会稳定:https://www.reddit.com/r/networking/comments/ah0z93/highreliability_tunneling_any_fecing_idea/
>>>
>>> 所以,上面链接也说了, UDP Tunnel需要一种丢包补偿机制,实践上我看到有两种方式:暴力多倍发包 和 基于FEC的算法补偿(https://github.com/wangyu-/tinyfecVirtualPN)。IPSec VirtualPN 也需要修改来支持。
>>> 我对与strongSwan 和 Linux kernel 都是新手,所以我想问的是
>>>
>>> . strongSwan有插件机制支持修改隧道数据包发送方式么(1个包 发 个, 或者 fec 算法 发送)? 或者需要netlink api 监听修改数据包?
>>> . 还是得修改内核 IPSec 数据包的发送(http://kernelspec.blogspot.com/2014/10/ipsec-implementation-in-linux-kernel.html)在esp_out() / ah_out() 时候修改?
>>> . 或者还是内通过内核的xfrm netfilter hook 机制 stolen IPSec包 进行计算重新再发送?写个kernel module ?
>>>
>>> 我还看到就是直接网卡抓包, 对与特定包进行再发送,比如这个项目:https://github.com/snooda/net-speeder
>>>
>>>
>>> Reference: https://www.cs.cmu.edu/~guyb/realworld/reedsolomon/reed_solomon_codes.html
>>>
>>>
>>> 以上
>>>
>>>
>> --
>> ------------
>> Cao Tong
>
--
------------
Cao Tong
[author: class_tong, date: 20190915]
[ipsec][strongswan] VirtualPN隧道网络加速FEC(forward error correction)的更多相关文章
- FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题--转
FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题 算法暂不介绍. 思路:FEC ENCODE 增加冗余包,当无线等网络丢包之后,接 ...
- 利用1.1.1.1进行DNS网络加速,仅需2分钟让网络更快
NEWS 近日,Cloudflare 和 APNIC联合推出了1.1.1.1DNS网络加速. Cloudflare 运行全球规模最大.速度最快的网络之一.APNIC 是一个非营利组织,管理着亚太和大洋 ...
- cdn网络加速
CDN全称Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定.通过在网络各处放置节点服 ...
- [ipsec][strongswan] strongswan源码分析--(五)plugin的配置文件的添加方法与管理架构解析
前言 我们知道,strongswan是基于插件式管理的.不同的插件有不同的配置文件,在这下面, 我们以netlink的插件为例:etc/strongswan.d/charon/kernel-netli ...
- 【HMS Core 6.0全球上线】Network Kit全链路网络加速技术,应用无惧网络拥塞
HMS Core 6.0已于7月15日全球上线,本次版本向广大开发者开放了众多全新能力与技术.其中HMS Core Network Kit开放了全链路网络加速技术,助力开发者为用户提供低时延的畅快网络 ...
- [ipsec][strongswan] strongswan源码分析--(一)SA整体分析
strongswan SA分析(一) 1 概念 下面主要介绍两个本文将要阐述的核心概念.他们是SA和SP.注意,这不是一篇不需要背景知识的文章.作者认为你适合阅读接下来内容的的前提是,你已经具备了一下 ...
- [ipsec][strongswan]strongswan源码分析--(零)引子
目录 strongswan sa 资料 编译 启动 进程信息 结构 架构图与插件 配置运行 传统配置方法 新的配置方法 其他配置方法 详细的配置文档 配置示例 用法 加密库 libgmp libcry ...
- [ipsec][strongswan] 使用wireshark查看strongswan ipsec esp ikev1 ikev2的加密内容
一,编译,启用strongswan的save-keys plugin ./configure --prefix=/root/OUTPUT --exec-prefix=/root/OUTPUT --en ...
- [ipsec][strongswan] 使用VTI配置基于路由的ipsec
之前写的一个:[dev][ipsec] 基于路由的VPrivateN 一 我们默认用strongswan的时候基于策略的. 也就是policy. 基于策略的ipsec中, policy承担了两部分功能 ...
随机推荐
- EasyNVR摄像机网页直播之问题解决:Failed:SYSTEM\CurrentCont......\Application\EasyNVR_Service registry key already
背景分析 经常使用EasyNVR产品的用户都知道,作为音视频行业互联网直播产品,EasyNVR主要功能在于通过RTSP/ONvif协议,接入前端音视频采集设备,通过EasyNVR软硬件产品将拉取过来的 ...
- [LeetCode] 505. The Maze II 迷宫 II
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- ECS与EDAS什么意思?
1.ECS 英文:Elastic Compute Service 简称云服务器 2.EDAS英文:Enterprise Distributed Application Service 企业级分布 ...
- MySQL之表日志管理
MySQL日志管理 mysql日志(默认存放在datadir): 同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分.MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志, ...
- 如何立即回收内存C#
C#如何立即回收内存 1.把对象赋值为null 2.立即调用GC.Collect(); 注意:这个也只是强制垃圾回收器去回收,但具体什么时候执行不确定. 代码: [System.Runt ...
- filter和map内置函数
filter filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回 ...
- PHP设计模式 - 合成模式
组合模式(Composite Pattern)有时候又叫做部分-整体模式,用于将对象组合成树形结构以表示“部分-整体”的层次关系.组合模式使得用户对单个对象和组合对象的使用具有一致性. 常见使用场景: ...
- Redis专栏
后端开发都应该掌握的Redis基础 Redis实用监控工具一览
- LeetCode 201. 数字范围按位与(Bitwise AND of Numbers Range)
201. 数字范围按位与 201. Bitwise AND of Numbers Range 题目描述 给定范围 [m, n],其中 0 <= m <= n <= 214748364 ...
- js继承的几种方法理解和代码演示
1.属性继承 :call .apply:不建议使用浪费内存. function Person(name,age,sex){ this.name = name; this.age = age; this ...