2017-10-17 256 views
-1

我正在玩Wireshark來調試我正在處理的一些物聯網家庭自動化項目。我想我會從更多地瞭解HTTP和TCP/IP如何實際工作中受益。我發現的大多數解釋都將HTTP描述爲「騎在TCP/IP之上」,但我更具體地詢問實際發送的內容。TCP/IP和HTTP如何協同工作?

這是我拍攝的客戶機/服務器交互的例子:

Client: [SYN] 
Server: [SYN, ACK] 
Client: [ACK] 

如果我到目前爲止明白,他們現在已經成功地建立TCP連接。雖然,下一次捕獲顯示我

Client: POST /whatever 
Server: 200 OK 

好吧,現在我迷路了。檢查該捕獲表明我在一個幀中都有以太網,IP,TCP和HTTP層。它是否真的很簡單,客戶端在TCP數據包結束後添加一堆文本,並將這些額外的字節噴到路由器上?據推測,這可以解析TCP/IP並相應地轉發它?這是我混亂的根源。 「乘坐在最上面」是否意味着(在物理意義上)HTTP只是在TCP數據包之後在同一幀中發送的一系列字節?在這種情況下,HTTP是否被認爲是TCP/IP的有效載荷?

,當然還有完成

Server: [FIN, ACK] 
Client: [ACK] 
Client: [FIN, ACK] 
Server: [ACK] 
//In this case the server terminates the connection. 

編輯:下方的評論者提出了一個問題,這使得我感覺好像我一直沒對我要求什麼,我很清楚。假設我可以站在我的客戶端和服務器之間(或者在我的客戶端和路由器之間以及路由器和服務器之間再次站立)。當人們不得不通過物理介質物理地發送原始數據(校驗和,糾錯碼等)時,忽略考慮的因素,實際流量在時間方面會是什麼樣子?我會看到以太網層的字節,然後是ip層,tcp,http等字節嗎?

+0

HTTP只是TCP的數據,但我不知道你爲什麼一直說'*在TCP數據包之後'。通過TCP發送的數據通過* TCP數據包發送*。 – EJP

+0

我的意思是說,在某些時候,我的客戶端(傳感器)只是通過無線方式向路由器發送一個字節流。路由器解釋這些腳本並與他們做一些事(將它們轉發給服務器)。該字節流可以用一些有用的方式解釋。如果您要從傳感器的天線發送出一個字節的字節流,它會看起來像[以太網] [IP] [TCP] [HTTP]嗎?(當然,除非我認爲是很多糾錯碼,校驗和等)。 – brenzo

+0

如果您從天線發送信息,它將是Wi-Fi,幀將是Wi-Fi幀,而不是以太網幀。 Wi-Fi和以太網是兩種完全不同的數據鏈路協議。 –

回答

1

網絡層使用抽象和封裝。較低層封裝較高層。

  • 應用層可以具有其自己的協議,例如, HTTP。 HTTP 與目標設備上的HTTP進行通信,並且它是傳輸應用程序數據(HTML)的協議 。
  • 傳輸層(層4)封裝了應用程序數據報,它與目標設備上的相同傳輸層協議通信。一些傳輸協議具有保證並且創建用於可靠性的連接,例如, TCP(段),但有些是無連接的,沒有保證,例如UDP(數據報)。該層的目的是 是將應用程序數據從一個應用程序獲取到 另一個應用程序。一些傳輸協議使用尋址(端口) 來實現這一點,有些使用其他的東西,或根本沒有。
  • 網絡層將傳輸協議數據報封裝爲 數據包,並與目標設備網絡協議進行通信。 該層的目的是從一個網絡上的設備獲取數據包到另一個網絡上的設備。路由器使用包頭中的地址 來完成此操作(IPv4,IPX, IPv6,AppleTalk等地址)。
  • 數據鏈路層將網絡數據包封裝成幀,並且它與同一網絡上的設備的數據鏈路進行通信。 該層的目的是爲了將幀傳送到同一網絡(PC打印機,路由器等)的另一臺設備上。一些數據鏈路協議使用尋址(IEEE協議使用MAC尋址,48位或者64位MAC地址),一些使用其他尋址(幀中繼使用 DLCI,ATM使用VPI/VCI等),以及有些使用不尋址(PPP只有 有兩個設備,所以它不需要尋址)。該協議可以改變 的變化,因爲封裝的數據包在從其中一個網絡被髮送到另一個 到達目的地設備的路上。路由器剝離該幀,並在將數據包從一個網絡轉發到另一個網絡時丟棄該數據包, 創建一個新的幀來封裝新網絡的數據包。
  • 物理層(層1)將數據鏈路層(層-2)的幀轉換爲「線上的位」。

目標設備執行與上述相反的操作,將應用程序數據傳送到目標應用程序。

由於每層的抽象和封裝,您可以在不同的層混合和匹配不同的協議。例如,以太網可以承載任何數量的網絡協議(IPv4,IPX,IPv6,AppleTalk等),而無需知道或關心以太網幀的有效載荷中的內容。相反,IP不知道或關心哪個數據鏈路協議(以太網,Wi-Fi,令牌環,PPP,幀中繼等)攜帶它。

您的網絡瀏覽器使用HTTP在它與Web服務器之間傳遞數據(HTML)。 HTTP使用TCP將其傳輸到Web服務器。 Web瀏覽器將請求TCP分配一個TCP地址(端口)。 Web服務器可能使用衆所周知的TCP端口80用於HTTP,而TCP會將來自應用程序的數據流分段爲TCP段(不要將其與IPv4碎片混淆)。 TCP將在Web服務器的操作系統上與TCP建立連接,並且TCP保證這些分段將到達,並且呈現給目標應用程序的數據將完成並按順序排列。

TCP理論上可以使用任何網絡層協議,但實際上它只使用IPv4或IPv6。 IP會將TCP段封裝到IP數據包中。

IP將使用數據包將通過其發送的接口的數據鏈路協議。在PC上,這很可能是以太網或Wi-Fi,但它可以是其他類似PPP的東西。數據鏈路協議將把數據包封裝成數據鏈路協議的幀。每個數據鏈路協議具有不同的幀格式。如果目標設備位於同一網絡上,則幀會被尋址並直接傳送到目標。如果目標位於不同的網絡上,則將幀編址並傳送到在源OS中配置的網關(路由器)。

該接口將編碼幀中的位和接口介質上的信號。

+0

謝謝你這個非常詳細的答案。它幫助了很多。爲了確認我的理解正確,理論上可以將我的HTTP POST分解爲多個TCP段,然後由較低層封裝,發送並在服務器上重新構建。即當服務器的傳輸層軟件已經確定已經接收到所有特定會話的TCP分組時,就從這些分段重構HTTP並傳遞給相關應用程序? – brenzo

+0

是的。但請記住,HTTP也是傳輸應用程序數據的協議。它傳輸的應用程序數據實際上是HTML。 –

+0

對,這很有道理。然後,因爲每個層都不知道其他層,所以此架構可以輕鬆地將HTTP換出爲FTP或SSH,而無需設計任何新的內容來交付它們。完全可以通過以太網或WiFi進行通信,而無需更改上述任何層。 – brenzo