Как работает сервер ICQ (нельзя открыть более65535 портов)?
От: FractalizeR  
Дата: 26.11.06 13:53
Оценка:
Добрый день.

Меня вот заинтересовал такой вопрос. Как же работают популярные серверы мгновенных сообщений типа ICQ, Skype, если один сервер не может держать открытыми более 65535 портов одновременно (каждое клиентское подключение занимает один порт)? Ведь в каждый момент времени каждый сервер имеет миллионы клиентов онлайн.
Re: Как работает сервер ICQ (нельзя открыть более65535 порто
От: denisio_mcp  
Дата: 26.11.06 13:59
Оценка:
Здравствуйте, FractalizeR, Вы писали:

FR>Меня вот заинтересовал такой вопрос. Как же работают популярные серверы мгновенных сообщений типа ICQ, Skype, если один сервер не может держать открытыми более 65535 портов одновременно (каждое клиентское подключение занимает один порт)? Ведь в каждый момент времени каждый сервер имеет миллионы клиентов онлайн.


один из вариантов: login сервер переадресовывает запрос на подключение на один из виртуальных серверов в кластере.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re: Как работает сервер ICQ (нельзя открыть более65535 порто
От: Michael Chelnokov Украина  
Дата: 26.11.06 14:01
Оценка:
Здравствуйте, FractalizeR, Вы писали:

FR>Меня вот заинтересовал такой вопрос. Как же работают популярные серверы мгновенных сообщений типа ICQ, Skype, если один сервер не может держать открытыми более 65535 портов одновременно (каждое клиентское подключение занимает один порт)? Ведь в каждый момент времени каждый сервер имеет миллионы клиентов онлайн.


Все очень просто. Там далеко не один сервер и/или на серверах далеко не по одному интерфейсу.
Re[2]: Как работает сервер ICQ (нельзя открыть более65535 по
От: FractalizeR  
Дата: 26.11.06 14:02
Оценка:
_>один из вариантов: login сервер переадресовывает запрос на подключение на один из виртуальных серверов в кластере.

Да, это возможно. Но.... Я только что зашел в Скайп. Он показывает — 6 530 813 пользователей онлайн. Что составит примерно 100 серверов.Неужели у них датацентр такой?
Re[3]: Как работает сервер ICQ (нельзя открыть более65535 по
От: Michael Chelnokov Украина  
Дата: 26.11.06 14:08
Оценка:
Здравствуйте, FractalizeR, Вы писали:

_>>один из вариантов: login сервер переадресовывает запрос на подключение на один из виртуальных серверов в кластере.


FR>Да, это возможно. Но.... Я только что зашел в Скайп. Он показывает — 6 530 813 пользователей онлайн. Что составит примерно 100 серверов.Неужели у них датацентр такой?


Если один сервер выгребает такое количество клиентов, то просто назначают N IP-адресов на один интерфейс. Так что там может быть не 100 серверов, а 10 и по 10 IP-адресов на каждый. Ессно, ядро ОС в этом случае должно быть настроено на возможность открытия, скажем, миллиона файлов (сокетов).
Re[4]: Как работает сервер ICQ (нельзя открыть более65535 по
От: FractalizeR  
Дата: 26.11.06 14:13
Оценка:
MC>Если один сервер выгребает такое количество клиентов, то просто назначают N IP-адресов на один интерфейс. Так что там может быть не 100 серверов, а 10 и по 10 IP-адресов на каждый. Ессно, ядро ОС в этом случае должно быть настроено на возможность открытия, скажем, миллиона файлов (сокетов).

Да, похоже, вы правы. Это логично.
Re: Как работает сервер ICQ (нельзя открыть более65535 порто
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.11.06 14:18
Оценка: 2 (2) +4
Здравствуйте, FractalizeR, Вы писали:

FR>Добрый день.


FR>Меня вот заинтересовал такой вопрос. Как же работают популярные серверы мгновенных сообщений типа ICQ, Skype, если один сервер не может держать открытыми более 65535 портов одновременно (каждое клиентское подключение занимает один порт)? Ведь в каждый момент времени каждый сервер имеет миллионы клиентов онлайн.


Хехе. Вот например SMTP-сервер. К нему соединились на порт 25. Вы думаете, это только запрос пошёл на 25-й, а соединение установлено с другим портом? Нет, всё с тем же 25.

Установленные соединения для TCP определяются четырьмя параметрами — {хост1, порт1, хост2, порт2}. Если хост1, порт1 зафиксированы (как у обычного сервера), хост2 и порт2 могут быть любыми и от этого конфликта не возникает. Потому и не нужно на каждое такое соединение свой порт заводить. И соединений может быть хоть миллион, всё равно с серверной стороны достаточно одного хоста и порта.

(Впрочем, в случае ICQ вполне возможно, что там ещё специальный переходник "разбрасывает" соединения на разные внутренние хосты в зависимости, например, от хэша построенного на {хост2, порт2}. Ничего в стеке этому не противоречит.)
The God is real, unless declared integer.
Re: Как работает сервер ICQ (нельзя открыть более65535 порто
От: _vvs Россия  
Дата: 26.11.06 22:33
Оценка:
Как точно работает ICQ сервер не скажу
Но то, что он использует несколько серверов для распределения нагрузки — 100%
Это хорошо видно на серверах, на которых установлен прокси, через который по протоколу ICQ общаются пользователи вашей сети
Если в 2-х словах, то в протоколе ICQ это реализовано следующим образом. Сначала вы в рамках протокола ICQ соединяетесь с ICQ сервером login.icq.com. Данный сервер выдает вам адрес сервера (называется BOS-сервером), через который вы будете вести всё свое дальнейшее общение

Здравствуйте, FractalizeR, Вы писали:

FR>Добрый день.


FR>Меня вот заинтересовал такой вопрос. Как же работают популярные серверы мгновенных сообщений типа ICQ, Skype, если один сервер не может держать открытыми более 65535 портов одновременно (каждое клиентское подключение занимает один порт)? Ведь в каждый момент времени каждый сервер имеет миллионы клиентов онлайн.
Re: Как работает сервер ICQ (нельзя открыть более65535 порто
От: TarasCo  
Дата: 27.11.06 07:43
Оценка:
Здравствуйте, FractalizeR, Вы писали:

FR>Добрый день.


FR>Меня вот заинтересовал такой вопрос. Как же работают популярные серверы мгновенных сообщений типа ICQ, Skype, если один сервер не может держать открытыми более 65535 портов одновременно (каждое клиентское подключение занимает один порт)? Ведь в каждый момент времени каждый сервер имеет миллионы клиентов онлайн.


По моему, icq сервер использует набор фиксированных портов ( 5190 и еще несколько ). Соответственно, абстрактный сервер с абстрактной ОС сможет обслуживать любое количество клиентов. Естественно, в реальной жизни будет ограничение — на число одновременно установленных ТСР соединений. Но с номерами портов это никак не связано. scype думается мне, также использует фиксированный порт.
Да пребудет с тобою сила
Re[2]: Как работает сервер ICQ (нельзя открыть более65535 по
От: FractalizeR  
Дата: 27.11.06 14:52
Оценка:
N>Хехе. Вот например SMTP-сервер. К нему соединились на порт 25. Вы думаете, это только запрос пошёл на 25-й, а соединение установлено с другим портом? Нет, всё с тем же 25.

Я не совсем понимаю этот механизм установки соединения. Вы не могли бы мне разъяснить? Я задавал этот вопрос на нескольких форумах и убедился, что в основной массе народ не понимает этого механизма.

Сервер. К нему коннектятся клиенты на порт, скажем, 3306. Разве для приема подключения от клиента не выделяется другой локальный порт?
Re[3]: Как работает сервер ICQ (нельзя открыть более65535 по
От: TarasCo  
Дата: 27.11.06 14:58
Оценка:
Здравствуйте, FractalizeR, Вы писали:

Позапускайте утилиту netstat -na при работе сетевых приложений. Возможно, вопросы сами уйдут
Да пребудет с тобою сила
Re[3]: Как работает сервер ICQ (нельзя открыть более65535 по
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 27.11.06 15:12
Оценка: 59 (8)
Здравствуйте, FractalizeR, Вы писали:

N>>Хехе. Вот например SMTP-сервер. К нему соединились на порт 25. Вы думаете, это только запрос пошёл на 25-й, а соединение установлено с другим портом? Нет, всё с тем же 25.


FR>Я не совсем понимаю этот механизм установки соединения. Вы не могли бы мне разъяснить? Я задавал этот вопрос на нескольких форумах и убедился, что в основной массе народ не понимает этого механизма.


Я не знаю, как разъяснить, потому что не понимаю, что тут непонятно.:)) Уточните вопрос.

FR>Сервер. К нему коннектятся клиенты на порт, скажем, 3306. Разве для приема подключения от клиента не выделяется другой локальный порт?


_Порт_ — не выделяется. Выделяется _сокет_ (в модели BSD sockets), endpoint (в модели TLI/XTI). Но у этого сокета оказывается локальный адрес (хост, порт) такой же как у слушающего.

Пожалуй, чтобы понять это, надо понять следующие вещи:

1. Устанавливаемое, установленное или заканчивающееся соединение идентифицируется 4-мя параметрами: {хост1, порт1, хост2, порт2} и соединение с такими четырьмя параметрами может быть (для хост1, хост2) только одним. Совпадение номера порта с одной стороны с номером порта какого-то другого соединения не имеет никакого значения: идентификация соединения идёт по всем четырём параметрам.
Так как сокет установленного TCP соединения не может быть переделан во что-то другое — можно только закрыть его и соединение — тут конфликта нет.

2. Сокет слушающий — это другой тип сокета. У него есть только локальный адрес (хост и порт, причём хост может быть INADDR_ANY). Но когда приходит запрос на соединение и если этот запрос начинает отрабатываться положительно (то есть сервер принимает это соединение) — мы уже имеем дело со всеми четырьмя параметрами, то есть получается случай 1.
Поэтому может получиться картина вот такого вот типа (живой листинг из FreeBSD, только адреса замаскированы)

d6822140 tcp4 0 48 10.0.0.107.25 10.0.0.11.57138 ESTABLISHED
d6834c80 tcp4 0 0 10.0.0.107.25 192.168.32.30.62075 ESTABLISHED
d67eb3c0 tcp4 0 0 10.0.0.107.25 10.0.0.133.62261 ESTABLISHED
d685c700 tcp4 0 0 10.0.0.107.25 10.0.0.104.55962 ESTABLISHED

первая колонка — адрес структуры сокета в ядре, пятая — локальный адрес (a.b.c.d.порт), шестая — удалённый.
Здесь 4 живых соединения — у всех локальный адрес 10.0.0.107:25 — на нём сервер принимает соединения. А удалённые адреса при этом все разные. И процессы все разные, в общем случае могут даже принадлежать разным пользователям.

А теперь почему при исходящих соединениях все порты разные (что Вас наверняка и привело к идее что все порты всегда разные). Вообще-то это недооптимизация. Исходящие соединения могут быть с заранее заданным локальным адресом (тут понятно, что нужен свой отдельный порт) и без заранее заданного (таких большинство). Так вот, во втором случае никто не мешает в принципе всем таким назначить такой порт, что среди занятых другими соединениями и удалённые адреса не совпадают (а то был бы конфликт идентификации соединений). Например, если один установил коннект с 10.0.0.107:25, а ему дали локальный 10.0.0.200:1024; второй — на 10.0.0.106:25, ему дали тот же 10.0.0.200:1024; третий — снова на 10.0.0.107:25, ему нельзя дать такой же, дают 10.0.0.200:1025. Да, можно и так сэкономить порты. Просто пока никого настолько не припекло. А вот если локальный порт зафиксирован (например, сообщить в другом соединении о разрешении файрволлу) — опаньки, такое занимать уже нельзя, потому что может быть конфликт соединений в будущем.

И, наконец, для UDP такой идентификации соединений и разбрасывания по сокетам и процессам не получится — поэтому там одному порту соответствует один сокет, или же начнутся дикие извраты с балансировкой. Вот там бывает, что договариваются о других портах. Но это уже явный договор, а не происки ядра.

Я понятно рассказал?
The God is real, unless declared integer.
Re[3]: Как работает сервер ICQ (нельзя открыть более65535 по
От: Аноним  
Дата: 28.11.06 02:38
Оценка:
FR>Я не совсем понимаю этот механизм установки соединения. Вы не могли бы мне разъяснить? Я задавал этот вопрос на нескольких форумах и убедился, что в основной массе народ не понимает этого механизма.
Стивенса потому что не читали. Читай Стивенса; там все об этом хорошо написано.

FR>Сервер. К нему коннектятся клиенты на порт, скажем, 3306. Разве для приема подключения от клиента не выделяется другой локальный порт?

Не выделяется.
Re[4]: Как работает сервер ICQ (нельзя открыть более65535 по
От: FractalizeR  
Дата: 28.11.06 10:14
Оценка:
Здравствуйте, Аноним, Вы писали:

FR>>Я не совсем понимаю этот механизм установки соединения. Вы не могли бы мне разъяснить? Я задавал этот вопрос на нескольких форумах и убедился, что в основной массе народ не понимает этого механизма.

А>Стивенса потому что не читали. Читай Стивенса; там все об этом хорошо написано.

Что за книгу вы имеете ввиду?
Re[5]: Как работает сервер ICQ (нельзя открыть более65535 по
От: Аноним  
Дата: 28.11.06 10:25
Оценка:
Здравствуйте, FractalizeR, Вы писали:

FR>Здравствуйте, Аноним, Вы писали:


FR>>>Я не совсем понимаю этот механизм установки соединения. Вы не могли бы мне разъяснить? Я задавал этот вопрос на нескольких форумах и убедился, что в основной массе народ не понимает этого механизма.

А>>Стивенса потому что не читали. Читай Стивенса; там все об этом хорошо написано.

FR>Что за книгу вы имеете ввиду?


не иначе эту ВЕЩЬ: http://www.ozon.ru/context/detail/id/1390985/
Re[3]: peer2peer
От: remark Россия http://www.1024cores.net/
Дата: 30.11.06 16:32
Оценка: 6 (2)
Здравствуйте, FractalizeR, Вы писали:

_>>один из вариантов: login сервер переадресовывает запрос на подключение на один из виртуальных серверов в кластере.


FR>Да, это возможно. Но.... Я только что зашел в Скайп. Он показывает — 6 530 813 пользователей онлайн. Что составит примерно 100 серверов.Неужели у них датацентр такой?


В Скайп нет серверов — это peer2peer — каждый клиентский компьютер — сервер. В т.ч. и твой Если он не за NAT.
Именно в этом причина его безграничной масштабируемости и возможности поддерживать миллионы клиентов.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: peer2peer
От: FractalizeR  
Дата: 30.11.06 17:46
Оценка: +2
R>В Скайп нет серверов — это peer2peer — каждый клиентский компьютер — сервер. В т.ч. и твой Если он не за NAT.
R>Именно в этом причина его безграничной масштабируемости и возможности поддерживать миллионы клиентов.

Вы не правы. Как тогда я могу отправить сообщение на скайп своего друга? Кто подскажет, на какой IP Skype должен отправить сообщение? Кто уведомит меня о том, что мой друг вышел online с такого-то IP? Кто обеспечит поддержку UDP hole punching, чтобы клиенты, которые оба сидят за NAT могли обмениваться сообщениями? Кто обеспечит поддержку SkypeOut, SkypeIn?
Re[5]: peer2peer
От: remark Россия http://www.1024cores.net/
Дата: 04.12.06 16:00
Оценка:
Здравствуйте, FractalizeR, Вы писали:

R>>В Скайп нет серверов — это peer2peer — каждый клиентский компьютер — сервер. В т.ч. и твой Если он не за NAT.

R>>Именно в этом причина его безграничной масштабируемости и возможности поддерживать миллионы клиентов.

FR>Вы не правы. Как тогда я могу отправить сообщение на скайп своего друга? Кто подскажет, на какой IP Skype должен отправить сообщение? Кто уведомит меня о том, что мой друг вышел online с такого-то IP? Кто обеспечит поддержку UDP hole punching, чтобы клиенты, которые оба сидят за NAT могли обмениваться сообщениями? Кто обеспечит поддержку SkypeOut, SkypeIn?


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

По поводу SkypeOut, SkypeIn — тут, конечно, определённо должны быть традиционные сервера.
А вот по поводу всего остального — вопрос. К сожалению в своё время не смог найти детальной информации. Вполне возможно, что все остальные роли выполняют peer-компьютеры. Локация которых происходит по некоторым алгоритмым.

Кто обеспечит поддержку UDP hole punching, чтобы клиенты, которые оба сидят за NAT могли обмениваться сообщениями


Например, твой компьютер
Смотри выше — уже писал.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: peer2peer
От: FractalizeR  
Дата: 04.12.06 17:07
Оценка:
R>Определённые сервера, конечно, есть. Но они только являются инфраструктурной поддержкой, они не являются серверами в традиционном смысле этого слова, т.е. все не направляют к ним все запросы.

Если обмен сообщениями между клиентами невозможен в силу того, например, что оба клиента находятся за NAT сервер должен транслировать эти сообщения обоим клиентам. Кто-то должен проверять логин клиента при его подключении и обеспечить безопасность соединения, чтобы один клиент не выдал себя за другого. Эти серверы являются основными серверами Skype сети, без которых сеть не сможет работать.

R>А вот по поводу всего остального — вопрос. К сожалению в своё время не смог найти детальной информации. Вполне возможно, что все остальные роли выполняют peer-компьютеры. Локация которых происходит по некоторым алгоритмым.

Какие все остальные роли? Как можно произвести локацию клиентского компьютера, имея только Nickname клиента в Skype? Никак.

R>

R>Кто обеспечит поддержку UDP hole punching, чтобы клиенты, которые оба сидят за NAT могли обмениваться сообщениями


R>Например, твой компьютер

R>Смотри выше — уже писал.

Разумеется, мой компьютер этого сделать не сможет. Ему может даже быть неизвестен адрес гейта NAT в интернет. Мне кажется, вы плохо представляете себе как происходит обмен информацией между клиентами, находящимися за NAT. Попробуйте прочитать вот это: http://www.brynosaurus.com/pub/net/p2pnat/
Re[7]: peer2peer
От: remark Россия http://www.1024cores.net/
Дата: 04.12.06 17:43
Оценка: 10 (1)
Здравствуйте, FractalizeR, Вы писали:

R>>Определённые сервера, конечно, есть. Но они только являются инфраструктурной поддержкой, они не являются серверами в традиционном смысле этого слова, т.е. все не направляют к ним все запросы.


FR>Если обмен сообщениями между клиентами невозможен в силу того, например, что оба клиента находятся за NAT сервер должен транслировать эти сообщения обоим клиентам.


Да. Только в роли сервера в Skype не выступает некий Сервер_Который_Специально_Для_Этого_Установил_Skype. В роли сервера выступает любой peer-компьютер, (1) на который установлен Skype, (2) которой сам не находится за NAT. Вопрос его локации — отдельный вопрос. В этом может посодействовать какой-то централизованный Сервер_Который_Специально_Для_Этого_Установил_Skype, либо это может быть peer-компьютер, который выбран в качестве сервера, или его адрес может быть банально кэширован, тогда вообще никаких обращений ни к каким централизованным серверам не будет. Но даже если для локации компьютера-посредника было обращение к центролизованному серверу, всё остальное будет обрабатываться уже посредником. Т.о. централизованным серверам не надо держать миллионы коннектов.


FR>Кто-то должен проверять логин клиента при его подключении и обеспечить безопасность соединения, чтобы один клиент не выдал себя за другого. Эти серверы являются основными серверами Skype сети, без которых сеть не сможет работать.


Что будет, если американские телекоммуникационные компании лоббируют закон, что бы все американские интернет-провайдеры закрыли доступ к Skype-серверам? Skype будет недоступен в Америке? А вот и неправильно! Skype будет работать как работал!


FR>Разумеется, мой компьютер этого сделать не сможет. Ему может даже быть неизвестен адрес гейта NAT в интернет. Мне кажется, вы плохо представляете себе как происходит обмен информацией между клиентами, находящимися за NAT. Попробуйте прочитать вот это: http://www.brynosaurus.com/pub/net/p2pnat/


Похоже это Вы плохо представляете как работают p2p
Скайп установлен? Посмотри лицензионное соглашение повнимательнее. Строчки типа "... через пользовательский компьютер может проходить служебный трафик системы Skype..." Как ты думаешь, о чём это?



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.