1. 程式人生 > >linux核心學習之網路篇——IP和TCP結構體原始碼

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最為經典的就是三次握手了,網上百度一大推,大家可以自己去看。

不說了就這些