ssh多路传输multiplexing加速
multiplexing(多路传输)是在一根线或者一个连接上发送多个信号的功能。使用multiplexing
,OpenSSH可以重用已有的TCP连接,这样多个SSH会话就可以比每次都重建一个连接要快很多。
Multiplexing的优点
SSH multiplexing的一个优点是克服了创建一个新的TCP连接的消耗。对于一个主机可以接受的连接数量是有限的,并且对于一些主机限制更为明显,这和主机的负载有关。并且开启一个新的连接会有明显的延迟。当使用multiplexing的是欧,重用一个已经开启的连接可以明显加速。
multiplexing和独立会话的区别是,在服务器和客户端,都只看到一个进程(即使多次连接会话)。并且,在服务器和客户机上,可以看到只打开了一个TCP连接;只不过,在客户端,后建立的会话都是通过stream
的本地套接字来访问的。OpenSSH使用现有的TCP连接来实现多个SSH会话,这种方式降低了新建TCP连接的负载。
Multiplexing的创建过程:
设置
ControlMaster
开启一个本地Unix domain socket其余的所有的ssh命令连接都通过Unix domain socket连接到
ControlMaster
ControlMaster
提供了以下优点:
使用已经存在的unix socket
没有新增的TCP/IP连接
不再需要密钥交换
不再需要认证等
以下是在一个Mac OS X客户端,登陆过Linux服务器之后,关闭终端,然后又发起4次ssh登陆(没有退出)情况下的检查:
Mac OS X客户端
Linux服务器
设置Multiplexing
OpenSSH通过ControlMaster
,ControlPath
和ControlPersist
配置来实现multiplexing:
ControlMaster
决定ssh是否坚挺控制连接并且如何处理ControlPath
是控制套接字的位置ControlPersist
是配合ControlMaster
设置,如果设置成yes
则会在后台始终开启主连接来接受新的连接,只到被明确地杀死或者通过-O
参数关闭。
ControlPersist
选项需要 OpenSSH 5.6 以上版本支持,否则会ssh时会提示错误:Bad configuration option: ControlPersist
配置
上述配置,就会在~/.ssh/controlmasters/
目录下创建控制套接字
Host machine1
也如果配置成Host *
则表示匹配所有的主机,则不需要设置HostName
ControlPath ~/.ssh/controlmasters/%r@%h:%p
设置用于共享连接的控制unix套接字路径。变量%r
,%h
和%p
表示远程ssh连接的用户名,主机名和端口。ControlMaster
设置成auto
则会无条件接受新的连接,如果这个参数设置成10
就只能接受10个多路会话。ControlPersist 10m
设置主连接保持在后台打开的时间是10分钟。如果没有客户端连接,这个后台master连接将自动终止。
从OpenSSH 6.7开始
%r@%h:%p
可以合并成%C
,这个参数会自动生成%l%h%p%r
的哈希,优点是可以唯一标识连接并且可以
选项-O
用来管理连接
这个
-O stop
会清除掉旧的控制套接字,原先的已经连接的会话不受影响。新的连接将建立新的TCP连接。
手工建立multiplex连接
使用参数-M
和-S
对应的就是ControlMaster
和ControlPath
,所以可以使用如下命令创建多路传输
后续的ssh可以使用-S
参数复用前面创建的控制套接字
结束multiplex连接
参考
Last updated