Webサーバーを構築中、クライアントがHTTP 200 OKフレームを認識しない

StackOverflow https://stackoverflow.com/questions/2592068

  •  25-09-2019
  •  | 
  •  

質問

チュートリアルに基づいて独自の Web サーバーを構築しています。TCP 接続を開始し、http データの 1 セグメントを送信する簡単な方法を見つけました (Web サーバーはマイクロコントローラー上で実行されるため、サイズは非常に小さくなります)。

とにかく、次の手順を実行する必要があります。

  1. SYNを受信する

  2. SYN、ACKを送信する

  3. ACKを受信(接続が確立されました)

  4. HTTP GETコマンドでACKを受信する

  5. ACKを送信する

  6. HTTP データで FIN、ACK を送信 (例: 200 OK)

  7. FIN,ACK を受信 <- このパケットを受信しません!

  8. 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 パケットの再送信試行は見られません。キャプチャをすぐに停止したためでしょうか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top