为了将世界上所有不同类型的计算机和移动设备都连接起来,必须规定一套全球通用的协议标准。互联网协议簇,即Internet Protocol Suite,就是这一通用的协议标准。这个协议簇包含了多种协议,但TCP和IP是最为重要的两个协议,因此互联网通信协议通常简称为TCP/IP协议。
7层协议图例
网络通信协议分层模型中,有两种主要的模型:
- TCP/IP标准:1970年代提出并采用了分层概念,将网络通信分为四层:数据链接层、网络层、传输层、网际应用层。
- OSI(开放系统互联通信参考模型):这是国际标准,始于上世纪70年代后期。OSI模型分成了七层,包括物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
关于两者的关系,可以理解为它们是网络通信的两大巨头,各自制定了标准,因为它们的话语权强,所以国际标准以这两者为核心,再添加一些其他标准。其中TCP/IP是网络分层模型中的核心,而OSI则更像是一种理论框架或皇室象征。
端口
端口可以理解为房子的门,是出入这间房子的必经之路。在计算机网络中,端口用于进程间的网络数据交流。每个进程都有一个唯一的端口号,操作系统通过端口号来管理进程与网络数据的交互。
关于端口号,既然有这么多端口,为了统一管理,操作系统会对端口进行编号,这就是端口号。端口号只有整数,范围从0到65535。端口号的分配不是随意的,而是按照一定的规定进行。知名端口也就是众所周知的端口号,范围为[0, 1023],是计算机内部的保留端口。动态端口则是不固定分配某种服务的端口号,范围为[1024, 65535],可以随意使用。
基于Socket的通信方式主要有两种:TCP和UDP。TCP可靠,UDP不可靠。例如,早期的QQ就是基于UDP实现的聊天室。
关于TCP协议,它是面向连接的、可靠的协议。在发送数据前,需要先建立连接(fd到fd的链接)。成功建立连接后,就可以使用send()发送数据,recv()接收数据。TCP协议基于字节流,可以进行细粒度的数据操作。
HTTP协议和RPC协议是基于TCP协议的应用层协议。HTTP主要用于浏览器与服务器之间的通信,而RPC则更多地用于服务之间的调用。它们在服务发现、连接方式等方面有所不同,但都是为了更好地实现网络通信。
网络通信的复杂度远超我们的想象。为了实现不同设备之间的互联互通,需要制定各种协议和标准。而这些协议和标准的发展也是不断演进的,随着技术的进步和需求的变化而不断改进和完善。
对于目前主流的HTTP 1.1协议,尽管其名为“超文本”协议,并支持音频视频内容,但其原始设计主要是为了网页文本展示。它主要传输的内容以字符串为主,不论是header还是body部分都如此。在body数据部分,通常使用json进行结构化数据的序列化。
当我们打开浏览器并访问一个网页时,可以在控制台(console)查看到一个请求的详细信息。对于HTTP POST请求报文,其内容十分丰富。每次页面刷新,都会包含许多头部信息,这在一定程度上浪费了带宽。特别地,像header里的重复字段,如果在每次传输时都重复发送,显然是不必要的。
相较之下,RPC(远程过程调用)协议则展现出其优越性。由于RPC的数据结构更为灵活,并且可以通过序列化与反序列化的方式处理数据,因此可以选择使用体积更小的protobuf或其他序列化协议来保存结构化数据。RPC不需要像HTTP那样考虑各种浏览器行为,如1XX、2XX、3XX状态码以及烦人的404错误,因此其性能表现更佳。这也是许多公司在内部微服务中舍弃HTTP而选择使用RPC的主要原因。
HTTP协议原理
当提及HTTP时,特指的是当前主流使用的HTTP 1.1版本。虽然HTTP2/HTTP3已经进行了诸多改进,其性能可能在某些小规模场景下优于RPC,甚至gRPC底层都直接采用了HTTP2。
关于RPC
既然已经提到了HTTP2,那么为什么还需要RPC协议呢?这是因为过去的技术积累和现有系统的兼容性考虑。不同的RPC实现还可能内置一个HTTP服务,如Brpc所示。
传输协议的比较
– RPC: 可以基于TCP或HTTP协议进行传输。
– HTTP: 专为HTTP协议设计。
传输效率的对比
– RPC通过使用自定义的TCP协议或HTTP2协议,可以减小请求报文的体积,从而提高传输效率。
– HTTP 1.1协议在请求中会包含许多无用的内容,而HTTP 2.0在经过简单封装后,可以作为一个RPC来使用。标准RPC框架更多地关注于服务治理方面。
性能消耗的分析
– RPC: 可以利用thrift实现高效的二进制传输。
– HTTP: 主要通过json实现数据交换,这相比thrift在字节大小和序列化耗时上更加消耗性能。
其他方面的考量
– 负载均衡: RPC通常自带负载均衡策略,而HTTP则需要额外配置如Nginx、HAProxy等工具来实现。
使用场景的建议
– RPC因其性能消耗低、传输效率高以及服务治理方便等特点,主要用于公司内部的服务调用。
– HTTP则适用于对外的异构环境,如浏览器接口调用、APP接口调用以及第三方接口调用等场景。