linux核心學習之網路篇——IP和TCP結構體原始碼
今天只是看一下IP協議的結構體和TCP的結構體所控制的欄位。
首先看一下IP的欄位,就是傳說中ip協議中的包頭欄位。
struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4; #elif defined (__BIG_ENDIAN_BITFIELD) __u8 version:4, ihl:4; #else #error "Please fix <asm/byteorder.h>" #endif __u8 tos; __u16 tot_len; __u16 id; __u16 frag_off; __u8 ttl; __u8 protocol; __u16 check; __u32 saddr; __u32 daddr; /*The options start here. */ };
看了之後,設計到的資料型別如下
typedef unsigned char __u8;
typedef unsigned short __u16;
typedef unsigned int __u32;
通過欄位型別,大家可以 當你sizeof(struct iphdr)的時候,結果等於20,。對就是20,包頭協議的長度為20。
下面畫一個圖來的直觀一些
大家可以直觀的看到圖示的結構體欄位了。資料就是放在了sk——buf欄位中了。
下面是tcp的協議結構體
如下程式碼
struct tcphdr { __u16 source; __u16 dest; __u32 seq; __u32 ack_seq; #if defined(__LITTLE_ENDIAN_BITFIELD) __u16 res1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, ece:1, cwr:1; #elif defined(__BIG_ENDIAN_BITFIELD) __u16 doff:4, res1:4, cwr:1, ece:1, urg:1, ack:1, psh:1, rst:1, syn:1, fin:1; #else #error "Adjust your <asm/byteorder.h> defines" #endif __u16 window; __u16 check; __u16 urg_ptr; };
相應的圖示為
出去可選項,頭的長度也是20.
詳述一下TCP的包頭欄位的意思
●源、目標埠號欄位:佔16位元。TCP協議通過使用"埠"來標識源端和目標端的應用程序。埠號可以使用0到65535之間的任何數字。在收到服務請求時,作業系統動態地為客戶端的應用程式分配埠號。在伺服器端,每種服務在"眾所周知的埠"(Well-Know Port)為使用者提供服務。
●順序號欄位:佔32位元。用來標識從TCP源端向TCP目標端傳送的資料位元組流,它表示在這個報文段中的第一個資料位元組。
●確認號欄位:佔32位元。只有ACK標誌為1時,確認號欄位才有效。它包含目標端所期望收到源端的下一個資料位元組。
●頭部長度欄位:佔4位元。給出頭部佔32位元的數目。沒有任何選項欄位的TCP頭部長度為20位元組;最多可以有60位元組的TCP頭部。
●標誌位欄位(U、A、P、R、S、F):佔6位元。各位元的含義如下:
◆URG:緊急指標(urgent pointer)有效。
◆ACK:確認序號有效
◆PSH:接收方應該儘快將這個報文段交給應用層。
◆RST:重建連線。
◆SYN:發起一個連線。
◆FIN:釋放一個連線。
●視窗大小欄位:佔16位元。此欄位用來進行流量控制。單位為位元組數,這個值是本機期望一次接收的位元組數。
●TCP校驗和欄位:佔16位元。對整個TCP報文段,即TCP頭部和TCP資料進行校驗和計算,並由目標端進行驗證。
●緊急指標欄位:佔16位元。它是一個偏移量,和序號欄位中的值相加表示緊急資料最後一個位元組的序號。
●選項欄位:佔32位元。可能包括"視窗擴大因子"、"時間戳"等選項。
TCP最為經典的就是三次握手了,網上百度一大推,大家可以自己去看。
不說了就這些