TCP/ICMP报头结构
IP 协议是在网络层的协议.它主要完成数据包的发送作用. 下面这个表是 IP4 的数据包格式
0 4 8 16 32
--------------------------------------------------
|版本 |首部长度|服务类型| 数据包总长 |
--------------------------------------------------
| 标识 |DF |MF| 碎片偏移 |
--------------------------------------------------
| 生存时间 | 协议 | 首部较验和 |
------------------------------------------------
| 源 IP 地址 |
------------------------------------------------
| 目的 IP 地址 |
-------------------------------------------------
| 选项 |
=================================================
| 数据 |
-------------------------------------------------
下面我们看一看 IP 的结构定义<netinet/ip.h>;
struct ip
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ip_hl:4;
unsigned int ip_v:4;
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
unsigned int ip_v:4;
unsigned int ip_hl:4;
#endif
u_int8_t ip_tos;
u_short ip_len;
u_short ip_id;
u_short ip_off;
#define IP_RF 0x8000
#define IP_DF 0x4000
#define IP_MF 0x2000
#define IP_OFFMASK 0x1fff
u_int8_t ip_ttl;
u_int8_t ip_p;
u_short ip_sum;
struct in_addr ip_src, ip_dst;
};
ip_vIP 协议的版本号,这里是 4,现在 IPV6 已经出来了
ip_hlIP 包首部长度,这个值以 4 字节为单位.IP 协议首部的固定长度为 20 个字节,如果 IP 包
没有选项,那么这个值为 5.
ip_tos 服务类型,说明提供的优先权.
ip_len 说明 IP 数据的长度.以字节为单位.
ip_id 标识这个 IP 数据包.
ip_off 碎片偏移,这和上面 ID 一起用来重组碎片的.
ip_ttl 生存时间.没经过一个路由的时候减一,直到为 0 时被抛弃.
ip_p 协议,表示创建这个 IP 数据包的高层协议.如 TCP,UDP 协议.
ip_sum 首部校验和,提供对首部数据的校验.
ip_src,ip_dst 发送者和接收者的 IP 地址
关于 IP 协议的详细情况,请参考 RFC791
ICMP协议
ICMP 是消息控制协议,也处于网络层.在网络上传递 IP 数据包时,如果发生了错误,那么就
会用 ICMP 协议来报告错误.
ICMP 包的结构如下:
0 8 16 32
---------------------------------------------------------------------
| 类型 | 代码 | 校验和 |
--------------------------------------------------------------------
| 数据 | 数据 |
--------------------------------------------------------------------
ICMP 在<netinet/ip_icmp.h>;中的定义是
struct icmphdr
{
u_int8_t type;
u_int8_t code;
u_int16_t checksum;
union
{
struct
{
u_int16_t id;
u_int16_t sequence;
} echo;
u_int32_t gateway;
struct
{
u_int16_t __unused;
u_int16_t mtu;
} frag;
} un;
};
关于 ICMP 协议的详细情况可以查看 RFC792