Zookeeper ZAB协议

Zookeeper Atomic Broadcast protocol是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议。基于该协议,Zookeeper实现了一种主备模式的系统架构来保持集群中各个副本的数据一致性。

软件架构设计原则 Srinath

本文作者叫Srinath,是一位科学家,软件架构师,也是一名在分布式系统上工作的程序员。他是Apache Axis2项目的联合创始人,也是Apache Software基金会的成员。他是WSO2流处理器(wso2.com/analytics)的联席架构师。Srinath撰写了两本关于MapReduce和许多技术文章的书。他获得了博士学位。来自美国印第安纳大学。

Srinath 通过不懈的努力最终总结出了30条架构原则,他主张架构师的角色应该由开发团队本身去扮演,而不是专门有个架构师团队或部门。Srinath 认为架构师应该扮演的角色是一个引导者,讨论发起者,花草修建者,而不是定义者和构建者。Srinath为了解决团队内部的架构纷争和抉择,制定了以下30条原则,这些原则被成员们广泛认可,也成为了新手架构师的学习途径。

Icmp协议

Icmp协议

ICMP(Internet Control Message Protocol)互联网控制报文协议,和IP协议一样属于网络层。最常见的用途就是用来测试网络节点的可达性,源主机封装一个Icmp消息,发往目的主机,目的主机根据情况选择回复或者不回复,源主机依据回复判断网络通不通,如果途径的路由节点发现目的主机不可达,可能会在Icmp的回复中带上具体的原因,这些错误原因有助于故障诊断和排除。

除了判断网络不通,Icmp也能通过重定向消息,反馈源主机一些信息,比如更优的网络路径,或者消息发太快了,源主机可以选择进行处理或者不处理。

报文格式

  • Type占1字节,报文主要可以分为两类:查询报文差错报文,查询报文用于获取有关网络或目标主机的特定信息,差错报文主要用于报告网络错误;
  • Code占1字节,提供有关报文类型更详细的信息;
Type Code 描述
查询报文 0 0 Echo Reply
差错报文 3 0 Network Unreachable
差错报文 3 1 Host Unreachable
差错报文 3 2 Protocol Unreachable
差错报文 3 3 Port Unreachable
差错报文 3 4 Fragmentation Needed and DF Set 需要分片,但设置了不分片标志
差错报文 3 5 Source Route Failed
差错报文 4 0 Source Quench 源抑制
差错报文 5 0 Redirect for the Network
差错报文 5 1 Redirect for the Host
差错报文 5 2 Redirect for the Type of Service and Network
差错报文 5 3 Redirect for the Type of Service and Host
查询报文 8 0 Echo Request
差错报文 11 0 Time to live Exceeded in Transit 传输超时
差错报文 11 1 Fragment Reassembly Time Exceeded 分片重组超时
差错报文 12 0 Parameter Problem
查询报文 13 0 Timestamp Request
查询报文 14 0 Timestamp Reply
查询报文 15 0 Information Request
查询报文 16 0 Information Reply

Ping与Tcp发消息区别

Ping的作用是用来判断目标机器是否可达,它是一个应用层命令,依赖的网络层的ICMP协议,而ICMP也是利用IP协议进行消息传输的

如果与TCP发消息对比可以如下图所示

所以ICMP在传输的过程中,从外部看来就是一个IP数据包,只有解析了IP报头,取出里面的数据,才能获取ICMP的报头信息。在ICMP报文中也可能存放着请求报文报头信息,比如A给C发消息经过B,结果B发现C不可达,于是就给A回了一个ICMP消息,这个消息的IP报头中放的就是B和A的IP信息,而ICMP消息中放的就是A和C的IP信息。


参考:

如果Tcp的连接目标不存在

家用路由器

现在的家用路由器一般都已经集成了NAT路由、交换机和WFI接入等功能,可简单如图所示

一般可以直接登录网关http://192.168.1 进行配置查询和修改

IP在局域网内

如果IP属于当前子网,但是不存在,那么连接会卡在ARP流程,找不到目标主机,无法拼凑MAC报头,也就发不出SYN数据包。至于一直重试ARP,是由于TCP本身的可靠性机制

sudo tcpdump host 192.168.1.128
1
2
3
4
5
6
7
tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on pktap, link-type PKTAP (Apple DLT_PKTAP), snapshot length 524288 bytes
07:58:54.830853 ARP, Request who-has 192.168.1.128 tell 192.168.1.16, length 28
07:58:55.831918 ARP, Request who-has 192.168.1.128 tell 192.168.1.16, length 28
07:58:56.832754 ARP, Request who-has 192.168.1.128 tell 192.168.1.16, length 28
07:58:57.833841 ARP, Request who-has 192.168.1.128 tell 192.168.1.16, length 28

IP在局域网外

如果IP不属于当前子网,那么能发出第一次SYN,从网关出去,但是会一直失败,直到放弃

sudo tcpdump host 100.108.149.128
1
2
3
4
5
6
7
8
9
10
11
12
13
14
tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on pktap, link-type PKTAP (Apple DLT_PKTAP), snapshot length 524288 bytes
08:13:28.660606 IP 192.168.1.16.53461 > 100.108.149.128.yo-main: Flags [S], seq 2297239020, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 2553345619 ecr 0,sackOK,eol], length 0
08:13:29.660444 IP 192.168.1.16.53461 > 100.108.149.128.yo-main: Flags [S], seq 2297239020, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 2553346619 ecr 0,sackOK,eol], length 0
08:13:30.660923 IP 192.168.1.16.53461 > 100.108.149.128.yo-main: Flags [S], seq 2297239020, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 2553347620 ecr 0,sackOK,eol], length 0
08:13:31.660896 IP 192.168.1.16.53461 > 100.108.149.128.yo-main: Flags [S], seq 2297239020, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 2553348620 ecr 0,sackOK,eol], length 0
08:13:32.661747 IP 192.168.1.16.53461 > 100.108.149.128.yo-main: Flags [S], seq 2297239020, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 2553349621 ecr 0,sackOK,eol], length 0
08:13:33.662785 IP 192.168.1.16.53461 > 100.108.149.128.yo-main: Flags [S], seq 2297239020, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 2553350622 ecr 0,sackOK,eol], length 0
08:13:35.664588 IP 192.168.1.16.53461 > 100.108.149.128.yo-main: Flags [S], seq 2297239020, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 2553352623 ecr 0,sackOK,eol], length 0
08:13:39.665025 IP 192.168.1.16.53461 > 100.108.149.128.yo-main: Flags [S], seq 2297239020, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 2553356624 ecr 0,sackOK,eol], length 0
08:13:47.666382 IP 192.168.1.16.53461 > 100.108.149.128.yo-main: Flags [S], seq 2297239020, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 2553364625 ecr 0,sackOK,eol], length 0
08:14:03.666994 IP 192.168.1.16.53461 > 100.108.149.128.yo-main: Flags [S], seq 2297239020, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 2553380626 ecr 0,sackOK,eol], length 0
08:14:35.666851 IP 192.168.1.16.53461 > 100.108.149.128.yo-main: Flags [S], seq 2297239020, win 65535, options [mss 1460,sackOK,eol], length 0

端口不存在

如果端口不存在,对方收到连接数据包会返回RST,强制关闭连接,提示Connection refused

tcpdump host 192.168.1.12
1
2
3
4
5
tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on pktap, link-type PKTAP (Apple DLT_PKTAP), snapshot length 524288 bytes
08:35:59.693090 IP 192.168.1.16.53843 > 192.168.1.12.http-alt: Flags [S], seq 1159496581, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 925681565 ecr 0,sackOK,eol], length 0
08:35:59.739797 IP 192.168.1.12.http-alt > 192.168.1.16.53843: Flags [R.], seq 0, ack 1159496582, win 0, length 0

不一定总会收到RST回应,对于线上生产环境的服务器,一般都会设置防火墙,只开放指定的端口,如果访问未开放的端口,消息会直接被拒绝,根本到不了目标机器的协议栈,也就不会回复RST了


参考: