第0章 數據是如何進行一步步的封裝的
第一章:mac幀頭定義
幀頭數據結構的定義:
一、MAC幀頭定義 /*數據幀定義,頭14個字節,尾4個字節*/ typedef struct _MAC_FRAME_HEADER { char m_cDstMacAddress[6]; //目的mac地址 6字節 char m_cSrcMacAddress[6]; //源mac地址 6字節 short m_cType; //上一層協議類型,如0x0800代表上一層是IP協議,0x0806為arp 占用2字節 }__attribute__((packed))MAC_FRAME_HEADER,*PMAC_FRAME_HEADER; typedef struct _MAC_FRAME_TAIL {//占用4字節 unsigned int m_sCheckSum; //數據幀尾校驗和,偵校驗:FrameCheckSequence:這個字段包括4字節循環冗余校檢碼(CRC)用於檢查錯誤 }__attribute__((packed))MAC_FRAME_TAIL, *PMAC_FRAME_TAIL;
ip頭部定義
車過來看
1.源端口和目的端口字段——各占 2 字節。各包含一個TCP端口編號,分別標識連接兩端的兩個應用程序。本地的端口編號與IP主機的IP地址(32位)形成一個惟一的套接字。雙方的套接字惟一定義了一次連接。
2.序號字段——占 4 字節。TCP 連接中傳送的數據流中的每一個字節都編上一個序號。序號字段的值則指的是本報文段所發送的數據的第一個字節的序號。
3.確認號字段——占 4 字節,是期望收到對方的下一個報文段的數據的第一個字節的序號。
4. 數據偏移——(占有一個字節)占 4 bit,它指出 TCP 報文段的數據起始處距離 TCP 報文段的起始處有多遠。“數據偏移”的單位不是字節而是 32 bit 字 (4 字節為計算單位)。
保留字段——(占有1.5個字節)占 6 bit,保留為今后使用,但目前應置為 0。
緊急比特 URG —— 當 URG = 1 時,表明緊急指針字段有效。它告訴系統此報文段中有緊急數據,應盡快傳送(相當於高優先級的數據)。
確認比特 ACK —— 只有當 ACK =1 時確認號字段才有效。當 ACK = 0 時,確認號無效。
推送比特 PSH (PuSH) —— 接收 TCP 收到推送比特置 1 的報文段,就盡快地交付給接收應用進程,而不再等到整個緩存都填滿了后再向上交付。
復位比特 RST (ReSeT) —— 當 RST 1 時,表明 TCP 連接中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連接,然后再重新建立運輸連接。
同步比特 SYN —— 同步比特 SYN 置為 1,就表示這是一個連接請求或連接接受報文。
終止比特 FIN (FINal) —— 用來釋放一個連接。當FIN 1 時,表明此報文段的發送端的數據已發送完畢,並要求釋放運輸連接。
窗口字段 —— 占 2 字節。窗口字段用來控制對方發送的數據量,單位為字節。TCP 連接的一端根據設置的緩存空間大小確定自己的接收窗口大小,然后通知對方以確定對方的發送窗口的上限。
5.
檢驗和 —— 占 2 字節。檢驗和字段檢驗的范圍包括首部和數據這兩部分。在計算檢驗和時,要在 TCP 報文段的前面加上 12 字節的偽首部。
緊急指針字段 —— ( 占 2 字節)占 16 bit。緊急指針指出在本報文段中的緊急數據的最后一個字節的序號。
/*TCP頭定義,共20個字節*/
typedef struct _TCP_HEADER
{
//第一行
short m_sSourPort; // 源端口號16bit
short m_sDestPort; // 目的端口號16bit
//第二行
unsigned int m_uiSequNum; // 序列號32bit
//第三行
unsigned int m_uiAcknowledgeNum; // 確認號32bit
//第四行
short m_sHeaderLenAndFlag; // 前4位:TCP頭長度;中6位:保留;后6位:標志位
short m_sWindowSize; // 窗口大小16bit
//第五行
short m_sCheckSum; // 檢驗和16bit
short m_surgentPointer; // 緊急數據偏移量16bit
}__attribute__((packed))TCP_HEADER, *PTCP_HEADER;

數據結構的定義
/*UDP頭定義,共8個字節*/ typedef struct _UDP_HEADER { unsigned short m_usSourPort; // 源端口號16bit unsigned short m_usDestPort; // 目的端口號16bit unsigned short m_usLength; // 數據包長度16bit unsigned short m_usCheckSum; // 校驗和16bit }__attribute__((packed))UDP_HEADER, *PUDP_HEADER;
-
版本(Version)字段:占4比特。用來表明IP協議實現的版本號,當前一般為IPv4,即0100。
-
報頭長度(Internet Header Length,IHL)字段:占4比特。是頭部占32比特的數字,包括可選項。普通IP數據報(沒有任何選項),該字段的值是5,即160比特=20字節。此字段最大值為60字節。
-
服務類型(Type of Service ,TOS)字段:占8比特。其中前3比特為優先權子字段(Precedence,現已被忽略)。第8比特保留未用。第4至第7比特分別代表延遲、吞吐量、可靠性和花費。當它們取值為1時分別代表要求最小時延、最大吞吐量、最高可靠性和最小費用。這4比特的服務類型中只能置其中1比特為1。可以全為0,若全為0則表示一般服務。服務類型字段聲明了數據報被網絡系統傳輸時可以被怎樣處理。例如:TELNET協議可能要求有最小的延遲,FTP協議(數據)可能要求有最大吞吐量,SNMP協議可能要求有最高可靠性,NNTP(Network News Transfer Protocol,網絡新聞傳輸協議)可能要求最小費用,而ICMP協議可能無特殊要求(4比特全為0)。實際上,大部分主機會忽略這個字段,但一些動態路由協議如OSPF(Open Shortest Path First Protocol)、IS-IS(Intermediate System to Intermediate System Protocol)可以根據這些字段的值進行路由決策。
-
總長度字段:占16比特。指明整個數據報的長度(以字節為單位)。最大長度為65535字節。
-
-
標志字段:占16比特。用來唯一地標識主機發送的每一份數據報。通常每發一份報文,它的值會加1。
-
標志位字段:占3比特。標志一份數據報是否要求分段。
-
段偏移字段:占13比特。如果一份數據報要求分段的話,此字段指明該段偏移距原始數據報開始的位置。
-
-
生存期(TTL:Time to Live)字段:占8比特。用來設置數據報最多可以經過的路由器數。由發送數據的源主機設置,通常為32、64、128等。每經過一個路由器,其值減1,直到0時該數據報被丟棄。
-
協議字段:占8比特。指明IP層所封裝的上層協議類型,如ICMP(1)、IGMP(2) 、TCP(6)、UDP(17)等。
-
頭部校驗和字段:占16比特。內容是根據IP頭部計算得到的校驗和碼。計算方法是:對頭部中每個16比特進行二進制反碼求和。(和ICMP、IGMP、TCP、UDP不同,IP不對頭部后的數據進行校驗)。
-
-
源IP地址、目標IP地址字段:各占32比特。用來標明發送IP數據報文的源主機地址和接收IP報文的目標主機地址。
-
可選項字段:占32比特。用來定義一些任選項:如記錄路徑、時間戳等。這些選項很少被使用,同時並不是所有主機和路由器都支持這些選項。可選項字段的長度必須是32比特的整數倍,如果不足,必須填充0以達到此長度要求。