菜鸟提问:关于 TCP 协议

2017-04-05 13:05:23 +08:00
 justicelove
4733 次点击
所在节点    Linux
20 条回复
introom
2017-04-05 13:15:38 +08:00
ss -timep srcport=yourport

你的问题暴露出你还不了解你的问题。可以先从熟悉 ss 开始。有问题的话就翻翻 ss 源码。
jimzhong
2017-04-05 13:24:50 +08:00
我觉得是固定值
yangff
2017-04-05 13:50:10 +08:00
@introom 穿越了……?
LokiSharp
2017-04-05 13:52:07 +08:00
@introom 你进错贴了吧?
justicelove
2017-04-05 13:57:34 +08:00
@jimzhong
如果是固定值,那保留 TIME_WAIT 状态有何意义?

在网上查看到的内容如下:

**TIME_WAIT 两个 MSL 的作用:可靠安全的关闭 TCP 连接。比如网络拥塞,主动方最后一个 ACK 被动方没收到,这时被动方会对 FIN 开启 TCP 重传,发送多个 FIN 包,在这时尚未关闭的 TIME_WAIT 就会把这些尾巴问题处理掉,不至于对新连接及其它服务产生影响。**
如果是固定值,那当发生 TCP 重连时,重传的内容从哪里来呢?
falseen
2017-04-05 13:59:00 +08:00
这个是系统内核决定的吧。
neighbads
2017-04-05 13:59:43 +08:00
肯定不是传送内容大小。。。
ryd994
2017-04-05 15:13:42 +08:00
TIME_WAIT 只是内核的一种处理方式,只是连接表里的一个标记,资源占用可以忽略
保留在连接表里可以防止该端口在这段时间内复用,否则如果刚好有个新连接,四元组相同,延迟的包就会影响现在的链接

你看清楚,被动方会对 FIN 开启 TCP 重传
1. 这是被动方以为连接还没断干净,是被动方重发
2.TIME_WAIT 是主动方的事,被动方没有 TIME_WAIT
justicelove
2017-04-05 15:42:21 +08:00
@ryd994 多谢,懂了
est
2017-04-05 15:48:12 +08:00
@LokiSharp
@yangff

iproute2 包里有一个比 netstat 牛逼一万倍的命令叫 ss 。。。。。
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 观测。
demonchang
2017-04-05 17:52:15 +08:00
time_wait 最主要的还是占用链接资源。每个机器链接资源都是有限的。不过可以更改大小。 主要还是重复利用 time_wait 的链接资源吧
est
2017-04-05 18:03:28 +08:00
@introom 高玩啊。我觉得 ss 已经很够用了。其实 netlink 也可以得到更多信息。上次解决一个比较棘手的问题是一个 unix domain socket 的 backlog 有多大。
raysonx
2017-04-05 18:11:47 +08:00
内核会为每一个 TCP 连接分配一定的资源( tcpcb 之类)保存连接的状态信息。关闭连接的主动方在发送完最后一个 ACK 后,会进入 TIME_WAIT 状态,连接在这个状态超时之前不会被释放,以防对方没收到这个 ACK 包。若对方真的没收到这个 ACK 会重发 FIN ,这时主动方会再次发送 ACK 。
理论上来讲,占用的内存会和连接数占线性关系。
owt5008137
2017-04-05 20:02:32 +08:00
这个根据实现的不同而不同的吧。理论上内存消耗不会超过最后一次发送窗口+tcp 本身资源占用的大小。

tcp 连接都有自己的发送队列的, fin 对方没收到,难道之前的包对方就收到了?所以一般来说,这里的发送队列管理和正常的收发包流程并没有什么太大区别
longaiwp
2017-04-05 20:52:56 +08:00
@yangff 惊了,原来还有这样的命令
luoqeng
2017-04-05 23:21:36 +08:00
https://zhuanlan.zhihu.com/p/25241630 虽然我也没仔细看
zyEros
2017-04-06 00:40:33 +08:00
time wait 只是一个 tcp 状态,占资源的是链接
justicelove
2017-04-06 09:06:54 +08:00
@introom 感谢
duzhichaomail
2017-04-06 12:08:09 +08:00
楼主看来对 tcp 的概念不熟悉 , 推荐 《计算机网络:自顶向下方法》 《 TCP/IP 详解 卷 1 :协议》

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/352631

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX