科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Linux内核2.4.x的网络接口结构(二) (4)

Linux内核2.4.x的网络接口结构(二) (4)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

协议的映射完成了,现在要进行服务的映射了。上层当然不可能知道下层的什么协议能对应特定的服务,所以这种映射自然由协议族自己完成。在TCP/IP协议族里,这种映射是通过struct list_head inetsw[SOCK_MAX]( net/ipv4/af_inet.c)这个数组进行映射的,在谈论这个数组之前我们来看另外一个数组

作者:hcyo 来源:赛迪网技术社区  2007年10月31日

关键字: 接口 网络 内核 Linux

  • 评论
  • 分享微博
  • 分享邮件
 

协议的映射完成了,现在要进行服务的映射了。上层当然不可能知道下层的什么协议能对应特定的服务,所以这种映射自然由协议族自己完成。在TCP/IP协议族里,这种映射是通过struct list_head inetsw[SOCK_MAX]( net/ipv4/af_inet.c)这个数组进行映射的,在谈论这个数组之前我们来看另外一个数组:



inetsw_array[] (net/ipv4/af_inet.c) 
  static struct inet_protosw inetsw_array[] = 
  { 
   { 
   type: SOCK_STREAM, 
   protocol: IPPROTO_TCP, 
   prot: &tcp_prot, 
   ops: &inet_stream_ops, 
   capability: -1, 
   no_check: 0, 
   flags: INET_PROTOSW_PERMANENT, 
   }, 
   { 
   type: SOCK_DGRAM, 
   protocol: IPPROTO_UDP, 
   prot: &udp_prot, 
   ops: &inet_dgram_ops, 
   capability: -1, 
   no_check: UDP_CSUM_DEFAULT, 
   flags: INET_PROTOSW_PERMANENT, 
   }, 
   { 
   type: SOCK_RAW, 
   protocol: IPPROTO_IP, /* wild card */ 
   prot: &raw_prot, 
   ops: &inet_dgram_ops, 
   capability: CAP_NET_RAW, 
   no_check: UDP_CSUM_DEFAULT, 
   flags: INET_PROTOSW_REUSE, 
   } 
  };

我们看到,SOCK_STREAM映射到了TCP协议,SOCK_DGRAM映射到了UDP协议,SOCK_RA W映射到了IP协议。现在只要把inetsw_array里的三项添加到数组inetsw[SOCK_MAX]就可以了,添加是通过函数inet_register_protosw()实现的。在inet_init()(net/ipv4/af_inet.c) 里完成了这些工作。

还有一个需要映射的就是socket其它诸如accept,send(),connect(),release(),bind()等的操作函数是怎么映射的呢?我们来看一下上面的数组的TCP的项:

{ 
  type: SOCK_STREAM, 
  protocol: IPPROTO_TCP, 
  prot: &tcp_prot, 
  ops: &inet_stream_ops, 
  capability: -1, 
  no_check: 0, 
  flags: INET_PROTOSW_PERMANENT, 
  },

我们看到这种映射是通过ops,和prot来映射的,我们再来看看 tcp_prot这一项:

  struct proto tcp_prot = { 
  name: "TCP", 
  close: tcp_close, 
  connect: tcp_v4_connect, 
  disconnect: tcp_disconnect, 
  accept: tcp_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, 
  };

所以的映射都已经完成了,用户调用connect()函数,其实就是调用了tcp_v4_connect()函数,按照这幅图,读起源码来就简单了很多了。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章