11 基础篇 | TCP连接的建立和断开受哪些系统配置影响?
该思维导图由 AI 生成,仅供参考
TCP 连接的建立过程会受哪些配置项的影响?
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了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-0516 - Abby老师,如果不开启abort_on_overflow, 是不是这个时候client认为连接建立成功了,就会发送数据。server端发现这个连接没有建立,直接就再次发送reset回去咯?所以设置成1意义不大
作者回复: 并不是这样,在Server侧此时这个连接还是半连接,他会忽略client发的三次握手阶段的最后一个ack,而是继续给client发送synack,synack有次数的限制,Server给client发送的synack超过这个次数后才会断开这个连接。 如果是为1的话,Server就不会重传synack,而是直接发送Reset来断开连接。
2020-09-1712 - 姑射仙人“如果不维持 TIME_WAIT 这个状态,那么再次收到对端的 FIN 包后,本端就会回一个 Reset 包,这可能会产生一些异常。” 老师,我有两个问题: 1. 如果不维持TCP状态,最后一次ACK结束,Client端认为已经结束,就会关闭连接。这时候Server端在发送FIN包,客户端应该就收不到了吧? 2. 假设客户端收到了,回复RESET,会产生什么样的异常?
作者回复: 1. 内核协议栈会收到该包。假设该fd已经被关闭,内核协议栈收到对端的fin包后,就查找不到对应的连接,它就会通知对端这是个异常的连接。 2. 假设客户端重新建立了一个连接,复用了之前的端口,由于网络延迟的原因,这个fin包可能在新连接建立后到达,那么这个新连接就会被误伤。所以一定要设立一个保护时间,来应对网络的不确定性。
2021-03-106 - 机制小风风半连接,即收到了 SYN 后还没有回复 SYNACK 的连接,Server 每收到一个新的 SYN 包,都会创建一个半连接,然后把该半连接加入到半连接队列(syn queue)中。 开启 SYN Cookies 后,还会创建半连接吗?如果不创建是不是不用设置半连接队列了? 如果创建半连接,还会加入队列吗?如果加入,是收到ack,确认好cookies加入,还是什么时候加入? 不保存客户端信息,是不是指的不创建半连接?
作者回复: 开启syn cookies后,服务端还是会创建半连接,但是该半连接只是为了回复syn-ack,回复完就会销毁,所以不会有资源浪费。再收到client的最后一个ack包后,服务端验证cookies的有效性后就会创建一个全连接,并把它添加到全连接队列中。
2020-11-1825 - 小白debug老师你好,文章里提到"有些情况下 1s 的阻塞时间可能都很久,所以有的时候也会将三次握手的初始超时时间从默认值 1s 调整为一个较小的值,比如 100ms" ,这里面怎么把第一次握手syn的初始超时时间从1s改成100ms?查了很多资料只看到介绍改超时次数tcp_syn_retries,而没有看到改默认超时时间。
作者回复: 这需要修改内核代码来实现,内核默认是无法更改这个时间的。
2020-11-0125 - 我能走多远在一些文章中看到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-094 - piboyeisn和paws老师可以细讲不,还有nat转换会转换seq吗?
作者回复: 最普通的nat是不会的,它只是进行地址转换。不过nat可以工作在tcp层,可以解析tcp协议,所以有些nat也可以进行seq的转换。比如说有些协议地址是在tcp payload中,那这些内容都需要换掉。
2020-09-222 - 地下城勇士看了好多篇,老师的图都很到为,请问一下老师的图是用什么工具画的?
作者回复: gliffy diagrams,chrome的插件。
2020-10-171 - 欧阳洲老师好: FIN_WAIT_2 超时时间是 tcp_fin_timeout 控制, TIME_WAIT 默认也是 60s,但是 /proc/sys/net/ipv4/ 下没有wait相关文件名, TIME_WAIT 是与 FIN_WAIT_2 共用了同一个选项吗?
作者回复: 默认内核里TIME-WAIT时间是不可修改的,也就是没有对应的sysctl选项。
2020-09-1251 - Felix收到SYN还没有回复SYNACK的是半连接,那回复了SYNACK还没有收到ACK的连接算不算是半连接,这也是一个中间状态,是否也在syn queue里面,即syn queue只包含第一次握手还是只包含第二次握手还是第一次第二次都包含
作者回复: client发送syn,sever接收syn然后回复synack,client收到synack回复ack,至此三次握手结束。 半连接/全链接针对的是被被动连接方(Server),目的是为了安全以及可靠性,对于主动连接方(client)而言,是无需考虑这些事的,所以不存在全连接/半连接这个设计。
2021-09-02