我开发了一个基于 Beancount 的账本托管服务 HostedBeans,欢迎大家来了解纯文本复式记账并试用我的服务。
查看源代码

笔记:对比 HTTP 和 FTP

HTTP和FTP作为互联网架构中相当基本的应用层协议,想必大家对它们都有一些了解,因此,本文不详述其协议本身,而是着重于它们之间的对比。

应该说HTTP和FTP的定位是相当接近的,FTP用于传输文件,而HTTP用于传输本质也是文件的“对象”(不要忘了HTTP还有PUT和DELETE等方法). 它们均基于TCP, C/S架构,均为基于纯文本的“简单”协议,都有SSL版本:HTTPS和FTPS(不是SFTP!).

通常FTP除了文件本身的属性,如体积,修改时间外,没有其他的元信息(meta-data), 而每个HTTP报文则都会携带大量的元信息,即HTTP报头中的键/值对。这估计也是HTTP将文件抽象为“对象”的原因吧。下面是一个简单(大多数浏览器都会产生更多报头)的HTTP请求报头:

GET / HTTP/1.1
Host: jyprince.me
Connection: kepp-alive
User-agent: Mozilla/4.0
Accept-language: zh-cn

之所以我将报头中的键/值对视为“信息”而不是协议本身,是因为它们中的大部分字段都是交由Web服务器或者浏览器来处理的。

当然,也有一些例外,如 Connection: kepp-alive, 这个报头指出客户端希望于服务器建立持久连接。基于持久连接的HTTP, 和FTP一样,都可以认为是一问一答的交互式会话。

但HTTP是无状态的,每一问一答中间,是没有关联的,将多个应答放在同一个TCP连接中仅仅是为了节约建立TCP连接的时间。

而FTP的两个应答之间,服务器是需要维护状态信息的,例如客户端的当前路径,这将直接影响到之后的指令的行为。

HTTP虽然也有手段携带状态信息(如Cookie), 但在我看来,这些属于协议之上承载的信息,并非协议本身。

HTTP报文的数据紧接报头,以一个空行隔开,即HTTP报文中的键/值对(元信息)和数据是一体的。而FTP连接中仅发送控制指令,每当需要传输文件的数据时,会建立另一个连接专用于传输数据。

总结:

  • HTTP在报头中以键/值对携带元信息,FTP没有
  • HTTP无状态,FTP在会话期间维护状态
  • HTTP的元信息与数据一同传输,FTP使用单独的连接传输数据

撰写评论

如希望撰写评论,请发邮件至 jysperm@gmail.com 并注明文章标题,我会挑选对读者有价值的评论附加到文章末尾。

精子生于 1995 年,英文 ID jysperm.

订阅推送

通过 Telegram Channel 订阅我的博客日志、产品和项目的动态:

王子亭的博客 @ Telegram


通过邮件订阅订阅我的博客日志、产品和项目的动态(历史邮件):

该博客使用基于  Hexo  的  simpleblock  主题。博客内容使用  CC BY-NC-ND  授权发布。最后生成于 2023-12-20.