題記:本系列文章的目的是拋開書本從源代碼和使用的角度分析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