Go言語で作るTCP/IP
terassiy @terassyi_
SYN 1
自己紹介
2
TCP/IPを(Goで)作るモチベーション
3
準備
4
デモ
5
標準パッケージ(OSのプロトコルスタック)を利用したtcp echoサーバ
gotcpで記述した
tcp echoクライアント
デモ
6
全体図
7
ping応答
Ethernet
ARP
IPv4
ICMP
TCP
アドレス解決問い合わせ
アドレス解決
EthernetからIPv4(ICMP)まで
8
Ethernet
ARP
IPv4
ICMP
TCP
アドレス解決問い合わせ
アドレス解決
ping応答
IPアドレスとMACアドレスの解決
9
ARPテーブルの定義
IPパケット送出処理
ARPテーブルの更新を待つ
新たにARPリクエスト送信
TCP
10
ping応答
Ethernet
ARP
IPv4
ICMP
TCP
アドレス解決問い合わせ
アドレス解決
TCPの機能
11
TCPパケット
12
TCP内部構造体(Task Control Block)
13
TCB(Task Control Block): TCPの内部状態を管理・制御する構造体
TCPの状態遷移
14
コネクションの確立
Server(passive open)
Client(active open)
15
Listen()
Listen
Accept()
SYN_RECVD
ESTABLISHED
getConnection()
Conn{}
Dial()
SYN_SENT
ESTABLISHED
getConnection()
Conn{}
SYN
SYN|ACK
ACK
コネクションの確立(Client)
16
コネクションの確立(Server)
17
セグメントの処理
18
再送処理
19
コネクションの終了
待ってAckの伝達を確認する
Finを再送する
20
Client(active close)
Server(passive close)
FIN|ACK
ACK
ACK
FIN|ACK
wait
コネクションの終了
Server(passive close)
Client(active close)
21
ESTABLISHED
handle()
passiveClose()
CLOSE_WAIT
LAST_ACK
CLOSED
FIN_WAIT1
activeClose()
FIN_WAIT2
TIME_WAIT
CLOSED
※別ルートの遷移もあり
GotcpのTCPクライアントのコード
22
はまりどころ
23
もう少し詳しいハマりどころの説明→自作TCP/IPデバッグの辛み
まとめ
FIN|ACK 24