Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84032
  • 博文数量: 14
  • 博客积分: 188
  • 博客等级: 入伍新兵
  • 技术积分: 142
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-11 09:59
文章分类

全部博文(14)

文章存档

2012年(14)

分类: LINUX

2012-03-16 21:53:00

数据包结构/操作分析

以下是sk_buff类型的定义

include/linux/skbuff.h
  1. struct sk_buff {

  2. /* These two members must be first. */

  3. struct sk_buff *next; //下一个socket buff的指针

  4. struct sk_buff *prev; //上一个socket buff的指针


  5. struct sock *sk; //自己拥有的socket连接(只有连接是和本地进程通讯时才有,如果是转发的连接,指针为NULL)

  6. ktime_t tstamp; //到达时间

  7. struct net_device *dev; //到达/离开时使用的网络设备


  8. union { //此报文的路由,路由确定后赋此值

  9. struct dst_entry *dst;

  10. struct rtable *rtable;

  11. };

  12. struct sec_path *sp;


  13. /*

  14. * This is the control buffer. It is free to use for every

  15. * layer. Please put your private variables there. If you

  16. * want to keep them across layers you have to do a skb_clone()

  17. * first. This is owned by whoever has the skb queued ATM.

  18. */

  19. char cb[48]; //用于在协议栈之间传递参数,参数内容的涵义由使用它的函数确定


  20. unsigned int len, //此报文的长度,这是指网络报文在不同协议层中的长度,包括头部和数据。在协议栈的不同层,这个长度是不同的

  21. data_len; //数据长度

  22. __u16 mac_len, //链路层头部的长度

  23. hdr_len; //对cloned的skb能够写入的头部长度

  24. union {

  25. __wsum csum;

  26. struct {

  27. __u16 csum_start;

  28. __u16 csum_offset;

  29. };

  30. };

  31. __u32 priority;

  32. __u8 local_df:1,

  33. cloned:1,

  34. ip_summed:2,

  35. nohdr:1,

  36. nfctinfo:3;

  37. __u8 pkt_type:3,

  38. fclone:2,

  39. ipvs_property:1,

  40. peeked:1,

  41. nf_trace:1;

  42. __be16 protocol;


  43. void (*destructor)(struct sk_buff *skb);

  44. #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)

  45. struct nf_conntrack *nfct;

  46. struct sk_buff *nfct_reasm;

  47. #endif

  48. #ifdef CONFIG_BRIDGE_NETFILTER

  49. struct nf_bridge_info *nf_bridge;

  50. #endif


  51. int iif;

  52. #ifdef CONFIG_NETDEVICES_MULTIQUEUE

  53. __u16 queue_mapping;

  54. #endif

  55. #ifdef CONFIG_NET_SCHED

  56. __u16 tc_index; /* traffic control index */

  57. #ifdef CONFIG_NET_CLS_ACT

  58. __u16 tc_verd; /* traffic control verdict */

  59. #endif

  60. #endif

  61. #ifdef CONFIG_IPV6_NDISC_NODETYPE

  62. __u8 ndisc_nodetype:2;

  63. #endif

  64. /* 14 bit hole */


  65. #ifdef CONFIG_NET_DMA

  66. dma_cookie_t dma_cookie;

  67. #endif

  68. #ifdef CONFIG_NETWORK_SECMARK

  69. __u32 secmark;

  70. #endif


  71. __u32 mark; //标记,在ipvs中作为fwmark(防火墙标记)使用


  72. sk_buff_data_t transport_header; //传输层头部指针的偏移量(如果设置了NET_SKBUFF_DATA_USES_OFFSET,则为指针)

  73. sk_buff_data_t network_header; //网络层头部指针

  74. sk_buff_data_t mac_header; //链路层头部指针

  75. /* These elements must be at the end, see alloc_skb() for details. */

  76. sk_buff_data_t tail;

  77. sk_buff_data_t end;

  78. unsigned char *head, //buffer的头部指针,以上的所有偏移量都是以这个指针为基础

  79. *data; //数据起始位置

  80. unsigned int truesize; //此报文存储区的长度,这个长度是16字节对齐的,一般要比报文的长度大。

  81. atomic_t users; //这个socket的引用数,工作方式类似于文件系统的硬链接的引用数.比如clone了一次,连接数就+1

  82. };

网络层头部结构iphdr

include/linux/ip.h
  1. struct iphdr {

  2. #if defined(__LITTLE_ENDIAN_BITFIELD)

  3. __u8 ihl:4,

  4. version:4;

  5. #elif defined (__BIG_ENDIAN_BITFIELD)

  6. __u8 version:4,

  7. ihl:4;

  8. #else

  9. #error "Please fix "

  10. #endif

  11. __u8 tos;

  12. __be16 tot_len;

  13. __be16 id;

  14. __be16 frag_off;

  15. __u8 ttl;

  16. __u8 protocol;

  17. __sum16 check;

  18. __be32 saddr;

  19. __be32 daddr;

  20. /*The options start here. */

  21. };

传输层头部结构tcphdr

include/linux/tcp.h
  1. struct tcphdr {

  2. __be16 source;

  3. __be16 dest;

  4. __be32 seq;

  5. __be32 ack_seq;

  6. #if defined(__LITTLE_ENDIAN_BITFIELD)

  7. __u16 res1:4,

  8. doff:4,

  9. fin:1,

  10. syn:1,

  11. rst:1,

  12. psh:1,

  13. ack:1,

  14. urg:1,

  15. ece:1,

  16. cwr:1;

  17. #elif defined(__BIG_ENDIAN_BITFIELD)

  18. __u16 doff:4,

  19. res1:4,

  20. cwr:1,

  21. ece:1,

  22. urg:1,

  23. ack:1,

  24. psh:1,

  25. rst:1,

  26. syn:1,

  27. fin:1;

  28. #else

  29. #error "Adjust your defines"

  30. #endif

  31. __be16 window;

  32. __sum16 check;

  33. __be16 urg_ptr;

  34. };

传输层头部结构udphdr

include/linux/udp.h
  1. struct udphdr {

  2. __be16 source;

  3. __be16 dest;

  4. __be16 len;

  5. __sum16 check;

  6. };

icmphdr

include/linux/icmp.h
  1. struct icmphdr {

  2. __u8 type;

  3. __u8 code;

  4. __sum16 checksum;

  5. union {

  6. struct {

  7. __be16 id;

  8. __be16 sequence;

  9. } echo;

  10. __be32 gateway;

  11. struct {

  12. __be16 __unused;

  13. __be16 mtu;

  14. } frag;

  15. } un;

  16. };

链路层帧格式

前导码
8 bytes
目的mac地址
6 bytes
源mac地址
6 bytes
帧类型
2 bytes
帧数据
46~1500 bytes
crc校验
4 bytes

网络层数据包格式

4 bits4 bits8 bits3 bits13 bits
VersionIHLType of ServiceTotal Length
IdentificationFlagsFragmentation Offset
Time To LiveProtocolHeader Checksum
Source Address
Destination Address
OptionsPadding
Data

传输层数据报文格式

4 bits6 bits6 bits16 bits
Source PortDestination Port
Sequence Number
Acknowledge Number
Data
Offset
ReservedCodeWindow
CkecksumUrgent Pointer
OptionsPadding
Data
阅读(2426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~