Страница 1 из 1

протокол SCTP

Добавлено: 26 июн 2017, 11:13
Olej
Протокол SCTP был добавлен достаточно поздно (2000г.) как 3-й протокол транспортного уровня TCP/IP (в дополнение к UDP и TCP).
Считается, что он объединяет возможности UDP и TCP и одновременно устраняет (некоторые) их недостатки.
(более-менее внятное объяснение см. по ссылке выше)
Изображение
Меня интересовала программная реализация SCTP ... и, естественно, в Linux.
Но найти внятных обсуждений, а тем более примеры кода, как оказалось, не так просто... :-(
Описание и некоторые примеры см. Надежная передача данных по протоколу SCTP (2008г.) ... но это, в таком виде, не работает (неизвестно в какой ОС это делалось).

Re: протокол SCTP

Добавлено: 26 июн 2017, 11:18
Olej
Olej писал(а):не работает
Поехали... ;-)
Т.е. не компилируется даже:

Код: Выделить всё

[olej@dell SCTP]$ make
cc     ss.c   -o ss
ss.c: В функции «main»:
ss.c:52:11: предупреждение: неявная декларация функции «sctp_sendmsg» [-Wimplicit-function-declaration]
     ret = sctp_sendmsg( connSock,
           ^
...

Код: Выделить всё

[olej@dell linux]$ dnf list '*sctp*'
Последняя проверка окончания срока действия метаданных: 0:00:11 назад, Mon Jun 26 09:57:41 2017.
Установленные пакеты
lksctp-tools.x86_64                                               1.0.16-4.fc23                                         @System
Доступные пакеты
lksctp-tools.i686                                                 1.0.16-4.fc23                                         fedora
lksctp-tools-devel.i686                                           1.0.16-4.fc23                                         fedora
lksctp-tools-devel.x86_64                                         1.0.16-4.fc23                                         fedora
lksctp-tools-doc.x86_64                                           1.0.16-4.fc23                                         fedora
python-pysctp.x86_64                                              0.6-5.fc23                                            fedora

Код: Выделить всё

[olej@dell linux]$ sudo dnf install lksctp-tools*
...
Выполнение транзакции
  Установка    : lksctp-tools-devel-1.0.16-4.fc23.x86_64                                                                   1/2
  Установка    : lksctp-tools-doc-1.0.16-4.fc23.x86_64                                                                     2/2
  Проверка     : lksctp-tools-doc-1.0.16-4.fc23.x86_64                                                                     1/2
  Проверка     : lksctp-tools-devel-1.0.16-4.fc23.x86_64                                                                   2/2

Установлено:
  lksctp-tools-devel.x86_64 1.0.16-4.fc23                         lksctp-tools-doc.x86_64 1.0.16-4.fc23

Выполнено!
Теперь не линкуется:

Код: Выделить всё

[olej@dell SCTP]$ make
cc     ss.c   -o ss
/tmp/cc6oAoBJ.o: In function `main':
ss.c:(.text+0x106): undefined reference to `sctp_sendmsg'
ss.c:(.text+0x17b): undefined reference to `sctp_sendmsg'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
<встроенное>: ошибка выполнения рецепта для цели «ss»
make: *** [ss] Ошибка 1
Это ничего не даёт:

Код: Выделить всё

[olej@dell netinet]$ pkg-config --list-all | grep sctp
Зато даёт:

Код: Выделить всё

[olej@dell lib64]$ ls *sctp*.*
libsctp.so  libsctp.so.1  libsctp.so.1.0.16

[olej@dell lib64]$ pwd
/lib64

Re: протокол SCTP

Добавлено: 26 июн 2017, 11:20
Olej
Olej писал(а): Зато даёт:

Код: Выделить всё

[olej@dell SCTP]$ make 
cc -Wall -l sctp ss.c -o ss 
cc -Wall -l sctp sc.c -o sc 

Код: Выделить всё

[olej@dell SCTP]$ cat Makefile
CC += -Wall
LDOPT += -l sctp

TASK = ss sc
all: $(TASK)

%: %.c
    $(CC) $(LDOPT) $< -o $@

clean:
    rm -f $(TASK) *.o

Re: протокол SCTP

Добавлено: 26 июн 2017, 11:31
Olej
Olej писал(а): Но найти внятных обсуждений, а тем более примеры кода, как оказалось, не так просто... :-(
Вот что настораживает - SCTP:
Протокол SCTP реализован в следующих операционных системах:
...
QNX Neutrino Realtime OS,[6] в версиях с 6.3.0 по 6.3.2, но с 6.4.0 поддержка прекращена
...

Re: протокол SCTP

Добавлено: 26 июн 2017, 12:47
Olej
Выглядит это как-то так:

Код: Выделить всё

[olej@dell SCTP]$ ./ss 
...

Код: Выделить всё

[olej@dell SCTP]$ ./sc 
(Local) Mon Jun 26 12:45:40 2017

(GMT  ) Mon Jun 26 09:45:40 2017

Связь в 2 независимых канала разнородной информации.

Re: протокол SCTP

Добавлено: 27 июн 2017, 01:05
Olej
Olej писал(а): Меня интересовала программная реализация SCTP ... и, естественно, в Linux.
Но найти внятных обсуждений, а тем более примеры кода, как оказалось, не так просто... :-(
Интерфейс прикладного программирования Socket API, Часть 5: SCTP
Оригинал: "The Socket API, Part 5: SCTP"
Автор: Pankaj Tanwar
Дата публикации: December 29, 2011
Перевод: Н.Ромоданов
Дата перевода: июль 2012 г.
Протокол SCTP
Это полный официальный стандарт протокола (перевод):
Stream Control Transmission Protocol
23.12. Когда SCTP оказывается предпочтительнее TCP
7. Многие функции TCP поддерживаются и SCTP: уведомление о приеме, повторная передача утерянных данных, сохранение последовательности данных, оконное управление передачей, медленное начало и алгоритмы предотвращения перегрузки линий, а также выборочные уведомления. Есть и два исключения: состояние неполного закрытия и срочные данные.
SCTP лишен двух особенностей TCP. Одной из них является состояние неполного (половинного) закрытия соединения. Это состояние возникает, когда приложение закрывает свой конец соединения, но разрешает собеседнику отправлять данные, а само принимает их (мы обсуждали это состояние в разделе 6.6). Приложение входит в это состояние для того, чтобы сообщить собеседнику, что отправка данных завершена. Приложения очень редко используют эту возможность, поэтому при разработке SCTP решено было не заботиться об ее поддержке. Приложениям, которым нужна эта функция, с переходом на SCTP придется изменять протокол уровня приложения, чтобы отправлять сигнал в потоке данных. В некоторых случаях изменения могут быть далеко не тривиальными.

SCTP не поддерживает и такую функцию TCP, как обработка внеочередных данных (urgent data). Для доставки срочных данных в SCTP можно использовать отдельный поток, однако это не позволяет в точности воспроизвести поведение TCP.

Для приложений, ориентированных на передачу потока байтов, переход на SCTP может оказаться невыгодным. К таким приложениям относятся:
- telnet
- rlogin
- rsh
- ssh
TCP сегментирует поток байтов на пакеты IP более эффективно, чем SCPT, который пытается сохранять границы сообщений, из-за чего могут получаться блоки, не помещающиеся целиком в IP-дейтаграммы и вызывающие избыточные накладные расходы на передачу.
UNIX: разработка сетевых приложений
Стивенс Уильям Ричард
Глава 23 Дополнительные сведения о сокетах SCTP