文章目录
1.ABNF操作符
先了解巴科斯范式BNF,它是以美国人巴科斯(Backus)和丹麦人诺尔(Naur)的名字命名的一种形式化的语法表示方法,用来描述语法的一种形式体系,是一种典型的元语言。它不仅能严格地表示语法规则,而且所描述的语法是与上下文无关的。它具有语法简单,表示明确,便于语法分析和编译的特点。而ABNF则是扩展的巴科斯范式,并做了更多的改进,这种元语言的发起原则是描述作为通信协议(双向规范)的语言的形式系统,包括HTTP协议。
- 空白字符:用来分隔定义中的各个元素
如: method SP request-target SP HTTP-version CRLF - 选择 /:表示多个规则都是可供选择的规则
如:start-line = request-line / status-line - 值范围 %c##-##
如:OCTAL = “0” / “1” / “2” / “3” / “4” / “5” / “6” / “7” 与 OCTAL = %x30-37 等价 - 序列组合 ():将规则组合起来,视为单个元素
- 不定量重复 m*n
如: *元素表示零个或更多元素:*( header-field CRLF )
如: 1* 元素表示一个或更多元素,2*4 元素表示两个至四个元素 - 可选序列 []: 如 [ message-body ]
ABNF (扩充巴科斯-瑙尔范式)核心规则
规则 | 形式定义 | 意义 |
---|---|---|
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 | 横向制表符 |
WSP | SP / HTAB | 空格或横向制表符 |
LWSP | *(WSP / CRLF WSP) | 直线空白(晚于换行) |
VCHAR | %x21-7E | 可见(打印)字符 |
CHAR | %x01-7F | 任何7-位US-ASCII字符,不包括NUL(%x00) |
OCTET | %x00-FF | 8位数据 |
CTL | %x00-1F / %x7F | 控制字符 |
CR | %x0D | 回车 |
LF | %x0A | 换行 |
CRLF | CR LF | 互联网标准换行 |
BIT | “0” / “1” | 二进制数 |
2.使用telnet 捕获一个网络包如下所示
telnet www.baidu.com 80
......
GET / HTTP/1.1 CRLF
Host:www.baidu.com CRLF
CRLF
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 14615
Content-Type: text/html
......
3.评估Web架构的关键属性
性能、可伸缩性、简单性、可见性、可移植性、可靠性、可修改性
- 性能:吞吐量、开销
- 用户感知性能:延迟、完成时间
- 网络效率:重用缓存、减少交互次数、数据传输距离更近、COD
- 可修改性:可进化性、可扩展性、可定制性、可配置性、可重用性
4.为什么进行URI编码
对可能产生歧义性的数据编码以免发生错误。 如不在 ASCII 码范围内的字符, ASCII 码中不可显示的字符,URI 中规定的保留字符,不安全字符(传输环节中可能会被不正确处理),如空格、引号、尖括号等。
- 保留字符
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
- 非保留字符
unreserved = ALPHA / DIGIT / “-” / “.” / “_” / “~”
ALPHA: %41-%5A and %61-%7A
DIGIT: %30-%39
-: %2D .: %2E _: %5F
~: %7E,某些实现将其认为保留字符
- URI的百分号编码
(1) 直接"%" HEXDIG HEXDIG
编码
(2) 非 ASCII 码字符(例如中文):建议先 UTF8 编码,再 US-ASCII 编码
(3) 对 URI 合法字符,编码与不编码是等价的
5.netstat命令查看 TCP 状态
-a: 显示所有连接和侦听端口。
-n: 以数字形式(如 IP 地址)显示地址和端口号。
-r: 显示路由表。
-s: 显示每个协议的统计信息。
-b(Windows)/-p(Linux) : 显示对应的可执行程序名字。
6.超时时间与缓冲队列
- 应用层 connect 超时时间调整
- 缓冲队列
(1)服务器端SYN_RCV 状态:
net.ipv4.tcp_max_syn_backlog:SYN_RCVD 状态连接的最大个数
net.ipv4.tcp_synack_retries:被动建立连接时,发SYN/ACK的重试次数
(2)客户端SYN_SENT状态:
net.ipv4.tcp_syn_retries = 6 主动建立连接时,发 SYN 的重试次数 net.ipv4.ip_local_port_range = 32768 60999 建立连接时的本地端口可用范围
(3)ACCEPT队列设置
7.三次握手中的性能优化与安全问题
(1) 什么是Fast Open降低时延
所谓的Fast Open就是指在第一次建立三次握手的时候由服务器负责为客户端生成cookie,其中由关于tcp连接的相关信息如源端口、目的端口、目的 ip、序号、 应答序号、对方窗口大小、己方窗口大小等,这样在第二次进行tcp连接是就可以直接基于cookie更快的通信,避免了三次握手,详情见下图:
如何打开TCP Fast Open
net.ipv4.tcp_fastopen:系统开启 TFO 功能
- 0:关闭
- 1:作为客户端时可以使用 TFO
- 2:作为服务器时可以使用 TFO
- 3:无论作为客户端还是服务器,都可以使用 TFO
(2) 如何应对 SYN 攻击
攻击者短时间伪造不同 IP 地址的 SYN 报文,快速占满 SYN(backlog) 队列,使 服务器不能为正常用户服务的现象叫做SYN攻击。
通常通过限制SYN队列大小与SYN_RCVD 状态连接的最大个数,以及超出处理能力时,对新来的 SYN 直接回包 RST,丢弃连接的方法来解决SYN攻击。
(3) 什么是TCP_DEFER_ACCEPT
指三次握手完毕之后并不立即将accept队列中的连接请求立即交给上层应用程序处理,而是直到有数据来临时才交给上层应用程序处理。