HTTP与TCP/IP,向Web服务器发送数据

133

我目前正在开展一个项目,需要使用Arduino Nano (http://arduino.cc/en/Main/arduinoBoardNano)将温度传感器的数据发送到Web服务器。

起初,我以为这很容易,因为有很多出色的库可以帮助进行POST/GET等操作。然而,我的教授告诉我,我需要使用TCP/IP向服务器发送数据,而据我所知,POST和GET是HTTP方法。

有人能解释一下HTTP和TCP/IP之间的区别吗?特别是与向Web服务器发送数据相关的区别。我希望得到一个不太技术化的答案(我对这些都很新)。

最后,如果有任何有经验的人能指点一下如何让Arduino实现上述功能,我将不胜感激。

谢谢!


3
它们是协议层次结构中的不同层。请查看它们的维基百科页面或转到类似tcpipguide.com这样的网站,了解协议如何分层。 - Barmar
1
@Barmar非常有用的链接到tcpipguide.com。 - Adam
7个回答

179

简而言之,TCP是传输层协议,HTTP是运行在TCP上的应用层协议。
详细来说,要理解区别(以及许多其他网络主题),您需要了解分层网络模型的概念。基本上,有不同的协议可以让计算机以不同的距离和抽象层次进行通信。
在网络堆栈的底部是物理层。这是电信号、光脉冲或无线电波实际传输信息的地方。物理层没有真正的协议,而是具有电压、频率和其他物理属性的标准。您可以直接通过这种方式传输信息,但需要大量功率或专用线路,并且如果没有更高的层次,您将无法共享带宽。
上面一层是链路层。这一层涵盖与共享物理通信介质的设备的通信。在这里,诸如Ethernet、802.11a/b/g/n和Token Ring等协议指定如何处理对物理介质的多个并发访问以及如何将流量引导到一个设备而不是另一个设备。在典型的家庭网络中,这是您的计算机与家庭“路由器”通信的方式。
第三层是网络层。在大多数情况下,这由Internet Protocol(IP)主导。这是互联网的魔力所在,您可以与世界各地的计算机进行通信,而无需知道它在哪里。路由器处理将您的流量从本地网络引导到另一台计算机所在的网络,在那里它自己的链路层处理将数据包发送到正确的计算机。
现在我们正在取得进展。我们可以与世界各地的计算机进行通信,但该计算机正在运行许多不同的程序。它应该如何知道将您的消息交付给哪个程序?传输层通常使用端口号来处理此问题。最受欢迎的传输层协议是TCP和UDP。TCP执行许多有趣的操作,以平滑网络层分组交换通信中的粗糙点,例如重新排序数据包、重传丢失的数据包等。UDP更不可靠,但开销更小。
因此,我们已将您的浏览器连接到另一端的Web服务器软件,但服务器如何知道您想要哪个页面?您如何发布问题或答案?这些是应用层协议处理的事情。对于Web流量,这是超文本传输协议(HTTP)。有数千种应用层协议:电子邮件的SMTP、IMAP和POP3;聊天的XMPP、IRC和ICQ;远程管理的Telnet、SSH和RDP等。
这些是TCP/IP网络模型的五个层次,但它们实际上只是概念性的。OSI模型有7个层次。在现实中,一些协议在各种层之间进行切换,或者可以同时工作在多个层上。例如,TLS/SSL提供了网络层和传输层之间的加密和会话信息。在应用程序层以上,应用程序编程接口(API)管理与Web应用程序(如Quora、Twitter和Facebook)的通信。

131

HTTP是一个协议,主要用于浏览互联网(IE、Firefox等)。它建立在TCP之上,为两台计算机之间提供可靠的连接(如果数据包丢失,则进行重传)。TCP本身建立在IP之上,提供统一的寻址方式来进行计算机之间的通信。TCP/IP是互联网和99%的其他网络的基础。

基本上,这意味着如果你正在使用HTTP进行通信,则其底层是TCP/IP(但我确定这不是你教授的意思)。

Arduino Nano不支持所有这些功能,因此您需要介入一个东西,可以将Nano的信号转换为TCP/HTTP通信。

以下是您的一些选项:

  1. 通过串口与Nano通信,并使PC将您的串口协议转换为HTTP / TCP。
  2. 选择某些支持Ethernet/Wifi扩展板(Uno/Mega)的其他Arduino板,或选择自带以太网的自定义板子,代替Nano。
  3. 使用另一个Arduino(Uno/Mega)与Ethernet扩展板作为附加板,通过串口或借助RF模块与Nano进行通信(我个人过去实现了这个选项)。
  4. 另一个不寻常的选择是使用音频电缆将Nano连接到Android智能手机上,并使用软调制解调器库,例如(https://code.google.com/p/arms22/issues/detail?id=2),其中包含了Android的实现,并编写一个Android应用程序。

您提到的Web服务器仅支持HTTP,因此如果您想通过TCP进行通信,则需要使用一些TCP服务器。

现有的一种为传感器数据提供图形可视化的Web服务是https://xively.com/,其API基于REST,建立在HTTP之上。但并不是唯一的选择。


2
@Miro,如果我使用不同的自定义板卡并且具有独立的以太网,该怎么考虑您的第二个选项?您能否建议一些板卡?之后我该如何继续? - ddpd
我非常喜欢Spark平台(内置wifi)- https://store.spark.io/?product=spark-core - Meir Tseitlin
如果你需要更强大的东西 - 我建议选择Udoo - http://www.udoo.org/。他们做高质量的板子。或者选择价格略低的Beaglebone Black (http://beagleboard.org/BLACK)。 - Meir Tseitlin

63

IP vs. TCP vs. HTTP

IP 想象成一条高速公路,它允许其他协议进入并找到其它计算机。而 TCPUDP 则是高速公路上的“货车”,它们所运载的“货物”包括了诸如 HTTP、文件传输协议 (FTP)等协议。

IP 是连接所有网络所必须的;

TCP 是一种安全地传输数据的机制;

HTTP 使用 TCP 传输数据,是 Web 服务器和客户端所使用的特定协议。


更像是“用特定协议包装的数据”。 - Yash Nag
迄今为止最好、最简化和易懂的答案。 - Enis Arik
惊人的答案! - Ivan

29

@Miro回答了这个问题,用技术术语表述的很好。但对于网络主题上的新手,我想提供一个非常技术化的解释:

可以将TCP或UDP视为美国邮政服务的等效物,而HTTP则相当于一种商业信函模板。如果你要写给一个陌生人,采用商业信函格式是传输你信息的一个好的通用方式,能包含"谁、怎么样、什么、何时和何地"的信息,但并不是USPS所允许的唯一格式。也就是说,如果你要写给商业伙伴或爱人,你可能会放弃形式主义,转而使用更有效率的格式,比如开票发票、情书或贺卡,但USPS(类似于TCP或UDP)仍然会在背后为你运送这些信件来回。


2
这是一个非常棒的比喻。 - Sammy Taylor
谢谢你的回答,现在我有办法向不熟悉这个概念的人解释了。 - iomv

2

一般而言,并没有特别的理由对TCP/IP或HTTP进行偏好,除了HTTP更容易编码外。HTTP存在一些额外开销,但与延迟相比通常很小。此外,一个良好的TCP/IP链接将具有关于稳定性的代码,而HTTP则免费提供。

因此,除非相关教授有特别的技术要求(请问!),或者他们希望这成为某种特殊的学习体验(请问!),否则我认为POST/GET类型的交互更优秀。许多系统今天确实以这种方式使用JSON对象进行通信。


2
您可以以餐厅为例,您阅读菜单,将订单交给负责准备菜肴的大厨。最后,服务员将由大厨准备的订单带回来。
这里,服务员是TCP/IP,菜单是HTTP,而大厨则是服务器。
HTTP告诉我们请求和期望的响应内容。 TCP/IP并不关心您所发出的请求,它的工作是可靠地将数据从客户端(顾客)传输到服务器(大厨)。
希望现在清楚了。

0

我在这里看到很多解释,但为什么不阅读整个解释,请查看此网站上的完整解释:

https://www.goanywhere.com/blog/http-vs-tcp-whats-the-difference#:~:text=TCP%20contains%20information%20about%20what,data%20in%20the%20stream%20contains

好的,这提供了解释,但是教授为什么要问这个问题呢?他是否希望你了解如何使用TCP/IP发送数据?这只是他想让你学习的一课,因为现在通过互联网发送数据的正确方式是使用SOAP(XML)或JSON。这些都是许多公司使用的协议。你刚才谈到了REST,但那不是将被使用的协议。TCP/IP只是携带数据的协议,背后还有更多内容。

你的教授是指:连接必须保持打开状态,并且必须能够进行双向通信,就像聊天应用程序一样。如果是这种情况,那么WebSocket就是解决方案。WebSocket使用TCP/IP。通过这种方式,您将与服务器建立一个开放的通信通道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接