首先RPC是可以基于TCP协议的,也可以基于HTTP协议的。而HTTP是基于HTTP协议的。
在说RPC和HTTP的区别之前,我们先了解一下OSI的七层网络结构模型
七层架构就是在在不可靠不安全的线路上建立安全的渠道
第一层:物理层。这一层主要就是传输这些二进制数据。
两个硬件之间怎么通信。具体就是一台发些比特流,然后另一台能收到。
于是,科学家就发明了物理层:
就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特,物理层包括架空明线,光纤等。
第二层:数据链路层。将下面的网络层的数据包封装成数据帧,便于物理层传输;
现在通过电线我能发数据流了,但是,我还希望通过无线电波,通过其它介质来传输。然后我还要保证传输过去的比特流是正确的,要有纠错功能。
于是,发明了数据链路层:
定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。链路产品中最常见的当属网卡,网桥也是链路产品
第三层:网络层。定义网络设备间如何传输数据;
传输层只是解决了打包的问题。但是如果我有多台计算机,怎么找到我要发的那台?或者,A要给F发信息,中间要经过B,C,D,E,但是中间还有好多节点如K.J.Z.Y。我怎么选择最佳路径?这就是路由要做的事。
于是,发明了网络层。即路由器,交换价那些具有寻址功能的设备所实现的功能。这一层定义的是IP地址,通过IP地址寻址。所以产生了IP协议。
第四层:传输层。管理着网络中的端到端的数据传输;
现在我能发正确的发比特流数据到另一台计算机了,但是当我发大量数据时候,可能需要好长时间,例如一个视频格式的,网络会中断好多次(事实上,即使有了物理层和数据链路层,网络还是经常中断,只是中断的时间是毫秒级别的)。
那么,我还须要保证传输大量文件时的准确性。于是,我要对发出去的数据进行封装。就像发快递一样,一个个地发。
于是,先发明了传输层(传输层在OSI模型中,是在网络层上面)
例如TCP,是用于发大量数据的,我发了1万个包出去,另一台电脑就要告诉我是否接受到了1万个包,如果缺了3个包,就告诉我是第1001,234,8888个包丢了,那我再发一次。这样,就能保证对方把这个视频完整接收了。
例如UDP,是用于发送少量数据的。我发20个包出去,一般不会丢包,所以,我不管你收到多少个。在多人互动游戏,也经常用UDP协议,因为一般都是简单的信息,而且有广播的需求。如果用TCP,效率就很低,因为它会不停地告诉主机我收到了20个包,或者我收到了18个包,再发我两个!如果同时有1万台计算机都这样做,那么用TCP反而会降低效率,还不如用UDP,主机发出去就算了,丢几个包你就卡一下,算了,下次再发包你再更新。
TCP协议是会绑定IP和端口的协议。
第五层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;
现在我们已经保证给正确的计算机,发送正确的封装过后的信息了。但是用户级别的体验好不好?难道我每次都要调用TCP去打包,然后调用IP协议去找路由,自己去发?当然不行,所以我们要建立一个自动收发包,自动寻址的功能。
于是,发明了会话层。会话层的作用就是建立和管理应用程序之间的通信。
第六层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;
现在我能保证应用程序自动收发包和寻址了。但是我要用Linux给window发包,两个系统语法不一致,就像安装包一样,exe是不能在linux下用的,shell在window下也是不能直接运行的。于是需要表示层(presentation),帮我们解决不同系统之间的通信语法问题。
第七层:应用层。定义了用于在网络中进行通信和传输数据的接口;
OK,现在所有必要条件都准备好了,我们可以写个android程序,web程序去实现需求它,应用它。
在五层协议中表示层和会话层是和应用层合并了
因此我们可以这样来看七层协议:
当客户端(即应用层)发出想要浏览某个页面时,位于应用层的DNS协议会将其页面的域名告诉应用层,然后http协议将生成针对目标web服务器的http请求报文。(2)在TCP协议下将http请求报文分割成报文段,然后将每个报文段可靠地传给对方。(3)IP协议中,搜索对方的地址,一边中转一边传送。·············到达对方tcp层,tcp将接收到的报文段按序号进行重组,然后http协议对请求的内容进行处理
Http和RPC的区别
RPC(即Remote Procedure Call,远程过程调用)和HTTP(HyperText Transfer Protocol,超文本传输协议)他们最本质的区别,就是RPC主要工作在TCP协议之上,而HTTP服务主要是工作在HTTP协议之上,我们HTTP协议是在传输层协议TCP之上的,且HTTP接口由于受限于HTTP协议,需要带HTTP请求头。所以效率来看的话,RPC要要更胜一筹。
在性能消耗上 主要在于序列化和反序列化的耗时
RPC,可以基于thrift实现高效的二进制传输
HTTP,大部分是通过json来实现的,字节大小和序列化耗时都比thrift要更消耗性能RPC基本都自带了负载均衡策略且在服务治理方面能做到自动通知,RPC主要要用于公司内部的服务调用,HTTP主要用于对外的异构环境,app,浏览器调用