独断のトレンド予想/SCTP

なお検証は 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 が立ち上がらないなど、問題を引き起こすので、まったくお勧めできないです。

独断のトレンド予想/SCTP (最終更新日時 2016-07-20 01:06:30 更新者 NorikatsuShigemura)