如何优化TCP通信中的TIME_WAIT
一、TIME_WAIT 的危害
过多的 TIME_WAIT 的主要危害有两种。
第一是内存资源占用,这个目前看来不是太严重,基本可以忽略。
第二是对端口资源的占用,一个 TCP 连接至少消耗一个本地端口。要知道,端口资源也是有限的,一般可以开启的端口为 32768~61000 ,也可以通过net.ipv4.ip_local_port_range指定,如果 TIME_WAIT 状态过多,会导致无法创建新连接。
二、如何优化 TIME_WAIT?
- net.ipv4.tcp_max_tw_buckets
一个暴力的方法是通过 sysctl 命令,将系统值调小。这个值默认为 18000,当系统中处于 TIME_WAIT 的连接一旦超过这个值时,系统就会将所有的 TIME_WAIT 连接状态重置,并且只打印出警告信息。这个方法过于暴力,而且治标不治本,带来的问题远比解决的问题多,不推荐使用。 -
SO_LINGER 的设置
英文单词“linger”的意思为停留,我们可以通过设置套接字选项,来设置调用 close 或者 shutdown 关闭连接时的行为。int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
struct linger { int l_onoff; /* 0=off, nonzero=on */ int l_linger; /* linger time, POSIX specifies units as seconds */ }
设置 linger 参数有几种可能:
a) 如果l_onoff为 0,那么关闭本选项。l_linger的值被忽略,这对应了默认行为,close 或 shutdown 立即返回。如果在套接字发送缓冲区中有数据残留,系统会将试着把这些数据发送出去。
b) 如果l_onoff为非 0, 且l_linger值也为 0,那么调用 close 后,会立该发送一个 RST 标志给对端,该 TCP 连接将跳过四次挥手,也就跳过了 TIME_WAIT 状态,直接关闭。这种关闭的方式称为“强行关闭”。 在这种情况下,排队数据不会被发送,被动关闭方也不知道对端已经彻底断开。只有当被动关闭方正阻塞在recv()调用上时,接受到 RST 时,会立刻得到一个“connet reset by peer”的异常。struct linger so_linger; so_linger.l_onoff = 1; so_linger.l_linger = 0; setsockopt(s,SOL_SOCKET,SO_LINGER, &so_linger,sizeof(so_linger));
c)如果l_onoff为非 0, 且l_linger的值也非 0,那么调用 close 后,调用 close 的线程就将阻塞,直到数据被发送出去,或者设置的l_linger计时时间到。
第二种可能为跨越 TIME_WAIT 状态提供了一个可能,不过是一个非常危险的行为,不值得提倡。 - net.ipv4.tcp_tw_reuse:更安全的设置
Linux 系统对于net.ipv4.tcp_tw_reuse的解释如下:Allow to reuse TIME-WAIT sockets for new connections when it is safe from protocol viewpoint. Default value is 0.It should not be changed without advice/request of technical experts.
这段话的大意是从协议角度理解如果是安全可控的,可以复用处于 TIME_WAIT 的套接字为新的连接所用。
那么什么是协议角度理解的安全可控呢?主要有两点:
1.只适用于连接发起方(C/S 模型中的客户端);
2.对应的 TIME_WAIT 状态的连接创建时间超过 1 秒才可以被复用。
使用这个选项,还有一个前提,需要打开对 TCP 时间戳的支持,即net.ipv4.tcp_timestamps=1(默认即为 1)。
要知道,TCP 协议也在与时俱进,RFC 1323 中实现了 TCP 拓展规范,以便保证 TCP 的高可用,并引入了新的 TCP 选项,两个 4 字节的时间戳字段,用于记录 TCP 发送方的当前时间戳和从对端接收到的最新时间戳。由于引入了时间戳,我们在前面提到的 2MSL 问题就不复存在了,因为重复的数据包会因为时间戳过期被自然丢弃。
- 分享
- 举报
-
2021-04-06 16:21:26
-
浏览量:746次2023-02-14 17:22:21
-
浏览量:3208次2020-08-07 17:39:59
-
浏览量:761次2024-02-27 18:09:40
-
浏览量:2535次2019-10-14 14:48:05
-
浏览量:2451次2020-07-31 18:12:31
-
浏览量:4613次2021-05-28 16:59:07
-
浏览量:2710次2020-10-28 09:59:08
-
浏览量:4051次2022-02-19 09:00:30
-
浏览量:2756次2020-02-29 12:04:47
-
浏览量:5383次2021-06-17 11:39:26
-
浏览量:3177次2020-11-09 19:56:03
-
2023-04-14 13:55:03
-
2021-04-06 16:19:37
-
浏览量:2459次2018-12-17 17:07:51
-
浏览量:2429次2019-12-18 19:16:10
-
浏览量:1881次2020-07-07 09:07:51
-
浏览量:751次2024-03-01 16:04:36
-
浏览量:1362次2022-10-11 14:43:12
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
gcp
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明