1
introom 2017-04-05 13:15:38 +08:00 via Android
ss -timep srcport=yourport
你的问题暴露出你还不了解你的问题。可以先从熟悉 ss 开始。有问题的话就翻翻 ss 源码。 |
2
jimzhong 2017-04-05 13:24:50 +08:00
我觉得是固定值
|
5
justicelove OP @jimzhong
如果是固定值,那保留 TIME_WAIT 状态有何意义? 在网上查看到的内容如下: **TIME_WAIT 两个 MSL 的作用:可靠安全的关闭 TCP 连接。比如网络拥塞,主动方最后一个 ACK 被动方没收到,这时被动方会对 FIN 开启 TCP 重传,发送多个 FIN 包,在这时尚未关闭的 TIME_WAIT 就会把这些尾巴问题处理掉,不至于对新连接及其它服务产生影响。** 如果是固定值,那当发生 TCP 重连时,重传的内容从哪里来呢? |
6
falseen 2017-04-05 13:59:00 +08:00 via Android
这个是系统内核决定的吧。
|
7
neighbads 2017-04-05 13:59:43 +08:00
肯定不是传送内容大小。。。
|
8
ryd994 2017-04-05 15:13:42 +08:00 2
TIME_WAIT 只是内核的一种处理方式,只是连接表里的一个标记,资源占用可以忽略
保留在连接表里可以防止该端口在这段时间内复用,否则如果刚好有个新连接,四元组相同,延迟的包就会影响现在的链接 你看清楚,被动方会对 FIN 开启 TCP 重传 1. 这是被动方以为连接还没断干净,是被动方重发 2.TIME_WAIT 是主动方的事,被动方没有 TIME_WAIT |
9
justicelove OP @ryd994 多谢,懂了
|
11
introom 2017-04-05 17:46:21 +08:00
@est
一般来说 ss 确实够了,但有些时候感觉还是不方便。虽然 tcpdump 能推测出一些信息,可是毕竟是在 2 层。 比方说, kernel 有一些 helper 函数,类似: http://lxr.free-electrons.com/source/include/net/tcp.h#L1071 所以我自己用还是手写 systemtap 比较方便。 @justicelove 你关心内存的话,可以边学 tcp ,边用 systemtap 观测。 |
12
demonchang 2017-04-05 17:52:15 +08:00
time_wait 最主要的还是占用链接资源。每个机器链接资源都是有限的。不过可以更改大小。 主要还是重复利用 time_wait 的链接资源吧
|
13
est 2017-04-05 18:03:28 +08:00
@introom 高玩啊。我觉得 ss 已经很够用了。其实 netlink 也可以得到更多信息。上次解决一个比较棘手的问题是一个 unix domain socket 的 backlog 有多大。
|
14
raysonx 2017-04-05 18:11:47 +08:00
内核会为每一个 TCP 连接分配一定的资源( tcpcb 之类)保存连接的状态信息。关闭连接的主动方在发送完最后一个 ACK 后,会进入 TIME_WAIT 状态,连接在这个状态超时之前不会被释放,以防对方没收到这个 ACK 包。若对方真的没收到这个 ACK 会重发 FIN ,这时主动方会再次发送 ACK 。
理论上来讲,占用的内存会和连接数占线性关系。 |
15
owt5008137 2017-04-05 20:02:32 +08:00 via Android
这个根据实现的不同而不同的吧。理论上内存消耗不会超过最后一次发送窗口+tcp 本身资源占用的大小。
tcp 连接都有自己的发送队列的, fin 对方没收到,难道之前的包对方就收到了?所以一般来说,这里的发送队列管理和正常的收发包流程并没有什么太大区别 |
17
luoqeng 2017-04-05 23:21:36 +08:00
|
18
zyEros 2017-04-06 00:40:33 +08:00 via iPhone
time wait 只是一个 tcp 状态,占资源的是链接
|
19
justicelove OP @introom 感谢
|
20
duzhichaomail 2017-04-06 12:08:09 +08:00
楼主看来对 tcp 的概念不熟悉 , 推荐 《计算机网络:自顶向下方法》 《 TCP/IP 详解 卷 1 :协议》
|