Запомните, что это значение backlog указывает только на максимальное количество соединений, поставленных в очередь для одной слушающей конечной точки, все из которых уже приняты TCP и ожидают того, чтобы быть принятыми приложением. Значение backlog не оказывает какого-либо влияния на максимальное количество соединений, которое может быть установлено системой, или на количество клиентов, которое может обслужить конкурентный сервер.
Значения для Solaris на этом рисунке именно такие, как мы и ожидали. Традиционные значения для BSD (по каким-то непонятным причинам) равны значению backlog, умноженному на 3, поделенному на 2, плюс 1.
Мы можем посмотреть этот сценарий с использованием программы 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