GolangでP2Pをやろう、の下準備。 [プログラミング]
最終的に違法ファイルを流すP2Pを作るつもりではないので、それを目的にした人はどうもお疲れ様でした。
ともあれ、二点間でのP2Pを作ろうとしているわけですが、GUIをブラウザでやろうとしているので、基本的にWebサーバを作って情報をやり取りするということになっております。ホストとなるマシンがあるから正確にはP2Pではないのだけれど、直つなぎという点においては間違いはないかと。
GolangでUPnPで同じようなことをやっているソースがありそうなもんだなと探してみた。
https://github.com/syncthing/syncthing/blob/master/lib/upnp/upnp.go
syncthingというアプリがそのまま自分の実現したい用途に適合してそうだったけど、ここはお勉強も兼ねてやるので面倒臭くない程度で自分でやりたい。そしてライセンスが面倒なことになっていなければそのまま使えれば使っちゃおう。うぉ、8タブだよ、厳しいな。GitHubって8tabだったっけ?
ただ自分のグローバルIPを知って、ポートに穴開けて、ポートフォワーディングできればいいから、フルスタックなUPnPのライブラリを作るわけじゃないので、限られた動作ができればそれでいい。UPnPのプロトコルってどこにあるんだろ。RFCかな? とりあえずSOAPで送って云々というのはなんとなく見ているからそんなに難しいことをやっている気はしない。
グローバルアドレスはDHCPでも得られるみたいなことを書いてあったが、今回はUPnPができないと話にならないのでDHCPは使わない。
https://mdgw.hateblo.jp/entry/20080204/1202132356
SSDPを使うとあるが、HTTPリクエストをマルチキャストで投げればいいらしい。やっていることはそんなに難しいことではない。情報が入っているXMLのURLが送られるので、そこから取ると。そのあとのポートの開け方とかを知りたいんだけどな〜。
https://nazuna.sakura.ne.jp/software/upnp/get_device.html
古いドキュメントには標準化されていないと書いてあったが、そんなことはなかった。仕様は下記のどこかに埋まっているんだろうけど、探すの面倒だな。
https://openconnectivity.org/search/UPnP
これあたりかなぁ。
https://openconnectivity.org/developer/specifications/upnp-resources/upnp/internet-gateway-device-igd-v-2-0
どこぞでIPv6を使うとNAT越えも大丈夫とあるが、ようけわからんというか、IPv6から勉強しないといけないのと、IPv6の実装状況が一般的にどうなっているのかわからんというのが正直なところ。
とりあえず、グローバルIPと任意のポートを開けられたとしましょう。それを相手に教えるためにメールするわけだけど、SMTPをやるにも標準で用意されているからサンプルとかはたくさんあるでしょう。
https://www.write-ahead-log.net/entry/2017/08/02/233000
ASCIIなメールは送れるけど日本語はできないと書いてあるけど、まぁ当然ですよね。というか、それが当然と知っているのはメールクライアントをいじくったことがあるからで、基本的に歴史的にメールはASCII文字しか使えないということがあって、そのためにアルファベットなどにエンコーディングしないといけない。base64とかquoted-printableを使えばいいのだけれど、URLを送るだけだから面倒くさいからいいや。確かにGolangは標準ライブラリの作りが薄い…。
それでつなぎに行くところを伝えられたら、あとはWebサーバを立てられればOK。まぁそこからが何をするのかを考えるのが本体なのだが、メッセージングとファイルのやり取りはできればいいかなと思ったり。というか、それ以上のことは考えていません。双方向に情報を送れそうなので、やれることは多そうではある。HTTPだとファイルのやり取りはあまり効率的じゃなさそうですが、お手軽にやるにはそれで十分ですね。
ともあれ、二点間でのP2Pを作ろうとしているわけですが、GUIをブラウザでやろうとしているので、基本的にWebサーバを作って情報をやり取りするということになっております。ホストとなるマシンがあるから正確にはP2Pではないのだけれど、直つなぎという点においては間違いはないかと。
GolangでUPnPで同じようなことをやっているソースがありそうなもんだなと探してみた。
https://github.com/syncthing/syncthing/blob/master/lib/upnp/upnp.go
syncthingというアプリがそのまま自分の実現したい用途に適合してそうだったけど、ここはお勉強も兼ねてやるので面倒臭くない程度で自分でやりたい。そしてライセンスが面倒なことになっていなければそのまま使えれば使っちゃおう。うぉ、8タブだよ、厳しいな。GitHubって8tabだったっけ?
ただ自分のグローバルIPを知って、ポートに穴開けて、ポートフォワーディングできればいいから、フルスタックなUPnPのライブラリを作るわけじゃないので、限られた動作ができればそれでいい。UPnPのプロトコルってどこにあるんだろ。RFCかな? とりあえずSOAPで送って云々というのはなんとなく見ているからそんなに難しいことをやっている気はしない。
グローバルアドレスはDHCPでも得られるみたいなことを書いてあったが、今回はUPnPができないと話にならないのでDHCPは使わない。
https://mdgw.hateblo.jp/entry/20080204/1202132356
SSDPを使うとあるが、HTTPリクエストをマルチキャストで投げればいいらしい。やっていることはそんなに難しいことではない。情報が入っているXMLのURLが送られるので、そこから取ると。そのあとのポートの開け方とかを知りたいんだけどな〜。
https://nazuna.sakura.ne.jp/software/upnp/get_device.html
古いドキュメントには標準化されていないと書いてあったが、そんなことはなかった。仕様は下記のどこかに埋まっているんだろうけど、探すの面倒だな。
https://openconnectivity.org/search/UPnP
これあたりかなぁ。
https://openconnectivity.org/developer/specifications/upnp-resources/upnp/internet-gateway-device-igd-v-2-0
どこぞでIPv6を使うとNAT越えも大丈夫とあるが、ようけわからんというか、IPv6から勉強しないといけないのと、IPv6の実装状況が一般的にどうなっているのかわからんというのが正直なところ。
とりあえず、グローバルIPと任意のポートを開けられたとしましょう。それを相手に教えるためにメールするわけだけど、SMTPをやるにも標準で用意されているからサンプルとかはたくさんあるでしょう。
https://www.write-ahead-log.net/entry/2017/08/02/233000
ASCIIなメールは送れるけど日本語はできないと書いてあるけど、まぁ当然ですよね。というか、それが当然と知っているのはメールクライアントをいじくったことがあるからで、基本的に歴史的にメールはASCII文字しか使えないということがあって、そのためにアルファベットなどにエンコーディングしないといけない。base64とかquoted-printableを使えばいいのだけれど、URLを送るだけだから面倒くさいからいいや。確かにGolangは標準ライブラリの作りが薄い…。
それでつなぎに行くところを伝えられたら、あとはWebサーバを立てられればOK。まぁそこからが何をするのかを考えるのが本体なのだが、メッセージングとファイルのやり取りはできればいいかなと思ったり。というか、それ以上のことは考えていません。双方向に情報を送れそうなので、やれることは多そうではある。HTTPだとファイルのやり取りはあまり効率的じゃなさそうですが、お手軽にやるにはそれで十分ですね。
コメント 0