【问题标题】:How to find out the bytes sent for a connected tcp socket?如何找出为连接的 tcp 套接字发送的字节?
【发布时间】:2019-01-07 16:03:41
【问题描述】:

我想知道一个 tcp 套接字上传输了多少字节(顺便说一下,我使用的是 Ubuntu 18.04)。我尝试了 ss 命令,但似乎 ss 只能显示 bytes_received,而不是 bytes_sent。那么有什么方法可以显示套接字的 bytes_sent 吗?为什么这个数字没有显示在ss中?我认为 bytes_received 和 bytes_sent 密切相关。

> ss -ti

ESTAB    0   0   host1:ssh              host2:7703
     cubic wscale:2,8 rto:384 rtt:181.622/16.823 ato:40 mss:1452 cwnd:10 
     ssthresh:118 bytes_acked:120873541 bytes_received:1151501 segs_out:87562 
     segs_in:39194 send 639.6Kbps lastsnd:11732 lastrcv:11564 lastack:11564 
     pacing_rate 1.3Mbps retrans:0/203 reordering:56 rcv_rtt:11516 rcv_space:71360

【问题讨论】:

  • 从编程角度还是从操作系统角度?
  • "我认为 bytes_received 和 bytes_sent 是密切相关的。" - 从套接字的角度来看,接收到的字节数和发送的数完全没有关系。我目前不确定系统是否在每个套接字的基础上跟踪您想要的统计信息。
  • @tadman 操作系统视角。现在我认为 bytes_acked 可能是我想要的,但不确定。在我看来,bytes_acked 表示套接字已发送并被对等方确认的字节数
  • 如果这是操作系统级别的问题,那么这是 SuperUser 的问题,因为 Stack Overflow 是针对编程问题的,这是题外话。
  • 跟踪可能与TCP序列号有关,需要跟踪通信的有效载荷字节数。但是,它应该从随机初始序列号 (ISN) 开始。查看实现的内核代码可能会很有趣,可能会保存 ISN,以便可以确定实际字节,并且您可能会看到哪些接口可用于导出它。

标签: c linux sockets tcp ss


【解决方案1】:

我一直在研究同样的问题,并得出结论,这取决于您使用的内核。

根据我的测试,我能够在 Linux 内核 4.xx 和 5.xx 上获得 bytes_sentbytes_ackedbytes_recieved,但在 3.xx 上却没有。请参阅下面Debian GNU/Linux with kernel 4.19.0-6-amd64 的示例:

$ ss -itpn

State           Recv-Q           Send-Q                      Local Address:Port                      Peer Address:Port
ESTAB           0                0                          172.16.177.135:22                        172.16.177.1:60928            
users:(("sshd",pid=700,fd=4))
    bytes_sent:50872 bytes_acked:50872 bytes_received:11165

*我删除了与此问题无关的其他信息

在挖掘 sock_diagss's source code 之后,看起来 ss 使用 INET_DIAG_INFO 类型的 struct tcp_info 来获取此信息。

我希望这会有所帮助,如果我想出任何其他问题,我会通知您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多