分布式——2.网络通信协议

分布式系统的运行基础是服务间的相互调用,调用的过程中当然离不开服务间的网络传输,因此理解网络间的通信协议对于我们理解分布式系统是很有帮助的。本篇博客主要介绍分布式网络通信的原理,并进行简要的分析。

1.OSI参考模型

OSI(Open System interconnect) 既开放式系统互联。一般都叫OSI参考模型,是ISO(国际标准化组织)在1985年研究的网络互联模型。该体系结构标准定义了网络互联的七层框架,既OSI开发系统互联参考模型。在这一框架下详细的定义了每一层的功能。
OSI由上到下的分别为
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层、
与OSI相对应的是TCP的5层模型,由上到下分别为应用层、传输层、网络层、数据链路层、物理层,只是将表示层和会话层统一合并到应用层。
osi模型
应用层:可以理解为是我们的应用程序,Http、POP3、SMTP、Https、FTP等都是应用层协议
表示层:对应用层传输的数据进行转化、压缩、加密等操作
会话层:负责建立、管理和终止表示层实体之间的通信会话、
传输层:为上层协议提供端到端的可靠透明的数据传输服务,TCP、UDP等都是此层的协议、应用层Http、Ftp等协议都是通过TCP/UDP协议实现的。
网络层:IP协议层,负责对IP地址进行转换,正确无误的根据IP地址将数据传递到指定的端点。
数据链路层:为网络层提供服务的,解决两个相邻结点之间的通信问题,传送的协议数据单元称为数据帧。
物理层:是OSI参考模型的最低层,它利用传输介质为数据链路层提供物理连接

2.TCP/UDP协议

TCP和UDP一样都是OSI模型中传输层的协议。
TCP(Transmission Control Protocol)是一种可靠的网络数据传输控制协议。定义了主机如何连入因特网以及数据如何在他们之间传输的标准

2.1TCP的优点

可靠,稳定
TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源(4次挥手)。

2.2TCP的缺点

慢,效率低,占用系统资源高,易被攻击
TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

2.3TCP3次握手

3次握手既TCP协议在建立连接时,client与server端之间会发送3个数据包以确认连接的建立。
3次握手
a.第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
b.第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
c.第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

2.3.1SYN攻击

在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击是一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
#netstat -nap | grep SYN_RECV

2.4 4次挥手协议

三次握手耳熟能详,四次挥手估计就听得比较少了,所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开
4次挥手
由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

单工:数据传输只支持数据在一个方向上传输(类似广播)
半双工:数据传输允许数据在两个方向上传输,但是在某一时刻,只允许在一个方向上传输,实际上有点像切换方向的单工通信(类似对讲机)
全双工:数据通信允许数据同时在两个方向上传输,因此全双工是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力(类似手机)

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。(客户端告诉服务端,我不给你发送数据了,此时客户端任然可以收到服务端的数据)
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。(服务端响应客户端,我收到你的通知了)
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。(服务端通知客户端,我不给你发送数据了。)
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

2.5 TCP通信原理

首先,对于TCP通信来说,每个TCP Socket的内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式及TCP的滑动窗口就是依赖于这两个独立的Buffer和该Buffer的填充状态。
接收缓冲区把数据缓存到内核,若应用进程一直没有调用Socket的read方法进行读取,那么该数据会一直被缓存在接收缓冲区内。不管进程是否读取Socket,对端发来的数据都会经过内核接收并缓存到Socket的内核接收缓冲区。
read所要做的工作,就是把内核接收缓冲区中的数据复制到应用层用户的Buffer里。
TCP通信原理
进程调用Socket的send发送数据的时候,一般情况下是将数据从应用层用户的Buffer里复制到Socket的内核发送缓冲区,然后send就会在上层返回。换句话说,send返回时,数据不一定会被发送到对端。
在socket调用read方法时,如果缓冲区没有数据就会一直阻塞。
在socket调用write方法时,如果缓冲区已经满了也会一直阻塞。

2.6滑动窗口协议

发送方和接收方都会维护一个数据帧的序列,这个序列被称作窗口。发送方的窗口大小由接收方确认,目的是控制发送速度,以免接收方的缓存不够大导致溢出,同时控制流量也可以避免网络拥塞。
下面图中的4,5,6号数据帧已经被发送出去,但是未收到关联的ACK,7,8,9帧则是等待发送。可以看出发送端的窗口大小为6,这是由接受端告知的(事实上必须考虑拥塞窗口cwnd,这里暂且考虑cwnd>rwnd)。此时如果发送端收到4号ACK,则窗口的左边缘向右收缩,窗口的右边缘则向右扩展,此时窗口就向前“滑动了”,即数据帧10也可以被发送
滑动窗口
明白了Socket读写数据的底层原理,我们就很容易理解“阻塞模式”:对于读取Socket数据的过程而言,如果接收缓冲区为空,则调用Socket的read方法的线程会阻塞,直到有数据进入接收缓冲区;而对于写数据到Socket中的线程来说,如果待发送的数据长度大于发送缓冲区空余长度,则会阻塞在write方法上,等待发送缓冲区的报文被发送到网络上,然后继续发送下一段数据,循环上述过程直到数据都被写入到发送缓冲区为止

从前面分析的过程来看,传统的Socket阻塞模式直接导致每个Socket都必须绑定一个线程来操作数据,参与通信的任意一方如果处理数据的速度较慢,会直接拖累到另一方,导致另一方的线程不得不浪费大量的时间在I/O等待上,所以这就是Socket阻塞模式的“缺陷”。但是这种模式在少量的TCP连接通信的情况下,双方都可以快速的传输数据,这个时候的性能是最高的。

2.7UDP协议

UDP(User Datagram Protocol)用户数据报协议,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
UDP的优点:
快,比TCP稍安全。
UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……

UDP的缺点:
不可靠,不稳定
因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包

TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

单播、组播、广播
单播:一对一通信 (两个程序员讨论需求)
组播:一对多通信 (项目经理组织召开需求讨论会,只需要研发人员接收消息,公司的其他部门是不需要参与的)
广播:一对多通信(公司年会,公司的所有部门都需要参与)

3.java中的分布式通信协议

在这里插入图片描述

BIO,NIO,AIO的区别:
BIO:同步阻塞IO
NIO:同步非阻塞IO,java的NIO是基于epoll模型实现的
AIO:异步非阻塞IO
linux网络模型
select、poll、epoll之间的区别
(1)select==>时间复杂度O(n)
它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
(2)poll==>时间复杂度O(n)
poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.
(3)epoll==>时间复杂度O(1)
epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))
参考地址:select、poll、epoll之间的区别

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值