系统性能调优必知必会
陶辉
智链达CTO、前阿里云高级技术专家
立即订阅
4492 人已学习
课程目录
已更新 13 讲 / 共 34 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 万变不离其宗,性能优化也有章可循
免费
基础设施优化 (6讲)
01 | CPU缓存:怎样写代码能够让CPU执行得更快?
02 | 内存池:如何提升内存分配的效率?
03 | 索引:如何用哈希表管理亿级对象?
04 | 零拷贝:如何高效地传输文件?
05 | 协程:如何快速地实现高并发服务?
06 | 锁:如何根据业务场景选择合适的锁?
系统层网络优化 (6讲)
07 | 性能好,效率高的一对多通讯该如何实现?
08 | 事件驱动:C10M是如何实现的?
09 | 如何提升TCP三次握手的性能?
10 | 如何提升TCP四次挥手的性能?
11 | 如何修改TCP缓冲区才能兼顾并发数量与传输速度?
12 | 如何调整TCP拥塞控制的性能?
系统性能调优必知必会
15
15
1.0x
00:00/00:00
登录|注册

09 | 如何提升TCP三次握手的性能?

陶辉 2020-05-18
你好,我是陶辉。
上一讲我们提到 TCP 在三次握手建立连接、四次握手关闭连接时是怎样产生事件的,这两个过程中 TCP 连接经历了复杂的状态变化,既容易导致编程出错,也有很大的优化空间。这一讲我们看看在 Linux 操作系统下,如何优化 TCP 的三次握手流程,提升握手速度。
TCP 是一个可以双向传输的全双工协议,所以需要经过三次握手才能建立连接。三次握手在一个 HTTP 请求中的平均时间占比在 10% 以上,在网络状况不佳、高并发或者遭遇 SYN 泛洪攻击等场景中,如果不能正确地调整三次握手中的参数,就会对性能有很大的影响。
TCP 协议是由操作系统实现的,调整 TCP 必须通过操作系统提供的接口和工具,这就需要理解 Linux 是怎样把三次握手中的状态暴露给我们,以及通过哪些工具可以找到优化依据,并通过哪些接口修改参数。
因此,这一讲我们将介绍 TCP 握手过程中各状态的意义,并以状态变化作为主线,看看如何调整 Linux 参数才能提升握手的性能。

客户端的优化

客户端和服务器都可以针对三次握手优化性能。相对而言,主动发起连接的客户端优化相对简单一些,而服务器需要在监听端口上被动等待连接,并保存许多握手的中间状态,优化方法更为复杂一些。我们首先来看如何优化客户端。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《系统性能调优必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(18)

  • Geek_007
    老师,今天的内容很多只适用于内网通信或者服务端单边优化吧。生产场景,客户端经常是手机或者PC.无法修改客户端内核参数。另外TFO适用于公网么?运营商或者移动端会不会对TFO不支持。(难道非得QUIC才能优化客户端的网络连接吗)😀
    2020-05-18
    1
    7
  • 忆水寒
    本文的干货满满的,虽然都熟悉,但是没有这么底层的优化过。
    当网络丢包严重的时候,可以使用快速重传机制。重传时间间隔是指数级退避,直到达到 120s 为止,总时间将近 15 分钟,重传次数默认是 15次 ,重传次数默认值由 /proc/sys/net/ipv4/tcp_retries2 决定。

    作者回复: 谢谢忆水寒的补充!

    2020-05-20
    4
  • 凉人。
    做过优化,长连接, 减少time_wait时长,复用time_wait连接
    2020-05-18
    3
  • Geek_007
    看评论区,很多同学都说是长连接,普通的http keepalive 会不会有坑,三大运营商或者中间网络设备都会将超过一定时间的链接drop掉。如果没有h2这种ping保活的机制,有可能客户端莫名其妙长链接被drop掉,客户端只能依赖超时来感知异常,反倒是影响性能了。

    作者回复: 是的,不只网络设备,一些代理服务器为了减轻自己的负担,也会把长连接断掉,比如Nginx默认关闭75秒没有数据交互的keep alive 长连接

    2020-05-18
    2
  • 那时刻
    使用http的时候,为了减少tcp链接,重复使用已经链接的tcp,设置nginx的keepalive参数。

    作者回复: http/1.1里的keepalive功能是个很好用的优化点^_^

    2020-05-18
    1
    2
  • 我来也
    很实用的一篇文章。

    今天又有新的收获,原来TFO是这么个意思,原理是这样的。
    之前只在某些网络代理软件中看到过tcp_fastopen选项,但不知道啥意思。现在就明白了。
    话说光软件层面开启了,内核未开启,也是享受不了的。这个就得看看内核是否默认开启了。
    2020-05-18
    2
  • 猿人谷
    这篇文章太精彩了,赏心悦目啊

    作者回复: 谢谢^_^

    2020-05-22
    1
  • Tango281
    老师,TFO编程的时候,为什么要改为sendto或者sendmsg啊? 这个地方原理不太懂。

    作者回复: 你好Tango281,非TFO场景下,你大可先调用connect函数,在这里传递服务器地址,再调用send函数发送请求,但在TFO场景下,是不能调用connect函数的,否则就回归正常的三次握手了,所以要使用sendto等函数。

    2020-05-22
    1
  • 小一日一
    干货满满的一节,感谢老师

    作者回复: ^_^

    2020-05-19
    1
  • 唐朝首都
    刚学习了两个知识点:
    (1)syncookies功能
    当SYN 半连接队列已满时,并非只能丢弃连接,服务端可以实时计算出一个状态值与SYN+ACK 报文一同发出,客户端返回报文时进行实时解析验证,如果通过也是可以建立连接的,减少了客户端不断重试的时间。
    (2)TFO
    首次建立连接之后,客户端与服务端分别存储加密的Cookie,解决后续的信任问题,这样后续就无需再经历同样的三次握手,减少建立连接的时间。
    2020-05-18
    1
  • 小林coding
    陶辉老师,我用 hping 命令模拟 tcp 洪泛的测试,发现不管怎么调大 tcp_max_syn_backlog,服务端的 SYN_RECV 状态一直最大只有 256 个,我测试的 Linux 内核是版本 2.6.32-431.el6.x86_64

    然后在网上搜索了下资料,https://www.cnblogs.com/zengkefu/p/5606696.html,发现 TCP 半连接队列的大小不是简单由 tcp_max_syn_backlog 决定,还会跟 TCP 全连接队列有关系。
    2020-05-24
  • 🎧重返归途
    这节收获很多!
    应用连接数,服务器进程文件数量和连接数数,tcp超时时间等;比较明显的是tcp超时时间设置,应用有更长时间对错误tcp状态进行报错提示。
    2020-05-24
  • eason2017
    文章精彩,佩付大师!

    作者回复: ^_^

    2020-05-21
  • 崔伟协
    现在网络上tfo的连接多吗,占多少比率
    2020-05-20
  • 董泽润
    访量很大时,time_wait 会非常多,一般都用长连接来规避这个问题。但是长连接也有问题,比如保活,比如当服务端挂了,但是因为网络隔离客户端还没感知道,这时请求就会有大量超时
    2020-05-20
  • 爱谁谁
    预建连接,连接复用,多IP竞速建立链接和复合连接~
    2020-05-20
  • holly
    我集群中的一台服务器出现了大量的LAST_ACK,三次握手看了多遍还是不知从何处开始分析。用neststat查看
    LAST_ACK 2056
    LISTEN 8
    CLOSE_WAIT 10
    ESTABLISHED 7273
    FIN_WAIT1 1
    FIN_WAIT2 3
    SYN_SENT 2
    TIME_WAIT 26
    其它正常的服务器中的一台LAST_ACK 2056
    LISTEN 8
    CLOSE_WAIT 17
    ESTABLISHED 7940
    FIN_WAIT1 1
    FIN_WAIT2 3
    TIME_WAIT 56
    查找资料说根据TCP状态变化过程分析LAST_ACK是属于主动还是被动,可是该资料没说怎么根据tcp状态变化过程分析,只是给出了是主动还是被动的结果,希望老师给个思路
    2020-05-19
  • 有朋自远方来
    这个 cookie 和常说的 cookie session 是一回事么?

    作者回复: 不是哦,那个是HTTP协议中的概念

    2020-05-19
收起评论
18
返回
顶部