2

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

とにかく、以下は私が通過する必要があるシーケンスです:

  1. SYNを受信する

  2. SYN、ACKを送信します

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

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

  5. ACKを送信

  6. HTTPデータを使用してFIN、ACKを送信します(例:200 OK)

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

  8. ACKを送信

確認応答とHTTP200OKメッセージを送信するまで、すべて正常に機能します。クライアントはこれら2つのパッケージに確認応答を送信しないため、Webページは表示されません。シーケンスのpcapファイルをwiresharkで記録した方法で追加しました。

Pcapファイル:http ://cl.ly/5f5/httpdump2.pcap

すべてのシーケンス番号と確認応答番号は正しく、チェックサムは問題ありません。旗も正しいです。何が悪いのかわかりません。

4

3 に答える 3

1

ステップ6は、ACKなしのFINだけである必要があると思います。その場所でクライアントからのどのパケットをACKしていますか?また、4。が通常のデータパケットではなくACKである必要がある理由もわかりません。クライアントは3で接続をACKしました。

TCP状態に関するこの図が役立つ場合があります。

于 2010-04-07T11:54:00.833 に答える
0

WireSharkは(FINパケットについて)次のように述べています。

壊れたTCP:ACKフラグが設定されていない間、確認応答フィールドはゼロ以外です

それが問題の原因かどうかはわかりませんが、WireSharkがそのパケットを気に入らない場合は、クライアントも気に入らない可能性があります。したがって、FIN + ACKにするか、確認応答フィールドを0に設定する必要があります。

それでも解決しない場合は、最初にデータを送信してから、別のFINパケットを送信してみてください。FINにデータを含めることは有効ですが、FINを単独で送信する方が一般的です(以前に投稿した他のpcapトレースに見られるように)。

また、おそらくパケットにPUSHフラグを設定する必要があります。200 OK

最後に、FINパケットの再送信の試行は表示されません。これは、キャプチャをすぐに停止したためですか?

于 2010-04-07T12:47:23.333 に答える
0

その結果、IP長フィールドは8ビットをカウントしすぎていました。計算を間違えました。今ではすべてが魅力のように機能します!

于 2010-05-11T09:56:38.210 に答える