CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

TCP実装(3)

TCP実装のつづき。
ボードの内部状態がLISTENからSYN_RCVDに移り、ボードからSYN/ACKを返送するところまでできたのですが、ここからがうまく行きません。
本来であればクライアントからACKを送ってきてそれでTCPコネクション完了なのですが、実際には再度SYNの接続要求を送ってくるのでボードはまたLISTENに戻ってしまうという状態です。
でプログラムのあちこちにprintf文で変数を表示してデバッグしました。
(実際はシリアルを通してターミナルに表示)

ボードからの返送内容に問題があると思われるので、プロトコルの下位、データリンク層から出力される直前のデータのダンプを取ると

** ** ** ** ** ** 00 02 CB 01 A5 C9 08 00 45 00 00 2C A2 79 40 00 40 06 16 F6 C0 A8 00 0A C0 A8 00 02 27 10 05 92 00 00 1B D0 00 00 1B E0 60 12 00 08 AD 5E 00 00 02 04 05 B4 

となっています(先頭の**はクライアントのMACアドレス
これをプロトコルのフォーマットで整列させると

** ** ** ** ** ** (dst_mac) ←ETHERヘッダ(14byte)
00 02 CB 01 A5 C9 (src_mac) 
08 00 (type)

45 00 (ver)          ←IPヘッダ(20byte) 
00 2C (length=44)
A2 79 (ID)
40 00 (frgmnt)
40   (TTL) 
06   (protocol=TCP)
16 F6 (SUM)
C0 A8 00 0A (src_IP) 
C0 A8 00 02 (dst_IP) 

27 10 (src_port)     ←TCPヘッダ(24byte) 
05 92 (dst_port)
00 00 1B D0 (seq_no)
00 00 1B E0 (ack_no)
60 (head len) 
12  (flag)
00 08 (wsize)
AD 5E (sum)
00 00 (uptr)
02 04 05 B4 (option)

となっていて、先ずはきちんとカプセル化されてヘッダは仕様通りついているなと。
(でもこのパケットは送るべきデータサイズは0でヘッダだけなんですけどね)