網路程式設計設定TTL

2021-09-29 11:00:52 字數 1667 閱讀 3930

最近遇到乙個問題,領導讓我查一下關於多播的ttl配置的問題,我也是看了diam之後才知道的原來ttl可以通過程式設計來實現,說起來網路程式設計能力欠佳啊

ttl是 time to live的縮寫,該欄位指定ip包被路由器丟棄之前允許通過的最大網段數量。ttl是ipv4包頭的乙個8 bit欄位.

在ipv4包頭中ttl是乙個8 bit欄位,它位於ipv4包的第9個位元組。如下圖所示,每

一行表示 32 bit(4位元組),位從0開始編號,即0~31。

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。

ttl值的登錄檔位置hkey_local_machine\system\currentcontrolset\services\tcpip\parameters 其中有個defaultttl的dword值,其資料就是預設的ttl值了,我們可以修改,但不能大於十進位制的255。windows系統設定後重啟才生效。

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

#include #include 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.

Hbase命令設定TTL 編碼設定TTL

建立表的時候指定 create t task log 檢視ttl desc t task log 預設 ttl forever 修改ttl 禁用表 disable t task log 設定ttl值,作用於列族cf alter t task log name cf ttl 86400 恢復表 ena...

RabbitMQ設定TTL生存時間

public static void main string args throws ioexception,timeoutexception connection connection factory.newconnection channel channel connection.createc...

網路程式設計屬性設定EADDRINUSE

如下演示程式,程式目的是 先準備好乙個serversocket,監聽埠8880,然後建乙個clientsocket 受限於業務需要,必須在serversocket準備好後再建client 也必須繫結同一埠8880,問題是 為什麼對clientsocket bind port 8880 時,會報錯ea...