远程通信
Posted liufei1983
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了远程通信相关的知识,希望对你有一定的参考价值。
远程通信技术重点是通信方式、序列化协议和透明化RPC协议。
2.1 通信方式
OSI(Open System Interconnection)开放系统互联: 定义了了不同计算机之间实现互联的标准,是网络通信的基本框架。
ISO:国际标准化组织。
OSI复杂,没有TCP/IP模型引用广泛。TCP/IP可以看做是OSI模型的浓缩版本,它将OSI模型的七层抽象为四层。
2.1.1 通信协议
应用层(应用层+表示层+会话层):HTTP, FTTP, Telnet, NTP, DHCP, PING
传输层(传输层):TCP UDP
网络层(网络层):IP, ARP, ICMP, IGMP
网络接口层(数据链路层 + 物理层):Ethernet
传输层协议:
1 TCP(Transportation Control Protocol)传输控制协议。面向连接的协议(因为显示的方式确认连接的创建和终止),提供可靠的双向字节流。TCP通过三次握手的连接创建机制确保连接的可靠性。
TCP的开销高于UDP,性能低于UDP,但是可以保证数据的正确性、顺序性和不可重复性。对于业务间的通信而言,TCP是更适合选择。
Socket:通过IP和一个端口确定一个网络环境中唯一的通信句柄。 socket是TCP/IP协议的API。
Java的Socket编程API封装了TCP的三次握手。
我们编程不会直接去调用tcp
udp
,而是通过他们封装好的接口socket
去通信。可以说,现在几乎网络上所有的通信,底层都是通 过socket
完成的,一切皆Socket
。
java Socket 可以实现TCP也可以实现UDP通信
2 UDP(User Datagram Protocol)用户数据报文协议
UDP是一种无连接,面向数据报文的协议。每一个数据报文都是一个独立的信息,包括完整的源地址或目的地址,数据报文是否能到达目的地,到达的时间以及传送的内容是否正确,这些都不能保证。
UDP不要求通信时保持统一的连接,不需要建立连接。
UDP可能产生网络丢包,并且无法保证传输的原有顺序,但在性能方面更有优势,更加适用允许数据被部分丢弃的业务场景,如视频会
议流等。
Java使用DatagramSocket用于开发UDP。
应用层协议:
包含所有的高层协议,如FTP,SMTP,DNS和HTTP
1 HTTP
无连接(这个无连接是指每次连接只处理一个请求。)
无状态的:协议对于业务事务处理没有记忆能力。
2 长连接与短连接
HTTP的长连接和短连接本质上是TCP长连接和短连接。
HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。
IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的
所有包,并且顺序与发出顺序一致。
TCP有可靠,面向连接的特点。
在HTTP/1.0中,默认使用的是短连接
从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:
Connection:keep-alive |
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
HTTP首部的Connection: Keep-alive是HTTP1.0浏览器和服务器的实验性扩展,当前的HTTP1.1 RFC2616文档没有对它做说明,因为它所需要的功能已经默认开启,无须带着它,但是实践中可以发现,浏览器的报文请求都会带上它。如果HTTP1.1版本的HTTP请求报文不希望使用长连接,则要在HTTP请求报文首部加上Connection: close
2.1.2 I/O模型
2.1.3 Java中的I/O
2.2 序列化
2.2.1 文本序列化
2.2.2 二进制Java序列化
2.2.3 二进制异构语言序列化
2.3 远程调用
2.3.1 核心概念
2.3.2 Java远程方法调用
2.3.3 异构语言RPC框架gRPC
以上是关于远程通信的主要内容,如果未能解决你的问题,请参考以下文章