1、TCP數(shù)據(jù)段格式
TCP是一種可靠的、面向連接的字節(jié)流服務(wù)。源主機(jī)在傳送數(shù)據(jù)前需要先和目標(biāo)主機(jī)建立連接。然后,在此連接上,被編號的數(shù)據(jù)段按序收發(fā)。同時,要求對每個數(shù)據(jù)段進(jìn)行確認(rèn),保證了可靠性。如果在指定的時間內(nèi)沒有收到目標(biāo)主機(jī)對所發(fā)數(shù)據(jù)段的確認(rèn),源主機(jī)將再次發(fā)送該數(shù)據(jù)段。
如圖1所示,是TCP頭部結(jié)構(gòu)(RFC 793、1323)。
圖1 TCP頭部結(jié)構(gòu)
●源、目標(biāo)端口號字段:占16比特。TCP協(xié)議通過使用"端口"來標(biāo)識源端和目標(biāo)端的應(yīng)用進(jìn)程。端口號可以使用0到65535之間的任何數(shù)字。在收到服務(wù)請求時,操作系統(tǒng)動態(tài)地為客戶端的應(yīng)用程序分配端口號。在服務(wù)器端,每種服務(wù)在"眾所周知的端口"(Well-Know Port)為用戶提供服務(wù)。
●順序號字段:占32比特。用來標(biāo)識從TCP源端向TCP目標(biāo)端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個報文段中的第一個數(shù)據(jù)字節(jié)。
●確認(rèn)號字段:占32比特。只有ACK標(biāo)志為1時,確認(rèn)號字段才有效。它包含目標(biāo)端所期望收到源端的下一個數(shù)據(jù)字節(jié)。
●頭部長度字段:占4比特。給出頭部占32比特的數(shù)目。沒有任何選項字段的TCP頭部長度為20字節(jié);最多可以有60字節(jié)的TCP頭部。
●標(biāo)志位字段(U、A、P、R、S、F):占6比特。各比特的含義如下:
◆URG:緊急指針(urgent pointer)有效。
◆ACK:確認(rèn)序號有效。
◆PSH:接收方應(yīng)該盡快將這個報文段交給應(yīng)用層。
◆RST:重建連接。
◆SYN:發(fā)起一個連接。
◆FIN:釋放一個連接。
●窗口大小字段:占16比特。此字段用來進(jìn)行流量控制。單位為字節(jié)數(shù),這個值是本機(jī)期望一次接收的字節(jié)數(shù)。
●TCP校驗和字段:占16比特。對整個TCP報文段,即TCP頭部和TCP數(shù)據(jù)進(jìn)行校驗和計算,并由目標(biāo)端進(jìn)行驗證。
●緊急指針字段:占16比特。它是一個偏移量,和序號字段中的值相加表示緊急數(shù)據(jù)最后一個字節(jié)的序號。
●選項字段:占32比特??赡馨?窗口擴(kuò)大因子"、"時間戳"等選項。
2、UDP數(shù)據(jù)段格式
UDP是一種不可靠的、無連接的數(shù)據(jù)報服務(wù)。源主機(jī)在傳送數(shù)據(jù)前不需要和目標(biāo)主機(jī)建立連接。數(shù)據(jù)被冠以源、目標(biāo)端口號等UDP報頭字段后直接發(fā)往目的主機(jī)。這時,每個數(shù)據(jù)段的可靠性依靠上層協(xié)議來保證。在傳送數(shù)據(jù)較少、較小的情況下,UDP比TCP更加高效。
圖2 UDP數(shù)據(jù)段格式
●源、目標(biāo)端口號字段:占16比特。作用與TCP數(shù)據(jù)段中的端口號字段相同,用來標(biāo)識源端和目標(biāo)端的應(yīng)用進(jìn)程。
●長度字段:占16比特。標(biāo)明UDP頭部和UDP數(shù)據(jù)的總長度字節(jié)。
●校驗和字段:占16比特。用來對UDP頭部和UDP數(shù)據(jù)進(jìn)行校驗。和TCP不同的是,對UDP來說,此字段是可選項,而TCP數(shù)據(jù)段中的校驗和字段是必須有的
3、IP報文段格式:
普通的 IP 頭部長度為20 個字節(jié),不包含IP 選項字段。
版本號(Version)字段標(biāo)明了IP 協(xié)議的版本號,目前的協(xié)議版本號為4。下一代IP 協(xié)議的版本號為6。
報文長度指 IP 包頭部長度,占4 位。
8 位的服務(wù)類型(TOS,Type of Service)字段包括一個3 位的優(yōu)先權(quán)字段(COS,Class of Service),4 位TOS 字段和1 位未用位。4 位TOS 分別代表最小時延、最大吞吐量、最高可靠性和最小費(fèi)用。
總長度(Total length)是整個IP 數(shù)據(jù)報長度,包括數(shù)據(jù)部分。
標(biāo)識符(Identification)字段唯一地標(biāo)識主機(jī)發(fā)送的每一份數(shù)據(jù)報。通常每發(fā)送一份報文它的值就會加1.
生存時間(TTL,Time to Live)字段設(shè)置了數(shù)據(jù)包可以經(jīng)過的路由器數(shù)目。一旦經(jīng)過一個路由器,TTL 值就會減1,當(dāng)該字段值為0 時,數(shù)據(jù)包將被丟棄。
協(xié)議字段確定在數(shù)據(jù)包內(nèi)傳送的上層協(xié)議,和端口號類似,IP 協(xié)議用協(xié)議號區(qū)分上層協(xié)議。TCP 協(xié)議的協(xié)議號為6,UDP 協(xié)議的協(xié)議號為17。
報頭校驗和(Head checksum)字段計算IP 頭部的校驗和,檢查報文頭部的完整性。源IP 地址和目的IP 地址字段標(biāo)識數(shù)據(jù)包的源端設(shè)備和目的端設(shè)備。
Linux下各數(shù)據(jù)報頭部結(jié)構(gòu)體定義:
#ifndef LITTLE_ENDIAN
#define LITTLE_ENDIAN (1) //BYTE ORDER
#else
#error Redefine LITTLE_ORDER
#endif
//Mac頭部,總長度14字節(jié)
typedef struct _eth_hdr
{
unsigned char dstmac[6]; //目標(biāo)mac地址
unsigned char srcmac[6]; //源mac地址
unsigned short eth_type; //以太網(wǎng)類型
}eth_hdr;
//IP頭部,總長度20字節(jié)
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; //服務(wù)類型
unsigned short tot_len; //總長度
unsigned short id; //標(biāo)志
unsigned short frag_off; //分片偏移
unsigned char ttl; //生存時間
unsigned char protocol; //協(xié)議
unsigned short chk_sum; //檢驗和
struct in_addr srcaddr; //源IP地址
struct in_addr dstaddr; //目的IP地址
}ip_hdr;
//TCP頭部,總長度20字節(jié)
typedef struct _tcp_hdr
{
unsigned short src_port; //源端口號
unsigned short dst_port; //目的端口號
unsigned int seq_no; //序列號
unsigned int ack_no; //確認(rèn)號
#if LITTLE_ENDIAN
unsigned char reserved_1:4; //保留6位中的4位首部長度
unsigned char thl:4; //tcp頭部長度
unsigned char flag:6; //6位標(biāo)志
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位標(biāo)志
#endif
unsigned short wnd_size; //16位窗口大小
unsigned short chk_sum; //16位TCP檢驗和
unsigned short urgt_p; //16為緊急指針
}tcp_hdr;
//UDP頭部,總長度8字節(jié)
typedef struct _udp_hdr
{
unsigned short src_port; //遠(yuǎn)端口號
unsigned short dst_port; //目的端口號
unsigned short uhl; //udp頭部長度
unsigned short chk_sum; //16位udp檢驗和
}udp_hdr;
//ICMP頭部,總長度4字節(jié)
typedef struct _icmp_hdr
{
unsigned char icmp_type; //類型
unsigned char code; //代碼
unsigned short chk_sum; //16位檢驗和
}icmp_hdr;