什么是设置一个Linux套接字的影响 – 高优先级?

从linux套接字的manpage :

SO_PRIORITY
为此套接字上的所有数据包设置协议定义的优先级。 Linux使用此值对networking队列进行sorting:具有较高优先级的数据包可能会先被处理,具体取决于所选的设备排队规则。

这是使用:

int optval=7 // valid values are in the range [1,7] // 1- low priority, 7 - high priority setsockopt(socket, SOL_SOCKET, SO_PRIORITY, &optval, optlen) 

并说,这个过程有:
一个。 来自socket_1socket_10 10个低优先级套接字(priority = 4)
湾 1个高优先级套接字(priority = 7) – socket_11

在以下情况下会发生什么情况:

  1. send() :进程在socket_1上发送多个socket_1socket_10socket_11上, socket_11上的IMO socket_11优先于通过socket_1socket_10发送的socket_10

  2. recv() :如果在上面描述的所有套接字中都收到了socket_1消息,那么socket_11在通过socket_1socket_10读取消息时获得了更高的优先级吗?

  3. 有没有办法从命令行使用诸如lsofnetstat等工具来测量套接字的优先级?

每个Linux网络接口都附有一个qdisc (排队规则)。 问题的答案取决于相关网络接口上配置的qdisc。 有些人,如pfifo和bfifo ,没有优先权的概念,所以如果他们使用,答案很简单 – 什么都不会发生(至少,没有什么有趣的)。

但是,如果使用适当的qdisc,比如pfifo_fast ,这是我见过的每台Linux机器上默认的qdisc,那么优先级可能会有影响。

此图像描述了pfifo_fast qdisc中发生了什么:

在这里输入图像描述

我们看到数据包根据其优先级放置在队列中。 当接口发送下一个数据包(实际上是 ,但是我们不去理解)的时候,它总是选择发送在队列中等待的那些优先级最高的数据包。 其他QDisc有不同的结构和政策。 例如SFQ qdisc:

在这里输入图像描述

考虑到这一点,让我们回到你的问题:

  1. 根据socket_11 ,是的,来自socket_11的数据包可以在来自其他套接字的数据包之前发送。 如果使用pfifo_fast ,并且如果socket_11发送大量流量来socket_11站网络接口饱和,则来自其他套接字的数据包甚至可能根本不会被发送。 但实际上这是不太可能的。 在饱和某些其他资源(如Internet连接速度或自己的CPU)之前,通常很难使网络接口饱和,除非我们正在讨论无线链路。 如果网络接口没有接近其饱和点,并始终可用于发送数据包,则队列将(几乎)始终为空,因此不会发生优先级排序。 有必要争夺优先权踢

  2. 数据包从机器的网络接口到套接字的路径比网络本身快得多。 而且,你还记得,要确定优先次序有什么作用,就必须有争论。 在一个典型的情况下,到达网络接口的数据包已经通过网络旅行的瓶颈。 您当然可以使用入口qdisc或其他机制来人为地创建一个瓶颈,并优先处理传入的流量,但是您为什么要这样做? 这只有在建立流量整形器或类似的网络设备时才有意义。 另外,由于这个队列是一个低层次的机制,发生在更高层次的套接字之下(即使在桥接或路由之前),我怀疑套接字的优先级可能对其有任何影响。

  3. 不是我知道,但我很乐意学习。 这个内核模块接近,但它似乎不能显示优先级标志,只是普通的套接字选项。

您的问题的答案:

  1. 是的默认情况下,解释如下
  2. 没有优先级只适用于发送,解释也在下面
  3. 我不这么认为,因为这个选项甚至没有通过/ proc接口看到

关于1的细节

关于优先级,网络队列和设备规程的一些话。 所有这些都与服务质量有关,特别是区分服务(DiffServ)。

当数据包被发送时,它被放到由网络设备处理的接口“队列”中。 默认情况下,队列不是真正的队列,而是三个真正的优先队列。 如果fifo0中的数据包比fifo1中的数据包在等待。 通过以下映射将套接字优先级映射到此fifo:

  • 0(尽力而为)是fifo1
  • 1-3(Filler,Bulk,…)是fifo2
  • 4是fifo1
  • 5是fifo2
  • 6-7(Interactive,Control)是fifo0
  • 8-15是fifo1

因此优先级1将在优先级0后发送。

为了改变默认行为,使用“traffic control”(tc)工具。 有了它,您可以在网络接口上配置优先级队列。 这就是所谓的“设备排队纪律”。 您可以定义特定网络设备的服务优先级(麦芽回答对此有很好的解释)。

关于2的细节

套接字有状态“准备读取”/“没有准备好读”,这是布尔。 如果有任何数据到达未准备好的套接字,它将状态从“未准备好”变为“准备就绪”,这可以通过诸如选择/轮询或从阻塞的接收呼叫返回的功能来看到。 什么线程将被唤醒取决于不是由套接字优先,而是由线程优先。

所以如果你想优先考虑你需要的插座

  • 或者把它们放在优先级的线程上
  • 或在选择/轮询之后按代码划分优先级