IP标头具有服务types(TOS)字段。 它可以用来设置有类别的排队规则,即PRIO。
我testing了以下代码。
#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字段设置成功的情况下发送数据包。 但是,如何使信息优先生效呢? 谢谢!
TOS是路由器的指令。 除非路径中的所有路由器都认同它的意思,否则它不起作用,将它完整地传递给下一个路由器,并自己做一些事情。 他们呢? 如果路径中没有路由器,则根本不起作用。
TOS领域的一个重要特征是沿途的路由器可以基于TOS字段优先考虑数据包。
使用TOS字段的另一个重要影响是在本地机器内。 例如,在Linux内核中,网络律师有一些称为“ 流量控制”的功能 ,可以对输出的IP流量进行限制或重新排序。 Linux 2.2+上的默认行为是pfifo_fast ,它包含三个独立的队列(或波段),用于传出流量。 每个队列的优先级高于下一个队列,这意味着队列0中的所有流量在队列1的任何内容被推送到网络之前被推出。 TOS字段决定了哪一个队列将被放置一个输出IP数据包。欲了解更多信息,请看这里 。 小心玩TC功能,你可以很容易地瘫痪电脑。 我建议使用虚拟机。
我不确定这种行为是否存在于非Linux平台上。