原文:http://blog.csdn.net/wenqian1991/article/details/46700177

通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关于网络栈中数据包的状态,地址,端口等信息都封装在对应的结构中,可以说,了解这些数据结构是理解网络栈源码的基础,这里我们就来了解下网络协议栈中的各类数据结构。Linux 1.2.13

1、socket

(include\linux\Socket.h)该结构体socket 主要使用在BSD socket 层,是最上层的结构,在INET socket 层也会有涉及,但很少。

  1. /*
  2. * Internal representation of a socket. not all the fields are used by
  3. * all configurations:
  4. *
  5. *            server                client
  6. * conn     client connected to server connected to
  7. * iconn        list of clients     -unused-
  8. *       awaiting connections
  9. * wait     sleep for clients,  sleep for connection,
  10. *          sleep for i/o               sleep for i/o
  11. */
  12. //该结构表示一个网络套接字
  13. struct socket {
  14. short         type;       /* 套接字所用的流类型*/
  15. socket_state      state;//套接字所处状态
  16. long          flags;//标识字段,目前尚无明确作用
  17. struct proto_ops  *ops;       /* 操作函数集指针  */
  18. /* data保存指向‘私有'数据结构指针,在不同的域指向不同的数据结构        */
  19. //在INET域,指向sock结构,UNIX域指向unix_proto_data结构
  20. void          *data;
  21. //下面两个字段只用于UNIX域
  22. struct socket     *conn;      /* 指向连接的对端套接字   */
  23. struct socket     *iconn;     /* 指向正等待连接的客户端(服务器端)    */
  24. struct socket     *next;//链表
  25. struct wait_queue **wait;     /* 等待队列 */
  26. struct inode      *inode;//inode结构指针
  27. struct fasync_struct  *fasync_list;   /* 异步唤醒链表结构 */
  28. };

2、sock

(include\linux\Net.h) sock 的使用范围比socket 要大得多,sock结构的使用基本贯穿硬件层、设备接口层、ip层、INET socket 层,而且是作为各层之间的一个联系,主要是因为无论是发送还是接收的数据包都要被缓存到sock 结构中的缓冲队列中。

sock 结构与其对应的 socket 会相互绑定。

  1. /*
  2. * This structure really needs to be cleaned up.
  3. * Most of it is for TCP, and not used by any of
  4. * the other protocols.
  5. * 大部分功能是为TCP准备的
  6. */
  7. struct sock {
  8. struct options        *opt;//IP选项缓冲于此处
  9. volatile unsigned long    wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用
  10. volatile unsigned long    rmem_alloc;//接收缓冲队列中存放的数据的大小
  11. /* 下面三个seq用于TCP协议中为保证可靠数据传输而使用的序列号 */
  12. unsigned long         write_seq;//
  13. unsigned long         sent_seq;//
  14. unsigned long         acked_seq;//
  15. unsigned long         copied_seq;//应用程序有待读取(但尚未读取)数据的第一个序列号
  16. unsigned long         rcv_ack_seq;//目前本地接收到的对本地发送数据的应答序列号
  17. unsigned long         window_seq;//窗口大小
  18. unsigned long         fin_seq;//应答序列号
  19. //下面两个字段用于紧急数据处理
  20. unsigned long         urg_seq;//紧急数据最大序列号
  21. unsigned long         urg_data;//标志位,1表示收到紧急数据
  22. /*
  23. * Not all are volatile, but some are, so we
  24. * might as well say they all are.
  25. */
  26. volatile char                 inuse,//表示其他进程正在使用该sock结构,本进程需等待
  27. dead,//表示该sock结构已处于释放状态
  28. urginline,//=1,表示紧急数据将被当做普通数据处理
  29. intr,//
  30. blog,
  31. done,
  32. reuse,
  33. keepopen,//=1,使用保活定时器
  34. linger,//=1,表示在关闭套接字时需要等待一段时间以确认其已关闭
  35. delay_acks,//=1,表示延迟应答
  36. destroy,//=1,表示该sock结构等待销毁
  37. ack_timed,
  38. no_check,
  39. zapped, /* In ax25 & ipx means not linked */
  40. broadcast,
  41. nonagle;//=1,表示不使用NAGLE算法
  42. //NAGLE算法:在前一个发送的数据包被应答之前,不可再继续发送其它数据包
  43. unsigned long             lingertime;//等待关闭操作的时间
  44. int               proc;//该sock结构所属的进程的进程号
  45. struct sock           *next;
  46. struct sock           *prev; /* Doubly linked chain.. */
  47. struct sock           *pair;
  48. //下面两个字段用于TCP协议重发队列
  49. struct sk_buff        * volatile send_head;//这个队列中的数据均已经发送出去,但尚未接收到应答
  50. struct sk_buff        * volatile send_tail;
  51. struct sk_buff_head       back_log;//接收的数据包缓存队列,当套接字正忙时,数据包暂存在这里
  52. struct sk_buff        *partial;//用于创建最大长度的待发送数据包
  53. struct timer_list     partial_timer;//定时器,用于按时发送partial指针指向的数据包
  54. long              retransmits;//重发次数
  55. struct sk_buff_head       write_queue,//指向待发送数据包
  56. receive_queue;//读队列,表示数据报已被正式接收,该队列中的数据可被应用程序读取?
  57. struct proto          *prot;//传输层处理函数集
  58. struct wait_queue     **sleep;
  59. unsigned long         daddr;//sock结构所代表套接字的远端地址
  60. unsigned long         saddr;//本地地址
  61. unsigned short        max_unacked;//最大未处理请求连接数
  62. unsigned short        window;//远端窗口大小
  63. unsigned short        bytes_rcv;//已接收字节总数
  64. /* mss is min(mtu, max_window) */
  65. unsigned short        mtu; //和链路层协议密切相关      /* 最大传输单元 */
  66. volatile unsigned short   mss; //最大报文长度 =mtu-ip首部长度-tcp首部长度,也就是tcp数据包每次能够传输的最大数据分段
  67. volatile unsigned short   user_mss;  /* mss requested by user in ioctl */
  68. volatile unsigned short   max_window;//最大窗口大小
  69. unsigned long         window_clamp;//窗口大小钳制值
  70. unsigned short        num;//本地端口号
  71. //下面三个字段用于拥塞算法
  72. volatile unsigned short   cong_window;
  73. volatile unsigned short   cong_count;
  74. volatile unsigned short   ssthresh;
  75. volatile unsigned short   packets_out;//本地已发送出去但尚未得到应答的数据包数目
  76. volatile unsigned short   shutdown;//本地关闭标志位,用于半关闭操作
  77. volatile unsigned long    rtt;//往返时间估计值
  78. volatile unsigned long    mdev;//绝对偏差
  79. volatile unsigned long    rto;//用rtt和mdev 用算法计算出的延迟时间值
  80. /* currently backoff isn't used, but I'm maintaining it in case
  81. * we want to go back to a backoff formula that needs it
  82. */
  83. volatile unsigned short   backoff;//退避算法度量值
  84. volatile short        err;//错误标志值
  85. unsigned char         protocol;//传输层协议值
  86. volatile unsigned char    state;//套接字状态值
  87. volatile unsigned char    ack_backlog;//缓存的未应答数据包个数
  88. unsigned char         max_ack_backlog;//最大缓存的未应答数据包个数
  89. unsigned char         priority;//该套接字优先级
  90. unsigned char         debug;
  91. unsigned short        rcvbuf;//最大接收缓冲区大小
  92. unsigned short        sndbuf;//最大发送缓冲区大小
  93. unsigned short        type;//类型值如 SOCK_STREAM
  94. unsigned char         localroute;//=1,表示只使用本地路由 /* Route locally only */
  95. #ifdef CONFIG_IPX
  96. ipx_address           ipx_dest_addr;
  97. ipx_interface         *ipx_intrfc;
  98. unsigned short        ipx_port;
  99. unsigned short        ipx_type;
  100. #endif
  101. #ifdef CONFIG_AX25
  102. /* Really we want to add a per protocol private area */
  103. ax25_address          ax25_source_addr,ax25_dest_addr;
  104. struct sk_buff *volatile  ax25_retxq[8];
  105. char              ax25_state,ax25_vs,ax25_vr,ax25_lastrxnr,ax25_lasttxnr;
  106. char              ax25_condition;
  107. char              ax25_retxcnt;
  108. char              ax25_xx;
  109. char              ax25_retxqi;
  110. char              ax25_rrtimer;
  111. char              ax25_timer;
  112. unsigned char         ax25_n2;
  113. unsigned short        ax25_t1,ax25_t2,ax25_t3;
  114. ax25_digi         *ax25_digipeat;
  115. #endif
  116. #ifdef CONFIG_ATALK
  117. struct atalk_sock     at;
  118. #endif
  119. /* IP 'private area' or will be eventually */
  120. int               ip_ttl;//ip首部ttl字段值,实际上表示路由器跳数      /* TTL setting */
  121. int               ip_tos;//ip首部tos字段值,服务类型值       /* TOS */
  122. struct tcphdr         dummy_th;//缓存的tcp首部,在tcp协议中创建一个发送数据包时可以利用此字段快速创建tcp首部
  123. struct timer_list     keepalive_timer;//保活定时器,用于探测对方窗口大小,防止对方通报窗口大小的数据包丢弃 /* TCP keepalive hack */
  124. struct timer_list     retransmit_timer;//重发定时器,用于数据包超时重发  /* TCP retransmit timer */
  125. struct timer_list     ack_timer;//延迟应答定时器     /* TCP delayed ack timer */
  126. int               ip_xmit_timeout;//表示定时器超时原因 /* Why the timeout is running */
  127. //用于ip多播
  128. #ifdef CONFIG_IP_MULTICAST
  129. int               ip_mc_ttl;          /* Multicasting TTL */
  130. int               ip_mc_loop;         /* Loopback (not implemented yet) */
  131. char              ip_mc_name[MAX_ADDR_LEN];   /* Multicast device name */
  132. struct ip_mc_socklist     *ip_mc_list;            /* Group array */
  133. #endif
  134. /* This part is used for the timeout functions (timer.c). */
  135. int               timeout;    /* What are we waiting for? */
  136. struct timer_list     timer;      /* This is the TIME_WAIT/receive timer when we are doing IP */
  137. struct timeval        stamp;
  138. /* identd */
  139. //一个套接在在不同的层次上分别由socket结构和sock结构表示
  140. struct socket         *socket;
  141. /* Callbacks *///回调函数
  142. void              (*state_change)(struct sock *sk);
  143. void              (*data_ready)(struct sock *sk,int bytes);
  144. void              (*write_space)(struct sock *sk);
  145. void              (*error_report)(struct sock *sk);
  146. };

3、sk_buff

(include\linux\Skbuff.h) sk_buff 是网络数据报在内核中的表现形式,通过源码可以看出,数据包在内核协议栈中是通过这个数据结构来变现的。

从其中的 union 字段可以看出,该结构是贯穿在各个层的,可以说这个结构是用来为网络数据包服务的。其中的字段表明了数据包隶属的套接字、当前所处的协议层、所搭载的数据负载长度(data指针指向)、源端,目的端地址以及相关字段等。

主要重要的一个字段是 data[0],这是一个指针,它指向对应层的数据报(首部+数据负载)内容的首地址。怎么解释呢?

如果在传输层,那么data指向的数据部分的首地址,其数据部分为 TCP 首部 + 有效数据负载。

如果在网络层,data指向的数据部分的首地址,其数据部分为 IP 首部 + TCP 首部 + 有效数据负载。

如果在链路层,data指向的首地址,其数据布局为 MAC 首部 + IP 首部 + TCP 首部 + 有效数据负载。

所以在该skb_buff结构传递时,获取某一层的首部,都是通过拷贝 data 指向地址对应首部大小的数据。

  1. //sk_buff 结构用来封装网络数据
  2. //网络栈代码对数据的处理都是以sk_buff 结构为单元进行的
  3. struct sk_buff {
  4. struct sk_buff        * volatile next;
  5. struct sk_buff        * volatile prev;//构成队列
  6. #if CONFIG_SKB_CHECK
  7. int               magic_debug_cookie; //调试用
  8. #endif
  9. struct sk_buff        * volatile link3; //构成数据包重发队列
  10. struct sock           *sk; //数据包所属的套接字
  11. volatile unsigned long    when;    //数据包的发送时间,用于计算往返时间RTT/* used to compute rtt's */
  12. struct timeval        stamp; //记录时间
  13. struct device         *dev; //接收该数据包的接口设备
  14. struct sk_buff        *mem_addr; //该sk_buff在内存中的基地址,用于释放该sk_buff结构
  15. //联合类型,表示数据报在不同处理层次上所到达的处理位置
  16. union {
  17. struct tcphdr   *th; //传输层tcp,指向首部第一个字节位置
  18. struct ethhdr   *eth; //链路层上,指向以太网首部第一个字节位置
  19. struct iphdr    *iph; //网络层上,指向ip首部第一个字节位置
  20. struct udphdr   *uh; //传输层udp协议,
  21. unsigned char   *raw; //随层次变化而变化,链路层=eth,网络层=iph
  22. unsigned long   seq; //针对tcp协议的待发送数据包而言,表示该数据包的ACK值
  23. } h;
  24. struct iphdr      *ip_hdr; //指向ip首部的指针        /* For IPPROTO_RAW */
  25. unsigned long         mem_len; //表示sk_buff结构大小加上数据部分的总长度
  26. unsigned long         len; //只表示数据部分长度,len = mem_len - sizeof(sk_buff)
  27. unsigned long         fraglen; //分片数据包个数
  28. struct sk_buff        *fraglist;  /* Fragment list */
  29. unsigned long         truesize; //同men_len
  30. unsigned long         saddr; //源端ip地址
  31. unsigned long         daddr; //目的端ip地址
  32. unsigned long         raddr; //数据包下一站ip地址     /* next hop addr */
  33. //标识字段
  34. volatile char         acked, //=1,表示数据报已得到确认,可以从重发队列中删除
  35. used, //=1,表示该数据包的数据已被应用程序读完,可以进行释放
  36. free, //用于数据包发送,=1表示再进行发送操作后立即释放,无需缓存
  37. arp; //用于待发送数据包,=1表示已完成MAC首部的建立,=0表示还不知道目的端MAC地址
  38. //已进行tries试发送,该数据包正在被其余部分使用,路由类型,数据包类型
  39. unsigned char         tries,lock,localroute,pkt_type;
  40. //下面是数据包的类型,即pkt_type的取值
  41. #define PACKET_HOST     0     //发往本机    /* To us */
  42. #define PACKET_BROADCAST    1 //广播
  43. #define PACKET_MULTICAST    2 //多播
  44. #define PACKET_OTHERHOST    3 //其他机器        /* Unmatched promiscuous */
  45. unsigned short        users; //使用该数据包的模块数     /* User count - see datagram.c (and soon seqpacket.c/stream.c) */
  46. unsigned short        pkt_class;  /* For drivers that need to cache the packet type with the skbuff (new PPP) */
  47. #ifdef CONFIG_SLAVE_BALANCING
  48. unsigned short        in_dev_queue; //该字段是否正在缓存于设备缓存队列中
  49. #endif
  50. unsigned long         padding[0]; //填充字节
  51. unsigned char         data[0]; //指向该层数据部分
  52. //data指向的数据负载首地址,在各个层对应不同的数据部分
  53. //从侧面看出sk_buff结构基本上是贯穿整个网络栈的非常重要的一个数据结构
  54. };

4、device

(include\linux\Netdevice.h)该结构表明了一个网络设备需要的字段信息。

  1. /*
  2. * The DEVICE structure.
  3. * Actually, this whole structure is a big mistake.  It mixes I/O
  4. * data with strictly "high-level" data, and it has to know about
  5. * almost every data structure used in the INET module.
  6. */
  7. //网络设备结构
  8. struct device
  9. {
  10. /*
  11. * This is the first field of the "visible" part of this structure
  12. * (i.e. as seen by users in the "Space.c" file).  It is the name
  13. * the interface.
  14. */
  15. char            *name;//设备名称
  16. /* I/O specific fields - FIXME: Merge these and struct ifmap into one */
  17. unsigned long       rmem_end;//设备读缓冲区空间       /* shmem "recv" end */
  18. unsigned long       rmem_start;       /* shmem "recv" start   */
  19. unsigned long       mem_end;//设备总缓冲区首地址和尾地址       /* sahared mem end  */
  20. unsigned long       mem_start;        /* shared mem start */
  21. unsigned long       base_addr;//设备寄存器读写IO基地址      /* device I/O address   */
  22. unsigned char       irq;  //设备所使用中断号      /* device IRQ number    */
  23. /* Low-level status flags. */
  24. volatile unsigned char  start,//=1,表示设备已处于工作状态        /* start an operation   */
  25. tbusy,//=1,表示设备正忙于数据包发送       /* transmitter busy */
  26. interrupt;//=1,软件正在进行设备中断处理       /* interrupt arrived    */
  27. struct device       *next;//构成设备队列
  28. /* The device initialization function. Called only once. */
  29. int             (*init)(struct device *dev);//设备初始化指针(函数指针)
  30. /* Some hardware also needs these fields, but they are not part of the
  31. usual set specified in Space.c. */
  32. unsigned char       if_port;//指定使用的设备端口号      /* Selectable AUI, TP,..*/
  33. unsigned char       dma;//设备所用的dma通道号         /* DMA channel      */
  34. struct enet_statistics* (*get_stats)(struct device *dev);//设备信息获取函数指针
  35. /*
  36. * This marks the end of the "visible" part of the structure. All
  37. * fields hereafter are internal to the system, and may change at
  38. * will (read: may be cleaned up at will).
  39. */
  40. /* These may be needed for future network-power-down code. */
  41. unsigned long       trans_start;//用于传输超时计算    /* Time (in jiffies) of last Tx */
  42. unsigned long       last_rx;//上次接收一个数据包的时间    /* Time of last Rx      */
  43. unsigned short      flags;//标志位   /* interface flags (a la BSD)   */
  44. unsigned short      family;//设备所属的域协议 /* address family ID (AF_INET)  */
  45. unsigned short      metric;   /* routing metric (not used)    */
  46. unsigned short      mtu;//该接口设备的最大传输单元,ip首部+tcp首部+有效数据负载,去掉了以太网帧的帧头 /* interface MTU value*/
  47. unsigned short      type;//该设备所属硬件类型      /* interface hardware type  */
  48. unsigned short      hard_header_len;//硬件首部长度  /* hardware hdr length  */
  49. void            *priv;//私有数据指针    /* pointer to private data  */
  50. /* Interface address info. */
  51. unsigned char       broadcast[MAX_ADDR_LEN];//链路层硬件广播地址   /* hw bcast add */
  52. unsigned char       dev_addr[MAX_ADDR_LEN];//本设备硬件地址  /* hw address   */
  53. unsigned char       addr_len;//硬件地址长度 /* hardware address length  */
  54. unsigned long       pa_addr;//本地ip地址  /* protocol address     */
  55. unsigned long       pa_brdaddr;//网络层广播ip地址    /* protocol broadcast addr  */
  56. unsigned long       pa_dstaddr;//点对点网络中对点的ip地址    /* protocol P-P other side addr */
  57. unsigned long       pa_mask;//ip地址网络掩码    /* protocol netmask     */
  58. unsigned short      pa_alen;//ip地址长度  /* protocol address length  */
  59. struct dev_mc_list     *mc_list;//多播地址链表  /* Multicast mac addresses  */
  60. int            mc_count;//多播地址数目  /* Number of installed mcasts   */
  61. struct ip_mc_list  *ip_mc_list;//网络层ip多播地址链表  /* IP multicast filter chain    */
  62. /* For load balancing driver pair support */
  63. unsigned long        pkt_queue;//该设备缓存的待发送的数据包个数  /* Packets queued */
  64. struct device       *slave;//从设备  /* Slave device */
  65. /* Pointer to the interface buffers. */
  66. struct sk_buff_head     buffs[DEV_NUMBUFFS];//设备缓存的待发送的数据包
  67. //函数指针
  68. /* Pointers to interface service routines. */
  69. int             (*open)(struct device *dev);
  70. int             (*stop)(struct device *dev);
  71. int             (*hard_start_xmit) (struct sk_buff *skb,
  72. struct device *dev);
  73. int             (*hard_header) (unsigned char *buff,
  74. struct device *dev,
  75. unsigned short type,
  76. void *daddr,
  77. void *saddr,
  78. unsigned len,
  79. struct sk_buff *skb);
  80. int             (*rebuild_header)(void *eth, struct device *dev,
  81. unsigned long raddr, struct sk_buff *skb);
  82. //用于从接收到的数据包提取MAC首部中类型字符值,从而将数据包传送给适当的协议处理函数进行处理
  83. unsigned short      (*type_trans) (struct sk_buff *skb,
  84. struct device *dev);
  85. #define HAVE_MULTICAST
  86. void            (*set_multicast_list)(struct device *dev,
  87. int num_addrs, void *addrs);
  88. #define HAVE_SET_MAC_ADDR
  89. int             (*set_mac_address)(struct device *dev, void *addr);
  90. #define HAVE_PRIVATE_IOCTL
  91. int             (*do_ioctl)(struct device *dev, struct ifreq *ifr, int cmd);
  92. #define HAVE_SET_CONFIG
  93. int             (*set_config)(struct device *dev, struct ifmap *map);
  94. };

5、tcp 首部格式

  1. //tcp首部格式
  2. //http://blog.csdn.net/wenqian1991/article/details/44598537
  3. struct tcphdr {
  4. __u16   source;//源端口号
  5. __u16   dest;//目的端口号
  6. __u32   seq;//32位序列号
  7. __u32   ack_seq;//32位确认号
  8. #if defined(LITTLE_ENDIAN_BITFIELD)
  9. __u16   res1:4,//4位首部长度
  10. doff:4,//保留
  11. //下面为各个控制位
  12. fin:1,//最后控制位,表示数据已全部传输完成
  13. syn:1,//同步控制位
  14. rst:1,//重置控制位
  15. psh:1,//推控制位
  16. ack:1,//确认控制位
  17. urg:1,//紧急控制位
  18. res2:2;//
  19. #elif defined(BIG_ENDIAN_BITFIELD)
  20. __u16   doff:4,
  21. res1:4,
  22. res2:2,
  23. urg:1,
  24. ack:1,
  25. psh:1,
  26. rst:1,
  27. syn:1,
  28. fin:1;
  29. #else
  30. #error  "Adjust your <asm/byteorder.h> defines"
  31. #endif
  32. __u16   window;//16位窗口大小
  33. __u16   check;//16位校验和
  34. __u16   urg_ptr;//16位紧急指针
  35. };

6、ip 首部格式

  1. //ip数据报,首部格式
  2. struct iphdr {
  3. #if defined(LITTLE_ENDIAN_BITFIELD)//如果是小端模式
  4. __u8    ihl:4,//首部长度
  5. version:4;//版本
  6. #elif defined (BIG_ENDIAN_BITFIELD)//大端
  7. __u8    version:4,
  8. ihl:4;
  9. #else
  10. #error  "Please fix <asm/byteorder.h>"
  11. #endif
  12. __u8    tos;//区分服务,用语表示数据报的优先级和服务类型
  13. __u16   tot_len;//总长度,标识整个ip数据报的总长度 = 报头+数据部分
  14. __u16   id;//表示ip数据报的标识符
  15. __u16   frag_off;//片偏移
  16. __u8    ttl;//生存时间,即ip数据报在网络中传输的有效期
  17. __u8    protocol;//协议,标识此ip数据报在传输层所采用的协议类型
  18. __u16   check;//首部校验和
  19. __u32   saddr;//源地址
  20. __u32   daddr;//目的地址
  21. /*The options start here. */
  22. };

7、以太网帧帧头格式

  1. /* This is an Ethernet frame header. */
  2. struct ethhdr {
  3. unsigned char     h_dest[ETH_ALEN];//目的地址 /* destination eth addr */
  4. unsigned char     h_source[ETH_ALEN];//源地址    /* source ether addr    */
  5. unsigned short    h_proto;//类型        /* packet type ID field */
  6. };

8、ARP报文报头

  1. /*
  2. *  This structure defines an ethernet arp header.
  3. */
  4. //ARP报文格式(arp报头)
  5. struct arphdr
  6. {
  7. unsigned short  ar_hrd;//硬件类型       /* format of hardware address   */
  8. unsigned short  ar_pro;//上层协议类型     /* format of protocol address   */
  9. unsigned char   ar_hln;//MAC地址长度        /* length of hardware address   */
  10. unsigned char   ar_pln;//协议地址长度     /* length of protocol address   */
  11. unsigned short  ar_op;//操作类型        /* ARP opcode (command)     */
  12. #if 0
  13. /*
  14. *  Ethernet looks like this : This bit is variable sized however...
  15. */
  16. unsigned char       ar_sha[ETH_ALEN];//源MAC地址   /* sender hardware address  */
  17. unsigned char       ar_sip[4];//源IP地址       /* sender IP address        */
  18. unsigned char       ar_tha[ETH_ALEN];//目的MAC地址  /* target hardware address  */
  19. unsigned char       ar_tip[4];//目的IP地址      /* target IP address        */
  20. #endif
  21. };

【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)的更多相关文章

  1. 5.2【Linux 内核网络协议栈源码剖析】socket 函数剖析 ☆☆☆

    深度剖析网络协议栈中的 socket 函数,可以说是把前面介绍的串联起来,将网络协议栈各层关联起来. 应用层 FTP SMTP HTTP ... 传输层 TCP UDP 网络层 IP ICMP ARP ...

  2. Linux 内核调度器源码分析 - 初始化

    导语 上篇系列文 混部之殇-论云原生资源隔离技术之CPU隔离(一) 介绍了云原生混部场景中CPU资源隔离核心技术:内核调度器,本系列文章<Linux内核调度器源码分析>将从源码的角度剖析内 ...

  3. Python twisted事件驱动网络框架 源码剖析

    一.Twisted简介 Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. 事件驱动简而言之,事件驱动分为二个部分:第一,注册事件:第 ...

  4. 如何查看跟踪查看LINUX内核中的源码

    我的博客:www.while0.com 最近看LINUX书籍时,根据书中代码找相应的函数或者结构定义相当吃力,根据网上资料按以下方法查找速度较快. 1.安装ctags 在源代码目录下运行 ctags ...

  5. [SPDK/NVMe存储技术分析]011 - 内核态ib_post_send()源码剖析

    OFA定义了一组标准的Verbs,并在用户态提供了一个标准库libibverbs.例如将一个工作请求(WR)放置到发送队列的Verb API是ibv_post_send(), 但是在Linux内核,对 ...

  6. ARMv8 Linux内核head.S源码分析

    ARMv8Linux内核head.S主要工作内容: 1. 从el2特权级退回到el1 2. 确认处理器类型 3. 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4. 验证设备树的地址是否有 ...

  7. Bluedroid: 蓝牙协议栈源码剖析

    一. 基础知识介绍 1.缩略语 BTIF: Bluetooth Interface BTU : Bluetooth Upper Layer BTM: Bluetooth Manager BTE: Bl ...

  8. Netty学习笔记(三)——netty源码剖析

    1.Netty启动源码剖析 启动类: public class NettyNioServer { public static void main(String[] args) throws Excep ...

  9. TCP/IP协议栈源码图解分析系列10:linux内核协议栈中对于socket相关API的实现

    题记:本系列文章的目的是抛开书本从Linux内核源代码的角度详细分析TCP/IP协议栈内核相关技术 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com linu ...

随机推荐

  1. unittest多线程执行用例

    前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...

  2. 解决Can’t finish GitHub sharing process Successfully created project ‘GitHubDemo’ on GitHub

    Can't finish GitHub sharing process        Successfully created project 'KeyWordsFrameWork' on GitHu ...

  3. Vim enhance part1

    NO1 .认识.命令 例 删除man.config中第1到30行的注释 1.光标移到#上,按下x删除 2.按下j将光标移到第二行#上,之后按下. 3.可以看到第2行的#也被删除了因为.就是重复上次命令 ...

  4. tree(poj 1741)

    题意:给一颗n个节点的树,每条边上有一个距离v(v<=1000).定义d(u,v)为u到v的最小距离.给定k值,求有多少点对(u,v)使u到v的距离小于等于k. /* 照着点分治模板敲了敲,有很 ...

  5. 【BZOJ1225】求正整数(数论)

    题意:对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m. n<=50000 思路:记得以前好像看的是maigo的题解 n即为将m分解为质数幂次的乘积后的次数+1之积 经检验只需要 ...

  6. Flume+kakfa+sparkStream实时处理数据测试

    flume:从数据源拉取数据 kafka:主要起到缓冲从flume拉取多了的数据 sparkStream:对数据进行处理   一.flume拉取数据   1.源数据文件读取配置   在flume目录的 ...

  7. Codechef May Challenge 2015

    随便瞎写,其实没做出多少题: Chef and Cake 题目大概是用输入的数生成 一个数组并且生成出q个[X,Y]的询问, 数组长度N<=1000000,q<=10^7; 开始用线段树, ...

  8. Effective Java Profiling With Open Source Tools

    https://www.infoq.com/articles/java-profiling-with-open-source

  9. js的基础(平民理解的执行上下文/调用堆栈/内存栈/值类型/引用类型)

    与以前的切图比较,现在的前端开发对js的要求似乎越来越高,在开发中,我们不仅仅是要知道如何运用现有的框架(react/vue/ng), 而且我们对一些基础的知识的依赖越来越大. 现在我们就用平民的方法 ...

  10. Meteor事件

    使用事件是非常简单的.我们将学习如何使用tag,class 和id作为事件选择器. 让我们创建HTML模板三大要素.第一个是 p 标签,第二个是 myClass 类,最后一个是myId. meteor ...