= 独断のトレンド予想/SCTP = [[https://man.freebsd.org/query=sctp(4)|SCTP]](Stream Control Transmission Protocol)の現状と今後について調べてみた。 なお検証は FreeBSD (10.3-RELEASE)のみで、CentOS(Linux)については調べていない。 <> == 対応アプリ == Apache や SSH を調べてみた限りはどれもこれも対応しておらず。 パッチが出てないわけでないけど、採用されてないあたり、お察しレベルにある。 === Apache 2.4.23 === 明示的に「対応していない」。強制的にSCTPを使用するようにしても起動せず。 === SSHd 7.2p2 === 「対応していない」。強制的にSCTP使用するようにしたら「動いているように」見える。 == SSHdをSCTP対応してみた == {{{ # sockstat -s USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS STATE : root sshd 62290 5 sctp6 2401:2500:102:3013:153:126:155:153:22 *:* LISTEN fe80::xxxx:xxxx:xxxx:xxxx:22 fe80::1:22 ::1:22 : root sshd 62290 7 sctp4 153.126.155.153:22 *:* LISTEN 127.0.0.1:22 : }}} 下記のパッチを適用して、SSHdを立ち上げてみた。 その結果、上記のように Listen していることを確認した。 しかし違和感バリバリ。 === スコープまたいで Listen している === リンクローカルな範囲なら通信できるかもしれないけど、グローバルな通信は難しい気が。 更に localhost(127.0.0.1 または ::1) はサーバーの外に出て行けるわけでもなく。 まぁ接続できなかった分は無視されるでいいのかな。 === IPをまたいでの Listen してない === 当然と言えば当然なのだけど、IPv4 と IPv6 は経路が違うので、SCTPの謳い文句で言うところの「マルチホーム対応」の効能が得られそうな気がする。 でもこれ見てると接続できる気がしない。 === でも接続検証してないけどね === この違和感が正しいのか間違っているのかは検証せず。 == 考察 == OSがSCTPサポートしてからこっち、ごく基本的なツールすら対応してないところを見ると、極めて用途が限定されているものと思われる。 実際、[[https://ja.wikipedia.org/wiki/Stream_Control_Transmission_Protocol|Wikipedia]]でも、[[https://tools.ietf.org/html/rfc4960|RFC4960]]でも、IP上で Public Switched Telephone Network(PSTN・[[https://ja.wikipedia.org/wiki/公衆交換電話網|公衆交換電話網]])信号メッセージの転送を意図して設計されている旨、記載されている。 つまり、IP電話やるためのプロトコルってところかな。 あとは通信の高信頼性接続が重要な用途、つなぎっぱなしで、切れちゃ困る系というと、VPNとかBGPとか、そういう方面になるかな。 というわけで、マルチホームで…という謳い文句はおまけとしか。 その方面ではMPTCP(Multipath TCP)の方が現実的かな。 次はMPTCPに挑戦だ!(たぶん) == FreeBSD 10.3-R で強制SCTP有効化 == {{{#!highlight diff Index: lib/libc/net/getaddrinfo.c =================================================================== --- lib/libc/net/getaddrinfo.c (revision 302907) +++ lib/libc/net/getaddrinfo.c (working copy) @@ -172,7 +172,7 @@ #ifdef INET6 { PF_INET6, SOCK_DGRAM, IPPROTO_UDP, 0x07 }, { PF_INET6, SOCK_STREAM, IPPROTO_TCP, 0x07 }, - { PF_INET6, SOCK_STREAM, IPPROTO_SCTP, 0x03 }, + { PF_INET6, SOCK_STREAM, IPPROTO_SCTP, 0x07 }, { PF_INET6, SOCK_SEQPACKET, IPPROTO_SCTP, 0x07 }, { PF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE, 0x03 }, { PF_INET6, SOCK_RAW, ANY, 0x05 }, @@ -179,7 +179,7 @@ #endif { PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0x07 }, { PF_INET, SOCK_STREAM, IPPROTO_TCP, 0x07 }, - { PF_INET, SOCK_STREAM, IPPROTO_SCTP, 0x03 }, + { PF_INET, SOCK_STREAM, IPPROTO_SCTP, 0x07 }, { PF_INET, SOCK_SEQPACKET, IPPROTO_SCTP, 0x07 }, { PF_INET, SOCK_DGRAM, IPPROTO_UDPLITE, 0x03 }, { PF_INET, SOCK_RAW, ANY, 0x05 }, }}} まぁこんなテクニックに頼るのでは無く、アプリケーションサイドで、明示的に [[https://man.freebsd.org/query=socket(2)|socket(2)]] しましょう。という結論で。 実際この設定を実施すると、Apache が立ち上がらないなど、問題を引き起こすので、まったくお勧めできないです。