从linux套接字命令页:
SO_PRIORITY 为在此套接字上发送的所有数据包设置协议定义的优先级。Linux使用此值对网络队列进行排序:根据所选设备排队规则,可以首先处理优先级较高的数据包。
这是使用以下方法设置的:
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) 并且说,这一过程有:
a. 10个低优先级套接字(priority=4)来自socket_1 - socket_10,
B.1高优先级套接字(priority=7) - socket_11
在下列情况下将发生什么:
send():进程在socket_1-socket_10上发送多个消息&在socket_11上,将优先考虑socket_11上的socket_11消息,而不是通过socket_1-socket_10发送的消息。recv():如果在上面描述的所有套接字上都接收到多条消息,那么socket_11在通过socket_1-socket_10读取消息时会获得更高的优先级吗?lsof、netstat等工具从命令行测量套接字优先级?发布于 2016-06-23 19:41:52
每个Linux网络接口都附加了一个所谓的qdisc (队列规则)。你的问题的答案取决于使用中的qdisc。一些队列规则,如pfifo和bfifo,没有优先级的概念。因此,如果使用它们,答案很简单--不需要优先排序。
但是,如果对qdisc (通常是Linux上的默认qdisc )进行排序,套接字优先级可能会产生影响。
此图像描述了pfifo_fast qdisc中正在发生的事情:

我们看到数据包根据其优先级被放置在队列中。当接口发送下一个数据包(实际上是帧,但我们不要进入)时,它总是选择发送优先级最高的数据包。这意味着,如果正在等待多个数据包,则将首先发送具有最高优先级的。请注意,这要求接口拥塞-如果接口没有拥塞,并且数据包从操作系统一到达就立即发送,那么就没有排队,因此也就没有优先级。
其他qdiscs有不同的结构和策略。例如,SFQ光盘:

考虑到这一点,让我们回到你的问题:
socket_11的数据包可以在其他套接字的数据包之前发送。如果使用pfifo_fast,并且如果socket_11发送足够的流量使出站网络接口饱和,那么来自其他套接字的数据包甚至可能根本不发送。这在实践中是不太可能的,因为通常很难在饱和其他资源之前使网络接口饱和,除非它是无线接口。发布于 2016-06-23 19:51:54
对你的问题的回答:
关于1的详细信息
一些关于优先级、网络队列和设备规则的话。所有这些都与服务质量有关,特别是与区分服务(DiffServ)有关。
当数据包被发送时,将其放入网络设备处理的接口“队列”。默认情况下,队列不是真正的队列,而是三个强优先级的真正fifos。如果fifo0中存在数据包,则fifo1中的数据包正在等待。套接字优先级通过以下映射映射到该fifo:
所以优先级1将在优先级0之后被分派。
对于更改默认行为,使用“流量控制”(tc)实用程序。使用它,您可以在网络接口上配置优先级队列。这就是所谓的“设备排队纪律”。您可以定义特定网络设备如何服务优先级( Malt的回答对此有很好的解释)。
详细介绍2
套接字的状态是“准备读”/“未准备读”,这是bool。如果任何数据到达没有准备好的套接字,它会将状态从“未准备好”更改为“就绪”,这可以通过选择/轮询之类的函数或从阻塞的recv调用返回。哪个线程将被唤醒并不取决于套接字优先级,而是取决于线程优先级。
因此,如果您想对所需的套接字进行优先级排序
https://stackoverflow.com/questions/37998404
复制相似问题