HTTP 协议中文名的理解

老牛浏览 448评论 0发表于

原文链接: 为何HTTP被翻译为「超文本传输协议」是一次历史上的重大翻译错误?

HTTP 1.0 协议(RFC1945)是在 1996 年 5 月发布的,其中文名「超文本传输协议」估计大约也是在 1996 年左右诞生。从此以后,这个名词就被固定下来,一直沿用到今天。非常遗憾,这是一个错误的翻译,而且错误的性质很严重。具体来说,就是将「Hypertext Transfer Protocol」中的「transfer」翻译错了。不应该将其翻译为「传输」,而应该翻译为「转移」或者「传递」。「传输」的英文单词应该是「transport」,而不是「transfer」。其实如果最初的译者确实曾经认真读过一些互联网协议,例如 HTTP 协议、FTP 协议等等,就会很容易地发现,在这些协议中,「transfer」和「transport」的含义有很明显的区别,根本无法混用。

虽然 IETF 的 RFC 在格式上比 ITU-T 的那些规范要自由很多,但 RFC 的作者都是非常严谨的,在术语的使用上面很少出现因混用导致的歧义。在 IETF 的 RFC 中,「transport」的含义是:从端到端(例如从 ip1:port1 到 ip2:port2)可靠地搬运比特,也就是 TCP/IP 协议栈中的第 3 层传输层(transport layer)协议所做的那些事情。将「transport」翻译为「传输」,100% 正确。而「transfer」的含义是:通过在客户端-服务器端之间转移一些带有操作语义的操作原语,来执行某种操作。「transfer」是 TCP/IP 协议栈中的第 4 层应用层的概念,而不是第三层传输层的概念。「transfer」所转移的是带有明确操作语义的操作原语,而不是没有操作语义的比特流。不仅仅非专业的翻译者很难理解「transfer」和「transport」的区别,很多经验丰富的 Web 开发者也常常混淆两者的区别。即使在母语为英语的国家,同样也存在着很多混淆。但是理解两者之间的区别,是理解 HTTP 协议本质的关键。为了澄清这个问题,HTTP 1.1 协议的主要作者 Roy Fielding 在其 2000 年发表的博士论文《Architecture Styles and the Design of Network-based Software Architectures》(中文版名为《结构风格与基于网络的软件架构设计》)的 6.5.3 小结中专门强调:HTTP 并不是一种传输协议。其具体内容如下:

HTTP并不是被设计为一个传输协议(transport protocol),它是一种转移协议(transfer protocol)。在 HTTP 协议中,消息通过在那些资源的表述上的转移和操作,来对资源执行一些动作,从而反映出 Web 架构的语义。使用这个非常简单的接口来获得广泛的功能是完全有可能的,但是必须要遵循这个接口,以便 HTTP 的语义被保持为对于中间组件是可见的。这就是为何 HTTP 协议可以穿越防火墙的原因。大多数当前协议的对于 HTTP 的扩展,除了 WebDAV 以外,仅仅使用 HTTP 作为一种使其他的应用协议穿越防火墙的方法,这从根本上来说是一种有误导性的想法。不仅仅是因为这种扩展方式挫败了拥有一个防火墙的目的,而且从长远来看它将无法工作,因为防火墙的厂商将会不得不执行额外的协议过滤。因此这种扩展方式对于那些在 HTTP 协议之上的扩展而言是没有意义的,因为这种情况下 HTTP 所完成的唯一的事情就是添加了来自一个遗留语法的负载(译者注:即添加了额外的 HTTP 协议负载)。一个真正的 HTTP 应用应该将协议用户的动作映射到能够使用 HTTP 语义来表达的某个事物,以这种方式创建一个基于网络的 API 来提供服务,能够被用户代理和中间组件所理解,而不需要知道关于应用的任何知识。

综上所述,HTTP 协议名称中的「transfer」可以肯定是与「传输」没什么关系的。「传输」这件事情,传输层协议 TCP/UDP 已经做的很好了,不需要 HTTP 再来越俎代庖。既然「transfer」与「transport」含义有明显区别,而「transport」又被正确地翻译为「传输」,那么将「transfer」也翻译为「传输」,必然会带来很大的误导。从实事求是的角度,我们作为专业的 Web 开发者,不应该任由「超文本传输协议」这个名词以讹传讹继续流传下去,贻害广大初学者。

那么将「transfer」翻译为什么更好呢?我在翻译 Fielding 博士论文时,对于这个问题曾经纠结了很长时间。在中文之中,将「transfer」翻译为「转移」或者「传递」,都比翻译为「传输」要好。我最后选择了「转移」,而没有选择「传递」,主要原因是「传递」与「传输」仅有一字之差,仍然会让不求甚解的开发者产生误解,误以为「传输」与「传递」完全是相同的含义。

于是,我在 Fielding 博士论文中文版和 《REST 实战》 中文版中,都将 HTTP 翻译为「超文本转移协议」,将 REST 翻译为「表述性状态转移」。在大多数地方,都将「transfer」统一翻译为「转移」。当然,如果你真的理解了「transfer」和「transport」之间的区别,将 HTTP 翻译为「超文本传递协议」,将 REST 翻译为「表述性状态传递」都是可以的。

具体到 HTTP 协议,「transfer」代表的含义是:通过在客户端 - 服务器端之间转移代表资源当前状态的资源表述,来对服务器端的资源执行某种操作。这既是缩写词 HTTP 中「transfer」的含义,也是缩写词 REST 中「transfer」的含义。

点赞
收藏
暂无评论,快来发表评论吧~
私信
老牛@ilaoniu
老牛,俗称哞哞。单纯的九零后理工小青年。喜欢折腾,爱玩,爱音乐,爱游戏,爱电影,爱旅游...
最后活跃于