首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Coding
V2EX  ›  Linux

菜鸟提问:关于 TCP 协议

  •  
  •   justicelove · 2017-04-05 13:05:23 +08:00 · 3798 次点击
    这是一个创建于 983 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • TCP 协议中的 TIME_WAIT 状态会占一定内存,想了解占用内存的大小是 固定值 还是这次 TCP 连接传输的内容大小
    20 回复  |  直到 2017-04-06 12:08:09 +08:00
        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
    我觉得是固定值
        3
    yangff   2017-04-05 13:50:10 +08:00
    @introom 穿越了……?
        4
    LokiSharp   2017-04-05 13:52:07 +08:00
    @introom 你进错贴了吧?
        5
    justicelove   2017-04-05 13:57:34 +08:00
    @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   2017-04-05 15:42:21 +08:00
    @ryd994 多谢,懂了
        10
    est   2017-04-05 15:48:12 +08:00   ♥ 1
    @LokiSharp
    @yangff

    iproute2 包里有一个比 netstat 牛逼一万倍的命令叫 ss 。。。。。
        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 对方没收到,难道之前的包对方就收到了?所以一般来说,这里的发送队列管理和正常的收发包流程并没有什么太大区别
        16
    longaiwp   2017-04-05 20:52:56 +08:00
    @yangff 惊了,原来还有这样的命令
        17
    luoqeng   2017-04-05 23:21:36 +08:00
    https://zhuanlan.zhihu.com/p/25241630 虽然我也没仔细看
        18
    zyEros   2017-04-06 00:40:33 +08:00 via iPhone
    time wait 只是一个 tcp 状态,占资源的是链接
        19
    justicelove   2017-04-06 09:06:54 +08:00
    @introom 感谢
        20
    duzhichaomail   2017-04-06 12:08:09 +08:00
    楼主看来对 tcp 的概念不熟悉 , 推荐 《计算机网络:自顶向下方法》 《 TCP/IP 详解 卷 1 :协议》
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2286 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 114ms · UTC 13:05 · PVG 21:05 · LAX 05:05 · JFK 08:05
    ♥ Do have faith in what you're doing.