ABNF(扩充巴科斯-瑙尔范式)操作符
- 空白字符:用来分隔定义中的各个元素
- 选择/:表示多个规则都是可供选择的规则
- start-line = request-line / status-line
- 值范围 %c##-##:
- CTAL =0”/“1”/“2”/“3”/“4”/5”/6”/“7”与OCTAL= %x30-37等价
- 序列组合():将规则组合起来, 视为单个元素
- 不定量重复m*n:
- 元素表示零个或更多元素:(header-field CRLF)
- 1元素表示一个或更多元素, 24元素表示两个至四个元素
- 可选序列
- [ message-body] | 规则 | 形式定义 | 意义 | | —- | —- | —- | | ALPHA | %x41-5A / %x61-7A | 大写和小写 ASCII 字母 (A-Z a-z) | | DIGIT | %x30-39 | 数字 (0-9) | | HEXDIG | DIGIT / “A” / “B” / “C” / “D” / “E” / “F” | 十六进制数字 (0-9 A-F a-f) | | DQUOTE | %x22 | 双引号 | | SP | %x20 | 空格 | | HTAB | %x09 | 水平tab | | WSP | SP / HTAB | 空格和水平tab | | LWSP | *(WSP / CRLF WSP) | 线性空白(晚于换行) | | VCHAR | %x21-7E | 可见(打印)字符 | | CHAR | %x01-7F | 任何 7-位 US-ASCII 字符,不包括 NUL | | OCTET | %x00-FF | 8 位数据 | | CTL | %x00-1F / %x7F | 控制字符 | | CR | %x0D | 回车 | | LF | %x0A | 换行 | | CRLF | CR LF | 互联网标准换行 | | BIT | “0” / “1” | 二进制数字 |
HTTP-message = start-line *(header-field CRLF ) CRLF [message-body]
- start-line = request-line / status-line
- request-line = method SP request-target SP HTTP_version CRLF
- status-line = HTTP-version SP status-code SP reason-phrase CRLF
- header-field = field-name “:” OWS field-value OWS
- OWS=*(SP/HTAB)
- field-name = token
- field-value = *(field-content /obs-fold )
- message-body = *OCTET
BNF
巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。
在BNF中,双引号中的字(“word”)代表着这些字符本身。而double_quote用来代表双引号。
在双引号外的字(有可能有下划线)代表着语法部分。
< > : 内包含的为必选项。
[ ] : 内包含的为可选项。
{ } : 内包含的为可重复0至无数次的项。
| : 表示在其左右两边任选一项,相当于”OR”的意思。
::= : 是“被定义为”的意思
“…” : 术语符号
[…] : 选项,最多出现一次
{…} : 重复项,任意次数,包括 0 次
(…) : 分组
| : 并列选项,只能选一个
斜体字: 参数,在其它地方有解释
ABNF
RFC2234 定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中 ABNF 被广泛使用。ABNF 做了更多的改进。扩充巴科斯-瑙尔范式(ABNF)基于了巴科斯-瑙尔范式(BNF),但由它自己的语法和推导规则构成。这种元语言的发起原则是描述作为通信协议(双向规范)的语言的形式系统。它建档于 RFC 4234 中通常充当 IETF 通信协议的定义语言。
ABNF 规定是一组推导规则,写为:
规则 = 定义 ; 注释 CR LF
这里的规则是大小写敏感的非终止符,定义由定义这个规则的符号序列,一个文档注释组成,并结束于回车换行。
规则名字是大小写不敏感的:
终结符由一个或多个数值字符指定。数值字符可以指定为跟随着基数(b = 二进制, d = 十进制, x = 十六进制)的一个百分号“%”,随后是这个数值,或数值的串联(用“.” 来指示)。例如回车可以指定为十进制的 %d13 或十六进制的 %x0D。回车换行可以指定为 %d13.10。
文字正文通过使用包围在引号(“)中字符串来指定。这些字符串是大小写不敏感的,使用的字符集是 US-ASCII。所以字符串“abc”将匹配“abc”, “Abc”, “aBc”, “abC”, “ABc”, “AbC”, “aBC” 和 “ABC”。对于大小写敏感匹配,必须定义明确的字符: 要匹配 “aBc” 定义将是 %d97 %d66 %d99。
操作符
空白被用来分隔定义的各个元素: 要使空格被识别为分割符则必须明确的包含它。
串联
规则1 规则2
规则可以通过列出一序列的规则名字来定义。
要匹配字符串“aba”可以使用下列规则:
fu = %x61; a bar = %x62; b mumble = fu bar fu
选择
规则1 / 规则2
规则可以通过用反斜杠(“/”)分隔的多选一规则来定义。
要接受规则
fubar = fu / bar
递增选择
规则1 =/ 规则2
可以通过使用在规则名字和定义之间的“=/”来向一个规则增加补充选择。
规则
ruleset = alt1 / alt2 / alt3 / alt4 / alt5
等价于
ruleset = alt1 / alt2 ruleset =/ alt3 ruleset =/ alt4 / alt5
值范围
%c##-##
数值范围可以通过使用连字符(“-”)来指定。
规则
OCTAL = “0” / “1” / “2” / “3” / “4” / “5” / “6” / “7”
等价于
OCTAL = %x30-37
序列分组
(规则1 规则2)
元素可以放置在圆括号中来组合定义中的规则。
要匹配“elem fubar snafu”或“elem tarfu snafu”可以构造下列规则:
group = elem (fubar / tarfu) snafu
要匹配“elem fubar”或“tarfu snafu”可以构造下列规则:
group = elem fubar / tarfu snafu group = (elem fubar) / (tarfu snafu)
可变重复
nn规则
要指示一个元素的重复可以使用形式 元素。可选的 给出要包括的元素的最小数目,缺省为 0。可选的 给出要包括的元素的最大数目,缺省为无穷。
对零或多个元素使用 元素,对一或多个元素使用 1元素,对二或三个元素使用 23元素。
特定重复
n规则
要指示明确数目的元素可使用形式 元素,它等价于 元素。
使用 2DIGIT 得到两个数字,使用 3DIGIT 得到三个数字。(DIGIT 在下面的核心规则中定义)。
可选序列
[规则]
要指示可选元素下列构造是等价的:
[fubar snafu] 1(fubar snafu) 01(fubar snafu)
注释
; 注释
分号(“;”)开始一个注释并持续到此行的结束。
操作符优先级
上述操作符有从最紧绑定(binding)到最松绑定的给定优先级:
字符串,名字形成(formation)
注释
值范围
重复
分组,可选
串联
选择
与串联一起使用选择操作符可以造成混淆,建议使用分组来做明确串联分组。
核心规则
核心规则定义于 ABNF 标准中。
OSI(Open System Interconnection Reference Model)概念模型
7.应用层 Application
- Network Process to application
- DNS WWW/HTTP P2P EMAIL/POP SMTP Telnet FTP
6.表示层 Presentation
- Data representation and encryption
- Recongnizing data HTML DOC JPEG MP3 AVI Sockets
5.会话层 Session
- Interhost communication
- Session estabishment in TCP SIP RTP RPC-Namee pipes
4.传输层 Transport
- End-to-end connections and reliability
- TCP UDP SCTP SSL TLS
3.网络层 Network
- Path delermination and logical addressing
- IP ARP IPsec ICMP IGMP OSPF
2.数据链路层 Data Link
- Physical addressing
- Ethernet 802.11 MAC/LIC VLAN ATM HDP Fibre Channel
Franme Relay HDLC PPP Q921 Token Ring
1.物理层 Physical
http协议
评估 Web架构的关键属性
协议应当在以下属性中取得可接受的均衡:
1.性能Performance:影响高可用的关键因素
2. 可伸缩性 Scalability: 支持部署可以互相交互的大量组件
3.简单性 Simplicity:易理解、易实现、 易验证
4.可见性Visiable:对两个组件旬的交互进行监视或者仲裁的能力。 如缓存、分层设计等
5. 可移植性 Portability: 在不同的环境下运行的能力
6.可靠性 Reliability:出现部分故障时, 对整体影响的程度
7.可修改性 Modifiability: 对系统作出修改的难易程度,由可进化性、 可定制性、可扩展性、可配置性、可重用性构成
架构属性:性能
- 网络性能 Network Performance
- Throughput 吞吐量:小于等于带宽 bandwidth
- Overhead开销:首次开销,每次开销
- 用户感知到的性能User-perceived Performance
- Latency延迟: 发起请求到接收到响应的时间
- Completion完成时间: 完成一个应用动作所花费的时间
网络效率 Network Efficiency
可进化性 Evolvability: 一个组件独立升级而不影响其他组件
- 可扩展性 Extensibility:向系统添加功能, 而不会影响到系统的其他部分
- 可定制性 Customizability:临时性、 定制性地更改某一要素来提供服务, 不对常规客户产生影响
- 可配置性 Configurability: 应用部署后可通过修改配置提供新的功能
- 可重用性 Reusabilit: 组件可以不做修改在其他应用在使用
REST架构下的WEB
5种架构风格
- 数据流风格Data-flow Styles
- 优点:简单性、可进化性、可扩展性、 可配置性、可重用性
- 复制风格 Replication Styles
- 优点:用户可察觉的性能、可伸缩性, 网络效率、可靠性也可以提到提升
- 分层风格Hierarchical Styles
- 优点:简单性、可进化性、可伸缩性
- 移动代码风格Mobile Code Styles
- 优点:可移植性、可扩展性、网络效率
点对点风格 Peer-to-Peer Styles
管道与过滤器 Pipe And Filter,PF
- 每个 Filter 都有输入端和输出端, 只能从输入端读取数据, 处理后再从输出端产生数据
- 统一接口的管道与过滤器 Uniform Pipe And Filter, UPF
- 在 PF 上增加了统一接口的约束,所有 Filter 过滤器必须具备同样的接口
PF与UPF对比
| Style | PF | UPF | | —- | —- | —- | | Derivation | | PF | | Net Perform |
| - | | UP Perform | ± | ± | | Efficiency | | | | Scalability | | | | Simplicity | + | ++ | | Evolvability | + | + | | Extensibility | + | + | | Customiz | | | | Configur | + | ++ | | Reusability | + | ++ | | Visibility | | + | | Protablity | | | | Reliablity | | |
- 在 PF 上增加了统一接口的约束,所有 Filter 过滤器必须具备同样的接口
复制风格 Replication Styples
- 复制仓库 Replicated Repository, RR
- 多个进程提供相同的服务, 通过反向代理对外提供集中服务
- 缓存$
- RR的变体,通过复制请求的结果, 为后续请求复用
分层风格Hierarchica
客户端服务器 Client-Server,CS
●由Client 触发请求,Server 监听到请求后产生响应, Client一直等待收到响应后,会话结束
●分离关注点隐藏细节,良好的简单性、 可伸缩性、可进化性
●分层系统Layered System,LS
●每一层为其之上的层服务, 并使用在其之下的层所提供的服务,例如 TCP/IP
●分层客户端服务器 Layered Client-Server, LCS ee
●LS+CS,例如正向代理和反向代理, 从空间上分为外部层与内部层
无状态、客户端服务器 Client-Stateless-Server CSS
●基于CS,服务器上不允许有sessicn state会话状态
● 提升了可见性、可伸缩性、可靠性, 但重复数据导致降低网络性能
.缓存、无状态、客户端服务器 Client-Cache-Stateless-Server C$SS
.提升性能
●分层、缓存、无状态、客户端服务器 Layered-Client-Cache-Stateless-Server,LC$SS