HTTP与RPC区别比较分析

一、TCP的特点与问题

我们八股文常背的
TCP是:(1)面向连接 (2)可靠的(3)基于字节流的

我们使用TCP协议的话,就需要使用socket编程

客户端需要做的

//获取socket套接字
fd = socket(AF_INET,SOCK_STREAM,0);
//绑定IP与port
bind(fd,  struct sockaddr *addr, addrlen);
//建立连接
connect(fd, struct sockaddr* addr, addrlen);

对于使用纯裸TCP存在的问题,我们关注点放在基于字节流上

什么叫基于字节流?
就是当通信双方建立连接后,我们可以形象一点的看作,通信双方之间建立了一个“通信的管道”,想要通信的数据一个一个比特位在通信管道内传输。

如果还不明白的话,我们可以打一个比方:
数据就像河流中的水一样;通信管道就是河道;河流中的水是由小的河流分支汇集而来(小分支就是一个一个用户发送数据);最终河流汇入大海(大海就是数据接收方)
大海收到河流中的水,但是收到的水并不是一批一批收到,而是不断的收到,这样大海无法确定对方在发送的时候一次发送了多少。所以在接收的时候,就可能一次收的比对方一次发的多,或者少。这就是大名鼎鼎的粘包问题
【如果还有不明白的,大家可以评论,我有空再详细讲一下】

总之,使用TCP就会有粘包问题,为了解决这个问题,我们就需要在TCP的上层(应用层)再设计一些自定义协议,解决粘包问题,最常见的就是HTTP,HTTP中的某一些字段就可以标识哪些属于同一个报文,这样就可以避免粘包问题。

二、HTTP与RPC

TCP是传输层的协议,而基于TCP造出来的HTTP和各类RPC协议,它们都只是定义了不同消息格式的应用层协议而已。

1、HTTP协议

HTTP协议【超文本传输协议】,平常我们用浏览器使用的就是HTTP一系列的协议

想对HTTP有更具体了解可以看我总结的HTTP复习系列
HTTP复习(一)
HTTP复习(二)

2、RPC协议

而RPC(Remote Procedure Call),又叫做远程过程调用。它本身并不是一个具体的协议,而是一种调用方式。

调用方法其实跟我们平常在代码中调用自定义方法(或者叫函数)差不多。只不过这个方法是远端服务器暴露出来的接口,我们通过这个接口去使用,就好像我们在调用本地函数一样,就屏蔽了底层网络细节,就方便了很多。需要完成一个任务就调用一个接口。简直不要太爽(回想一些基于TCP的socket通信)

虽然大部分RPC底层使用的是TCP,但是这也不被完全限制。RPC底层可以使用UDP/TCP,甚至是HTTP。

3、有了HTTP,why要出现RPC协议

其实RPC出现早于HTTP。
TCP是上世纪70年代出现,HTTP是90年代才流行。
但是TCP的粘包问题确实一直存在,这期间就要用各种各样的自定义应用层协议来解决粘包问题。

4、有了RPC,why要出现HTTP协议

一些app,只需要客户端与自家的服务器进行消息传递【C/S架构】,这个时候各家使用各家的RPC协议就可以。

但是随着【B/S架构】发展,浏览器要访问各种服务器,这个使用每家的服务器都必须遵守统一的规则,所以HTTP应用越加广泛。

现在【B/S】【C/S】架构分割越来越不明显了,RPC一般只用于公司内部使用了。

三、HTTP与RPC的区别

1、服务发现

首先要向某个服务器发起请求,你得先建立连接,而建立连接的前提是,你得知道IP地址和端口。这个找到服务对应的IP端口的过程,其实就是服务发现

HTTP中,你知道服务的域名,就可以通过DNS服务去解析得到它背后的IP地址,默认80端口

RPC的话,就有些区别,一般会有专门的中间服务去保存服务名和IP信息,比如consul或者etcd甚至是redis。想要访问某个服务,就去这些中间服务去获得IP和端口信息。由于dns也是服务发现的一种,所以也有基于dns去做服务发现的组件,比如CoreDNS。

可以看出服务发现这一块,两者是有些区别,但不太能分高低。

2、底层连接形式

以主流的HTTP1.1协议为例,其默认在建立底层TCP连接之后会一直保持这个连接(keep alive),之后的请求和响应都会复用这条连接。

而RPC协议,也跟HTTP类似,也是通过建立TCP长链接进行数据交互,但不同的地方在于,RPC协议一般还会再建个连接池,在请求量大的时候,建立多条连接放在池内,要发数据的时候就从池里取一条连接出来,用完放回去,下次再复用,可以说非常高效。
在这里插入图片描述

3、传输的内容

基于TCP传输的消息,说到底,无非都是消息头header消息体body

header:存储的是一些标志信息。可以传字符串也可以传二进制

body:实际传输的内容。一般采用JSON进行序列化
在这里插入图片描述
对于主流的HTTP1.1,虽然它现在叫超文本协议,支持音频视频,但HTTP设计初是用于做网页文本展示的,所以它传的内容以字符串为主。header和body都是如此。在body这块,它使用json来序列化结构体数据。

对于HTTP/1.1来说,会有头部字段冗余,传输字符串而不是二进制,队头阻塞等等问题。但是HTTP/2进行了很好的改进。所以HTTP/2的性能不一定就比RPC差了。
甚至gRPC底层都是使用的HTTP/2

而RPC,因为它定制化程度更高,可以采用体积更小的protobuf或其他序列化协议去保存结构体数据,同时也不需要像HTTP那样考虑各种浏览器行为,比如302重定向跳转啥的。因此性能也会更好一些,这也是在公司内部微服务中抛弃HTTP,选择使用RPC的最主要原因。

总结于小林coding~

Windows平台上,有许多常用的开发与调试工具可供使用。其中一些工具包括: 1. Sysinternals:这是一个由内核专家马克·拉斯科维茨(Mark Russinovich)开发的工具集合,包含了大量的Windows系统工具,是Windows开发必备的工具之一。其中一些工具包括: - Procmon.exe:用于监视程序运行过程中的动作,可用于性能监控。 - procexp.exe:类似于任务管理器,但功能更强大,可以查看加载模块、线程列表、创建dump等。 - autoruns.exe:用于查看系统和IE等的加载项。 - Dbgview.exe:用于查看调试端口输出。 2. 其他工具:除了Sysinternals之外,还有其他一些常用的工具,如: - Windbg:用于双机调试,支持pipe、TCP等。 - Visual Studio(VS):VS也支持双击调试,只需要拷贝一个东西到目标机上。 - IDA:主要用于静态分析。 - Ollydbg:用于反汇编和调试- Processhacker:作为Procexp.exe的补充工具- Total Uninstall:用于观察应用程序对系统配置等的改变,比如对比注册表。 - Unlocker:用于解除文件占用。 - Depends.exe:用于观察模块对DLL的依赖关系。 - PE Explorer:用于PE文件分析。 - SQLiteAdmin:用于查看SQLite数据库。 - Cookie Admin:用于查看cookie。 3. 抓包和网络数据分析:对于抓包和网络数据分析,可以使用以下工具- Microsoft Network Monitor - Fiddler - Wireshark - HttpAnalyzer 此外,还有一些调试必读的书目,例如张银奎的《软件调试》,以及一些调试参考书目,如《Windows高级调试》、《黑客反汇编揭秘》、《C反汇编与逆向分析技术揭秘》、《Windows核心编程》、《深入理解Windows操作系统》、《Windows内核情景分析》、《逆向工程核心原理》。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [windows客户端开发调试工具](https://blog.youkuaiyun.com/baihacker/article/details/38308331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Windows下的TCP/UDP网络调试工具-NetAssist以及Linux下的nc网络调试工具](https://blog.youkuaiyun.com/beiback/article/details/125590011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值