// i386 is little_endian.
#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;
几点自己的心得:
1.TCP/IP是起源自unix的,所以我先阅读的是linux下的源代码,但是发现linux的源代码很复杂,很乱。各种typedef,因为主要是了解,所以就找到了这个比较简洁的。
2.记住 一个 char 是8个bit,上面的代码中有很多是 分号接个数字,比如unsigned char ihl:4; IP头的长度只要4bit,而char是8bit,所以才这么写。另外,这么写是符合C语法的,能够编译通过的
参考:
1.http://book.51cto.com/art/201306/400250.htm