Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СистПриклПрогЗабез(Хихловская).doc
Скачиваний:
28
Добавлен:
10.02.2016
Размер:
961.02 Кб
Скачать

Аккуратное размыкание соединение

В работе TCP – соединения есть три фазы:

  1. Установление соединения

  2. Передача данных

  3. Разрыв соединения

Так как TCP –соединения полудуплексные, потоки данных в разных направлениях не зависят друг от друга.

Например, клиент может соединиться с сервером, отправить серию запросов и закрыть свою половину соединения, предоставив серверу информацию о том, что больше запросов не будет. Сервер может продолжать посылать данные после того, как клиент прекратил отправлять запросы.

С другой стороны сервер может посылать в ответ сколько угодно данных, и клиент не знает заранее, когда ответ закончится, и тогда сервер закроет свой конец соединения, сигнализируя о конце передачи. После закрытия сервером своего конца соединения, TCP завершает фазу разрыва, чем сообщает клиенту о прекращении передачи данных.

Вызов shutdown

Используется как вызов close, но при этом передаётся дополнительный параметр, означающий, какую сторону закрыть.

#include<sys socket.h>

#int shutdown(int s,int how)

Возвращаемые значения:0-нормально, 1-ошибка.

How=0-закрывается принимающая сторона соединения. В UNIX все полученные после выполнения данные уничтожаются.

How=1-закрывается отправляющая сторона соединения. В сокете делается отметка, что данные посылаться больше не будут.

How=2-закрываются обе стороны соединения.

При выполнении shutdown не закрывает сокет по настоящему, так как ресурсы не освобождаются.

Алгоритм Найгла

Алгоритм Найгла предложен в 1984г. и влияет на стратегию отправки TCP-регулирует количество передаваемых по сети данных, достигая наиболее эффективного использования полосы пропускания. TCP посылает данные блоками, размер которых равен MSS-максимальный размер сегмента. При установлении соединения TCP может указать максимальный размер сегмента(MSS), но не больше, чем разрешено окном передачи. Для того, чтобы избежать перегрузки сети и затора (при превышении памяти маршрутизатора дейтограммы отбрасываются), а повторные передачи ещё больше загрузят сеть, используют два окна – окно передачи и окно перегрузки. Окно передачи, объявляемое TCP на клиентской стороне, предохраняет от переполнения его буферов. Окно перегрузки на серверной стороне не даёт превысить пропускную способность сети. Если ограничить объём передачи минимальным из этих окон, то оба требования управления потоком будут удовлетворены. Это алгоритм –медленный старт. Второй алгоритм –Найгла -требует, чтобы в TCP не было более одного неподтверждённого маленького сегмента менее MSS. Цель алгоритма Найгла - не дать TCP последовательностью мелких сегментов, а сохраняет в своих буферах небольшие блоки данных, пока не получит подтверждение на предыдущий маленький сегмент. При каждом вызове процедуры вывода TCP вычисляет объём данных, которые можно послать. Это минимальное значение количества данных в буфере передачи, размера окон передачи и перегрузки и MSS. Данные отправляются при выполнении хотя бы одного из следующих условий:

  1. можно послать полный сегмент размером MSS

  2. соединение простаивает и можно освободить буфер передачи

  3. алгоритм Найгла отключён и можно опустошить буфер передачи

  4. есть срочные данные для отправки

  5. есть маленький сегмент, но его отправка уже задержана на длительный срок

  6. окно приёма, объявленное на приёмной стороне открыть не менее чем наполовину

  7. необходимо повторно передать сегмент

  8. требуется послать ACK на принятые данные

Алгоритм Найгла нужно иметь возможность отключить, так как он уменьшает производительность const int on=1;

Setsockopt(s,IPPROTO_TCP,TCP_NODELAY,&on,sizeof(on));