简述什么是回购协议3pc协议,并判定是否为阻断协议

关于分布式事务、两阶段提交协议、三阶交付协议 - 数据库当前位置:& &&&关于分布式事务、两阶段提交协议、三阶交付协议关于分布式事务、两阶段提交协议、三阶交付协议&&网友分享于:&&浏览:0次关于分布式事务、两阶段提交协议、三阶提交协议
来源: 伯乐在线 - HollisChuang
链接:/95632/
随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。
为了解决这样一系列问题,大型网站的架构也在不断发展。提高大型网站的高可用架构,不得不提的就是分布式。在《分布式系统的一致性探讨》一文中主要介绍了分布式系统中存在的一致性问题。本文将简单介绍如何有效的解决分布式的一致性问题,其中包括什么是分布式事务,二阶段提交和三阶段提交。
分布式一致性回顾
在分布式系统中,为了保证数据的高可用,通常,我们会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上。为了对用户提供正确的增\删\改\差等语义,我们需要保证这些放置在不同物理机器上的副本是一致的。
为了解决这种分布式一致性问题,前人在性能和数据一致性的反反复复权衡过程中总结了许多典型的协议和算法。其中比较著名的有二阶提交协议(Two Phase Commitment Protocol)、三阶提交协议(Two Phase Commitment Protocol)和Paxos算法。
分布式事务
分布式事务是指会涉及到操作多个数据库的事务。其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)
在分布式系统中,各个节点之间在物理上相互独立,通过网络进行沟通和协调。由于存在事务机制,可以保证每个独立节点上的数据操作可以满足ACID。但是,相互独立的节点之间无法准确的知道其他节点中的事务执行情况。所以从理论上讲,两台机器理论上无法达到一致的状态。如果想让分布式部署的多台机器中的数据保持一致性,那么就要保证在所有节点的数据写操作,要不全部都执行,要么全部的都不执行。但是,一台机器在执行本地事务的时候无法知道其他机器中的本地事务的执行结果。所以他也就不知道本次事务到底应该commit还是 roolback。所以,常规的解决办法就是引入一个“协调者”的组件来统一调度所有分布式节点的执行。
X/Open 组织(即现在的 Open Group )定义了分布式事务处理模型。 X/Open DTP 模型( 1994 )包括应用程序( AP )、事务管理器( TM )、资源管理器( RM )、通信资源管理器( CRM )四部分。一般,常见的事务管理器( TM )是交易中间件,常见的资源管理器( RM )是数据库,常见的通信资源管理器( CRM )是消息中间件。 通常把一个数据库内部的事务处理,如对多个表的操作,作为本地事务看待。数据库的事务处理对象是本地事务,而分布式事务处理的对象是全局事务。 所谓全局事务,是指分布式事务处理环境中,多个数据库可能需要共同完成一个工作,这个工作即是一个全局事务,例如,一个事务中可能更新几个不同的数据库。对数据库的操作发生在系统的各处但必须全部被提交或回滚。此时一个数据库对自己内部所做操作的提交不仅依赖本身操作是否成功,还要依赖与全局事务相关的其它数据库的操作是否成功,如果任一数据库的任一操作失败,则参与此事务的所有数据库所做的所有操作都必须回滚。 一般情况下,某一数据库无法知道其它数据库在做什么,因此,在一个 DTP 环境中,交易中间件是必需的,由它通知和协调相关数据库的提交或回滚。而一个数据库只将其自己所做的操作(可恢复)影射到全局事务中。
XA 就是 X/Open DTP 定义的交易中间件与数据库之间的接口规范(即接口函数),交易中间件用它来通知数据库事务的开始、结束以及提交、回滚等。 XA 接口函数由数据库厂商提供。
二阶提交协议和三阶提交协议就是根据这一思想衍生出来的。可以说二阶段提交其实就是实现XA分布式事务的关键(确切地说:两阶段提交主要保证了分布式事务的原子性:即所有结点要么全做要么全不做)
二阶段提交(Two-phaseCommit)是指,在计算机网络以及数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法(Algorithm)。通常,二阶段提交也被称为是一种协议(Protocol))。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。
所谓的两个阶段是指:第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)。
事务协调者(事务管理器)给每个参与者(资源管理器)发送Prepare消息,每个参与者要么直接返回失败(如权限验证失败),要么在本地执行事务,写本地的redo和undo日志,但不提交,到达一种“万事俱备,只欠东风”的状态。
可以进一步将准备阶段分为以下三个步骤:
协调者节点向所有参与者节点询问是否可以执行提交操作(vote),并开始等待各参与者节点的响应。
参与者节点执行询问发起为止的所有事务操作,并将Undo信息和Redo信息写入日志。(注意:若成功这里其实每个参与者已经执行了事务操作)
各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个”同意”消息;如果参与者节点的事务操作实际执行失败,则它返回一个”中止”消息。
如果协调者收到了参与者的失败消息或者超时,直接给每个参与者发送回滚(Rollback)消息;否则,发送提交(Commit)消息;参与者根据协调者的指令执行提交或者回滚操作,释放所有事务处理过程中使用的锁资源。(注意:必须在最后阶段释放锁资源)
接下来分两种情况分别讨论提交阶段的过程。
当协调者节点从所有参与者节点获得的相应消息都为”同意”时:
协调者节点向所有参与者节点发出”正式提交(commit)”的请求。
参与者节点正式完成操作,并释放在整个事务期间内占用的资源。
参与者节点向协调者节点发送”完成”消息。
协调者节点受到所有参与者节点反馈的”完成”消息后,完成事务。
如果任一参与者节点在第一阶段返回的响应消息为”中止”,或者 协调者节点在第一阶段的询问超时之前无法获取所有参与者节点的响应消息时:
协调者节点向所有参与者节点发出”回滚操作(rollback)”的请求。
参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。
参与者节点向协调者节点发送”回滚完成”消息。
协调者节点受到所有参与者节点反馈的”回滚完成”消息后,取消事务。
不管最后结果如何,第二阶段都会结束当前事务。
二阶段提交看起来确实能够提供原子性的操作,但是不幸的事,二阶段提交还是有几个缺点的:
1、同步阻塞问题。执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。
2、单点故障。由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)
3、数据不一致。在二阶段提交的阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这回导致只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交。于是整个分布式系统便出现了数据部一致性的现象。
4、二阶段无法解决的问题:协调者再发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。
由于二阶段提交存在着诸如同步阻塞、单点问题、脑裂等缺陷,所以,研究者们在二阶段提交的基础上做了改进,提出了三阶段提交。
三阶段提交(Three-phase commit),也叫三阶段提交协议(Three-phase commit protocol),是二阶段提交(2PC)的改进版本。
与两阶段提交不同的是,三阶段提交有两个改动点。
引入超时机制。同时在协调者和参与者中都引入超时机制。
在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。
也就是说,除了引入超时机制之外,3PC把2PC的准备阶段再次一分为二,这样三阶段提交就有CanCommit、PreCommit、DoCommit三个阶段。
CanCommit阶段
3PC的CanCommit阶段其实和2PC的准备阶段很像。协调者向参与者发送commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。
事务询问 协调者向参与者发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应。
响应反馈 参与者接到CanCommit请求之后,正常情况下,如果其自身认为可以顺利执行事务,则返回Yes响应,并进入预备状态。否则反馈No
PreCommit阶段
协调者根据参与者的反应情况来决定是否可以记性事务的PreCommit操作。根据响应情况,有以下两种可能。
假如协调者从所有的参与者获得的反馈都是Yes响应,那么就会执行事务的预执行。
发送预提交请求 协调者向参与者发送PreCommit请求,并进入Prepared阶段。
事务预提交 参与者接收到PreCommit请求后,会执行事务操作,并将undo和redo信息记录到事务日志中。
响应反馈 如果参与者成功的执行了事务操作,则返回ACK响应,同时开始等待最终指令。
假如有任何一个参与者向协调者发送了No响应,或者等待超时之后,协调者都没有接到参与者的响应,那么就执行事务的中断。
发送中断请求 协调者向所有参与者发送abort请求。
中断事务 参与者收到来自协调者的abort请求之后(或超时之后,仍未收到协调者的请求),执行事务的中断。
doCommit阶段
该阶段进行真正的事务提交,也可以分为以下两种情况。
发送提交请求 协调接收到参与者发送的ACK响应,那么他将从预提交状态进入到提交状态。并向所有参与者发送doCommit请求。
事务提交 参与者接收到doCommit请求之后,执行正式的事务提交。并在完成事务提交之后释放所有事务资源。
响应反馈 事务提交完之后,向协调者发送Ack响应。
完成事务 协调者接收到所有参与者的ack响应之后,完成事务。
中断事务 协调者没有接收到参与者发送的ACK响应(可能是接受者发送的不是ACK响应,也可能响应超时),那么就会执行中断事务。
发送中断请求 协调者向所有参与者发送abort请求
事务回滚 参与者接收到abort请求之后,利用其在阶段二记录的undo信息来执行事务的回滚操作,并在完成回滚之后释放所有的事务资源。
反馈结果 参与者完成事务回滚之后,向协调者发送ACK消息
中断事务 协调者接收到参与者反馈的ACK消息之后,执行事务的中断。
在doCommit阶段,如果参与者无法及时接收到来自协调者的doCommit或者rebort请求时,会在等待超时之后,会继续进行事务的提交。(其实这个应该是基于概率来决定的,当进入第三阶段时,说明参与者在第二阶段已经收到了PreCommit请求,那么协调者产生PreCommit请求的前提条件是他在第二阶段开始之前,收到所有参与者的CanCommit响应都是Yes。(一旦参与者收到了PreCommit,意味他知道大家其实都同意修改了)所以,一句话概括就是,当进入第三阶段时,由于网络超时等原因,虽然参与者没有收到commit或者abort响应,但是他有理由相信:成功提交的几率很大。 )
2PC与3PC的区别
相对于2PC,3PC主要解决的单点故障问题,并减少阻塞,因为一旦参与者无法及时收到来自协调者的信息之后,他会默认执行commit。而不会一直持有事务资源并处于阻塞状态。但是这种机制也会导致数据一致性问题,因为,由于网络原因,协调者发送的abort响应没有及时被参与者接收到,那么参与者在等待超时之后执行了commit操作。这样就和其他接到abort命令并执行回滚的参与者之间存在数据不一致的情况。
了解了2PC和3PC之后,我们可以发现,无论是二阶段提交还是三阶段提交都无法彻底解决分布式的一致性问题。Google Chubby的作者Mike Burrows说过, there is only one consensus protocol, and that’s Paxos” – all other approaches are just broken versions of Paxos. 意即世上只有一种一致性算法,那就是Paxos,所有其他一致性算法都是Paxos算法的不完整版。后面的文章会介绍这个公认为难于理解但是行之有效的Paxos算法。
参考资料:
分布式协议之两阶段提交协议(2PC)和改进三阶段提交协议(3PC)
关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
两阶段提交协议与三阶段提交协议
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有查看: 5224|回复: 13
怎么看pc显示器是否支持高清协议啊
在线时间1888 小时
阅读权限60
帖子猥币巴士票
猥人师表 Lv.6, 积分 4021, 距离下一级还需 979 积分
我的显示器是宏碁 ACRHQ
无HDMI接口,只有VGA,DVI,求鉴定~
在线时间1888 小时
阅读权限60
帖子猥币巴士票
猥人师表 Lv.6, 积分 4021, 距离下一级还需 979 积分
自己顶下,以便高人发现
在线时间71 小时
阅读权限30
帖子猥币巴士票
猥乎其微 Lv.3, 积分 261, 距离下一级还需 239 积分
我也想知道···· 同求
在线时间1565 小时
阅读权限70
帖子猥币巴士票
猥然不动 Lv.7, 积分 8830, 距离下一级还需 1170 积分
买个高清转接盒就OK了
在线时间1608 小时
头像被屏蔽
帖子猥币巴士票
提示: 作者被禁止或删除 内容自动屏蔽
在线时间1888 小时
阅读权限60
帖子猥币巴士票
猥人师表 Lv.6, 积分 4021, 距离下一级还需 979 积分
原来如此,谢谢啦
在线时间1156 小时
阅读权限100
帖子猥币巴士票
插上去直接用
在线时间952 小时
阅读权限80
帖子猥币巴士票
猥风八面 Lv.8, 积分 11238, 距离下一级还需 18762 积分
买转接线就可以了~!
PSN港服:SONGWEI520
大家都来加我吧~!谢谢!
在线时间223 小时
阅读权限50
帖子猥币巴士票
猥言大义 Lv.5, 积分 1354, 距离下一级还需 646 积分
一般新出的都支持HDCP协议
在线时间1049 小时
头像被屏蔽
帖子猥币巴士票
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
水元素【普通成就】
水、H2O、みず、water,额...总之怎么叫都行了
(累计发帖1000即可解锁)
常客【普通成就】
《我的业余生活》从前有一个论坛叫TGBUS…(在线时间超过1000小时)
管理团队【光辉事迹】
猥皮大本营管理团队特有的红色令牌。象征权力与责任的契约之证。(担任过论坛各级版主)
玩最大【稀有成就】
我是索狗,我自豪,特爽特牛逼!!(每月达标的PM组员)
浮云爱好者【普通成就】
一朵,两朵,三朵,呵呵呵… (累计获得1000朵浮云)
Powered by2259人阅读
协议分析(3)
一、阻断未建立起来的连接
&&&&& 我们知道TCP的建立要经过3次握手,假设客户端C向服务器S请求连接
&&&&& 1、C发送带有SEQ_C(随机)初始序列号的SYN报文给S
&&&&&&2、S回复带有SEQ_S(随机)初始序列号和确认序列号ACK_S(必须是SEQ_C+1)的SYN报文给C
&&&&& 3、C回复确认序列号ACK_C(取值为SEQ_S)给S
&&&&& 整个过程如果正确的话,连接将会建立。
&&&&& 通常需要进行阻断的情况是审计控制系统旁路监听内网。旁路监听的方式一般是将主交换机的数据镜像到控制系统,控制系统可以采用
libpcap捕获数据包。
&&&& 在这种情况下要阻断tcp连接的建立只要在监听到第一次握手的时候,控制系统伪造服务器发起第二次握手回应,就能阻断客户端与服务器连接的建立。因为我们的系统在内网,发出的报文肯定比服务器快,这样客户端接收到我们伪造的报文以后会回应第三次握手,当服务器真正的报文到达的时候客户端将不再处理,此时客户端再向服务器请求数据,因为seq号和ack号出错,服务器不会受理客户端的请求。
&&&& typedef struct tcp_header {
u_int16_t th_
/* source port */
u_int16_t th_
/* destination port */
/* sequence number */
/* acknowledgement number */
u_int8_t th_offx2;
/* data offset, rsvd */
#define TH_OFF(th) (((th)-&th_offx2 & 0xf0) && 4)
u_int8_t th_
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECNECHO 0x40 /* ECN Echo */
#define TH_CWR
0x80 /* ECN Cwnd Reduced */
u_int16_t th_
/* window */
u_int16_t th_
/* checksum */
u_int16_t th_
/* urgent pointer */
&&& 判断第一次握手的方式flag = tcp_h-&th_当flag等于0x02的时候说明客户端发起tcp握手,伪装第二次握手的代码:
&& int ForgedSYN(char *srcIP, char *dstIP, int srcPort, int dstPort)
unsigned char buff[2048] = {0};
unsigned char *ptr =
char options[4] = {0x02, 0x04, 0x05, 0x64};
int num = 0;
unsigned short iIPSize = sizeof(ip_header) / sizeof(unsigned long);
unsigned short iIPVersion = 4;
unsigned short iTotalSize = sizeof(ip_header) + sizeof(tcp_header) + 4;
unsigned short iTcpSize = sizeof(tcp_header) + 4;
struct sockaddr_
if(createSocket()&0) return -1;
iph.ip_vhl = (iIPVersion && 4) | iIPS
iph.ip_tos = 0;
iph.ip_len = htons(iTotalSize);
iph.ip_id = htons(17393);
iph.ip_off = 0;
iph.ip_ttl = 118;
iph.ip_p = IPPROTO_TCP;
iph.ip_sum = 0;
isrcip = inet_addr(srcIP);
idstip = inet_addr(dstIP);
memcpy(&iph.ip_src, &isrcip, 4);
memcpy(&iph.ip_dst, &idstip, 4);
iph.ip_sum = checksum((unsigned short *)&iph, 20);
tcph.th_sport = htons(srcPort);
tcph.th_dport = htons(dstPort);
tcph.th_seq = htonl(0x581A784D);
tcph.th_ack = htonl(g_seq+1);
tcph.th_offx2 = (24/4&&4|0);
tcph.th_flags = 0x12;
tcph.th_win = htons(16384);
tcph.th_sum = 0;
tcph.th_urp = 0;
psdh.s_addr =
psdh.d_addr =
psdh.mbz = 0;
psdh.protocol = IPPROTO_TCP;
psdh.tcpl = htons(iTcpSize);
memcpy(buff, &psdh, sizeof(psd_header));
memcpy(buff+sizeof(psd_header), &tcph, sizeof(tcp_header));
memcpy(buff+sizeof(psd_header)+sizeof(tcp_header), options, 4);
tcph.th_sum = checksum((unsigned short *)buff, sizeof(psd_header)+sizeof(tcp_header)+4);
memset(buff, 0x00, 2048);
memcpy(ptr, &iph, sizeof(ip_header));
ptr += sizeof(ip_header);
memcpy(ptr, &tcph, sizeof(tcp_header));
ptr += sizeof(tcp_header);
memcpy(ptr, options, 4);
server.sin_family = AF_INET;
server.sin_port = htons(dstPort);
server.sin_addr.s_addr = inet_addr(dstIP);
num = sendto(sockfd, buff, iTotalSize, 0, (struct sockaddr *)&server, sizeof(struct sockaddr));
& 数据伪造的时候ip头部和tcp头部要进行校验:
&& unsigned short checksum(unsigned short *buffer, int size)
unsigned long cksum=0;
while (size & 1)
cksum += *buffer++;
-= sizeof(unsigned short);
cksum += *(unsigned char *)
cksum = (cksum && 16) + (cksum & 0xffff);
cksum += (cksum &&16);
return (unsigned short)(~cksum);
二、阻断已经建立起来的连接
&&&&& 对于已经建立起来的连接只要伪造服务器发送rst包迫使客户端重新进行连接,或者fin包直接中断连接。
&&&&& 正常通行中的tcp报文seq和ack存在如下关系,假设C向S请求数据,seq是seq1,ack是ack1,服务器返回给客户端的seq2和ack2必须存在这种关系:
&&&&& seq2 = ack1
&&&&& ack2 = seq1+datalen(服务返回报文的长度,不包括ip头和tcp头)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:75446次
积分:1157
积分:1157
排名:千里之外
原创:36篇
转载:24篇
评论:19条
(1)(2)(1)(2)(4)(2)(2)(1)(1)(1)(2)(1)(3)(3)(8)(1)(4)(1)(6)(8)(2)(1)(2)(1)}

我要回帖

更多关于 简述网络协议 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信