TCP/IP協議棧 頭部參數


IP頭部:20個字節
算法

TCP頭部:20字節網絡

UDP頭部:8字節tcp

ICMP頭部:4字節大數據


TTL:通過一個路由器就減1,當TTL值爲0時,路由器就丟棄這個包,而後發送ICMP包給源主機。this

默認狀況下,Linux系統的TTL值爲64或255,Windows NT/2000/XP系統的TTL值爲128,Windows 98系統的TTL值爲32,UNIX主機的TTL值爲255。spa


以太網EthernetII最大的數據幀是1518字節,刨去以太網幀的幀頭(DMAC目的地址MAC48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗部分4Bytes(有時候你們也把它叫作FCS),那麼剩下承載上層協議的地方也就是Data域最大就只能有1500Bytes. 這個值咱們就把它稱之爲MTU。指針


以太網數據包長度:(64~1518)code

MTU: Maxitum Transmission Unit 最大傳輸單元 (46~1500)orm

MSS:Maxitum Segment Size 最大分段大小(MTU-IP header size-TCP header size)(1460=1500-20-20)htm

MSS解釋:

        MSS最大傳輸大小的縮寫,是TCP協議裏面的一個概念。MSS就是TCP數據包每次可以傳輸的最大數據分段。爲了達到最佳的傳輸效能TCP協議在創建鏈接的時候一般要協商雙方的MSS值,這個值TCP協議在實現的時候每每用MTU值代替(須要減去IP數據包包頭的大小20Bytes和TCP數據段的包頭20Bytes)因此每每MSS爲1460。通信雙方會根據雙方提供的MSS值得最小值肯定爲此次鏈接的最大MSS值。



圖中括號中的數字表明的是當前域所佔的空間大小,單位是bit位。

黃色的是數據鏈路層的頭部,一共18字節

綠色的部分是IP頭部,通常是20字節

紫色部分是TCP頭部,通常是20字節

最內部的是數據包內容

黃色部分:鏈路層

目的MAC當前step目的主機的mac地址

MAC當前step的源主機的mac地址

類型:指定網絡層所用的協議類型,一般是IP協議,0x0800


綠色部分:網絡層,這裏用的是IP包頭格式

版本:記錄數據報屬於哪個版本的協議,如IPv4IPv6

首部長度:指明IP頭部長度,單位是字,也就是兩個字節。該域的值最小爲5,就是標準的頭部長度;最大爲15,代表有擴展部分。

服務類型:用來區分不一樣服務的須要

數據報總長:包含IP頭部的數據報的總長度。注意,這裏不包括鏈路層的頭部,目前最大值是65535字節。

分組ID這個域的做用是當一個大的數據報被拆分時,拆分紅的小的數據段的這個域都是同樣的。

標記:共三個bit,第一個未使用;第二個DF(Don’t Fragment),設置成1表示這個數據包不能被分割,這個是針對路由器的一條指令;第三個MF(MoreFragment),若是一個數據包被分割了,那麼除了最後一個分段之外的全部分段都必須設置爲1,用來表示後面還有更多的分段沒有到達,最後一個設置爲0,用來表示分割的段所有到達。

段偏移量:這個域有13bit,也就是每個數據報最多有8192個分段。每個分段的長度必須是8字節的倍數,也就是說8字節是分段的基本單位,固然分組的最後一個段不作限制。這樣最大的數據報長度爲8*8192=65536字節,比目前限制的最大數據報長度還多1,可以知足對網絡中全部數據報傳送的需求。

生存時間:這是一個生存期計數器,最大爲255s,可是實際上使用的時候用做跳數計數器,當值爲0時數據報被丟棄,用來避免一個數據報太久的逗留在網絡中。

高層協議:這裏和鏈路層的類型做用相同,用來表示更高層的協議,這個數據報裏是TCP

首部校驗和:IP頭部的校驗和

IP地址:數據報來源主機的IP地址

目的IP地址:數據報目的主機的IP地址


紫色部分:傳輸層,這裏用的是TCP協議

源端口號:數據報來源主機的端口號

目的端口號:數據報目的主機的端口號

注意:源IP地址,目的IP地址,源端口號,目的端口號這四個字段惟一的肯定了一個TCP連接。

TCP序號(sq)發送的TCP的序號,從0開始,實際中這個值就是發送的數據報中內容的字節數,好比我發送的第一個報中sq=0,數據報內容20字節,那麼下一個數據報的sq就應該是21

捎帶的確認(ack)確認收到上一個數據報,而後act的值是指定本身想要收到的下一個數據報的sq,好比我收到一個數據報的sq=0,數據報內容20字節,那麼個人ack就應該是21,用來標明我sq=0,內容爲20字節的數據報已經收到,我接下來指望收到的是sq=21的數據報。

首部長度:IP頭部的長度域相似,這個域用來標明TCP頭部的長度,單位也是字。

保留:6bit未使用的域

Flag從左到右,[URG|ACK|PSH|RST|SYN|FIN]

ACK設置爲1表示前面的確認(ack)是有效的,不然前面的確認應被忽略。

PSH表示要求對方在接到數據後當即請求遞交給應用程序,而不是緩衝起來直到緩衝區收滿爲止。

RST用於重置一個已經混亂的鏈接。

SYN用於創建鏈接的過程。在連接請求中,SYN=1ACK=0表示該數據段沒有使用捎帶的確認域。連接應答則捎帶了一個確認,即SYN=1ACK=1.本質上SYN位是用來表示CONNECTION
REQUEST
CONNECTION ACCEPTED,而後進一步用ACK來區分是請求仍是應答,的確很高明。

FIN用來釋放一個鏈接。它表示發送方已經沒有數據要傳輸了。而後,在關閉一個鏈接後,關閉進程可能會在一段不肯定的時間內繼續接收到數據。SYNFIN數據段都有TCP序號,從而保證了這兩種數據段被按照正確的順序來進行處理。

窗口大小:指定了從被確認的字節算起能夠發送多少個字節。要深刻理解這個域的含義,能夠參看TCP用色控制和慢啓動算法

校驗和:校驗範圍包括TCP頭、數據報內容和概念性僞頭部。概念性僞頭部又包括源IP,目的IPTCP協議號。

緊急指針:指向數據報中緊急數據最後一個字節的下一個字節。




//以太網頭部
struct ethhdr {
	unsigned char	h_dest[ETH_ALEN];	/* destination eth addr	*/
	unsigned char	h_source[ETH_ALEN];	/* source ether addr	*/
	__be16		h_proto;		/* packet type ID field	*/
} __attribute__((packed));
// arp頭部
struct arphdr {
	__be16		ar_hrd;		/* format of hardware address	*/
	__be16		ar_pro;		/* format of protocol address	*/
	unsigned char	ar_hln;		/* length of hardware address	*/
	unsigned char	ar_pln;		/* length of protocol address	*/
	__be16		ar_op;		/* ARP opcode (command)		*/

#if 0
	 /*
	  *	 Ethernet looks like this : This bit is variable sized however...
	  */
	unsigned char		ar_sha[ETH_ALEN];	/* sender hardware address	*/
	unsigned char		ar_sip[4];		/* sender IP address		*/
	unsigned char		ar_tha[ETH_ALEN];	/* target hardware address	*/
	unsigned char		ar_tip[4];		/* target IP address		*/
#endif

};

//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;
	__be16	tot_len;
	__be16	id;
	__be16	frag_off;
	__u8	ttl;
	__u8	protocol;
	__sum16	check;
	__be32	saddr;
	__be32	daddr;
	/*The options start here. */
};


//UDP頭部
struct udphdr {
	__be16	source;
	__be16	dest;
	__be16	len;
	__sum16	check;
};


//TCP頭部
struct tcphdr {
	__be16	source;
	__be16	dest;
	__be32	seq;
	__be32	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	
	__be16	window;
	__sum16	check;
	__be16	urg_ptr;
};
相關文章
相關標籤/搜索