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

菜鸟提问:关于 TCP 协议

  •  
  •   justicelove ·
    Justice-love · 2017-04-05 13:05:23 +08:00 · 4713 次点击
    这是一个创建于 2793 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • TCP 协议中的 TIME_WAIT 状态会占一定内存,想了解占用内存的大小是 固定值 还是这次 TCP 连接传输的内容大小
    20 条回复    2017-04-06 12:08:09 +08:00
    introom
        1
    introom  
       2017-04-05 13:15:38 +08:00 via Android
    ss -timep srcport=yourport

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

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

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

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

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

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