【问题标题】:How to set message priority using TOS?如何使用 TOS 设置消息优先级?
【发布时间】:2012-07-11 09:18:43
【问题描述】:

IP 标头具有服务类型 (TOS) 字段。它可用于设置有类排队规则,即PRIO。

我已经测试了以下代码。

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char**argv)
{
   int listenfd, connfd, optval;
   struct sockaddr_in servaddr, cliaddr;
   socklen_t clilen;
   pid_t     childpid;
   char      mesg[16];

   listenfd = socket(AF_INET, SOCK_STREAM, 0);

   bzero(&servaddr, sizeof(servaddr));
   bzero(mesg, 0, sizeof(mesg));
   servaddr.sin_family = AF_INET;
   servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
   servaddr.sin_port = htons(32000);
   bind(listenfd,(struct sockaddr *)&servaddr, sizeof(servaddr));

   listen(listenfd, 1024);

   for (;;)
   {
      clilen = sizeof(cliaddr);
      connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);

      if ((childpid = fork()) == 0)
      {
         close(listenfd);

         for (;;)
         {
            optval = 0x28;
            setsockopt(cliaddr, IPPROTO_IP, IP_TOS, &optval, sizeof(optval));
            strcpy(mesg, "tos=0x28");
            sendto(connfd, mesg, sizeof(mesg), 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
            sleep(2);

            optval = 0x58;
            strcpy(mesg, "tos=0x58");
            setsockopt(cliaddr, IPPROTO_IP, IP_TOS, &optval, sizeof(optval));
            sendto(connfd, mesg, sizeof(mesg), 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
            sleep(2);
         }

      }

      close(connfd);
   }
}

设置了TOS字段的数据包可以发送成功。但是我该怎么做才能使消息优先级生效?谢谢!

【问题讨论】:

  • 您应该使用 tc 设置您的机器以确保 0x28 在出口队列中获得更高的优先级。

标签: c linux sockets network-programming


【解决方案1】:

TOS 是对路由器的指令。除非路径中的所有路由器都同意它的含义,将它完整地传递给下一个路由器,并自己做一些事情,否则它没有效果。他们有吗?如果路径中没有路由器,则根本没有效果。

【讨论】:

  • 谢谢你,EJP。但是 Linux 有流量控制 (tc) 工具来对数据包进行排队和过滤。我读了一篇使用 tos 字段进行优先级分配的论文。
  • @allenchen 当然可以,这就是 TOS 的用途。当然,通过“路由器”,我还应该包括网络桥接主机。
【解决方案2】:

TOS 字段的一个重要特性是沿途的路由器可以根据 TOS 字段确定数据包的优先级。

使用 TOS 字段的另一个重要作用是在本地机器内。例如,在 Linux 内核中,网络律师有一个名为 Traffic Control 的东西,它可以限制或重新排序传出的 IP 流量。 Linux 2.2+ 的默认行为称为 pfifo_fast,其中包含三个用于传出流量的单独队列(或波段)。每个队列的优先级都比下一个队列高,这意味着队列 0 的所有流量都在队列 1 的任何流量被推送到网络之前被推送。 TOS 字段决定了传出 IP 数据包将放置在哪个队列中。有关更多信息,请查看 here。小心使用 TC 功能,您可以轻松地瘫痪计算机。我建议使用虚拟机。

我不确定非 Linux 平台是否存在这种行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 2011-12-06
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    相关资源
    最近更新 更多