独断のトレンド予想/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 はサーバーの外に出て行けるわけでもなく、まぁ接続できなかった分は無視されるでいいのかな。
IPをまたいでの Listen してない
当然と言えば当然なのだけど、IPv4 と IPv6 は経路が違うので、SCTPの謳い文句の効能が得られそうな気がする。 でもこれ見ると接続できる気がしない。
結論
OSがSCTPサポートしてからこっち、ごく基本的なツールすら対応してないところを見ると、将来性は無いのかな。
我思う我ユースケース
1サーバーに複数NICつないでる(DMZ・LANとか)状態で、複数NIC経由で通信したいケースかな。 自分のイメージでは rsync でコンテンツ同期するのに、複数NIC経由で…と。 まぁリンクアグリゲーションしろって話なのかもしれないけど、こうもSCTP使われてないとなると、なんとも。
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) しましょう。という結論で。