Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Goによる P2Pチャットシステムの開発
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
h2so5
March 26, 2015
Programming
7.1k
11
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Goによる P2Pチャットシステムの開発
h2so5
March 26, 2015
More Decks by h2so5
See All by h2so5
Riot.js Tokyo #2
h2so5
0
740
Dripcap03
h2so5
2
360
Other Decks in Programming
See All in Programming
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
230
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
510
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
350
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
4
400
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
600
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
5.2k
Verilogで学ぶCPU自作入門.pdf
uyuki234
7
3.9k
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
30
13k
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
速習iPhone Duo対応
yuukiw00w
2
910
Simple Storage Service(S3) is not simple
iwatsukayura
0
110
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
280
Featured
See All Featured
Navigating Weather and Climate Data
rabernat
0
540
Designing Experiences People Love
moore
143
24k
Building an army of robots
kneath
307
47k
HDC tutorial
michielstock
2
930
What's in a price? How to price your products and services
michaelherold
247
13k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
450
Testing 201, or: Great Expectations
jmmastey
46
8.3k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
How STYLIGHT went responsive
nonsquared
100
6.3k
Optimising Largest Contentful Paint
csswizardry
37
4k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
250
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Transcript
Goによる P2Pチャッ トシステムの開発 橋本 論 https://github.com/h2so5/murcott
チャット 作ってました RelayCoding MikuMikuOnline
集中型の チャット サーバー クライアント
サーバーが ダウンすると サーバー クライアント
常に サーバーを経由
有名なチャットの プロトコル IRC XMPP <iq from='
[email protected]
/castle' id='get-data-1' to='
[email protected]
/pda' type='result'> <data
xmlns='urn:xmpp:bob' cid='
[email protected]
' max-age='86400' type='image/png'> iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0 vr4MkhoXe0rZigAAAABJRU5ErkJggg== </data> </iq> ・テキストプロトコル ・バイナリは苦手
今回 開発したもの https://github.com/h2so5/murcott Decentralized instant messaging framework murcott
murcottの構造 μTP 暗号化 DHT DHT
・Golang 100% ・IDによるメッセージの電子署名 ・扱いやすいバイナリ (MessagePack) ・Kademlia DHT ・UDP(μ TP)で通信 ・グループチャット対応
murcottの特徴
Golangについて ・コンパイルするため高速 ・サーバー向きのライブラリが充実 ・チャンネルによる非同期通信 特に暗号関連 低レイヤーの処理をするため重要 P2Pでは非同期処理が多くなりがち
murcottのID ZXF3qv3i8q4y3UGboNW89n2bRy95ngwuDT ZXF3qv53NguoqoAhhnVkJRdCk6BNcJm9yE ZXF3qv5M1U8oaByBX3YoGHQxfWctgnZmzR ZXF3qv5oMTEha58tXa5ky7QovHS6fc9Atx ZXF3qv4Bywkot1zbRLWmGDKkivUfYyp6H5 ZXF3qv4gsmv8f5twDGYZyHiB1HcT1NFypb アドレスの代わり
murcottのID の中身 0x 90 ネットワークID ECDSA 公開鍵のハッシュ IDの種類 ユーザー: 0.0.0.0
グループ: 1.0.0.0 0x 01 00 00 00 0x 48 89 5c 24 28 48 ZXF3qv3i8q4y3UGboNW89n2bRy95ngwuDT BASE58 20byte
メッセージの署名 ・相手に接続したときに公開鍵をダウンロード ・メッセージが本当にそのIDから送信された かどうかが分かる 接続 公開鍵の交換 メッセージ送信 秘密鍵 A 秘密鍵
A 公開鍵 A 公開鍵 A 秘密鍵 A 秘密鍵 B 公開鍵 B 秘密鍵 B 秘密鍵 B 公開鍵 B メッセージ+署名 B B A A A B 署名 検証
MessagePack { dst: <byte[20]>, # Destination node ID src: <byte[20]>,
# Source node ID type: <string>, # Payload type payload: <byte[]>, # Messagepack serialized payload id: <byte[20]>, # Message ID sign: { # Payload's ecdsa signature r: <byte[]>, # r s: <byte[]> # s }, ttl: <int> # TTL for broadcasts } ・JSON風の構造 ・画像もバイナリのままコンパクトに扱える ・いろいろな言語向けのライブラリがある http://msgpack.org/
Distributed Hash Table (DHT) ・ID (ZXF3...)から接続先を検索できる ・自分のIDを周囲のマシンに知らせておく ・複数のマシンをリレーして検索 ・グループの参加者のリストも管理している 検索
検索 検索 通知 通知
利点 欠点 UDPによる メッセージ通信 ・巨大なデータを送ることができない ・パケットロスの可能性 ・DHTとメッセージを同じソケットで扱える ・UDPホールパンチングが利用可能 Micro Transport
Protocol (μTP) NATを超えるのが容易
Micro Transport Protocol (μTP) https://github.com/h2so5/utp http://www.bittorrent.org/beps/bep_0029.html ・bittorrentでよく利用されているプロトコル ・UDPを使ってTCPのようなストリームを作成する ・murcottとは独立したライブラリとして開発
グループチャット ・グループ自体もひとつIDを持つ ・グループごとに独立したDHTが作成される ・メッセージを受け取ると他の参加者に転送 全体のDHT グループごとのDHT
murcottの 問題点 ・μTPライブラリの実装が不完全なため、 非常に長いメッセージでは効率が悪い ・メッセージの偽造は難しいが、メッセー ジの妨害や紛失に対して弱い ・グループチャットで参加者にちゃんと メッセージが届いたか判断できない
None