爆発試験室 | Network & AI | TechNews & LifeStyle 头像

消息来源频道

爆発試験室 | Network & AI | TechNews & LifeStyle

@boomtechreviews

频道5,371 位成员公开可见0 人在线

爆発試験俱乐部 : @boomtechclub 通用密码 : boomboomtech 三网Smokeping网络质量监控 : www.bakamai.com

成员规模5,371 位成员
在线情况0 人在线
消息总数1,334 条消息
浏览量总数730,983 次浏览

在这个频道里搜索消息……

t.me/boomtechreviews

[MPTCP小课堂] 第一章知识补充
本次剧情设计完全参考B站地雷系主播一滴泪老师,除了贫穷网络要被NAT,就连住的房子都要NAT这段是自己原创的...
看到有小伙伴转发了这一篇并表示没有看懂,那我就来逐段讲解一下,实际上每一段剧情都是在做铺垫,都是有作用的 。
首先你用的是移动宽带,没有公网地址,因此MPTCP只能采用单向连接的方式,不能从Server端发起连接。原本MPTCP设计初衷是给Client有2条线路,与Server组成FullMesh,既可从Client发起连接,又能从Server发起连接。在其中一条断线的时候Server主动向另一条发起连接做到FailOver的效果。(Shadowsocks在开发之初连MPTCP都没有,因此Server无法反向对Client反向发起连接,这个Failover机制需要专门为MPTCP设计过的程序才能支持。)
因此,当你只有一条宽带的时候,故障转移就不用谈了,按照MPTCP设计的初衷就是毫无卵用。
好在MPTCP引入了经过多年开发才正式实装的 ndiffport 功能。
简而言之就是用一个端口取代一个IP作为MPTCP子流(subflow)的端点。这下我们就可以假装自己有好几条宽带。用支持MPTCP的Shadowsocks Client先向Server发起 MPTCP连接,Server告诉Client我这里有5个端口可以供你发起subflow连接。之后Client的Linux内核把TCP转换成MPTCP分别对这5个端口传输数据,Server的内核在收到MPTCP数据后又把合并成一份交给Shadowsocks-Server。 所以这里要说明的是 60001-60005 是传输层的端口 , 与应用层的Shadowsocks端口无关,不存在端口转发的关系。
原理讲完了,再回顾一下之前的剧情。刷了 OpenWRT25.12 , VPS 装 Debian 13是为了保持MPTCP 两边的内核大版本一致。MPTCP是一个一直在开发中的协议,从最早进入5.6内核开始,到现在最新的6.19版内核的MPTCP,虽然可以兼容,但是性能和功能上已经产生了巨大变化。最正确的使用方式就是保持两头Linux内核一致,然后对自己的网络环境调整一下对应的参数:
############ 基础开启 ############
net.mptcp.checksum_enabled = 0
net.mptcp.blackhole_timeout = 0
############ MPTCP 控制平面 ############
net.mptcp.add_addr_timeout = 120
net.mptcp.close_timeout = 120
############ TCP 缓冲区优化 ############
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_mtu_probing = 1
############ GRE / NAT / 抖动友好 ############
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_no_metrics_save = 1
############ 并发 & 队列 ############
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_max_syn_backlog = 16384
net.core.somaxconn = 16384
再回到配参数的剧情,每个参数的含义请参考:
https://www.mptcp.dev/pm.html
先在服务端上放5个signal,类似于大喇叭广播给对面我有这5个端口供连接。
实际上MPTCP当前版本的subflow限制最大是8个,根据实际情况,带宽跑满就不用加了。
客户端在NAT后的内网里,且只有一条线路,所以它什么都做不了,只能单纯的对Server发起连接。
因此它只有一条把子流限制数调到最大的命令:
ip mptcp limits set subflow 8 add_addr_accepted 8
实际上Clash-Meta早就把这个功能给加上了,然而很多人不明觉厉,认为只要把Server和Client的MPTCP打开就能有神秘速度加成。实际上这样只会让MPTCP发起连接后降级回TCP传输,也就是什么都没有发生。MPTCP你必须告诉内核该怎么做,告诉它每个人的角色,才会有子流生成。
今天举的例子算是网络环境恶劣的情况下非正规MPTCP的用法,它的操作方式是最简单的。现成的系统无需编译,软件也是日常生活中用了无数次的。仅需两端分别加几行命令即可使自己在恶劣的环境中更有竞争力。
作为今年MPTCP小课堂的第一章,我并不想谈理论概念。MPTCP的初代开发者自己都没有把概念很清楚的传达给后续的开发者。现在麒麟软件(Kylinsoft)的唐葛亮老师在进行后续的开发。原作者看中AI经济热潮,跑去搞AI相关方面的东西了。。。
甚至,MPTCP社区的总管理员在Netdev宣讲会的时候都没和场内观众解释清楚MPTCP到底是什么,在25:17的时候有观众向他提问:你这个东西和服务器上插两根网线做Bonding有什么区别?
https://youtu.be/lo8biurYw5s?si=jSARsahGDAEGYNrj&t=1517
换我今天一定要用真理送这位观众去二次元空间。
于是,今后的MPTCP小课堂,每一章节都会先有剧情,然后再以知识补充的形式发布 。
#mptcp