如何找出为已连接的TCP套接字发送的字节?

时间:2019-01-07 16:03:42

标签: c linux sockets tcp ss

我想找出在tcp套接字上传输了多少字节(顺便说一句,我正在使用Ubuntu 18.04)。我尝试了 ss 命令,但 ss 似乎只能显示已接收的字节数,而不能显示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

1 个答案:

答案 0 :(得分:0)

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

通过测试,我已经在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的{​​{1}}来获取此信息。

我希望这会有所帮助,如果我发现其他问题,会告诉您。