【问题标题】:How to get the tcp window size of a socket in linux?如何在linux中获取套接字的tcp窗口大小?
【发布时间】:2019-01-07 08:34:15
【问题描述】:

有没有办法在 linux c api 中获取 tcp 套接字的传入窗口大小?

明确地说,我所说的传入是从我的 linux 服务器的角度来看的。 似乎我接受的套接字中 linux 中的 SND 和 RCV 值被翻转,即 RCV 表示从服务器到客户端。 在这种情况下,我需要客户端到服务器端,即 SND。

SND_BUFRCV_BUF 似乎与发送的实际值无关, 而TCP_WINDOW_CLAMP 不准确。

【问题讨论】:

标签: c linux tcp


【解决方案1】:

你可以使用这个(linux-specific,non-portable)套接字选项读取内部 tcp 套接字参数:

struct tcp_info ti;
socklen_t tisize = sizeof(ti);
getsockopt(fd, IPPROTO_TCP, TCP_INFO, &ti, &tisize);

结构 tcp_info 定义在 linux/tcp.h 中,其成员 ti.tcpi_rcv_space 包含相应套接字的广告 tcp 接收窗口。

从 Linux 4.8 开始有一个新的 tcp 套接字选项TCP_REPAIR_WINDOW,它允许直接读取(甚至设置)发送和接收窗口:

struct tcp_repair_window trw;
socklen_t trwsize = sizeof(trw);
getsockopt(fd, IPPROTO_TCP, TCP_REPAIR_WINDOW, &trw, &trwsize);

现在可以从trw.snd_wndtrw.rcv_wnd读取TCP发送和接收窗口。

【讨论】:

  • 那很好,但我实际上需要对面(传入)。没看到有tcpi_snd_space,但是tcpi_snd_wscale是对的。
  • @WimpyToes 那你为什么不说“发送窗口”? “传入”是常用术语中的“接收”
  • 对不起,我的意思是从我的 linux 服务器的角度传入。这些值似乎是从接受的套接字的角度来看的。我将编辑问题以澄清。
  • @WimpyToes 现在有一个相当新的选项,我将其添加到答案中。但是,它需要内核 >= 4.8。我担心,没有其他办法。
猜你喜欢
  • 2010-12-13
  • 2016-09-05
  • 1970-01-01
  • 2013-09-18
  • 2017-03-17
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多