Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goによる P2Pチャットシステムの開発
Search
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
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.3k
AIエージェントで 変わるAndroid開発環境
takahirom
2
740
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
620
Android CLI
fornewid
0
190
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
270
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
260
React本体のコードリーディング
high_g_engineer
0
110
yield再入門 #phpcon
o0h
PRO
0
820
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
420
5分で問診!Composer セキュリティ健康診断
codmoninc
0
690
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
200
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Rails Girls Zürich Keynote
gr2m
96
14k
Docker and Python
trallard
47
4k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
560
Everyday Curiosity
cassininazir
0
260
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
360
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
First, design no harm
axbom
PRO
2
1.2k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.4k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
440
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