Кнопка прерывания клиента
Кнопка прерывания клиента
Давайте рассмотрим еще один пример, в котором TCP использует режим срочности, когда поток данных остановлен с помощью символа прерывания. В этом примере сведены вместе несколько алгоритмов TCP, которые мы обсуждали ранее: режим срочности, предотвращение "глупого" окна, управление потоком данных с помощью окон и устойчивого таймера. Мы стартовали клиента на хосте sun. Затем зашли терминалом на bsdi, вывели на терминал большой текстовый файл, а затем остановили вывод, нажав Control-S. Когда вывод остановлен, мы нажали клавишу прерывания (DELETE), чтобы завершить работу программы:
sun % rlogin bsdi
приветствие от операционной системы
bsdi % cat /usr/share/misc/termcap вывод большого файла на терминал
большой вывод на терминал
мы печатаем Control-S, чтобы остановить вывод,
и ожидаем до тех пор, пока вывод не остановится
^? вводим символ прерывания, он отображается эхом
bsdi % затем появляется приглашение
Ниже описаны состояния клиента, сервера и соединения.
- Вывод на терминал остановлен путем ввода Control-S.
- Rlogin клиент приостановил вывод на терминал, однако выходной буфер терминала будет заполнен.
- Rlogin клиент не может читать из сети, так как приемный буфер TCP клиента полон.
- TCP клиент объявляет размер окна равный 0, чтобы остановить отправителя (TCP модуль Rlogin сервера), когда приемный буфер полон.
- TCP модуль сервера отправляет сообщение о заполнении буфера, когда его вывод остановлен сообщением от клиента о том, что размер окна равен 0.
- Сервер Rlogin остановлен, так как отправляющий буфер полон. Таким образом, сервер Rlogin не может читать данные от приложения, которое запущено на сервере (cat).
- Приложение cat останавливается, когда его выходной буфер наполняется.
- Затем мы вводим символ прерывания, чтобы остановить работу приложения cat на сервере. Это отправляется от TCP клиента к TCP серверу, потому что поток данных в этом направлении не остановлен с помощью контроля потока данных.
- Приложение cat получает символ прерывания и прекращает свою работу. При этом его выходной буфер (из которого читал сервер Rlogin) очищается, после чего "просыпается" сервер Rlogin. Сервер Rlogin входит в режим срочности и посылает клиенту команду "очистить вывод" (0x02).
На рисунке 26.6 показан поток данных от сервера к клиенту. (Номера последовательности взяты из временной диаграммы, которую мы покажем чуть ниже.)
Содержание раздела