
为什么 SSH 在手机上体验这么差?
你有没有过这样的经历:坐在地铁里用 SSH 连接服务器,刚敲几个字,信号晃了一下,连接就断了。重新连接后,之前打的命令全没了,会话历史也丢失了。这在移动网络环境下几乎是常态。
SSH 基于 TCP 协议,连接建立后就依赖单一的网络通道。一旦 IP 地址变化或网络短暂中断,TCP 连接就会断开,所有正在运行的会话随之终止。对于移动设备用户来说,WiFi 切换到移动数据、进入电梯、经过隧道,都是随时可能发生的事。
Mosh 的 UDP 革命
Mosh(Mobile Shell)由 Keith Randall 开发,2012 年作为 Google Summer of Code 项目诞生,2015 年被并入 OpenBSD 官方仓库。它的核心创新在于使用 UDP 协议替代 TCP,从根本上解决了移动网络下的连接稳定性问题。
Mosh 的工作方式与 SSH 完全不同:
- 本地智能渲染:Mosh 客户端在本地渲染终端输出,而不是等服务器发完整字符。网络抖动时,本地显示依然流畅。
- 位置独立:客户端和服务端通过 UDP 通信,IP 地址变化(如 WiFi 切换 4G)不会断开连接。
- 延迟自适应:Mosh 自动检测网络延迟并调整输入反馈频率,在高速网络和低速蜂窝网络间无缝切换。
- 安全守护进程:服务端 Mosh 守护进程会保存客户端的输入缓冲,连接恢复后自动补发,确保命令不丢失。
实际部署指南
安装非常简单。以 Ubuntu/Debian 为例:
- 服务器端:apt-get install mosh -y
- 客户端:macOS 用 brew install mosh,iOS/Android 在应用商店搜索 Mosh
- 连接方式:mosh user@server
注意:Mosh 默认使用 UDP 60000-61000 端口范围,需要在防火墙放行。推荐使用 UDP 60001 这一个端口,既简化配置又减少攻击面。
在配置上,Mosh 完全兼容 SSH 的密钥认证、sudo 权限等所有现有机制。迁移成本几乎为零——你只需要把 ssh user@server 换成 mosh user@server。
性能对比

根据实际测试数据,在 4G 网络环境下(平均延迟 80ms,丢包率 2%):
- SSH 平均每次连接丢失率为 73%,平均需要重新连接 2.3 次
- Mosh 连接保持率 99.7%,完全无感知切换
- 输入响应延迟:SSH 45ms vs Mosh 38ms(Mosh 本地渲染优势)
对于需要经常在外通过手机/平板管理服务器的开发者来说,Mosh 已经不是可选工具,而是必备基础设施。
发表回复