TCP-IP крупным планом

       

Максимальное количество принимаемых



Рисунок 18.23 Максимальное количество принимаемых соединений для слушающей конечной точки.

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

Значения для Solaris на этом рисунке именно такие, как мы и ожидали. Традиционные значения для BSD (по каким-то непонятным причинам) равны значению backlog, умноженному на 3, поделенному на 2, плюс 1.

  • Если в очереди для данной слушающей конечной точки есть место для нового соединения (см. рисунок 18.23), TCP модуль подтверждает (ACK) пришедший SYN и устанавливает соединение. Приложение сервера со слушающей конечной точкой не увидит этого нового соединения до тех пор, пока не будет принят третий сегмент из "трехразового рукопожатия". Также клиент может считать, что сервер готов принять данные, когда активное открытие клиента завершено успешно, перед тем как приложение сервера будет уведомлено о новом соединении. (Если это произойдет, сервер TCP просто поставит в очередь входящие данные.)
  • Если не хватает места, для того чтобы поставить в очередь новое соединение, TCP просто игнорирует принятый SYN. В ответ ничего не посылается (не посылается даже RST сегмент). Если слушающий сервер не может отказаться от приема некоторых уже принятых соединений, которые заполнили собой очередь до предела, активное открытие клиента будет прервано по тайм-ауту.
  • Мы можем посмотреть этот сценарий с использованием программы sock. Запустим ее с новой опцией (-O), которая сообщает о необходимости сделать паузу после создания слушающей конечной точки, перед приемом любого запроса на соединение. Если затем мы запустим несколько клиентов в течение этой паузы, сервер будет вынужден поставить в очередь принятые соединения, а то, что произойдет, мы увидим с использованием команды tcpdump.

    bsdi % sock -s -v -q1 -O30 5555

    Опция -q1 устанавливает backlog слушающей конечной точки в значение 1, для традиционной BSD системы это будет соответствовать двум запросам на соединение (рисунок 18.23). Опция -O30 заставляет программу "проспать" 30 секунд перед приемом любого соединения от клиента. Это дает нам 30 секунд, чтобы стартовать несколько клиентов, которые заполнят очередь. Мы стартуем четырех клиентов на хосте sun.

    На рисунке 18.24 показан вывод программы tcpdump, этот вывод начинается с первого SYN от первого клиента. (Мы удалили объявления размера окна и объявления MSS. Также мы выделили номера портов клиента жирным шрифтом, когда TCP соединение устанавливается - "трехразовое рукопожатие".)

    Первый запрос на соединение от клиента, пришедший с порта 1090, принимается TCP модулем (сегменты 1-3). Второй запрос на соединение от клиента с порта 1091 также принимается TCP модулем (сегменты 4-6). Приложение сервера все еще "спит" и не приняло ни одного соединения. Все проделанное было осуществлено TCP модулем в ядре. Также надо отметить, что два клиента успешно осуществили активное открытие, то есть "трехразовое рукопожатие" было успешно завершено.


    1 0.0 sun.1090 > bsdi.7777: S 1617152000:1617152000(0)
    2 0.002310 ( 0.0023) bsdi.7777 > sun.1090: S 4164096001:4164096001(0)
    3 0.003098 ( 0.0008) sun.1090 > bsdi.7777: . ack 1617152001
    ack 1
    4 4.291007 ( 4.2879) sun.1091 > bsdi.7777: S 1617792000:1617792000(0)
    5 4.293349 ( 0.0023) bsdi.7777 > sun.1091: S 4164672001:4164672001(0)
    ack 1617792001
    6 4.294167 ( 0.0008) sun.1091 > bsdi.7777: . ack 1
    7 7.131981 ( 2.8378) sun.1092 > bsdi.7777: S 1618176000:1618176000(0)
    8 10.556787 ( 3.4248) sun.1093 > bsdi.7777: S 1618688000:1618688000(0)
    9 12.695916 ( 2.1391) sun.1092 > bsdi.7777: S 1618176000:1618176000(0)
    10 16.195772 ( 3.4999) sun.1093 > bsdi.7777: S 1618688000:1618688000(0)
    11 24.695571 ( 8.4998) sun.1092 > bsdi.7777: S 1618176000:1618176000(0)
    12 28.195454 ( 3.4999) sun.1093 > bsdi.7777: S 1618688000:1618688000(0)
    13 28.197810 ( 0.0024) bsdi.7777 > sun.1093: S 4167808001:4167808001(0)
    14 28.198639 ( 0.0008) sun.1093 > bsdi.7777: . ack 1618688001
    ack 1
    15 48.694931 (20.4963) sun.1092 > bsdi.7777: S 1618176000:1618176000(0)
    16 48.697292 ( 0.0024) bsdi.7777 > sun.1092: S 4170496001:4170496001(0)
    ack 1618176001
    17 48.698145 ( 0.0009) sun.1092 > bsdi.7777: . ack 1



    Содержание раздела