Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1372609
  • 博文数量: 284
  • 博客积分: 3251
  • 博客等级: 中校
  • 技术积分: 3046
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-26 17:23
文章分类

全部博文(284)

文章存档

2019年(2)

2018年(5)

2015年(19)

2014年(13)

2013年(10)

2012年(235)

分类: LINUX

2012-12-21 16:48:53

 接着上一篇,继续介绍struct sock。
    sk_rmem_alloc, sk_wmem_alloc和sk_omem_alloc分别表示接收缓冲队列,发送缓冲队列及其它缓冲队列中已经分配的字节数,用于跟踪缓冲区的使用情况。
    struct sock有一个struct sock_common成员,因为struct inet_timewait_sock也要用到它,所以把它单独归到一个结构体中,其定义如下:
    struct sock_common {
        unsigned short      skc_family;
        volatile unsigned char  skc_state;
        unsigned char       skc_reuse;
        int         skc_bound_dev_if;
        struct hlist_node   skc_node;
        struct hlist_node   skc_bind_node;
        atomic_t        skc_refcnt;
        unsigned int        skc_hash;
        struct proto        *skc_prot;
    };

    struct inet_sock。
    这是INET域专用的一个socket表示,它是在struct sock的基础上进行的扩展,在基本socket的属性已具备的基础上,struct inet_sock提供了INET域专有的一些属性,比如TTL,组播列表,IP地址,端口等,下面是其完整定义:
        struct inet_sock {
            struct sock     sk;
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
            struct ipv6_pinfo   *pinet6;
#endif
            __u32           daddr;          //IPv4的目的地址。
            __u32           rcv_saddr;      //IPv4的本地接收地址。
            __u16           dport;          //目的端口。
            __u16           num;            //本地端口(主机字节序)。
            __u32           saddr;          //发送地址。
            __s16           uc_ttl;         //单播的ttl。
            __u16           cmsg_flags;
            struct ip_options   *opt;
            __u16           sport;          //源端口。
            __u16           id;             //单调递增的一个值,用于赋给iphdr的id域。
            __u8            tos;            //服务类型。
            __u8            mc_ttl;         //组播的ttl
            __u8            pmtudisc;
            __u8            recverr:1,
                            is_icsk:1,
                            freebind:1,
                            hdrincl:1,      //是否自己构建ip首部(用于raw协议)
                            mc_loop:1;      //组播是否发向回路。
            int             mc_index;       //组播使用的本地设备接口的索引。
            __u32           mc_addr;        //组播源地址。
            struct ip_mc_socklist   *mc_list;   //组播组列表。
            struct {
                unsigned int        flags;
                unsigned int        fragsize;
                struct ip_options   *opt;
                struct rtable       *rt;
                int                 length;
                u32                 addr;
                struct flowi        fl;
            } cork;
        };

    struct raw_sock
    这是RAW协议专用的一个socket的表示,它是在struct inet_sock基础上的扩展,因为RAW协议要处理ICMP协议的过滤设置,其定义如下:
    struct raw_sock {
        struct inet_sock   inet;
        struct icmp_filter filter;
    };

    struct udp_sock
    这是UDP协议专用的一个socket表示,它是在struct inet_sock基础上的扩展,其定义如下:
    struct udp_sock {
        struct inet_sock inet;
        int             pending;
        unsigned int    corkflag;
        __u16           encap_type;
        __u16           len;
    };

    struct inet_connection_sock
    看完上面两个,我们觉得第三个应该就是struct tcp_sock了,但事实上,struct tcp_sock并不直接从struct inet_sock上扩展,而是从struct inet_connection_sock基础上进行扩展,struct inet_connection_sock是所有面向连接的socket的表示,关于该socket,及下面所有tcp相关的socket,我们在分析 tcp实现时再详细介绍,这里只列出它们的关系。

    strcut tcp_sock
    这是TCP协议专用的一个socket表示,它是在struct inet_connection_sock基础进行扩展,主要是增加了滑动窗口协议,避免拥塞算法等一些TCP专有属性。

    struct inet_timewait_sock

    struct tcp_timewait_sock
    在struct inet_timewait_sock的基础上进行扩展。

    struct inet_request_sock

    struct tcp_request_sock
    在struct inet_request_sock的基础上进行扩展。
阅读(769) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~