在IP头中,有一Type-of-Service字段,该字段描述了IP包的
优先级和QoS选项,使用IP_TOS可以来设定该字段的值:
使用setsockopt设置IP_TOS代码如下:
unsigned char service_type = 0xe0 | IPTOS_LOWDELAY | IPTOS_RELIABILITY;
if(setsockopt(sock, SOL_IP/*IPPROTO_IP*/, IP_TOS, (void *)&service_type, sizeof(service_type)) < 0)
perror("setsockopt(IP_TOS) failed:");
使用getsockopt读取IP_TOS代码如下:
int optval = 0;
int optlen = sizeof(optval);
if(getsockopt(sock, SOL_IP, IP_TOS, (void *)&optval, &optlen) < 0)
perror("getsockopt(IP_TOS) failed:");
else
printf("OPTVAL=%x.\n", optval)
在socket设置IP_TOS后,用wireshark抓取该socket上发送的数据,查看IP头部可以看到设置的值。
附man手册中IP_TOS、SO_PRIORITY说明:
IP_TOS: SOL_IP / IPPROTO_IP(BSD); IP_TOS Set or receive the Type-Of-Service (TOS) field that is sent with every IP packet originating from this socket. It is used to prioritize packets
on the network. TOS is a byte. There are some standard TOS flags defined:
IPTOS_LOWDELAY
to minimize delays for interactive traffic,
IPTOS_THROUGHPUT
to optimize throughput,
IPTOS_RELIABILITY
to optimize for reliability,
IPTOS_MINCOST
should be used for "filler data" where slow transmission doesn't matter.
At most one of these TOS values can be specified. Other bits are invalid and shall be cleared. Linux sends
IPTOS_LOWDELAY datagrams first by default, but the exact behaviour depends on the
configured queueing discipline. Some high priority levels may require superuser
privileges (the CAP_NET_ADMIN capability). The priority can also be set in a protocol
independent way by the (SOL_SOCKET, SO_PRIORITY) socket option (see socket(7)).
discipline. For ip(7), this also sets the IP type-of-service (TOS) field for outgoing packets.
SO_PRIORITY: SOL_SOCKET; SO_PRIORITY Set the protocol-defined priority for all packets to be
sent on this socket. Linux uses this value to order the networking queues: packets with a
higher priority may be processed first depending on the selected device queueing
Setting a priority outside the range 0 to 6 requires the CAP_NET_ADMIN capability.

本文详细介绍了如何使用IP_TOS与SO_PRIORITY这两个套接字选项来设置和获取IP包的服务类型,包括减少延迟、优化吞吐量、提高可靠性和最小化成本等标志,并提供了具体的代码示例。
1万+

被折叠的 条评论
为什么被折叠?



