Кэйт Уэйнстейн (Keith Winstein) и группа разработчиков из Массачусетского Технологического Института (MIT) представили проект Mosh с реализацией клиент-серверного ПО для организации удаленного доступа, по назначению схожего с SSH и применяющего его средства аутентификации, но предназначенного для использования в мобильных сетях с неустойчивым или медленным соединением. Исходные тексты проекта доступны под лицензией GPLv3.

Mosh (Mobile Shell) выступает в роли надстройки над SSH, используя средства аутентификации последнего, но осуществляя обмен данными с использованием собственного протокола SSP (State Synchronization Protocol), реализованного поверх UDP с шифрованием AES-128. В отличие от SSH, который просто пересылает поток данных от сервера к клиенту и ожидает ответных данных, SSP основан на идее синхронизации состояний. И клиент и сервер хранят у себя текущее состояние экрана которое синхронизируется по запросу сторон. Этот подход позволяет легко устранить коренные недостатки SSH:

  • Операции редактирования командной строки на стороне клиента. При использовании SSH каждый печатаемый в командной строке символ отправляется серверу, который затем передает его обратно клиенту, который производит вывод на экран, в результате чего на медленном соединении терминал становится менее отзывчивым.

    Mosh обновляет содержимое экрана локально, отправляя информацию об изменившемся состоянии экрана (бинарный diff) серверу в момент нажатия клавиши Enter, в ответ сервер отсылает клиенту свой бинарный diff, содержащий ответ команды (или часть ответа, если вывод длинный), который объединяется с текущим содержимым. Такая архитектура позволяет сделать работу с удаленным терминалом удобной даже в условиях очень плохого и медленного соединения. Причем это относится и к полноэкранным приложениям.

  • Прозрачное переключение между IP-адресами (роуминг). Каждые три секунды SSP-клиент посылает серверу heartbeat-сообщения с увеличенным номером последовательности. Каждый раз, когда сервер получает аутентичный пакет от клиента с номером последовательности выше предыдущего, IP-адрес его источника становится адресом назначения для исходящих пакетов сервера. Таким образом изменение адреса клиента никак не повлияет на текущую сессию и она останется открытой. Более того, используя heartbeat-сообщения клиент сможет вовремя уведомить пользователя о недоступности сервера (в отличие от SSH, пользуясь которым человек узнает о потере соединения только когда попробует напечатать команду) и не закроет сессию на время его отсутствия.
  • Ctrl+C в любой ситуации. Mosh регулирует скорость посылки diff-сообщений клиенту на основе текущей скорости соединения и никогда не заполнит сетевые буферы клиента. Поэтому, даже если пользователь случайно запросит вывод на экран файла длиной 100 Мб, комбинация Ctrl+C сработает мгновенно.

Еще одно достоинство Mosh заключается в простоте его установки. Сервер использует существующую SSH-инфраструктуру для аутентификации и непривилегированные порты для приема данных, поэтому если между машинами уже налажена SSH-связь, все что потребуется сделать, это просто установить на обе машины пакет mosh и использовать команду mosh вместо ssh. Если сервер не позволяет производить установку пакетов, то достаточно будет положить бинарный файл mosh-server в любой каталог (например, /home/user) и вызвать клиент mosh с опцией '--server=/home/user/mosh-server'.

Более детальную информацию об архитектуре системы можно прочитать в документе Mosh: An Interactive Remote Shell for Mobile Clients.

Источник: http://www.opennet.ru/opennews/art.shtml?num=33849