独断のトレンド予想/SCTP
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サポートしてからこっち、ごく基本的なツールすら対応してないところを見ると、極めて用途が限定されているものと思われる。
実際、Wikipediaでも、RFC4960でも、IP上で Public Switched Telephone Network(PSTN・公衆交換電話網)信号メッセージの転送を意図して設計されている旨、記載されている。
つまり、IP電話やるためのプロトコルってところかな。 あとは通信の高信頼性接続が重要な用途、つなぎっぱなしで、切れちゃ困る系というと、VPNとかBGPとか、そういう方面になるかな。
というわけで、マルチホームで…という謳い文句はおまけとしか。 その方面ではMPTCP(Multipath TCP)の方が現実的かな。 次はMPTCPに挑戦だ!(たぶん)
FreeBSD 10.3-R で強制SCTP有効化
1 Index: lib/libc/net/getaddrinfo.c
2 ===================================================================
3 --- lib/libc/net/getaddrinfo.c (revision 302907)
4 +++ lib/libc/net/getaddrinfo.c (working copy)
5 @@ -172,7 +172,7 @@
6 #ifdef INET6
7 { PF_INET6, SOCK_DGRAM, IPPROTO_UDP, 0x07 },
8 { PF_INET6, SOCK_STREAM, IPPROTO_TCP, 0x07 },
9 - { PF_INET6, SOCK_STREAM, IPPROTO_SCTP, 0x03 },
10 + { PF_INET6, SOCK_STREAM, IPPROTO_SCTP, 0x07 },
11 { PF_INET6, SOCK_SEQPACKET, IPPROTO_SCTP, 0x07 },
12 { PF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE, 0x03 },
13 { PF_INET6, SOCK_RAW, ANY, 0x05 },
14 @@ -179,7 +179,7 @@
15 #endif
16 { PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0x07 },
17 { PF_INET, SOCK_STREAM, IPPROTO_TCP, 0x07 },
18 - { PF_INET, SOCK_STREAM, IPPROTO_SCTP, 0x03 },
19 + { PF_INET, SOCK_STREAM, IPPROTO_SCTP, 0x07 },
20 { PF_INET, SOCK_SEQPACKET, IPPROTO_SCTP, 0x07 },
21 { PF_INET, SOCK_DGRAM, IPPROTO_UDPLITE, 0x03 },
22 { PF_INET, SOCK_RAW, ANY, 0x05 },
まぁこんなテクニックに頼るのでは無く、アプリケーションサイドで、明示的に socket(2) しましょう。という結論で。
実際この設定を実施すると、Apache が立ち上がらないなど、問題を引き起こすので、まったくお勧めできないです。