2010-04-07 40 views
2

我根據教程建設自己的網絡服務器。 我發現了一個簡單的方法來發起一個TCP連接併發送一段http數據(網絡服務器將運行在微控制器上,所以它會很小)建立一個Web服務器,客戶端不承認HTTP 200 OK框架

無論如何,以下是我需要去的順序通過:

  1. 接收SYN

  2. 發送SYN,ACK

  3. 接收ACK(連接現在確定)

  4. 收到ACK與HTTP GET命令

  5. 發送ACK

  6. 發送FIN,ACK與HTTP數據(例如200 OK)

  7. 收到FIN,ACK < - 我不收到此包!直到我把我的確認和HTTP 200 OK消息

  8. 發送ACK

,一切工作正常。 客戶端將無法發送確認那兩個包,因此 正在顯示任何網頁。 我已經添加了一個序列的pcap文件,我如何用wireshark記錄它。

PCAP文件:http://cl.ly/5f5/httpdump2.pcap

所有的序列號和確認號是正確的,校驗都OK。旗子也是對的。 我不知道發生了什麼問題。

+0

發生了什麼事在PCAP文件上面不匹配說明:捕獲顯示SYN握手以後,GET,然後一堆HTTP數據(65.208.228.233 - > 145.254.160.237)。許多數據包被髮送(17,940字節),全部由客戶端確認。 '200 ok'是通過一個數據包本身發送,得到ACK,然後每個FIN + ACK發送一次,連接完成。 錯誤的捕獲數據? – 2010-04-07 12:15:52

+0

Jep,這是錯誤的數據。對不起。 這裏是正確的:http://cl.ly/5f5 – Evert 2010-04-07 12:27:35

+0

的HTTP協議,你在服務器inplementing,1.0或1.1,並支持你持久連接? – 2010-04-08 09:58:08

回答

0

的IP長度字段因此而被計數8個比特太多。我在計算中犯了一個錯誤。萬物現在就像一種魅力!

1

我認爲,第6步應該只是FIN,沒有ACK。你在那個地方認出了什麼來自客戶的數據包?此外,我不明白爲什麼4.應該是一個ACK而不是一個正常的數據包 - 客戶端確認連接在3.

This TCP狀態圖可能會有所幫助。

+0

我對數字4沒有任何影響,那就是客戶端(在這種情況下,使用Firefox的Windows XP)。但是,我試着在步驟6中僅使用FIN標誌,但它並不重要。 它可能與延遲確認有關嗎? – Evert 2010-04-07 12:02:41

+2

在實踐中,基本上所有的TCP數據包的ACK也 - ACK序列#/窗口大小域總是出現在頭部,所以每當你發送一些數據是有意義的「搭便車」當前ACK信息。 – 2010-04-07 12:09:39

0

Wireshark的說(的FIN數據包):

破碎TCP:確認字段 非零而ACK標誌未設置

我不肯定知道這是什麼導致你的問題,但如果WireShark不喜歡那個數據包,也許客戶端也不會。所以,它應該是FIN + ACK,還是應該設置確認字段爲0

如果不解決這個問題,您也可以嘗試先發送數據,然後一個單獨的FIN數據包。使用FIN包含數據是有效的,但是更常見的是單獨發送FIN(如您之前發佈的另一個pcap跟蹤所示)。

而且,你可能應該與200 OK

設置PUSH標誌的包。最後,我沒有看到的FIN數據包重傳的任何企圖 - 就是因爲你停止了採集,對嗎?

+0

正確,我嘗試過使用這些標誌,這就是爲什麼它在這個捕捉中不正確。我已將它恢復爲psh/ack。 我已經建立一個單獨的FIN數據包,並將其發送給客戶端。客戶端用fin/ack進行響應,但是有錯誤的確認號碼(仍然是1)。看起來客戶端沒有看到HTTP數據包,否則確認號碼就是我在http 200 OK數據包中發送的字節數?我不知道是什麼原因造成的? 你對鰭數據包重傳是正確的。我馬上停止了。 – Evert 2010-04-07 13:20:16