常见协议头部

IP包头: 
 

 

版本

头部长度

服务类型

总长度

标识符

 

DF

MF

分片偏移

TTL

协议

头部校验

源地址

目标地址

  1. 版本(4bit):标示了数据包的IP版本号(IPV4-0100,IPV6-0110);
  2. 头部长度(4bit):标识了IP包头的长度,最小长度为20个字节,最大长度为60个字节;
  3. 服务类型(8bit):用来指定特殊数据包的处理,分为2个字段:优先权和TOS。
  4. 总长度(16bit):IP数据包的总长度,最大长度为65535个字节;
  5. 标识符(16bit):通常与标记字段和分段偏移字段一起用于数据包的分段。如果数据包原始长度超过MTU,那么必须将数据包进行分段处理,路由器在每片数据包的标识字段打上相同的标记,以便接收设备能够识别出属于同一个数据包。
  6. 标志字段(3bit):第一位保留;第二位为DF位,DF设置为1时表示该数据包不允许进行分段处理;第三位是MF位,MF位设置为0时表示为数据包的最后一个分段;
  7. 分段偏移(13bit):用于指明分段起始点相对于IP包头起始点的偏移量;
  8. TTL(8bit):在最初创建数据包时TTL被设置一特定值(1-255),TTL值沿路由器逐跳减一,TTL为0 时丢弃该数据包;
  9. 协议(8bit):给出了主机到主机层或传输层的“地址”或协议号;
  10. 头部校验(16bit):略
  11. 源地址(32bit):略
  12. 目标地址(32bit):略

Ethernet 包头:

 

目标地址

源地址

类型

数据

 

  1. 目标地址(48bit):目标MAC;
  2. 源地址(48bit):源MAC;
  3. 类型:(16bit):标识上层协议类型,例如:IP0X0800,ARP0X0806

TCP 包头:

 

源端口

目标端口

序列号

确认号

首部长度

保留

U

A

P

R

S

F

窗口大小

校验和

紧急指针

选项

 

  1. 源端口(16bit):
  2. 目标端口(16bit):
  3. 序列号(32bit):确定了发送方发送的数据流中的数据所在的位置;
  4. 确认号(32bit):发送的确认号等于对方下一个报文的第一个字节的序列号;
  5. 首部长度(4bit):TCP包头的长度;
  6. URG(1bit):URG1,表明为紧急数据,将该数据插入到数据的最前面;
  7. ACK(1bit):
  8. PSH(1bit):
  9. RST(1bit):释放当前连接并重新建立连接;
  10. SYN(1bit):请求建立连接;
  11. FIN(1bit):终止连接;
  12. 窗口大小(16bit):窗口值作为接收方让发送方设置其发送窗口的依据;

UDP 包头:

 

源端口

目标端口

长度

校验和

 

ARP 数据包格式:

 

硬件类型

协议类型

硬件地址长度

协议地址长度

操作

发送者硬件地址

发送者硬件地址

发送者IP地址

发送者IP地址

目标硬件地址

目标硬件地址

目标IP地址

 

  1. 硬件类型(16bit):指定硬件类型,例如:1为以太网;
  2. 协议类型(16bit):指定了发送者映射到数据链路层标识符的网络层协议的类型;ip对应0x0800;
  3. 硬件地址长度(4bit):例如MAC的地址长度为6字节;
  4. 协议地址长度(4bit):例如IPV4地址长度为4字节;
  5. 操作(16bit):指明数据包时ARP请求(1),还是ARP响应(2),反向ARP请求(3),反向ARP 响应(4),反转ARP请求(8),反转ARP响应(9);

ICMP 数据包格式:

 

类型

代码

校验和

可变字段取决于ICMP的类型

 

 

  1. 类型(8bit):
  2. 代码(8bit):
  3. 检验和(8bit):

ICMP指定了多种消息类型,这些消息的共同目的就是管理网络。

ICMP消息可分为错误消息,请求消息,和响应消息。

ICMP报文提供针对网络层的错误诊断、拥塞控制、路径控制和查询服务四项大的功能。如,当一个分组无法到达目的站点或TTL超时后,路由器就会丢弃此分组,并向源站点返回一个目的站点不可到达的ICMP报文

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;



你可能感兴趣的:(协议头部)