Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51182
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 460
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
  • 认证徽章:
个人简介

90后空巢老码农

文章分类

全部博文(42)

文章存档

2018年(41)

2017年(1)

我的朋友

分类: 网络与安全

2018-07-01 00:00:51

最近在看tcp/ip v2,发现看完前几章之后,脑子里面一坨。。。呵呵哒,惨不忍睹啊,不过还是有点小收获,在这里跟各位看官分享一下网络相关的各个数据结构以及之间关系,拍砖的请自备工具。。。

俗话说,一图胜千言(也有人说,没图你说个xx。。。),先上图:



今天这篇文章的任务就是将上面的这张图给大家说清楚:

我将从水平和垂直两个维度来讲解这张图片:

第一行,表示的是整个机器上面,所有的网络硬件在内核当中的数据结构,在系统初始化期间,分别为每个网络设备分配一个独立的ifnet{}结构(其中,以太网卡貌似支持热插拔检测),每个ifnet{}结构的下面,连接着位于其上的一个或多个协议地址,ifnet{}的各个字段如下所示:



点击(此处)折叠或打开

  1. struct ifnet {
  2.     char    *if_name;        /* name, e.g. ``en'' or ``lo'' */
  3.     struct    ifnet *if_next;        /* all struct ifnets are chained */
  4.     struct    ifaddr *if_addrlist;    /* linked list of addresses per if */
  5.     int    if_pcount;        /* number of promiscuous listeners */
  6.     caddr_t    if_bpf;            /* packet filter structure */
  7.     u_short    if_index;        /* numeric abbreviation for this if */
  8.     short    if_unit;        /* sub-unit for lower level driver */
  9.     short    if_timer;        /* time 'til if_watchdog called */
  10.     short    if_flags;        /* up/down, broadcast, etc. */
  11.     struct    if_data {
  12. /* generic interface information */
  13.         u_char    ifi_type;    /* ethernet, tokenring, etc */
  14.         u_char    ifi_addrlen;    /* media address length */
  15.         u_char    ifi_hdrlen;    /* media header length */
  16.         u_long    ifi_mtu;    /* maximum transmission unit */
  17.         u_long    ifi_metric;    /* routing metric (external only) */
  18.         u_long    ifi_baudrate;    /* linespeed */
  19. /* volatile statistics */
  20.         u_long    ifi_ipackets;    /* packets received on interface */
  21.         u_long    ifi_ierrors;    /* input errors on interface */
  22.         u_long    ifi_opackets;    /* packets sent on interface */
  23.         u_long    ifi_oerrors;    /* output errors on interface */
  24.         u_long    ifi_collisions;    /* collisions on csma interfaces */
  25.         u_long    ifi_ibytes;    /* total number of octets received */
  26.         u_long    ifi_obytes;    /* total number of octets sent */
  27.         u_long    ifi_imcasts;    /* packets received via multicast */
  28.         u_long    ifi_omcasts;    /* packets sent via multicast */
  29.         u_long    ifi_iqdrops;    /* dropped on input, this interface */
  30.         u_long    ifi_noproto;    /* destined for unsupported protocol */
  31.         struct    timeval ifi_lastchange;/* last updated */
  32.     }    if_data;
  33. /* procedure handles */
  34.     int    (*if_init)        /* init routine */
  35.         __P((int));
  36.     int    (*if_output)        /* output routine (enqueue) */
  37.         __P((struct ifnet *, struct mbuf *, struct sockaddr *,
  38.          struct rtentry *));
  39.     int    (*if_start)        /* initiate output routine */
  40.         __P((struct ifnet *));
  41.     int    (*if_done)        /* output complete routine */
  42.         __P((struct ifnet *));    /* (XXX not used; fake prototype) */
  43.     int    (*if_ioctl)        /* ioctl routine */
  44.         __P((struct ifnet *, int, caddr_t));
  45.     int    (*if_reset)    
  46.         __P((int));        /* new autoconfig will permit removal */
  47.     int    (*if_watchdog)        /* timer routine */
  48.         __P((int));
  49.     struct    ifqueue {
  50.         struct    mbuf *ifq_head;
  51.         struct    mbuf *ifq_tail;
  52.         int    ifq_len;
  53.         int    ifq_maxlen;
  54.         int    ifq_drops;
  55.     } if_snd;            /* output queue */
  56. };

它使用if_next指针将系统中所有检测到的interface连接起来,组成一个单向链表,链表的头指针由全局变量ifnet表示,每一个ifnet{}结构中,有一个if_addrlist指针,分别对应,位于该interface上的所有协议的地址列表(如链路层,网络层等等);if_netaddrs指向一个数组,数组中的每一个元素,指向一个链路层地址结构if_addr{}, 其定义如下:



点击(此处)折叠或打开

  1. struct ifaddr {
  2.     struct    sockaddr *ifa_addr;    /* address of interface */
  3.     struct    sockaddr *ifa_dstaddr;    /* other end of p-to-p link */
  4. #define    ifa_broadaddr    ifa_dstaddr    /* broadcast address interface */
  5.     struct    sockaddr *ifa_netmask;    /* used to determine subnet */
  6.     struct    ifnet *ifa_ifp;        /* back-pointer to interface */
  7.     struct    ifaddr *ifa_next;    /* next address for interface */
  8.     void    (*ifa_rtrequest)();    /* check or clean routes (+ or -)'d */
  9.     u_short    ifa_flags;        /* mostly rt_flags for cloning */
  10.     short    ifa_refcnt;        /* extra to malloc for link info */
  11.     int    ifa_metric;        /* cost of going out this interface */
  12. #ifdef notdef
  13.     struct    rtentry *ifa_rt;    /* XXXX for ROUTETOIF ????? */
  14. #endif
  15. };

在往下,就是in_ifaddrs指针了,它指向一个单向链表,链表中的每一项就是该主机对应的一个网络地址,且每一个网络地址必须对应一个ifnet{}结构,每一个项由一个in_ifaddr{}机构表示,如下图所示:



点击(此处)折叠或打开

  1. struct in_ifaddr {
  2.     struct    ifaddr ia_ifa;        /* protocol-independent info */
  3. #define    ia_ifp        ia_ifa.ifa_ifp
  4. #define ia_flags    ia_ifa.ifa_flags
  5.                     /* ia_{,sub}net{,mask} in host order */
  6.     u_long    ia_net;            /* network number of interface */
  7.     u_long    ia_netmask;        /* mask of net part */
  8.     u_long    ia_subnet;        /* subnet number, including net */
  9.     u_long    ia_subnetmask;        /* mask of subnet part */
  10.     struct    in_addr ia_netbroadcast; /* to recognize net broadcasts */
  11.     struct    in_ifaddr *ia_next;    /* next in list of internet addresses */
  12.     struct    sockaddr_in ia_addr;    /* reserve space for interface name */
  13.     struct    sockaddr_in ia_dstaddr; /* reserve space for broadcast addr */
  14. #define    ia_broadaddr    ia_dstaddr
  15.     struct    sockaddr_in ia_sockmask; /* reserve space for general netmask */
  16.     struct    in_multi *ia_multiaddrs; /* list of multicast addresses */
  17. };

目前为止,就读明白这些,有了新进展,一定会分享的哈~~

阅读(803) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册