引用

跟一个网友就有关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)的更多相关文章

  1. FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题--转

    FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题 算法暂不介绍. 思路:FEC ENCODE 增加冗余包,当无线等网络丢包之后,接 ...

  2. 利用1.1.1.1进行DNS网络加速,仅需2分钟让网络更快

    NEWS 近日,Cloudflare 和 APNIC联合推出了1.1.1.1DNS网络加速. Cloudflare 运行全球规模最大.速度最快的网络之一.APNIC 是一个非营利组织,管理着亚太和大洋 ...

  3. cdn网络加速

    CDN全称Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定.通过在网络各处放置节点服 ...

  4. [ipsec][strongswan] strongswan源码分析--(五)plugin的配置文件的添加方法与管理架构解析

    前言 我们知道,strongswan是基于插件式管理的.不同的插件有不同的配置文件,在这下面, 我们以netlink的插件为例:etc/strongswan.d/charon/kernel-netli ...

  5. 【HMS Core 6.0全球上线】Network Kit全链路网络加速技术,应用无惧网络拥塞

    HMS Core 6.0已于7月15日全球上线,本次版本向广大开发者开放了众多全新能力与技术.其中HMS Core Network Kit开放了全链路网络加速技术,助力开发者为用户提供低时延的畅快网络 ...

  6. [ipsec][strongswan] strongswan源码分析--(一)SA整体分析

    strongswan SA分析(一) 1 概念 下面主要介绍两个本文将要阐述的核心概念.他们是SA和SP.注意,这不是一篇不需要背景知识的文章.作者认为你适合阅读接下来内容的的前提是,你已经具备了一下 ...

  7. [ipsec][strongswan]strongswan源码分析--(零)引子

    目录 strongswan sa 资料 编译 启动 进程信息 结构 架构图与插件 配置运行 传统配置方法 新的配置方法 其他配置方法 详细的配置文档 配置示例 用法 加密库 libgmp libcry ...

  8. [ipsec][strongswan] 使用wireshark查看strongswan ipsec esp ikev1 ikev2的加密内容

    一,编译,启用strongswan的save-keys plugin ./configure --prefix=/root/OUTPUT --exec-prefix=/root/OUTPUT --en ...

  9. [ipsec][strongswan] 使用VTI配置基于路由的ipsec

    之前写的一个:[dev][ipsec] 基于路由的VPrivateN 一 我们默认用strongswan的时候基于策略的. 也就是policy. 基于策略的ipsec中, policy承担了两部分功能 ...

随机推荐

  1. Conv2d常设置参数意义-继续扩展

    记录下一些常用设置: 1.下采样 当设置为: nn.Conv2d(nc,ndf,,,,bias=False) kernel_size = 4, stride = 2, padding = 1,就是将特 ...

  2. flink入门(一)——基本原理与应用场景

    一.简介 1.简介 flink是一个开源的分布式流处理框架 优势:高性能处理.高度灵活window操作.有状态计算的Exactly-once等 详情简介,参考官网:https://flink.apac ...

  3. 转 Shell判断字符串包含关系的几种方法

    https://blog.csdn.net/rznice/article/details/71086839 Shell中判断字符串包含关系的方法: 1.通过grep来判断:12str1="a ...

  4. iOS开发应该知道的7个编程概念

    对流行工具(如Xcode)和编程概念(如视图控制器)的高级讨论,这些对iOS开发本身很有用. 1. Xcode Xcode是iOS应用开发社区所见过的最通用的IDE.由于集成开发环境来自Apple,它 ...

  5. VMware的包格式vmdk转换为virtualBox的ova

    使用winxp的vmdk作为案例 1 使用vmvare导入vmdk的winxp,点击文件---->导出为ovf 2 找到生成的ovf文件 3 打开virtualBox 管理---->导入虚 ...

  6. (生鲜项目)03. xadmin的配置

    步骤1. 下载xadmin源码(git_hub上的源码已经不支持py3了,需要从其它老手那里获取),将本文件夹全部放置于合适的目录下(这里放到extra_apps内)2. 在settings的INST ...

  7. python实践项目七:正则表达式版本的strip()函数

    描述:写一个函数,它接受一个字符串,做的事情和 strip()字符串方法一样.如果只传入了要去除的字符串, 没有其他参数, 那么就从该字符串首尾去除空白字符:否则, 函数第二个参数指定的字符将从该字符 ...

  8. 怎么又出错了?盘点java中最容易出现的错误

    现如今,java已经广泛应用各种软件开发领域.基于面向对象的设计,java屏蔽了诸如C,C++等语言的一些复杂性,提供了垃圾回收机制,平台无关的虚拟机技术,Java创造了一种前所未有的开发方式.所以, ...

  9. SpringBoot常用注解(三)

    最全的Java常用开发注解 转   https://blog.csdn.net/weixin_40753536/article/details/81285046              Spring ...

  10. Linux 进程间通信(管道、共享内存、消息队列、信号量)

           进程通信 : 不同进程之间传播或交换信息    为什么要进程通信呢? 协同运行,项目模块化 通信原理 : 给多个进程提供一个都能访问到的缓冲区. 根据使用场景,我们能划分为以下几种通信 ...