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

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)
HEXDIGDIGIT / “A” / “B” / “C” / “D” / “E” / “F”十六进制数字(0-9, A-F, a-f)
DQUOTE%x22双引号
SP%x20空格
HTAB%x09横向制表符
WSPSP / HTAB空格或横向制表符
LWSP*(WSP / CRLF WSP)直线空白(晚于换行)
VCHAR%x21-7E可见(打印)字符
CHAR%x01-7F任何7-位US-ASCII字符,不包括NUL(%x00)
OCTET%x00-FF8位数据
CTL%x00-1F / %x7F控制字符
CR%x0D回车
LF%x0A换行
CRLFCR 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更快的通信,避免了三次握手,详情见下图:
fast_open
如何打开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队列中的连接请求立即交给上层应用程序处理,而是直到有数据来临时才交给上层应用程序处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值