2017-10-17 49 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