May 30, 2020
By: Kevin
用了MOSH, SSH再也回不去了
用MOSH有几年了, 居然没有找到一份好的中文介绍(英文的似乎也不多)
简介
吐槽SSH就是对MOSH最好的介绍了.
SSH让人抓狂的几个点:
- 断网的时候(wifi切换/连VPN)ssh连接就死掉了, 再无重连的可能性.
- 网络很差的时候, 输入每个字符都需要服务器echo一下, 卡的时候10秒看到反馈再正常不过.
- 断了的时候起来的ssh为副进程的子进程会死.
希望有这么一个连接工具: 断网后可以重连,输入时候快捷迅速, 即使合上10小时, 坐飞机从纽约飞到北京, 开盖就可以连上, 里面所有的程序都还在.
对了, 这些功能MOSH都有.
ssh为啥有这些问题
- 基于连接TCP协议, connection断了, session也就断了, TCP是不可以漫游和换IP的.
- 双向传输对象是字符流, 只能到服务器拿到处理结果才能反馈, 你在vi里面按了个i, 确实只有服务器才知道你是模式切换还是输入字符i.
+-----------------------+ +------------------------+
| app (eg. emacs) | | termial (eg. item2) |
+-----------------------+ +------------------------+
| | | |
+-----------------------+ +------------------------+
^ ^
| |
| |
| |
v v
+-----------------------+ +------------------------+
| RSA + AES | | RSA + AES |
+-----------------------+ +------------------------+
| TCP |<-------->| TCP |
+-----------------------+ +------------------------+
mosh
- 基于对象比较(可以diff和patch), 而不是字符流
- session的初始化(认证过程)基于ssh, 安全可靠
- 服务器端不需要运行任何特权代码, 也不需要预先启动任何服务. 只要安装mosh就可以
mosh xxx@host上去 - 数据传输依靠UDP, 路由根据客户端的最后发出的包重新建立, 很多时候都没有意识到漫游发生.
- 预判输入反馈(本地就处理了),平均输入反馈延时是ssh的1/100~1/4不等(根据网络状况)
mosh-server mosh-client
+-------------------+ +------------------+
| server app: emacs| |term emulator:item|
+-------------------+ +------------------+
| Pseudo-terminal | | Psesudo-terminal |
+-------------------+ +-+------+---------+
| | | | predict |
| Mosh termial emul | | | -ive |
| | +----->| echo |
+-------------------+ ^+---------+
^ |
| |
v v
+-------------------+ +-------------------+
| SSP | | SSP |
+-------------------+ +-------------------+
| AES-OCB | | AES-OCB |
+-------------------+ +-------------------+
| UDP |<-------->| UDP |
+-------------------+ +-------------------+
安装配置 & demo
安装
客户端和server端都装上.
不需要配置!
Mosh会通过ssh登陆到系统, 然后会打开一个60000~61000的端口进行通讯, 如果ssh端口不是22, 需要指定下ssh端口
mosh --ssh="ssh -p 2222" figrindan
演示了:
- ssh和mosh连接同一个终端
- 切换为vpn的时候左边的ssh断连
- 右面的mosh切换网络不会断掉
- 注意mosh输入的时候会在本地做echo prediction, 下划线的字符是mosh本地echo的, 非常顺畅,几乎无延时.