mosh 的本地回顯預測是它在高延遲鏈路下打字順的關鍵:客戶端不等伺服器把你打的字回傳、而是在本地先猜測並立刻顯示,之後再用伺服器的真實輸出校正。這消掉了每個按鍵一趟 round-trip 的黏滯感。代價是「預測」要猜字元怎麼佔位,撞上寬度不是一格的字元(CJK 雙寬字)時會算錯、顯示錯位。理解這個機制,才知道 mosh 什麼時候好用、什麼時候反而該關掉或改用 SSH。

概念位置

雙寬字與終端輸入的更完整討論見 終端 CJK 雙寬字與即時輸入。mosh 為什麼能扛換網路、以及它跟 SSH 在漫遊上的分野,見 TCP 連線與漫遊

預測消掉 RTT 黏滯

裸 SSH 下,你打一個字要等它走到伺服器、再回傳才顯示,鏈路 RTT 高(跨國、行動網路)時就是一個字一個字等的黏滯感。mosh 在客戶端維護一份對終端狀態的預測:多數按鍵的效果是可預測的(打 a 就顯示 a、退格就刪一格),它先在本地畫出來、把伺服器的權威輸出當校正。體感上打字即時、跟本地終端接近。這是 mosh 在高延遲下優於 SSH 的主要來源。

代價:CJK 雙寬字顯示衝突

預測要正確,前提是客戶端能算對每個字元佔幾格。ASCII 字元一格、CJK 字元兩格(雙寬),當你用輸入法打中文時,預測層對「正在組字 / 已上屏的雙寬字」寬度容易算錯,游標位置與行重繪就跟著錯位——畫面上表現為輸入行的字重疊、跳位。關鍵觀察是輸出正常、只有正在編輯的輸入行亂:因為輸出只是被動印出、不經預測,輸入行才有預測參與。

怎麼確認真的走 mosh

client 顯示「已連線」不代表用了 mosh——有些 client 的 mosh 開關無效時會靜默退回 SSH。要判斷得看伺服器側的權威狀態:mosh 生效時伺服器上有一個 mosh-server 行程、而 SSH 連線在 spawn 完 mosh-server 後就關閉,所以此時 ss -tnp 反而看不到該 client 的 TCP:22。看到 mosh-server 行程、看不到對應 SSH 連線,才是走 mosh 的簽章;只看到 SSH 連線、沒有 mosh-server,就是退回了純 SSH。而且這個狀態會變(第一條連線可能是 SSH、重連後 mosh 才接管),所以不能只查一次。

邊界

預測是可調的:mosh --predict=never 關掉本地預測、只顯示伺服器的真實輸出,能避開 CJK 顯示衝突、但也失去高延遲下的即時手感。所以權衡是使用形態的:要打中文對話、又不想被顯示錯位干擾時,關預測(或直接用不預測的 SSH);要在高延遲鏈路快速打英文 / 指令時,開預測。