connection_pool
由于连接池有利于提升网络请求性能,所以不少编程语言的网络库里都会给HTTP加个连接池,比如Java/go都是这么*。
消息(头 身体)
不管是7层还是4层,各层的消息传输都是都是消息头header和消息体body:header是用于标记一些特殊信息,其中最重要的是连接端的一些信息,比如IP:Port,每一条TCP连接都是由5元组标记(Srcip, Srcport, protocol, Dstip, DstPort)。body则是放我们真正需要传输的消息内容,而这些内容只能是二进制01串(链路层的比特流,字节跳动后还可以有个比特跳动公司),毕竟计算机只认识这玩意。所以TCP传文字、图片和语言都可以,因为都可以转成编码再变成01串。但结构体呢,我们得想个办法将它也转为二进制01串,这样的方案现在也有很多现成的,比如xml, json, protobuf等。结构体呢计算机不认识,我们需要把它转为二进制数组,这个过程就叫序列化,反过来将二进制数组复原成结构体的过程叫反序列化。
序列化和反序列化
对于主流的HTTP1.1,虽然它现在叫超文本协议,支持音频视频,但HTTP设计初是用于做网页文本展示的,所以它传的内容以字符串为主。header和body都是如此。在body这块,它使用json来序列化结构体数据。
打开浏览器,再打开一个页面,在console总可以看到一个请求的详细信息:
HTTP POST报文
可以看到这里面的内容非常的多,没刷新下,页面都包含这么写头,非常浪费带宽。最明显的,像header里的那些信息,如果我们事先约定好就不需要每次都把头中重复的字段来回传,包括数据格式的类型。
而RPC就比较聪明,因为它的数据结构比较灵活,反正序列化 反序列化就可以搞定,选择体积更小的protobuf或其他序列化协议去保存结构体数据更高效,同时也不需要像HTTP那样考虑各种浏览器行为,比如繁琐的1XX、2XX、3XX和讨厌的404。因此性能也会更好一些,这也是在公司内部微服务中抛弃HTTP,选择使用RPC的最主要原因。
HTTP原理