linux TCP/IP协议栈中protocol结构体

本文深入探讨了Linux内核中socket与传输层协议的关系,特别关注了SOCK_RAW套接字及其与IP、TCP、UDP等协议的交互,同时介绍了raw_prot操作集在不同协议下的具体实现与用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
socket->sk->sk_prot是一个传输层协议绑定的操作集,比如对于IPPROTO_TCP,它就是tcp_prot,对于IPPROTO_UDP,它就是 udp_prot。而对于类型为SOCK_RAW的套接字,它没有相应的传输层协议,而是用于通配所有的网络层附属协议,所以,所有网络层附属协议共用的一个操作集raw_prot。


struct proto {
    close()
    connect()
    disconnect()
    accept()
    ioctl()
    init()
    destroy()
    shutdown()
    setsockopt()
    getsockopt()
    compat_setsockopt()
    compat_getsockopt()
    sendmsg()
    recvmsg()
    sendpage()
    bind()
    backlog_rcv()
    hash()
    unhash()
    get_port()
    enter_memory_pressure()
    atomic_t                 *memory_allocated
    atomic_t                 *sockets_allocated
    int                      *memory_pressure
    int                      *sysctl_mem
    int                      *sysctl_wmem
    int                      *sysctl_rmem
    int                      max_header
    kmem_cache_t             *slab
    unsigned int             obj_size
    atomic_t                 *orphan_count
    struct request_sock_ops -*rsk_prot
    struct timewait_sock_ops *twsk_prot
    struct module            *owner
    char                     name[32]
    struct list_head         node
#ifdef SOCK_REFCNT_DEBUG
    atomic_t                 socks
#endif
    struct {
        int inuse
        u8 __pad[SMP_CACHE_BYTES - sizeof(int)]
    } stats[NR_CPUS]
}



tcp_prot <--> TCP
-------------------------------------
struct proto tcp_prot = {
    .name           = "TCP",
    .owner          = THIS_MODULE,
    .close          = tcp_close,
    .connect        = tcp_v4_connect,
    .disconnect     = tcp_disconnect,
    .accept         = inet_csk_accept,
    .ioctl          = tcp_ioctl,
    .init           = tcp_v4_init_sock,
    .destroy        = tcp_v4_destroy_sock,
    .shutdown       = tcp_shutdown,
    .setsockopt     = tcp_setsockopt,
    .getsockopt     = tcp_getsockopt,
    .sendmsg        = tcp_sendmsg,
    .recvmsg        = tcp_recvmsg,
    .backlog_rcv    = tcp_v4_do_rcv,
    .hash           = tcp_v4_hash,
    .unhash         = tcp_unhash,
    .get_port       = tcp_v4_get_port,
    .enter_memory_pressure = tcp_enter_memory_pressure,
    .sockets_allocated = &tcp_sockets_allocated,
    .orphan_count       = &tcp_orphan_count,
    .memory_allocated   = &tcp_memory_allocated,
    .memory_pressure    = &tcp_memory_pressure,
    .sysctl_mem         = sysctl_tcp_mem,
    .sysctl_wmem        = sysctl_tcp_wmem,
    .sysctl_rmem        = sysctl_tcp_rmem,
    .max_header         = MAX_TCP_HEADER,
    .obj_size           = sizeof(struct tcp_sock),
    .twsk_prot          = &tcp_timewait_sock_ops,
    .rsk_prot           = &tcp_request_sock_ops,
#ifdef CONFIG_COMPAT
    .compat_setsockopt = compat_tcp_setsockopt,
    .compat_getsockopt = compat_tcp_getsockopt,
#endif
};


udp_prot <--> UDP
-------------------------------------
struct proto udp_prot = {
    .name          = "UDP",
    .owner         = THIS_MODULE,
    .close         = udp_lib_close,
    .connect       = ip4_datagram_connect,
    .disconnect    = udp_disconnect,
    .ioctl         = udp_ioctl,
    .destroy       = udp_destroy_sock,
    .setsockopt    = udp_setsockopt,
    .getsockopt    = udp_getsockopt,
    .sendmsg       = udp_sendmsg,
    .recvmsg       = udp_recvmsg,
    .sendpage      = udp_sendpage,
    .backlog_rcv   = udp_queue_rcv_skb,
    .hash          = udp_lib_hash,
    .unhash        = udp_lib_unhash,
    .get_port      = udp_v4_get_port,
    .obj_size      = sizeof(struct udp_sock),
#ifdef CONFIG_COMPAT
    .compat_setsockopt = compat_udp_setsockopt,
    .compat_getsockopt = compat_udp_getsockopt,
#endif
};



raw_prot <--> IP
-------------------------------------
struct proto raw_prot = {
    .name          = "RAW",
    .owner         = THIS_MODULE,
    .close         = raw_close,
    .connect       = ip4_datagram_connect,
    .disconnect    = udp_disconnect,
    .ioctl         = raw_ioctl,
    .init          = raw_init,
    .setsockopt    = raw_setsockopt,
    .getsockopt    = raw_getsockopt,
    .sendmsg       = raw_sendmsg,
    .recvmsg       = raw_recvmsg,
    .bind          = raw_bind,
    .backlog_rcv   = raw_rcv_skb,
    .hash          = raw_v4_hash,
    .unhash        = raw_v4_unhash,
    .obj_size      = sizeof(struct raw_sock),
#ifdef CONFIG_COMPAT
    .compat_setsockopt = compat_raw_setsockopt,
    .compat_getsockopt = compat_raw_getsockopt,
#endif
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值