Webサーバーを構築中、クライアントがHTTP 200 OKフレームを認識しない
質問
チュートリアルに基づいて独自の Web サーバーを構築しています。TCP 接続を開始し、http データの 1 セグメントを送信する簡単な方法を見つけました (Web サーバーはマイクロコントローラー上で実行されるため、サイズは非常に小さくなります)。
とにかく、次の手順を実行する必要があります。
SYNを受信する
SYN、ACKを送信する
ACKを受信(接続が確立されました)
HTTP GETコマンドでACKを受信する
ACKを送信する
HTTP データで FIN、ACK を送信 (例: 200 OK)
FIN,ACK を受信 <- このパケットを受信しません!
ACKを送信する
確認応答と HTTP 200 OK メッセージを送信するまでは、すべてが正常に動作します。クライアントはこれらの2つのパッケージに謝辞を送信しないため、Webページは表示されません。Wireshark で記録したシーケンスの pcap ファイルを追加しました。
Pcap ファイル: http://cl.ly/5f5/httpdump2.pcap
すべてのシーケンス番号と確認応答番号は正しく、チェックサムも問題ありません。フラグも正しいです。何が問題なのか分かりません。
解決 3
その結果、IP 長さフィールドは 8 ビットをカウントしすぎていました。計算を間違えました。すべてが魅力的に機能するようになりました。
他のヒント
ステップ6だと思います。ACK なしで FIN のみにする必要があります。その場所ではクライアントからのどのパケットにACKを送信していますか?また、なぜ4なのかわかりません。通常のデータ パケットではなく ACK である必要があります。クライアントは 3 で接続に ACK を送信しました。
これ TCP 状態に関する図が役に立つかもしれません。
WireShark は(FIN パケットについて)次のように述べています。
壊れたTCP:ACKフラグが設定されていない間、確認フィールドはゼロではありません
それが問題の原因であるかどうかはわかりませんが、WireShark がそのパケットを好まない場合は、クライアントも気に入らない可能性があります。したがって、FIN+ACK にするか、確認フィールドを 0 に設定する必要があります。
それでも解決しない場合は、最初にデータを送信してから、別の FIN パケットを送信してみることもできます。FIN にデータを含めることは有効ですが、(以前に投稿した他の pcap トレースに見られるように) FIN を単独で送信する方が一般的です。
また、おそらく、パケット内に PUSH フラグを設定する必要があります。 200 OK
最後に、FIN パケットの再送信試行は見られません。キャプチャをすぐに停止したためでしょうか?