netch80: (Default)
[personal profile] netch80
Исследовал SCTP.
После наступания на практически все заботливо разложенные грабли решил описать траекторию и цвета искр в глазах, начиная с самого чайниковского.

1. Есть сокеты one-to-one и one-to-many. Их не следует путать с тем, сколько адресов на конце у каждой ассоциации: может быть one-to-one на много адресов и one-to-many на один адрес.

One-to-one - значит, может быть только одна ассоциация. При передаче не обязательно указывать, по какой передаёшь и почему, а при приёме - с какой получено. One-to-many - напоминает старый добрый UDP - общаешься с кем хочешь, но не забывай про цену - тут на каждого другого есть состояние в памяти.

2. SOCK_STREAM - это не поток, как в TCP, несмотря на название. Это всего лишь one-to-one сокет. Почему STREAM - видимо, констант не хватило. Сообщения, приходящие в него, всё равно не склеиваются. (Я вначале подумал, что назначил бы иначе - SEQPACKET для one-to-one и DGRAM для one-to-many. Было бы немного логичнее.)

3. sctp_send(), sctp_sendx() работают только при уже готовой ассоциации. Если такой ещё нет, функция обломится с совершенно невнятной диагностикой. Это значит, что первая посылка на one-to-many через них недопустима и надо использовать sctp_sendmsg[x](). А лучше - использовать её всегда для таких сокетов.

4. На one-to-many сокете передавать надо, как сказано выше, через sctp_sendmsg(). Это создаёт ассоциацию, если её ещё не было - но у этой функции нет возврата номера созданной ассоциации. Зовите sctp_getassocid(), если он нужен. Сравнивайте адреса, как в старом добром UDP.

5. У one-to-many сокета, если не сделать listen(), он не будет принимать новые ассоциации по входящим запросам. Однако логично.

6. Номер потока не может быть произвольным, они считаются от 0 до максимума. По умолчанию дают только 10 потоков - с 0 до 9. (FreeBSD: sysctl net.inet.sctp.outgoing_streams) Можно увеличивать желаемое (через sockopt SCTP_INITMSG), вопрос в том, насколько удобно получится с этим работать.

7. Поле ppid надо сохранять и извлекать с помощью htonl() и ntohl(). Ну или воспринимать его просто как char[4]. В мане написано специально, чтобы запутать: "Note that the stack passes this value without regard to byte order." Кроме того, есть рекомендации IANA по значениям для него - чтобы помогать расшифровке в случае чего. Не вижу глубокого смысла ставить его по этим рекомендациям, но можно использовать в качестве своего внешнего тега.

8. Поле assoc_id имеет выделенное значение 0 - "моя не знай", допустимо при передаче. Использовать одновременно адреса и assoc_id от разных ассоциаций я не пробовал - боюсь, порвётся.

9. Не забывать включать получение sctp_sndrcvinfo через SCTP_EVENTS (sctp_event_subscribe::sctp_data_io_event=1). FreeBSD по умолчанию его доставляет, а вот Linux - нет.

Возможно, to be continued.

Date: 2010-09-19 08:44 am (UTC)
From: [identity profile] mtve.livejournal.com
n) ppid можно выставить только в какой-то одной из sctp_send* функций (забыл детали);
n+1) тонкости различий linux/bsd/sunos будут непрерывно доставлять, начиная с sctp.h и далее.

Date: 2010-09-19 02:12 pm (UTC)
From: [identity profile] netch80.livejournal.com
Хм, на уровне C я таких проблем с ppid не вижу.
У одних функций оно в основном списке аргументов, у других - в структуре, но есть у всех.
Различия в заголовках - какие?

Date: 2011-02-06 01:08 pm (UTC)
From: [identity profile] nuclight.livejournal.com
> 7. Поле ppid надо сохранять и извлекать с помощью htonl() и ntohl().
> В мане написано специально, чтобы запутать: "Note that the stack passes
> this value without regard to byte order."
> Кроме того, есть рекомендации IANA по значениям для него - чтобы помогать
> расшифровке в случае чего. Не вижу глубокого смысла ставить его по этим
> рекомендациям, но можно использовать в качестве своего внешнего тега.

А кто-нибудь эти рекомендации массово соблюдает? Потому что поле так и напрашивается для использования не в качестве числа для htonl(), а как непосредственная команда протокола - HELO, AUTH, EPSV, DATA и т.д.

Date: 2011-02-06 01:27 pm (UTC)
From: [identity profile] netch80.livejournal.com
При использовании как команды протокола, думаю, могут всплыть проблемы с файрволлами и NAT'ами, которые ведут какой-то вид connection tracking.
Хотя на сейчас я не знаю ни одного такого средства, которое бы поддерживало SCTP.

Date: 2011-02-06 01:49 pm (UTC)
From: [identity profile] nuclight.livejournal.com
Гм, мысль интересная, вот только зачем такому средству учитывать PPID, если есть номер порта?

Одно такое средство, умеющее NAT SCTP, известно, в ОС с референсной имплементацией SCTP ;) и в alias_sctp.[ch] нет учета PPID.

Date: 2011-02-06 01:56 pm (UTC)
From: [identity profile] netch80.livejournal.com
> Гм, мысль интересная, вот только зачем такому средству учитывать PPID, если есть номер порта?

Посмотри список payload types. Существенная часть из них может не иметь фиксированного порта.

Но я тут подумал о другом: что без фиксированного порядка байт получается ерунда с этими шлюзами - не пытаться же опознать в обоих порядках байт?

> Одно такое средство, умеющее NAT SCTP, известно, в ОС с референсной имплементацией SCTP ;) и в alias_sctp.[ch] нет учета PPID.

Так ему или не нужно, или слишком сложно (как в случае H.323).

Date: 2011-02-06 02:13 pm (UTC)
From: [identity profile] nuclight.livejournal.com
> Посмотри список payload types. Существенная часть из них может не иметь фиксированного порта.

Большинство из них мне не знакомо, но исходный вопрос всё же в другом: таки зачем промежуточному шлюзу об этом знать? Это нарушает network transparency. В случае с TCP было понятно, дополнительные коннекты открывались, надо было адреса переписывать. Но в SCTP это же не нужно, потоки внутри ассоциации есть. Я вообще думаю, появись SCTP на 8 лет раньше, такой потребности в уходе от NAT к IPv6 не было бы...

> Но я тут подумал о другом: что без фиксированного порядка байт получается ерунда с этими шлюзами - не пытаться же опознать в обоих порядках байт?

Думается мне, авторы просто забыли это описать, а сам порядок вполне однозначен. Randall Stewart коммиттер же, rrs@ - напиши ему :)

> Так ему или не нужно, или слишком сложно (как в случае H.323).

Ну, я уже выше спросил, зачем это может быть нужно. С H.323 не знаком. И кому это не будет сложно?..

Date: 2011-12-26 09:37 am (UTC)
From: [identity profile] csredrat.livejournal.com
Защита и надёжность превыше всего. В наше время информация играет очень значительную роль в жизни. В связи с этим очень уместно было бы внедрение реализации протокола SCTP (http://ru.wikipedia.org/wiki/SCTP) (Stream Control Transmission Protocol — «протокол передачи с управлением потоком») в новую версию Windows (http://ru.wikipedia.org/wiki/Windows_8). Это обеспечит защиту от SYN-flood атак, безопасное установление подключения (с помощью четырёхэтапного квитирования), а также приятные нововведения в виде сохранения границ сообщения, многопоточность, неупорядоченная доставка, поддержка множественных интерфейсов. Внедрение данного протокола позволит вывести сети на новый уровень, увеличить скорость, надёжность, безопасность и возможности передачи данных по сети. Ведь новый протокол создавался с учётом недостатков устаревшего TCP, с учётом современных сетей и полного использования их возможностей, а также особое внимание было уделено надёжности и безопасности.

Давно пора продвигать протокол SCTP повсеместно! Учитывая нынешнее активное продвижение в сторону IPv6 (http://ru.wikipedia.org/wiki/IPv6). + массу полезностей из этого извлекает ещё один хороший протокол SPDY (http://ru.wikipedia.org/wiki/SPDY). Нельзя тормозить развитие технологий и необходимо проталкивать современные протоколы в массы. Остаётся убедить Microsoft в полезности и необходимости данных протоколов и склонить к их интенсивному внедрению.

Profile

netch80: (Default)
netch80

January 2026

S M T W T F S
    1 23
45678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 2nd, 2026 12:38 pm
Powered by Dreamwidth Studios