同步操作将从 Java精选/Ebooks 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
同步是指函数调用在没得到结果之前,没有调用结果,不返回任何结果。
异步是指函数调用在没得到结果之前,没有调用结果,返回状态信息。
阻塞是指函数调用在没得到结果之前,当前线程挂起。得到结果后才返回。
非阻塞是指函数调用在没得到结果之前,当前线程不会挂起,立即返回结果。
RPC(Remote Protocal Call)服务为异步服务是通过网络传输数据。
网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。对象是不能直接在网络中传输的,所以需要提前把它转成可传输的二进制,并且要求转换算法是可逆的,这个过程我们一般叫做“序列化”。这时,服务提供方就可以正确地从二进制数据中分割出不同的请求,同时根据请求类型和序列化类型,把二进制的消息体逆向还原成请求对象,这个过程称之为“反序列化”。
如下图:
总结来说,序列化就是将对象转换成二进制数据的过程,而反序列就是反过来将二进制转换为对象的过程。
为什么RPC框架需要序列化?因为网络传输的数据必须是二进制数据,所以在RPC调用中,对入参对象与返回值对象进行序列化与反序列化是一个必须的过程。
协议本质是双方约定好的一种传输规则,其作用是为了让传输数据的双方节点能建立连接,按照约定去传输和解析数据。
当浏览者访问网页时,浏览器会向网页所在服务器发出请求。浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
HTTP状态码的英文为HTTP Status Code。
下面是常见的HTTP状态码:
200 - 请求成功 301 - 资源(网页等)被永久转移到其它URL 404 - 请求的资源(网页等)不存在 500 - 内部服务器错误
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。
HTTP状态码共分为5种类型:
“1**”状态码表示信息,服务器收到请求,需要请求者继续执行操作。
“2**”状态码表示成功,操作被成功接收并处理。
“3**”状态码表示重定向,需要进一步的操作以完成请求。
“4**”状态码表示客户端错误,请求包含语法错误或无法完成请求。
“5**”状态码表示服务器错误,服务器在处理请求的过程中发生了错误。
建立时三次握手
为了双方都互相知道已经准备好进行数据传输,确认一个初始传输序列号,以免产生错误的连接。
1)第一次握手
客户端:将标志位SYN(SYN:同步序列编号)置为1,并产生一个同步值(seq=j),将数据包发送到服务器,并使自己处于SYN_SENT状态,等待服务器确认。
2)第二次握手
服务端: 收到客户端发来的数据包,由SYN标志位为1知道客户端请求建立连接,知道同步值seq=j后,将自己的SYN和ACK置为1,产生一个确认包ack=j+1,同时产生一个同步值seq=k,然后发送数据包,并使自己处于SYN_RECV状态(接收状态)。
3)第三次握手
客户端: 收到服务端发来的数据包,将自己的ACK(接收状态)置为1,并产生一个确认包ack=k+1,然后发送数据包,此时双方同时处于SYN_ESTABLISHED状态,建立连接,等待发送和接收数据,完成三次握手。
释放时四次挥手
第一次挥手
客户端将自己的FIN置为1(意思为关闭连接,自己这边没有发送的数据了),同时产生一个同步值seq=u,将数据包发送给服务器。
第二次挥手
服务器收到以后,由于可能还没有发送完自己的数据,先将自己的ACK置为1(回应状态,意思知道了),并产生一个确认包ack=u+1,并产生一个同步值v,将数据包发送给客户端。
第三次挥手
服务器发送完没有发送的数据后,将自己的FIN置为1(意思可以关闭连接),ACK置为1(回应状态,意思收到),并产生一个同步值w,产生确认包ack=u+1(基于客户端的,跟上一次一样,因为客户端只发送了一次)。
第四次挥手
客户端收到,将自己的ACK置为1(收到),产生一个确认包ack=w+1,还有一个同步值seq=u+1,将自己的数据报发送给服务器。
解决HTTP协议无状态协议可以使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是”老用户“。
应用层协议(application layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文。
应用层协议
1)DNS:一种用以将域名转换为IP地址的Internet服务,域名系统DNS是因特网使用的命名系统,用来把便于人们使用的机器名字转换为IP地址。
现在顶级域名TLD分为三大类:国家顶级域名nTLD;通用顶级域名gTLD;基础结构域名。
域名服务器分为四种类型:根域名服务器;顶级域名服务器;本地域名服务器;权限域名服务器。
2)FTP:文件传输协议FTP是因特网上使用得最广泛的文件传送协议。FTP提供交互式的访问,允许客户指明文件类型与格式,并允许文件具有存取权限。
基于客户服务器模式,FTP协议包括两个组成部分,一是FTP服务器,二是FTP客户端,提供交互式的访问面向连接,使用TCP/IP可靠的运输服务,主要功能:减少/消除不同操作系统下文件的不兼容性 。
3)telnet远程终端协议:telnet是一个简单的远程终端协议,它也是因特网的正式标准。又称为终端仿真协议。
4)HTTP:超文本传送协议,是面向事务的应用层协议,它是万维网上能够可靠地交换文件的重要基础。http使用面向连接的TCP作为运输层协议,保证了数据的可靠传输。
5)电子邮件协议SMTP:即简单邮件传送协议。SMTP规定了在两个相互通信的SMTP进程之间应如何交换信息。SMTP通信的三个阶段:建立连接、邮件传送、连接释放。
6)POP3:邮件读取协议,POP3(Post Office Protocol 3)协议通常被用来接收电子邮件。
7)远程登录协议(Telnet):用于实现远程登录功能。
8)SNMP:简单网络管理协议。由三部分组成:SNMP本身、管理信息结构SMI和管理信息MIB。SNMP定义了管理站和代理之间所交换的分组格式。SMI定义了命名对象类型的通用规则,以及把对象和对象的值进行编码。MIB在被管理的实体中创建了命名对象,并规定类型。
假设有两台A服务器服务S1和B服务器服务S2,应用服务S0
首先你接收客户端(浏览器)请求的服务肯定是单点(一对一)连接,之后交给应用服务S0处理分配给两台服务器A和B上的服务S1和S2。
分配原则可以按一定的策略,如计数器等,按当前活跃连接数来决定分给哪台服务器。也可以更科学的按两台服务器实际处理的数据量来分配,因为有些连接可能一直空闲。
如果两台服务器上的服务通信正常且数据库能够承受压力,访问请求并不是太多的情况下,可以考虑使用数据库传递消息,反之可以考虑使用Redis缓存技术。
如果需要即时传递消息,在其中一个服务器上的服务S1查找不到,把消息发给另外一台服务器上的服务S2或把消息存储至数据库或缓存当中,然后通知其他服务有生产消息。类似MQ处理方式可参考ActiveMQ。
这是因为考虑数据丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到。
注意:Linux系统中2MSL默认是60秒,那么一个MSL也就是30秒。
通常服务端启动时会绑定一个端口提供服务,而客户端在发起连接请求时会被随机分配一个端口号。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。