以下是 维基百科 中关于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层)。
至于 OSI 模型的各个层次都有什么系统和它们对应,这里有篇很好的文章可以满足大家的求知欲:OSI七层模型详解 。
HTTP是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:1、支持客户/服务器模式;2、简单快速;3、灵活;4、无连接;5、无状态。基于HTTP协议的客户/服务器模式的信息交换过程,分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。
无连接
无连接是指限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。HTTP 是一个无状态协议,这意味着每个请求都是独立的。
从上面的图中可以看出,HTTP、WebSocket 等应用层协议,都是基于 TCP 协议来传输数据的。我们可以把这些高级协议理解成对 TCP 的封装。
既然大家都使用 TCP 协议,那么大家的连接和断开,都要遵循 TCP 协议中的三次握手和四次握手 ,只是在连接之后发送的内容不同,或者是断开的时间不同。
更详细内容可阅读:wireshark抓包图解 TCP三次握手/四次挥手详解
对于 WebSocket 来说,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。
属于会话层的协议,面向方法,是为了应对分布式通讯能够像本地调用方法一样,使得通信无感化。
rpc是请求/响应模式,将数据以二进制的格式通过网络进行传输,这就涉及到了序列化与反序列化
在Java中,通过监听同一个socket来进行二进制数据的传输。这里有个简单的rpc实现,主要是利用了socket,代理和反射,但是代码都是在同一个项目中,并没有真正意义上实现远程调用,不过作为一个简单的例子帮助理解概念还是可以的。如果想更深入去了解rpc,可以看看dubbo,是一个阿里的开源中间件。
链接:https://blog.csdn.net/beyond_qjm/article/details/79083126
rest是一种编程风格,而不是一种协议,是面向资源的
REST是更好的利用http,使用到了http的动词(get,post,put,delete),将所有的函数都描述为URL资源来唯一识别
首先rpc的使用场景主要是后端的各个不同服务之间,我们想要在某个服务上,调用另一个服务的方法,那么如果我们用http的方式去调用的话,
我们就要将每个方法都要加上请求映射,比如使用restful风格来实现。并且每一次请求都会发起http,我们知道http是会存在一定延迟的,
且消耗较多资源。那么我们使用rcp的话,就能像在本地调用方法一样,实现远程调用(实际上只是将复杂的过程给封装起来了,可以参考第4点的链接,里面有简单rpc实现)。
在Java中,rcp可以通过socket连接,先在两个服务建立链接,客户端将需要调用的类,方法,参数, 通过输入输出流,序列化成二进制传输到服务端,
服务端再反序列化得到信息并调用自身的方法,然后将结果序列化成二进制,然后再通过socket获得输出流,并传输二进制数据给客户端,客户端再反序列化后,得到结果。
rpc是一种编程思想,而http则是基于tcp/ip的应用层协议,两者不是同个层次的东西,在rpc开发中可以通过使用http协议来完成(比如grpc),也可以基于其它协议,比如更底层的传输层的tcp协议
rpc 远程过程调用(面向方法)
soa 面向服务的架构(面向消息)
rest Representational state transfer表述性状态转移 (面向资源)
参考资料:
https://www.cnblogs.com/jiangzhaowei/p/8781635.html
https://blog.csdn.net/beyond_qjm/article/details/79083126