Linux 内核技术实战课
邵亚方
前蘑菇街技术专家,Linux Kernel 活跃贡献者
23704 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
Linux 内核技术实战课
15
15
1.0x
00:00/00:00
登录|注册

11 基础篇 | TCP连接的建立和断开受哪些系统配置影响?

推荐关闭
推荐打开
推荐调小
推荐减小该值
推荐调小为2
推荐配置为0
推荐适当调大
推荐设置为2
推荐开启SYN Cookies
推荐适当调大
数据中心内部经常进行网络优化
推荐设置为2
需要排查应用程序是否有Bug
tcp_tw_recycle
tcp_tw_reuse
tcp_max_tw_buckets
TCP_TIMEWAIT_LEN
tcp_fin_timeout
tcp_abort_on_overflow
backlog
tcp_synack_retries
SYN Flood攻击
tcp_max_syn_backlog
三次握手的初始超时时间
tcp_syn_retries
CLOSE_WAIT状态
TIME_WAIT状态
主动关闭方的FIN_WAIT_2状态
Server调用accept()
Server发送SYNACK包
Server处理SYN包
Client调用connect()
TCP连接的断开过程
TCP连接的建立过程
TCP连接的建立和断开受哪些系统配置影响?

该思维导图由 AI 生成,仅供参考

你好,我是邵亚方。
如果你做过 Linux 上面网络相关的开发,或者分析过 Linux 网络相关的问题,那你肯定吐槽过 Linux 系统里面让人眼花缭乱的各种配置项,应该也被下面这些问题困扰过:
Client 为什么无法和 Server 建立连接呢?
三次握手都完成了,为什么会收到 Server 的 reset 呢?
建立 TCP 连接怎么会消耗这么多时间?
系统中为什么会有这么多处于 time-wait 的连接?该这么处理?
系统中为什么会有这么多 close-wait 的连接?
针对我的业务场景,这么多的网络配置项,应该要怎么配置呢?
……
因为网络这一块涉及到的场景太多了,Linux 内核需要去处理各种各样的网络场景,不同网络场景的处理策略也会有所不同。而 Linux 内核的默认网络配置可能未必会适用我们的场景,这就可能导致我们的业务出现一些莫名其妙的行为。
所以,要想让业务行为符合预期,你需要了解 Linux 的相关网络配置,让这些配置更加适用于你的业务。Linux 中的网络配置项是非常多的,为了让你更好地了解它们,我就以最常用的 TCP/IP 协议为例,从一个网络连接是如何建立起来的以及如何断开的来开始讲起。

TCP 连接的建立过程会受哪些配置项的影响?

确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了TCP连接的建立和断开过程中受系统配置项影响的问题。从TCP连接的建立过程入手,详细介绍了各个阶段受到的系统配置项的影响,如tcp_syn_retries和tcp_max_syn_backlog等。此外,还介绍了TCP连接断开过程中受到的系统配置项的影响,包括FIN_WAIT_2状态的超时时间和TIME_WAIT状态的存活时间等。文章还提到了一些系统配置项的建议调整值,以及对于CLOSE_WAIT状态的连接排查建议。总的来说,本文深入浅出地解释了TCP连接建立和断开过程中受到的系统配置项的影响,为读者提供了宝贵的技术知识。文章还提到了一些课后作业,鼓励读者使用tcpdump工具观察TCP的三次握手和四次挥手过程,巩固所学内容。整体而言,本文内容丰富,涵盖了TCP连接过程中的关键技术点,对于网络开发和故障分析的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 内核技术实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(24)

  • 最新
  • 精选
  • wong ka seng
    老师好,请问一下, 想听说tcp成功连接后很占资源,有没有具体的解说?例如每个连接消耗多少记忆体和cpu?谢谢!

    作者回复: TCP连接的开销主要是内存开销,也就是TCP相关结构体的开销,每个TCP结构体的大小可以通过/proc/slabinfo来查看,例如: cat /proc/slabinfo | grep -i TCP 这里面会有全连接和半连接TCP结构体的大小,全连接较大,一个有几K字节。 除了内存开销外,另外就是软中断的开销,tcp连接会用到很多timer,特别是time-wait连接,这些timer会消耗CPU。

    2020-10-05
    16
  • Abby
    老师,如果不开启abort_on_overflow, 是不是这个时候client认为连接建立成功了,就会发送数据。server端发现这个连接没有建立,直接就再次发送reset回去咯?所以设置成1意义不大

    作者回复: 并不是这样,在Server侧此时这个连接还是半连接,他会忽略client发的三次握手阶段的最后一个ack,而是继续给client发送synack,synack有次数的限制,Server给client发送的synack超过这个次数后才会断开这个连接。 如果是为1的话,Server就不会重传synack,而是直接发送Reset来断开连接。

    2020-09-17
    12
  • 姑射仙人
    “如果不维持 TIME_WAIT 这个状态,那么再次收到对端的 FIN 包后,本端就会回一个 Reset 包,这可能会产生一些异常。” 老师,我有两个问题: 1. 如果不维持TCP状态,最后一次ACK结束,Client端认为已经结束,就会关闭连接。这时候Server端在发送FIN包,客户端应该就收不到了吧? 2. 假设客户端收到了,回复RESET,会产生什么样的异常?

    作者回复: 1. 内核协议栈会收到该包。假设该fd已经被关闭,内核协议栈收到对端的fin包后,就查找不到对应的连接,它就会通知对端这是个异常的连接。 2. 假设客户端重新建立了一个连接,复用了之前的端口,由于网络延迟的原因,这个fin包可能在新连接建立后到达,那么这个新连接就会被误伤。所以一定要设立一个保护时间,来应对网络的不确定性。

    2021-03-10
    6
  • 机制小风风
    半连接,即收到了 SYN 后还没有回复 SYNACK 的连接,Server 每收到一个新的 SYN 包,都会创建一个半连接,然后把该半连接加入到半连接队列(syn queue)中。 开启 SYN Cookies 后,还会创建半连接吗?如果不创建是不是不用设置半连接队列了? 如果创建半连接,还会加入队列吗?如果加入,是收到ack,确认好cookies加入,还是什么时候加入? 不保存客户端信息,是不是指的不创建半连接?

    作者回复: 开启syn cookies后,服务端还是会创建半连接,但是该半连接只是为了回复syn-ack,回复完就会销毁,所以不会有资源浪费。再收到client的最后一个ack包后,服务端验证cookies的有效性后就会创建一个全连接,并把它添加到全连接队列中。

    2020-11-18
    2
    5
  • 小白debug
    老师你好,文章里提到"有些情况下 1s 的阻塞时间可能都很久,所以有的时候也会将三次握手的初始超时时间从默认值 1s 调整为一个较小的值,比如 100ms" ,这里面怎么把第一次握手syn的初始超时时间从1s改成100ms?查了很多资料只看到介绍改超时次数tcp_syn_retries,而没有看到改默认超时时间。

    作者回复: 这需要修改内核代码来实现,内核默认是无法更改这个时间的。

    2020-11-01
    2
    5
  • 我能走多远
    在一些文章中看到TIME_WAIT 和 FIN_WAIT2 状态的最大时长都是 2 MSL,由于在 Linux 系统中,MSL 的值固定为 30 秒,所以它们都是 60 秒。下面时我环境中 [13:47:18]root:workspace$ cat /proc/sys/net/ipv4/tcp_fin_timeout 60 TIME_WAIT 状态存在这么长时间,也是对系统资源的一个浪费,所以系统也有配置项来限制该状态的最大个数,该配置选项就是 tcp_max_tw_buckets=10000,如果当前环境TIME_WAIT数量达到10000时,又是怎么处理的?

    作者回复: 当time—wait的个数达到tw buckets的限制时 就直接释放掉 而不是再放在这个bucket中。

    2020-11-09
    4
  • piboye
    isn和paws老师可以细讲不,还有nat转换会转换seq吗?

    作者回复: 最普通的nat是不会的,它只是进行地址转换。不过nat可以工作在tcp层,可以解析tcp协议,所以有些nat也可以进行seq的转换。比如说有些协议地址是在tcp payload中,那这些内容都需要换掉。

    2020-09-22
    2
  • 地下城勇士
    看了好多篇,老师的图都很到为,请问一下老师的图是用什么工具画的?

    作者回复: gliffy diagrams,chrome的插件。

    2020-10-17
    1
  • 欧阳洲
    老师好: FIN_WAIT_2 超时时间是 tcp_fin_timeout 控制, TIME_WAIT 默认也是 60s,但是 /proc/sys/net/ipv4/ 下没有wait相关文件名, TIME_WAIT 是与 FIN_WAIT_2 共用了同一个选项吗?

    作者回复: 默认内核里TIME-WAIT时间是不可修改的,也就是没有对应的sysctl选项。

    2020-09-12
    5
    1
  • Felix
    收到SYN还没有回复SYNACK的是半连接,那回复了SYNACK还没有收到ACK的连接算不算是半连接,这也是一个中间状态,是否也在syn queue里面,即syn queue只包含第一次握手还是只包含第二次握手还是第一次第二次都包含

    作者回复: client发送syn,sever接收syn然后回复synack,client收到synack回复ack,至此三次握手结束。 半连接/全链接针对的是被被动连接方(Server),目的是为了安全以及可靠性,对于主动连接方(client)而言,是无需考虑这些事的,所以不存在全连接/半连接这个设计。

    2021-09-02
收起评论
显示
设置
留言
24
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部