网络协议基础(一):三次握手中的性能优化与安全问题

文章目录

        • 1.ABNF操作符
        • 2.使用telnet 捕获一个网络包如下所示
        • 3.评估Web架构的关键属性
        • 4.为什么进行URI编码
        • 5.netstat命令查看 TCP 状态
        • 6.超时时间与缓冲队列
        • 7.三次握手中的性能优化与安全问题

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更快的通信,避免了三次握手,详情见下图:
网络协议基础(一):三次握手中的性能优化与安全问题_第1张图片
如何打开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队列中的连接请求立即交给上层应用程序处理,而是直到有数据来临时才交给上层应用程序处理。

你可能感兴趣的:(网络协议基础)