2

Я использую ноутбук Mac OS через обычную (то есть дрянную) беспроводную домашнюю сеть и подключаюсь к работе через VPN. Я ssh на рабочий стол Linux (Ubuntu) у меня в офисе на работе. (Когда я говорю "я ssh": я нажимаю на кнопку, которая говорит мне, что он будет использовать "ssh", и открывается окно "Терминал", и он заходит на мой рабочий стол.)

Часто (до нескольких раз в день), когда я использую 'vim', 'vim' перестает отвечать, а через минуту или две, соединение с моим рабочим столом прерывается, и Терминал сообщает мне, что соединение разорвано , Я часто открываю на своем рабочем столе несколько окон терминала, и только окно терминала, где я использую 'vim', будет разбито. Другие окна остаются подключенными и пригодными для использования.

Недавно я использовал tcpdump для отслеживания пакетов, идущих туда-сюда, и я записал трассировку, где мой сеанс vim завис и завершился. За пару минут до сбоя пакеты с моего рабочего стола приходили с постоянно уменьшающимися размерами окна, пока мы не достигли нуля, а соединение разорвалось чуть позже.

Я почти мог понять, что, скажем, я вошел в режим вставки и начал печатать символы, когда рабочий стол висел, и я заполнил окно, набрав, пока мой рабочий стол был испорчен. Начальный размер окна был около 12500, и каждый символ, который я набираю, кажется, генерирует 48-байтовый пакет, поэтому где-то около 250 символов может заполнить буфер tcp.

Однако, когда vim зависает, это больше похоже на то, что я делаю постраничную перемотку (control-f), затем вхожу в режим вставки и начинаю набирать несколько символов. Мои команды и символы отображаются, указывая, что vim получает и обрабатывает символы.

Мне не ясно, где находится буфер tpc между сокетом и vim. Предположительно, драйвер tty на самом деле выбирает символы из буфера tcp, возвращает их мне, передает их в vim и передает вывод из vim мне. Но все эти действия извлекут байты из буфера tcp, и размер окна не станет равным нулю.

Что я не понимаю о том, как работает программный стек, и почему размер моего окна становится равным нулю, и как я могу обойти или устранить проблему?

Бонусные вопросы:

1) Почему мой рабочий стол устанавливает размер окна около 12 500 вместо 64 КБ?

2) При использовании tcpdump на Mac я не получаю вывод, если использую выражения "host hostname", "host ipaddress" или "port 22" (где "hostname" и "ipaddress" заменяются на имя или IP-адрес моего рабочего стола). Если я не укажу одно из этих выражений, я получу много выходных данных, и выходные данные явно будут содержать имя хоста, ipaddress или порт, который я указал в командной строке. Есть ли что-то особенное на Mac, где tcpdump не работает? Есть ли стандартный способ испортить командную строку, и я запутался в том, что я прошу tcpdump?

спасибо, Cs

1 ответ1

0

Во-первых, размер окна TCP не является буфером, это порог подтверждения. Узел, принимающий трафик, будет отправлять только ACK-пакет каждые x пакетов. В надежной сети это число должно быть как можно большим для пропускной способности - компромисс заключается в том, что в случае потери некоторых данных все окно должно быть передано повторно ... Обычно это приводит к тому, что стек TCP постепенно уменьшает размер окна, чтобы избежать необходимости повторной передачи такого большого количества данных в случае будущей потери пакета. Существует компонент, связанный с доступной памятью (приемные буферы), но в современных системах это в основном не имеет значения. Википедия

Основной причиной этой проблемы, вероятно, является плохое сетевое соединение. VPN могут часто иметь высокую задержку и / или потерю пакетов, как и беспроводные сети. Как эксперимент, проблема улучшается / решается, если вы подключаетесь через беспроводную линию?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .