TCP/IP头结构

// i386 is little_endian.
#ifndef LITTLE_ENDIAN
#define LITTLE_ENDIAN   (1)   //BYTE ORDER
#else
#error Redefine LITTLE_ORDER
#endif


[cpp]  view plain copy
  1. //Mac头部,总长度14字节  
  2. typedef struct _eth_hdr  
  3. {  
  4. unsigned char dstmac[6]; //目标mac地址  
  5. unsigned char srcmac[6]; //源mac地址  
  6. unsigned short eth_type; //以太网类型  
  7. }eth_hdr;  


[cpp]  view plain copy
  1. //IP头部,总长度20字节  
  2. typedef struct _ip_hdr  
  3. {  
  4. #if LITTLE_ENDIAN  
  5. unsigned char ihl:4;   //首部长度  
  6. unsigned char version:4, //版本   
  7. #else  
  8. unsigned char version:4, //版本  
  9. unsigned char ihl:4;   //首部长度  
  10. #endif  
  11. unsigned char tos;   //服务类型  
  12. unsigned short tot_len; //总长度  
  13. unsigned short id;    //标志  
  14. unsigned short frag_off; //分片偏移  
  15. unsigned char ttl;   //生存时间  
  16. unsigned char protocol; //协议  
  17. unsigned short chk_sum; //检验和  
  18. struct in_addr srcaddr; //源IP地址  
  19. struct in_addr dstaddr; //目的IP地址  
  20. }ip_hdr;  

  1.   

  2. //TCP头部,总长度20字节  
  3. typedef struct _tcp_hdr  
  4. {  
  5. unsigned short src_port;   //源端口号  
  6. unsigned short dst_port;   //目的端口号  
  7. unsigned int seq_no;    //序列号  
  8. unsigned int ack_no;    //确认号  
  9. #if LITTLE_ENDIAN  
  10. unsigned char reserved_1:4; //保留6位中的4位首部长度  
  11. unsigned char thl:4;    //tcp头部长度  
  12. unsigned char flag:6;    //6位标志  
  13. unsigned char reseverd_2:2; //保留6位中的2位  
  14. #else  
  15. unsigned char thl:4;    //tcp头部长度  
  16. unsigned char reserved_1:4; //保留6位中的4位首部长度  
  17. unsigned char reseverd_2:2; //保留6位中的2位  
  18. unsigned char flag:6;    //6位标志   
  19. #endif  
  20. unsigned short wnd_size;   //16位窗口大小  
  21. unsigned short chk_sum;   //16位TCP检验和  
  22. unsigned short urgt_p;    //16为紧急指针  
  23. }tcp_hdr;  
  24.  

  25.  
  26. //UDP头部,总长度8字节  
  27. typedef struct _udp_hdr  
  28. {  
  29. unsigned short src_port; //远端口号  
  30. unsigned short dst_port; //目的端口号  
  31. unsigned short uhl;   //udp头部长度  
  32. unsigned short chk_sum; //16位udp检验和  
  33. }udp_hdr;  
  34.   
  35. //ICMP头部,总长度4字节  
  36. typedef struct _icmp_hdr  
  37. {  
  38. unsigned char icmp_type;   //类型  
  39. unsigned char code;    //代码  
  40. unsigned short chk_sum;   //16位检验和  
  41. }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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值