TCPの状態遷移図
TCPの状態遷移図
https://plantuml-proxy.vercel.app/svg/https://scrapbox.io/api/code/villagepump/TCPの状態遷移図/tcpstd.pu#.svg
code:tcpstd.pu
@startdot
digraph std {
size ="8.5, 11";
rankdir = TD;
ratio=auto;
label="TCPの状態遷移図";
node fontsize = 12, shape = box, style=rounded;
edge fontsize = 10;
"CLOSED"->"LISTEN" label="パッシブオープン(TCB生成)";
"CLOSED"->"SYN_SENT" label="アクティブオープン(TCB生成とSYNの送信)";
"LISTEN"->"SYN_RECEIVED" label="SYNの受信(SYN/ACKの送信)";
"LISTEN"->"CLOSED" label="クローズ(TCB削除)";
"LISTEN"->"SYN_SENT" label="SENT(SYNの送信)";
"SYN_RECEIVED"->"ESTABLISHED" label="ACKの受信";
"SYN_RECEIVED"->"FIN_WAIT_1" label="クローズ(FINの送信)";
"SYN_SENT"->"ESTABLISHED" label="SYN/ACKの受信(ACKの送信)";
"SYN_SENT"->"SYN_RECEIVED" label="SYNの受信(ACKの送信)";
"ESTABLISHED"->"FIN_WAIT_1" label="クローズ(FINの送信)";
"FIN_WAIT_1"->"FIN_WAIT_2" label="ACKの受信";
"FIN_WAIT_1"->"CLOSING" label="FINの受信(ACKの送信)";
"FIN_WAIT_1"->"TIME_WAIT" label="FIN ACKの受信(ACKの送信)";
"FIN_WAIT_2"->"TIME_WAIT" label="FINの受信(ACKの送信)";
"CLOSING"->"TIME_WAIT" label="FIN ACKの受信";
"TIME_WAIT"->"CLOSED" label="タイムアウト待ち(TCB削除)";
"ESTABLISHED"->"CLOSE_WAIT" label="FIN ACKの受信";
"CLOSE_WAIT"->"LAST_ACK" label="クローズ(FINの送信)";
"LAST_ACK"->"CLOSED" label="FIN ACKの受信";
}
@enddot
code:tcp.mermaid
graph TD
CLOSED -->|パッシブオープン(TCB生成)| LISTEN
CLOSED -->|アクティブオープン(TCB生成とSYNの送信)| SYN_SENT
LISTEN -->|SYNの受信(SYN/ACKの送信)| SYN_RECEIVED
LISTEN -->|クローズ(TCB削除)| CLOSED
LISTEN -->|SENT(SYNの送信)| SYN_SENT
SYN_RECEIVED -->|ACKの受信| ESTABLISHED
SYN_RECEIVED -->|クローズ(FINの送信)| FIN_WAIT_1
SYN_SENT -->|SYN/ACKの受信(ACKの送信)| ESTABLISHED
SYN_SENT -->|SYNの受信(ACKの送信)| SYN_RECEIVED
ESTABLISHED -->|クローズ(FINの送信)| FIN_WAIT_1
FIN_WAIT_1 -->|ACKの受信| FIN_WAIT_2
FIN_WAIT_1 -->|FINの受信(ACKの送信)| CLOSING
FIN_WAIT_1 -->|FIN ACKの受信(ACKの送信)| TIME_WAIT
FIN_WAIT_2 -->|FINの受信(ACKの送信)| TIME_WAIT
CLOSING -->|FIN ACKの受信| TIME_WAIT
TIME_WAIT -->|タイムアウト待ち(TCB削除)| CLOSED
ESTABLISHED -->|FIN ACKの受信| CLOSE_WAIT
CLOSE_WAIT -->|クローズ(FINの送信)| LAST_ACK
LAST_ACK -->|FIN ACKの受信| CLOSED
FIN_WAIT_2の行部分はplantumlの方がレイアウト見やすいなseibe.icon