TCP,UDP,IP包頭格式及說明(zz)


 

 

一、MAC幀頭定義 
/數據幀定義,頭14個字節,尾4個字節/

typedef struct _MAC_FRAME_HEADER
{
 char m_cDstMacAddress[6];    //目的mac地址
 char m_cSrcMacAddress[6];    //源mac地址
 short m_cType;            //上一層協議類型,如0x0800代表上一層是IP協議,0x0806為arp
}__attribute__((packed))MAC_FRAME_HEADER,*PMAC_FRAME_HEADER;

typedef struct _MAC_FRAME_TAIL
{
 unsigned int m_sCheckSum;    //數據幀尾校驗和
}__attribute__((packed))MAC_FRAME_TAIL, *PMAC_FRAME_TAIL;

二、IP頭結構的定義 

/IP頭定義,共20個字/

typedef struct _IP_HEADER 
{
 char m_cVersionAndHeaderLen;       //版本信息(前4位),頭長度(后4位)
 char m_cTypeOfService;            // 服務類型8位
 short m_sTotalLenOfPacket;        //數據包長度
 short m_sPacketID;              //數據包標識
 short m_sSliceinfo;               //分片使用
 char m_cTTL;                  //存活時間
 char m_cTypeOfProtocol;          //協議類型
 short m_sCheckSum;             //校驗和
 unsigned int m_uiSourIp;          //源ip
 unsigned int m_uiDestIp;          //目的ip
} __attribute__((packed))IP_HEADER, *PIP_HEADER ;

tcp頭結構定義

 

 /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;

/*TCP頭中的選項定義 
kind(8bit)+Length(8bit,整個選項的長度,包含前兩部分)+內容(如果有的話) 
KIND = 1表示 無操作NOP,無后面的部分 
2表示 maximum segment 后面的LENGTH就是maximum segment選項的長度(以byte為單位,1+1+內容部分長度) 
3表示 windows scale 后面的LENGTH就是 windows scale選項的長度(以byte為單位,1+1+內容部分長度) 
4表示 SACK permitted LENGTH為2,沒有內容部分 
5表示這是一個SACK包 LENGTH為2,沒有內容部分 
8表示時間戳,LENGTH為10,含8個字節的時間戳 
*/ 
TCP的option

typedef struct _TCP_OPTIONS
{
 char m_ckind;
 char m_cLength;
 char m_cContext[32];
}__attribute__((packed))TCP_OPTIONS, *PTCP_OPTIONS;

四、UDP頭結構的定義

/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;

tcp、ip、udp頭部格式 
2.2 TCP/IP報文格式 
  1、IP報文格式 
  IP協議是TCP/IP協議族中最為核心的協議。它提供不可靠、無連接的服務,也即依賴其他層的協議進行差錯控制。在局域網環境,IP協議往往被封裝在以太網幀(見本章1.3節)中傳送。而所有的TCP、UDP、ICMP、IGMP數據都被封裝在IP數據報中傳送。如圖2-3所示: 
     
   這里寫圖片描述 
   圖2-3  TCP/IP報文封裝 
圖2-4是IP頭部(報頭)格式:(RFC 791)。 
    這里寫圖片描述 
   圖2-4  IP頭部格式 
   
  其中: 
  ●版本(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以達到此長度要求。 
   
  2、TCP數據段格式   
  TCP是一種可靠的、面向連接的字節流服務。源主機在傳送數據前需要先和目標主機建立連接。然后,在此連接上,被編號的數據段按序收發。同時,要求對每個數據段進行確認,保證了可靠性。如果在指定的時間內沒有收到目標主機對所發數據段的確認,源主機將再次發送該數據段。   
  如圖2-5所示,是TCP頭部結構(RFC 793、1323)。 
     這里寫圖片描述 
   圖2-5  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比特。可能包括”窗口擴大因子”、”時間戳”等選項。   
  3、UDP數據段格式   
  UDP是一種不可靠的、無連接的數據報服務。源主機在傳送數據前不需要和目標主機建立連接。數據被冠以源、目標端口號等UDP報頭字段后直接發往目的主機。這時,每個數據段的可靠性依靠上層協議來保證。在傳送數據較少、較小的情況下,UDP比TCP更加高效。   
  如圖2-6所示,是UDP頭部結構(RFC 793、1323): 
     這里寫圖片描述 
   圖2-6  UDP數據段格式 
   
  ●源、目標端口號字段:占16比特。作用與TCP數據段中的端口號字段相同,用來標識源端和目標端的應用進程。   
  ●長度字段:占16比特。標明UDP頭部和UDP數據的總長度字節。  
  ●校驗和字段:占16比特。用來對UDP頭部和UDP數據進行校驗。和TCP不同的是,對UDP來說,此字段是可選項,而TCP數據段中的校驗和字段是必須有的。   
  2.3 套接字   
  在每個TCP、UDP數據段中都包含源端口和目標端口字段。有時,我們把一個IP地址和一個端口號合稱為一個套接字(Socket),而一個套接字對(Socket pair)可以唯一地確定互連網絡中每個TCP連接的雙方(客戶IP地址、客戶端口號、服務器IP地址、服務器端口號)。   
  如圖2-7所示,是常見的一些協議和它們對應的服務端口號。 
     這里寫圖片描述 
   圖2-7  常見協議和對應的端口號 
   
  需要注意的是,不同的應用層協議可能基於不同的傳輸層協議,如FTP、TELNET、SMTP協議基於可靠的TCP協議。TFTP、SNMP、RIP基於不可靠的UDP協議。   
  同時,有些應用層協議占用了兩個不同的端口號,如FTP的20、21端口,SNMP的161、162端口。這些應用層協議在不同的端口提供不同的功能。如FTP的21端口用來偵聽用戶的連接請求,而20端口用來傳送用戶的文件數據。再如,SNMP的161端口用於SNMP管理進程獲取SNMP代理的數據,而162端口用於SNMP代理主動向SNMP管理進程發送數據。 
  還有一些協議使用了傳輸層的不同協議提供的服務。如DNS協議同時使用了TCP 53端口和UDP 53端口。DNS協議在UDP的53端口提供域名解析服務,在TCP的53端口提供DNS區域文件傳輸服務。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM