typedef struct FramHeader_t
{ //Pcap捕获的数据帧头
BYTE DstMAC[6]; //目的MAC地址
BYTE SrcMAC[6]; //源MAC地址
WORD FrameType; //帧类型
} FramHeader_t;
typedef struct IPHeader_t
{ //IP数据包头
BYTE Ver_HLen; //版本+报头长度
BYTE TOS; //服务类型
WORD TotalLen; //总长度
WORD ID; //标识
WORD Flag_Segment; //标志+片偏移
BYTE TTL; //生存周期
BYTE Protocol; //协议类型
WORD Checksum; //头部校验和
DWORD SrcIP; //源IP地址
DWORD DstIP; //目的IP地址
} IPHeader_t;
typedef struct ARPHeader_t
{ //ARP数据包头
WORD HeadwareType; //硬件类型
WORD ProtocolType; //协议类型
BYTE HLen; //硬件地址长度
BYTE PLen; //协议地址长度
WORD Operation; //操作类型
BYTE SrcMAC[6]; //源MAC地址
DWORD SrcIP; //源IP地址
BYTE DstMAC[6]; //目的MAC地址
DWORD DstIP; //目的IP地址
} ARPHeader_t;
typedef struct UDPHeader_t
{ //UDP数据包头
WORD SrcPort; //源端口
WORD DstPort; //目的端口
WORD Len; //总长度
WORD Checksum; //校验和
}UDPHeader_t;
typedef struct TCPHeader_t
{ //TCP数据包头
WORD SrcPort; //源端口
WORD DstPort; //目的端口
DWORD SeqNO; //序号
DWORD AckNO; //确认号
WORD Offset4_Reserved6_Flag6; //头部长度+保留+标志
WORD Window; //窗口大小
WORD Checksum; //校验和
WORD UrgentPointer; //紧急指针
DWORD Option_; //选项+填充
}TCPHeader_t;
#pragma pack() //恢复默认对齐方式
----------------------------------------------------------------------------
一.IP 数据报结构
IP数据包结构分析
IP数据报中依次包括以下信息:
1、Version=4,表示IP协议的版本号为4。该部分占4个BIT位。
2、Header Length=20 Bytes,表示IP包头的总长度为20个字节。该部分占4个BIT位,单位为4个字节,因此,一个IP包头的长度最长为“1111”,即15*4=60个字节。
3、Type of Service=00,表示服务类型为0。该部分用二个十六进制值来表示,共占8个BIT。
8个BIT的含义是:
000 前三位不用
0 表示最小时延,如Telnet服务使用该位
0 表示吞吐量,如FTP服务使用该位
0 表示可靠性,如SNMP服务使用该位
0 表示最小代价
0 不用
4、Total Length=48Bytes,表示该IP包的总长度为48个字节。该部分占16个BIT,单位为Byte。由此可见,一个IP数据包的最大长度为2的 16次方减1,即:65535个字节。因此,在以太网中能够传输的最大IP数据包为65535个字节。
5、Identification=363,表示IP包识别号为363。该部分占16个BIT,以十进制数表示。
6、Flags,表示片标志,占3个BIT。各位含义分别为:第一个“0”不用,第二个“0”为分片标志位,“1”表示分片,“0”表示不分版本。第三个0为是否最后一片标志位,0表示最后一片,1表示还有更多的片。
7、Fragment Offset=0,表示片偏移为0个Bytes。该部分占13个BIT。
8、Time to Live=128Secongs/Hops,表示生存时间TTL值为128。该部分占8个BIT。
9、Proctol=6(TCP),表示协议类型为TCP,协议代码是6。如果是UDP协议,则此处的协议代码应为17。如果是ICMP协议,则此处的协议代码应为1。该部分占8个BIT。
10、Header Checksun=4035(correct),表示IP包头校验和为4035,括号内的Correct表示此IP数据包是正确的,没有被非法修改过。该部分占16个BIT,用十六进制表示。
11、Source Address=[76.88.16.104],表示IP数据包源地址为:76.88.16.104。该部分占32个BIT。
12、Destination Address=[76.88.16.16],表示IP数据包目的地址为:76.88.16.16。该部分占32个BIT。
13、No Options,表示IP数据包中未使用选项部分。当需要记录路由时才使用该选项。
二.TCP数据报结构
TCP数据报结构分析
TCP数据报中依次包括以下信息:
1、Source Port=1038,表示发起连接的源端口为1038。该部分占16个BIT。通过此值,可以看出发起连接的计算机源端口号。
2、Destination Port=21(FTP-CTRL),表示要连接的目的端口为21。该部分占16个BIT。通过此值,可以看出要登录的目的端口号。21端口表示是FTP服务端口。
3、Initial Sequence Number=1791872318,表示初始连接的请求号,即SEQ值。该部分占32个BIT,值从1到2的32次方减1。
4、Next Expected SEQ Number=1791872319,表示对方的应答号应为1791872319,即对方返回的ACK值。该部分占32个BIT,值从1到2的32次方减1。
5、Data Offset=28 Bytes,表示数据偏移的大小。该部分占4个BIT。
6、Reserved Bites:保留位,此处不用。该部分占6个BIT。
7、Flags=02。该值用两个十六进制数来表示。该部分长度为6个BIT,6个标志位的含义分别是:
0 URG,紧急数据标志,为1表示有紧急数据,应立即进行传递。
0 ACK,确认标志位,为1表示此数据包为应答数据包
0 PSH,PUSH标志位,为1表示此数据包应立即进行传递。
0 RST:复位标志位。如果收到不属于本机的数据包,则返回一个RST
0 SYN:连接请求标志位。为1表示为发起连接的请求数据包。
0 FIN:结束连接请求标志位。为1表示是结束连接的请求数据包。
8、Window=64240,表示窗口是64240。该部分占16个BIT。
9、CheckSum=92D7(Correct),表示校验和是92D7。该部分占16个BIT,用十六进制表示。
10、Urgent Pointer=0,表示紧急指针为0。该部分占16个BIT。
11、Maximum Segment Size=1460,表示最大段大小为1460个字节。
三.UDP数据报结构
16 | 32bit |
Source port | Destination port |
Length | Checksum |
Data |
- Source Port — 16位。源端口是可选字段。当使用时,它表示发送程序的端口,同时它还被认为是没有其它信息的情况下需要被寻址的答复端口。如果不使用,设置值为0。
- Destination Port — 16位。目标端口在特殊因特网目标地址的情况下具有意义。
- Length — 16位。该用户数据报的八位长度,包括协议头和数据。长度最小值为8。
- Checksum — 16位。IP 协议头、UDP 协议头和数据位,最后用0填补的信息假协议头总和。如果必要的话,可以由两个八位复合而成。
- Data — 包含上层数据信息。