http,websocket,rpc的之间的关系

本文介绍了OSI模型与TCP/IP,指出HTTP、WebSocket等处于应用层。阐述了HTTP协议特点及信息交换过程,说明WebSocket依赖HTTP握手后经TCP传输。还介绍了rpc远程过程调用,对比了rpc和http的区别,提及REST编程风格及Web Service三种使用风格。

1.OSI 模型与 TCP/IP

以下是 维基百科 中关于OSI 模型的说明:
开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,ISO/IEC 7498-1),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织(ISO)提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。

TCP/IP 协议可以看做是对 OSI 模型的一种简化(以下内容来自 维基百科):
它将软件通信过程抽象化为四个抽象层,采取协议堆叠的方式,分别实作出不同通信协议。协议套组下的各种协议,依其功能不同,被分别归属到这四个阶层之中7,常被视为是简化的七层OSI模型。

这里有一张图详细介绍了 TCP/IP 协议族中的各个协议在 OSI模型 中的分布,一图胜千言(下图来自 科来):
见图HTTP、WebSocket等协议都是处于 OSI 模型的最高层: 应用层
IP 协议工作在网络层(第3层), TCP** 协议工作在传输层(第4层)。

2.HTTP

HTTP是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:
1、支持客户/服务器模式;2、简单快速;3、灵活;4、无连接;5、无状态。
基于HTTP协议的客户/服务器模式的信息交换过程,分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。

无连接
无连接是指限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

无状态
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。HTTP 是一个无状态协议,这意味着每个请求都是独立的。

3. WebSocket、HTTP 与 TCP

从上面的图中可以看出,HTTP、WebSocket 等应用层协议,都是基于 TCP 协议来传输数据的。我们可以把这些高级协议理解成对 TCP 的封装。

既然大家都使用 TCP 协议,那么大家的连接和断开,都要遵循 TCP 协议中的三次握手和四次握手 ,只是在连接之后发送的内容不同,或者是断开的时间不同。

对于 WebSocket 来说,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

4.rpc 远程过程调用

属于会话层的协议,面向方法,是为了应对分布式通讯能够像本地调用方法一样,使得通信无感化。
rpc是请求/响应模式,将数据以二进制的格式通过网络进行传输,这就涉及到了序列化与反序列化在Java中,通过监听同一个socket来进行二进制数据的传输。这里有个简单的rpc实现,主要是利用了socket,代理和反射,但是代码都是在同一个项目中,并没有真正意义上实现远程调用,不过作为一个简单的例子帮助理解概念还是可以的。如果想更深入去了解rpc,可以看看dubbo,是一个阿里的开源中间件。

链接:https://blog.youkuaiyun.com/beyond_qjm/article/details/79083126

5.REST (Representational state transfer 表述性状态转移)

rest是一种编程风格,而不是一种协议,是面向资源的REST是更好的利用http,使用到了http的动词(get,post,put,delete),将所有的函数都描述为URL资源来唯一识别

6.rpc 和 http的区别

RPC(Remote Procedure Call)
首先rpc的使用场景主要是后端的各个不同服务之间,我们想要在某个服务上,调用另一个服务的方法,那么如果我们用http的方式去调用的话,我们就要将每个方法都要加上请求映射,比如使用restful风格来实现。并且每一次请求都会发起http,我们知道http是会存在一定延迟的,且消耗较多资源。那么我们使用rpc的话,就能像在本地调用方法一样,实现远程调用(实际上只是将复杂的过程给封装起了,可以参考第4点的链接,里面有简单rpc实现)。

在Java中,rpc可以通过socket连接,先在两个服务建立链接,客户端将需要调用的类,方法,参数, 通过输入输出流,序列化成二进制传输到服务端,服务端再反序列化得到信息并调用自身的方法,然后将结果序列化成二进制,然后再通过socket获得输出流,并传输二进制数据给客户端,客户端再反序列化后,得到结果。
rpc是一种编程思想,而http则是基于tcp/ip的应用层协议,两者不是同个层次的东西,在rpc开发中可以通过使用http协议来完成(比如grpc),也可以基于其它协议,比如更底层的传输层的tcp协议

7.Web Service的三种使用风格

rpc 远程过程调用(面向方法)
soa 面向服务的架构(面向消息)
rest Representational state transfer表述性状态转移 (面向资源)

–参照
原文链接:https://blog.youkuaiyun.com/rerwr1rrr/article/details/99485668**

### HTTPRPC的特点和应用场景 #### 一、概述 HTTP(Hypertext Transfer Protocol)是一种广泛使用的应用层协议,主要用于浏览器与服务器之间的数据交换。而RPC(Remote Procedure Call)则是远程过程调用的缩写,旨在让开发者像调用本地函数一样调用远程服务中的方法[^1]。 --- #### 二、HTTP的主要特点及优缺点 ##### 特点 - **普适性强**:几乎所有的编程语言都有内置的支持库来处理HTTP请求,这使得其成为跨平台通信的标准选择之一。 - **无状态性**:每一次请求都是独立完成的,不依赖前后的上下文关系,简化了缓存机制的设计[^2]。 - **易调试**:由于采用了明文形式的数据传输方式(尽管现在普遍加密),便于通过工具观察流量并排查错误。 - **丰富的生态系统**:得益于互联网的发展历程积累下来的经验教训,围绕着标准衍生出了众多成熟可靠的中间件产品和服务[^3]。 ##### 优点 - 开发周期短,学习成本低; - 支持多种媒体类型,特别是JSON格式已经成为事实上的默认选项; - 天然具备良好的互操作能力,适合构建开放API接口供第三方接入使用。 ##### 缺点 - 相较于某些定制化的解决方案,在极端高性能需求面前可能存在瓶颈; - 默认情况下缺乏一些高级功能支持,例如自动重试失败的任务或是平滑切换不同版本的服务实例等操作[^4]。 --- #### 三、RPC的核心要素及其利弊分析 ##### 核心要点 - **透明度高**:隐藏掉底层网络细节之后,程序员只需关心业务逻辑本身即可,无需操心如何打包解包消息体等问题[^1]^。 - **高效的序列化方案**:相比起基于字符串解析的传统做法,现代RPC框架倾向于采用紧凑型二进制表示法来进行对象转换作业,从而减少带宽消耗提升吞吐量表现[^4]^。 - **集成更多辅助特性**:“开箱即用”的组件集合里通常包含了诸如负载均衡策略制定、超时控制设定等功能模块,有助于快速搭建健壮可用的基础架构体系^。 ##### 长处 - 提升程序间的交互效率,尤其是在大规模分布式环境下展现明显优势; - 更贴近实际编码习惯,降低心智负担; - 自动化程度较高,减少了人为干预带来的不确定性风险。 ##### 局限之处 - 存在一定的侵入性,可能会影响既有系统的稳定性; - 若选错实现路径,则可能导致后期维护困难重重; - 对新手不够友好,初次接触者需花费较多精力去理解背后原理[^2]^. --- #### 四、典型适用场景探讨 | 场景描述 | 推荐技术 | 理由 | |------------------------------|----------------|----------------------------------------------------------------------------------------| | Web前端到后端的一般性通讯 | HTTP | 方便快捷,易于与其他在线资源联动 | | 微服务之间高频次的小规模交流 | RPC | 减少不必要的开销,增强整体运行效能 | | 跨组织边界的公开服务平台建设 | REST over HTTP| 广泛接受度高,利于吸引外部贡献 | | 实时音视频流媒体分发 | WebSocket 或 gRPC| 前者保持持久连接通道后者兼顾速度质量 | --- #### 示例代码片段展示两种风格区别 以下是分别利用Python编写的一个简易版客户端发起GET请求的例子: ```python import requests response = requests.get('https://example.com/api/resource') print(response.json()) ``` 下面这段则演示了一个典型的gRPC调用情形: ```proto title="service.proto" syntax = "proto3"; package example; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply); } message HelloRequest { string name = 1; } message HelloReply { string message = 1; } ``` ```python from grpc import insecure_channel from generated_pb2_grpc import GreeterStub from generated_pb2 import HelloRequest channel = insecure_channel('localhost:50051') stub = GreeterStub(channel) request = HelloRequest(name='World') reply = stub.SayHello(request) print(reply.message) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值