网络编程设置TTL

最近遇到一个问题,领导让我查一下关于多播的TTL配置的问题,我也是看了diam之后才知道的原来TTL可以通过编程来实现,说起来网络编程能力欠佳啊

TTL

TTL是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。TTL是IPv4包头的一个8 bit字段.

在IPv4包头中TTL是一个8 bit字段,它位于IPv4包的第9个字节。如下图所示,每

一行表示 32 bit(4字节),位从0开始编号,即0~31。

img1

TTL的作用是限制IP数据包在计算机网络中的存在的时间。TTL的最大值是255,TTL的一个推荐值是64.

虽然TTL从字面上翻译,是可以存活的时间,但实际上TTL是IP数据包在计算机网络中可以转发的最大跳数。TTL字段由IP数据包的发送者设置,在IP数据包从源到目的的整个转发路径上,每经过一个路由器,路由器都会修改这个TTL字段值,具体的做法是把该TTL的值减1,然后再将IP包转发出去。如果在IP包到达目的IP之前,TTL减少为0,路由器将会丢弃收到的TTL=0的IP包并向IP包的发送者发送 ICMP time exceeded消息。

TTL的主要作用是避免IP包在网络中的无限循环和收发,节省了网络资源,并能使IP包的发送者能收到告警消息。

TTL 是由发送主机设置的,以防止数据包不断在IP互联网络上永不终止地循环。转发IP数据包时,要求路由器至少将 TTL 减小 1。

Windows

TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255。Windows系统设置后重启才生效。

Linux

linux系统 TTL值的修改位置是/proc/sys/net/ipv4/ip_default_ttl,

echo 128 > /proc/sys/net/ipv4/ip_default_ttl

  若要设置长久的可以:

  修改/etc/sysctl.conf配置文件,添加如下一行

  net.ipv4.ip_default_ttl=128

Socket

1
2
3
4
5
6
7
8
9
10
#include <sys/types.h>
#include <sys/socket.h>
int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);

int ttl = 64;
int yes = 1;
setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl)); //设置组播TTL
setsockopt(fd, IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl)); //set ttl on all sockets
setsockopt(fd, IPPROTO_IP, IP_RECVTTL , &yes, sizeof(yes));//Tell me the TTL of incomming packets.