分层
应用层
为操作系统或网络程序提供访问网络服务的接口,如http,rpc
传输层
负责端到端的传输,主要根据通信子网的特性,最佳的利用网络资源,为两个端系统的会话层之间,提供建立、维护和取消传输连接的功能,网络层只是根据网络地址将源结点发出的数据包传送到目的结点,而传输层则负责将数据可靠地传送到相应的端口
如tcp,三次握手四次挥手,可靠传输
udp,大段报文传输,非可靠
网络层
根据网络地址将源结点发出的数据包传送到目的结点
如IP协议
数据链路层
数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。
物理层
激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。该层为上层协议提供了一个传输数据的可靠的物理媒体。简单的说,物理层确保原始的数据可在各种物理媒体上传输。
TCP和UDP的区别及应用场景
面向连接VS无连接
TCP建立一个连接需要3次握手IP数据包,断开连接需要4次握手。另外断开连接时发起方可能进入TIME_WAIT状态长达数分钟(视系统设置,windows一般为120秒),在此状态下连接(端口)无法被释放。 UDP不需要建立连接,可以直接发起。
可靠VS不可靠
TCP利用握手、ACK和重传机制,udp没有。
有序性
TCP利用seq序列号对包进行排序,udp没有。
UDP:面向报文,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。
TCP:TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。TCP把应用程序看成是一连串的无结构的字节流,对其发送的数据块进行有序管控
应用场景
TCP:低效精准,文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录。
udp:高效,不精准,QQ聊天、在线视频、网络语音电话
http和rpc的区别
都基于tcp封装的协议,为应用传输提供接口,
socket为tcp的api,dubbo之间的通信使用netty框架进行rpc通信。netty为java框架封装了socket,无法跨语言,使用Nio,非阻塞io,线程多路复用,如果解码协议定义为rpc则为rpc服务器;
http:现在客户端浏览器与服务端通信基本都是采用Http协议。只要接口满足restfull风格,也可以用来进行远程服务调用。缺点是消息封装臃肿;
rpc:速度来看,RPC要比http更快,可以自定义tcp报文,五冗余字段,虽然底层都是TCP,但是http协议的信息往往比较臃肿;缺点是实现较为复杂,不能跨语言跨平台;
因此,两者都有不同的使用场景:
-
如果对效率要求更高,并且开发过程使用统一的技术栈,那么用RPC还是不错的。
-
如果需要更加灵活,跨语言、跨平台,显然http更合适
RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像http一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。