一、TCP數據段格式
TCP是一種可靠的、面向鏈接的字節流服務。源主機在傳送數據前須要先和目標主機創建鏈接。而後,在此鏈接上,被編號的數據段按序收發。同時,要求對每一個數據段進行確認,保證了可靠性。若是在指定的時間內沒有收到目標主機對所發數據段的確認,源主機將再次發送該數據段。
如圖1所示,是TCP頭部結構(RFC 79三、1323)。
圖1 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比特。可能包括"窗口擴大因子"、"時間戳"等選項。
二、UDP數據段格式
UDP是一種不可靠的、無鏈接的數據報服務。源主機在傳送數據前不須要和目標主機創建鏈接。數據被冠以源、目標端口號等UDP報頭字段後直接發往目的主機。這時,每一個數據段的可靠性依靠上層協議來保證。在傳送數據較少、較小的狀況下,UDP比TCP更加高效。
如圖2所示,是UDP頭部結構(RFC 79三、1323):
圖2 UDP數據段格式
●源、目標端口號字段:佔16比特。做用與TCP數據段中的端口號字段相同,用來標識源端和目標端的應用進程。
●長度字段:佔16比特。標明UDP頭部和UDP數據的總長度字節。
●校驗和字段:佔16比特。用來對UDP頭部和UDP數據進行校驗。和TCP不一樣的是,對UDP來講,此字段是可選項,而TCP數據段中的校驗和字段是必須有的 服務器
三、IP報文段格式:tcp
普通的 IP 頭部長度爲20 個字節,不包含IP 選項字段。操作系統
版本號(Version)字段標明瞭IP 協議的版本號,目前的協議版本號爲4。下一代IP 協議的版本號爲6。指針
報文長度指 IP 包頭部長度,佔4 位。code
8 位的服務類型(TOS,Type of Service)字段包括一個3 位的優先權字段(COS,Class of Service),4 位TOS 字段和1 位未用位。4 位TOS 分別表明最小時延、最大吞吐量、最高可靠性和最小費用。blog
總長度(Total length)是整個IP 數據報長度,包括數據部分。進程
標識符(Identification)字段惟一地標識主機發送的每一份數據報。一般每發送一份報文它的值就會加1.ip
生存時間(TTL,Time to Live)字段設置了數據包能夠通過的路由器數目。一旦通過一個路由器,TTL 值就會減1,當該字段值爲0 時,數據包將被丟棄。路由
協議字段肯定在數據包內傳送的上層協議,和端口號相似,IP 協議用協議號區分上層協議。TCP 協議的協議號爲6,UDP 協議的協議號爲17。get
報頭校驗和(Head checksum)字段計算IP 頭部的校驗和,檢查報文頭部的完整性。源IP 地址和目的IP 地址字段標識數據包的源端設備和目的端設備。
Linux下各數據報頭部結構體定義:
#ifndef LITTLE_ENDIAN
#define LITTLE_ENDIAN (1) //BYTE ORDER
#else
#error Redefine LITTLE_ORDER
#endif
//Mac頭部,總長度14字節
typedef struct _eth_hdr
{
unsigned char dstmac[6]; //目標mac地址
unsigned char srcmac[6]; //源mac地址
unsigned short eth_type; //以太網類型
}eth_hdr;
//IP頭部,總長度20字節
typedef struct _ip_hdr
{
#if LITTLE_ENDIAN
unsigned char ihl:4; //首部長度
unsigned char version:4, //版本
#else
unsigned char version:4, //版本
unsigned char ihl:4; //首部長度
#endif
unsigned char tos; //服務類型
unsigned short tot_len; //總長度
unsigned short id; //標誌
unsigned short frag_off; //分片偏移
unsigned char ttl; //生存時間
unsigned char protocol; //協議
unsigned short chk_sum; //檢驗和
struct in_addr srcaddr; //源IP地址
struct in_addr dstaddr; //目的IP地址
}ip_hdr;
//TCP頭部,總長度20字節
typedef struct _tcp_hdr
{
unsigned short src_port; //源端口號
unsigned short dst_port; //目的端口號
unsigned int seq_no; //序列號
unsigned int ack_no; //確認號
#if LITTLE_ENDIAN
unsigned char reserved_1:4; //保留6位中的4位首部長度
unsigned char thl:4; //tcp頭部長度
unsigned char flag:6; //6位標誌
unsigned char reseverd_2:2; //保留6位中的2位
#else
unsigned char thl:4; //tcp頭部長度
unsigned char reserved_1:4; //保留6位中的4位首部長度
unsigned char reseverd_2:2; //保留6位中的2位
unsigned char flag:6; //6位標誌
#endif
unsigned short wnd_size; //16位窗口大小
unsigned short chk_sum; //16位TCP檢驗和
unsigned short urgt_p; //16爲緊急指針
}tcp_hdr;
//UDP頭部,總長度8字節
typedef struct _udp_hdr
{
unsigned short src_port; //遠端口號
unsigned short dst_port; //目的端口號
unsigned short uhl; //udp頭部長度
unsigned short chk_sum; //16位udp檢驗和
}udp_hdr;
//ICMP頭部,總長度4字節
typedef struct _icmp_hdr
{
unsigned char icmp_type; //類型
unsigned char code; //代碼
unsigned short chk_sum; //16位檢驗和
}icmp_hdr;
原文連接:http://hi.baidu.com/yelangdefendou/item/8315a75138b3519d09be17e9