2017ArchSummit-WEB加速,协议先行

这个分享主要对提升WEB性能,在协议层面讨论优化的方案,主要分三个层面优化,TCP层面,TLS层,HTTP层。文中截图来自分享ppt http://ppt.geekbang.org/slide/show/946


TCP层面的优化

使用TFO(tcp fast open),使用TFO需要linux 内核版本在3.7以上。
内核选项设置

# 打开客户端TFO
sysctl -w net.ipv4.tcp_fastopen=1
# 打开服务端TFO
sysctl -w net.ipv4.tcp_fastopen=2
# 同时打开客户端和服务端TFO选项
sysctl -w net.ipv4.tcp_fastopen=3

TFO的基本步骤如下:

  1. 客户端发送一个SYN包到服务器,这个包中携带了Fast Open Cookie请求的TCP选项;
  2. 服务器生成一个cookie,这个cookie是通过使用密钥加密客户端的IP地址生成的。服务器给客户端发送SYN|ACK响应,在响应包的选项中包含了这个cookie;
  3. 客户端存储这个cookie以便将来再次与这个服务器的IP建立TFO连接时使用;
  4. 再次发起tcp连接请求,客户端发送一个携带应用数据和以TCP选项方式存储的Fast Open cookie的SYN包;
  5. 服务器验证这个cookie,如果合法,服务器发送一个SYN|ACK确认SYN和数据,然后数据被传递到应用进程;如果不合法,服务器丢弃数据,发送一个SYN|ACK只确认SYN,接下来走三次握手的普通流程;


    tfo01.png

客户端测试代码

int sockfd, n;  
char recvbuffer[1024], sendbuffer[1024];  
struct sockaddr_in servaddr;  
char buf[20] = {"hello server"};  
int ret = 0;  
  
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {  
    printf ("create socket error: %s(errno: %d)\n", strerror (errno),  
            errno);  
    exit (0);  
}  
  
memset (&servaddr, 0, sizeof (servaddr));  
servaddr.sin_family = AF_INET;  
servaddr.sin_port = htons (5999);  
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");  
  
ret = sendto(sockfd, buf, strlen(buf), MSG_FASTOPEN,  
        (struct sockaddr *)&servaddr, sizeof(servaddr));  
if (ret < 0) {  
    printf ("send msg error: %s(errno: %d)\n", strerror (errno), errno);  
}  
  
close (sockfd);  

在代码不需要使用connect,直接sendto发送数据。第一次交互时只是向服务器申请一个TFO cookie,数据并不在连接建立过程中送达;客户端拿到TFO cookie后,客户端每次用同样方式发送数据时都会在SYN包中携带数据。
在VM中双核2g内存的CentOS中对比普通建连和TFO建连1024次耗时

普通建连 TFO建连
457ms 285ms

服务端关键代码

// 将listenfd设置TCP_FASTOPEN选项
ret = setsockopt(listenfd, 6, TCP_FASTOPEN, &qlen, sizeof(qlen));

TFO在收到SYN的时候就创建socket并将数据提交给应用进程,在握手中传递数据。比普通模式节省了SYN|ACK与ACK的交互时间,减小了通信延迟。

TLS层面的优化

fasle start
False Start 有抢跑的意思。TLS False Start 是指客户端在发送 Change Cipher Spec Finished 同时发送应用数据(如 HTTP 请求),服务端在 TLS 握手完成时直接返回应用数据(如 HTTP 响应)。这样,应用数据的发送实际上并未等到握手全部完成,故谓之抢跑。

false start.png

启用 False Start 之后,TLS 阶段只需要一次 RTT 就可以开始传输应用数据。使用false start有个前提是,必须使用支持前向安全性(Forward Secrecy)的加密算法,例如ECDHE。False Start 在尚未完成握手时就发送了应用数据,Forward Secrecy 可以提高安全性
** Session Resumption**
通过会话复用,提高tls连接速度,是 TLS 握手中生成的 Session ID。服务端可以将 Session ID 协商后的信息存起来,浏览器也可以保存 Session ID,并在后续的 ClientHello 握手中带上它,如果服务端能找到与之匹配的信息,就可以完成一次快速握手。

tls_sessionid.png

Session Ticket
Session Identifier 机制有一些弊端

  1. 负载均衡中,多机之间往往没有同步 Session 信息,如果客户端两次请求没有落在同一台机器上就无法找到匹配的信息
  2. 服务端存储 Session ID 对应的信息不好控制失效时间,太短起不到作用,太长又占用服务端大量资源。

Session Ticket可以解决这些问题,Session Ticket 是用只有服务端知道的安全密钥加密过的会话信息,最终保存在浏览器端。浏览器如果在 ClientHello 时带上了 Session Ticket,只要服务器能成功解密就可以完成握手。

tls_ticket.png

** OCSP Stapling**
证书颁发者有时候需要作废某些证书,证书使用者可以通过 OCSP(Online Certificate Status Protocol,在线证书状态协议)查询证书是否已经作废。客户端会在 TLS 握手阶段进一步协商时,实时查询 OCSP 接口,并在获得结果前阻塞后续流程,这对性能影响很大。使用OCSP Stapling,可以使服务端在证书链中包含颁发机构对证书的 OCSP 查询结果,从而让浏览器跳过自己去验证的过程。服务端有更快的网络,获取 OCSP 响应更容易,也可以将 OCSP 响应缓存起来。从而提高TLS握手的速度。

tls_ocsp stapling.png

0-RTT Handshake
在即将发布的TLS1.3中,服务器可以把自己的 ECDH 公钥长期缓存在客户端,那么客户端就可以用缓存里的ECDHE公钥,构造一个电子信封,在第一个RTT里,直接就发送应用层数据了。

0RTT.png

HTTP层面

使用http2
HTTP/2 并没有改动 HTTP/1 的语义部分,例如请求方法、响应状态码、URI 以及头部字段等核心概念依旧存在。HTTP/2 最大的变化是重新定义了格式化和传输数据的方式,这是通过在高层 HTTP API 和低层 TCP 连接之间引入二进制分帧层来实现的。这样带来的好处是原来的 WEB 应用完全不用修改,就能享受到协议升级带来的收益。
HTTP/2相对于HTTP1的优点:

  1. 使用一个连接,握手少,头部做压缩,更好地利用TCP特性;
  2. 连接复用,减少域名解析的时间;
  3. HTTP/2 的多路复用特性,使得可以在一个连接上同时打开多个流,双向传输数据;
  4. Server Push,意味着服务端可以在发送页面 HTML 时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。

写在最后

针对这个分享之后,自己的一点思考。发现这些优化策略中有不少共同点,如复用,提前传输数据。在我司的产品中,在tls协议的使用中,可以尝试上述的一些优化策略,对TCP重连场景,也可以尝试使用TFO机制,但TFO需要较高的内核版本,在端上未必能支持。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容