1、UDP协议
UDP协议是建立在IP协议基础之上的,用在传输层的协议。UDP和IP协议一样是不可靠的数据报服务。
0 16 32
-------------------------------------------------------
| UDP源端口 | UDP目的端口 |
-------------------------------------------------------
| UDP数据报长度 | UDP数据报校验 |
-------------------------------------------------------
| 数据 |
-------------------------------------------------------
UDP的头格式为:
struct udphdr
{
u_int16_t source; /*源地址端口*/
u_int16_t dest; /*目的地址端口*/
u_int16_t len; /*UDP长度*/
u_int16_t check; /*UDP校验和*/
};
头文件:linux/udp.h
2、ICMP协议
ICMP是消息控制协议,也处于网络层。在网络上传递IP数据包时,如果发生了错误,那么就会用ICMP协议来报告错误。
0 8 16 32
----------------------------------------------------
| 类型 | 代码 | 校验和 |
----------------------------------------------------
| 识别号 | 报文序列号 |
----------------------------------------------------
ICMP的头格式为:
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; /* echo datagram */
u_int32_t gateway; /* gateway address */
struct
{
u_int16_t __unused;
u_int16_t mtu;
} frag; /* path mtu discovery */
} un;
};
头文件:linux /icmp.h
3、IP协议
IP协议是在网络层的协议,它主要完成数据包的发送作用,下面这个表是IPv4的数据包格式:
IP的头格式为:
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD) /*小端*/
__u8 ihl:4, /*IP头部长度*/
version:4; /*IP版本,值为4*/
#elif defined (__BIG_ENDIAN_BITFIELD)/*大端*/
__u8 version:4, /*IP版本,值为4*/
ihl:4; /*IP头部长度*/
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos; /*服务类型*/
__be16 tot_len; /*总长度*/
__be16 id; /*标识*/
__be16 frag_off; /*片偏移*/
__u8 ttl; /*生存时间*/
__u8 protocol; /*协议类型*/
__u16 check; /*头部校验和*/
__be32 saddr; /*源IP地址*/
__be32 daddr; /*目的IP地址*/
/*IP选项*/
};
头文件:linux/ip.h