Linux從用戶層到內核層系列 - TCP/IP協議棧部分系列4: IP層IP封包中TTL值何時修改

題記:本系列文章的目的是拋開書本從源代碼和使用的角度分析Linux內核和相關源代碼,byhankswang和你一起玩轉linux開發


輕鬆搞定TCP/IP協議棧,原創文章歡迎交流, [email protected]微笑

歡迎加入到CHLK - Linux開發交流羣 QQ:327084515 討論Linux開發相關問題


IP層IP封包中TTL值何時修改

IP包頭中TTL值每過一次中間設備就會被減1,當TTL值爲0的時候在網絡中會被丟棄。在Linux 內核中是如何操作的?


1.對TTL值做減法的函數

static inline

int ip_decrease_ttl(struct iphdr *iph)
{

/* 重新計算IP包頭的校驗和 */
u32 check = (__force u32)iph->check; 
check += (__force u32)htons(0x0100);
iph->check = (__force __sum16)(check + (check>=0xFFFF));

        /* TTL值在轉發前被減1 */
return --iph->ttl; 
}

補充說明的是IP首部校驗和: 
協議棧在發送數據時,校驗和計算: 
(1)把IP數據報的首部都置爲0,包括校驗和字段。  
(2)把首部看成以16位爲單位的數字組成,依次進行二進制反碼求和。 
(3)把得到的結果存入校驗和字段中。  

協議棧在接收數據時,校驗和計算:  
(1)把首部看成以16位爲單位的數字組成,依次進行二進制反碼求和,包括校驗和字段。 
(2)檢查計算出的校驗和的結果是否等於零。  
(3)如果等於零,說明被整除,校驗是和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個數據包。


2.何時調用ip_decrease_ttl

在TCP/IP協議棧中當中間設備收到需要轉發包的時候,由ip_forward函數調用ip_ttl_decrease

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章