歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核--網絡協議棧深入分析(三)--INET協議族socket和傳輸層sock

Linux內核--網絡協議棧深入分析(三)--INET協議族socket和傳輸層sock

日期:2017/3/1 10:09:57   编辑:Linux內核

本文分析基於Linux Kernel 3.2.1

Linux內核中協議族有INET協議族,UNIX協議族等,我們還是以INET協議族為例。

更多請查看 Linux內核--網絡內核實現分析

下面是內核中的協議族聲明:

  1. /* Supported address families. */
  2. #define AF_UNSPEC 0
  3. #define AF_UNIX 1 /* Unix domain sockets */
  4. #define AF_LOCAL 1 /* POSIX name for AF_UNIX */
  5. #define AF_INET 2 /* Internet IP Protocol */
  6. #define AF_AX25 3 /* Amateur Radio AX.25 */
  7. #define AF_IPX 4 /* Novell IPX */
  8. #define AF_APPLETALK 5 /* AppleTalk DDP */
  9. #define AF_NETROM 6 /* Amateur Radio NET/ROM */
  10. #define AF_BRIDGE 7 /* Multiprotocol bridge */
  11. #define AF_ATMPVC 8 /* ATM PVCs */
  12. #define AF_X25 9 /* Reserved for X.25 project */
  13. #define AF_INET6 10 /* IP version 6 */
  14. #define AF_ROSE 11 /* Amateur Radio X.25 PLP */
  15. #define AF_DECnet 12 /* Reserved for DECnet project */
  16. #define AF_NETBEUI 13 /* Reserved for 802.2LLC project*/
  17. #define AF_SECURITY 14 /* Security callback pseudo AF */
  18. #define AF_KEY 15 /* PF_KEY key management API */
  19. #define AF_NETLINK 16
  20. #define AF_ROUTE AF_NETLINK /* Alias to emulate 4.4BSD */
  21. #define AF_PACKET 17 /* Packet family */
  22. #define AF_ASH 18 /* Ash */
  23. #define AF_ECONET 19 /* Acorn Econet */
  24. #define AF_ATMSVC 20 /* ATM SVCs */
  25. #define AF_RDS 21 /* RDS sockets */
  26. #define AF_SNA 22 /* Linux SNA Project (nutters!) */
  27. #define AF_IRDA 23 /* IRDA sockets */
  28. #define AF_PPPOX 24 /* PPPoX sockets */
  29. #define AF_WANPIPE 25 /* Wanpipe API Sockets */
  30. #define AF_LLC 26 /* Linux LLC */
  31. #define AF_CAN 29 /* Controller Area Network */
  32. #define AF_TIPC 30 /* TIPC sockets */
  33. #define AF_BLUETOOTH 31 /* Bluetooth sockets */
  34. #define AF_IUCV 32 /* IUCV sockets */
  35. #define AF_RXRPC 33 /* RxRPC sockets */
  36. #define AF_ISDN 34 /* mISDN sockets */
  37. #define AF_PHONET 35 /* Phonet sockets */
  38. #define AF_IEEE802154 36 /* IEEE802154 sockets */
  39. #define AF_CAIF 37 /* CAIF sockets */
  40. #define AF_ALG 38 /* Algorithm sockets */
  41. #define AF_NFC 39 /* NFC sockets */
  42. #define AF_MAX 40 /* For now.. */
內核中的PF_***和AF_***其實可以混用,它的宏定義如下:
  1. /* Protocol families, same as address families. */
  2. #define PF_UNSPEC AF_UNSPEC
  3. #define PF_UNIX AF_UNIX
  4. #define PF_LOCAL AF_LOCAL
  5. #define PF_INET AF_INET
  6. #define PF_AX25 AF_AX25
  7. #define PF_IPX AF_IPX
  8. #define PF_APPLETALK AF_APPLETALK
  9. #define PF_NETROM AF_NETROM
  10. #define PF_BRIDGE AF_BRIDGE
  11. #define PF_ATMPVC AF_ATMPVC
  12. #define PF_X25 AF_X25
  13. #define PF_INET6 AF_INET6
  14. #define PF_ROSE AF_ROSE
  15. #define PF_DECnet AF_DECnet
  16. #define PF_NETBEUI AF_NETBEUI
  17. #define PF_SECURITY AF_SECURITY
  18. #define PF_KEY AF_KEY
  19. #define PF_NETLINK AF_NETLINK
  20. #define PF_ROUTE AF_ROUTE
  21. #define PF_PACKET AF_PACKET
  22. #define PF_ASH AF_ASH
  23. #define PF_ECONET AF_ECONET
  24. #define PF_ATMSVC AF_ATMSVC
  25. #define PF_RDS AF_RDS
  26. #define PF_SNA AF_SNA
  27. #define PF_IRDA AF_IRDA
  28. #define PF_PPPOX AF_PPPOX
  29. #define PF_WANPIPE AF_WANPIPE
  30. #define PF_LLC AF_LLC
  31. #define PF_CAN AF_CAN
  32. #define PF_TIPC AF_TIPC
  33. #define PF_BLUETOOTH AF_BLUETOOTH
  34. #define PF_IUCV AF_IUCV
  35. #define PF_RXRPC AF_RXRPC
  36. #define PF_ISDN AF_ISDN
  37. #define PF_PHONET AF_PHONET
  38. #define PF_IEEE802154 AF_IEEE802154
  39. #define PF_CAIF AF_CAIF
  40. #define PF_ALG AF_ALG
  41. #define PF_NFC AF_NFC
  42. #define PF_MAX AF_MAX
以後的分析就是以INET協議族為例來分析的。

下面的結構體就是在系統初始化時用來管理協議族初始化的結構體:

  1. struct net_proto_family {
  2. int family;
  3. int (*create)(struct net *net, struct socket *sock,
  4. int protocol, int kern);
  5. struct module *owner;
  6. };
第一個屬性就是協議族的宏定義,如PF_INET;

第二個屬性就是協議族對應的初始化函數指針;

INET協議族對應該結構的定義如下:

  1. static const struct net_proto_family inet_family_ops = {
  2. .family = PF_INET,
  3. .create = inet_create,
  4. .owner = THIS_MODULE,
  5. };
下面結構體是協議族操作集結構體定義:
  1. struct proto_ops {
  2. int family;
  3. struct module *owner;
  4. int (*release) (struct socket *sock);
  5. int (*bind) (struct socket *sock,
  6. struct sockaddr *myaddr,
  7. int sockaddr_len);
  8. int (*connect) (struct socket *sock,
  9. struct sockaddr *vaddr,
  10. int sockaddr_len, int flags);
  11. int (*socketpair)(struct socket *sock1,
  12. struct socket *sock2);
  13. int (*accept) (struct socket *sock,
  14. struct socket *newsock, int flags);
  15. int (*getname) (struct socket *sock,
  16. struct sockaddr *addr,
  17. int *sockaddr_len, int peer);
  18. unsigned int (*poll) (struct file *file, struct socket *sock,
  19. struct poll_table_struct *wait);
  20. int (*ioctl) (struct socket *sock, unsigned int cmd,
  21. unsigned long arg);
  22. #ifdef CONFIG_COMPAT
  23. int (*compat_ioctl) (struct socket *sock, unsigned int cmd,
  24. unsigned long arg);
  25. #endif
  26. int (*listen) (struct socket *sock, int len);
  27. int (*shutdown) (struct socket *sock, int flags);
  28. int (*setsockopt)(struct socket *sock, int level,
  29. int optname, char __user *optval, unsigned int optlen);
  30. int (*getsockopt)(struct socket *sock, int level,
  31. int optname, char __user *optval, int __user *optlen);
  32. #ifdef CONFIG_COMPAT
  33. int (*compat_setsockopt)(struct socket *sock, int level,
  34. int optname, char __user *optval, unsigned int optlen);
  35. int (*compat_getsockopt)(struct socket *sock, int level,
  36. int optname, char __user *optval, int __user *optlen);
  37. #endif
  38. int (*sendmsg) (struct kiocb *iocb, struct socket *sock,
  39. struct msghdr *m, size_t total_len);
  40. int (*recvmsg) (struct kiocb *iocb, struct socket *sock,
  41. struct msghdr *m, size_t total_len,
  42. int flags);
  43. int (*mmap) (struct file *file, struct socket *sock,
  44. struct vm_area_struct * vma);
  45. ssize_t (*sendpage) (struct socket *sock, struct page *page,
  46. int offset, size_t size, int flags);
  47. ssize_t (*splice_read)(struct socket *sock, loff_t *ppos,
  48. struct pipe_inode_info *pipe, size_t len, unsigned int flags);
  49. };
INET協議族中TCP和UDP協議對應的上述操作集的定義不同:

TCP協議z在INET層操作集inet_stream_ops

  1. const struct proto_ops inet_stream_ops = {
  2. .family = PF_INET,
  3. .owner = THIS_MODULE,
  4. .release = inet_release,
  5. .bind = inet_bind,
  6. .connect = inet_stream_connect,
  7. .socketpair = sock_no_socketpair,
  8. .accept = inet_accept,
  9. .getname = inet_getname,
  10. .poll = tcp_poll,
  11. .ioctl = inet_ioctl,
  12. .listen = inet_listen,
  13. .shutdown = inet_shutdown,
  14. .setsockopt = sock_common_setsockopt,
  15. .getsockopt = sock_common_getsockopt,
  16. .sendmsg = inet_sendmsg,
  17. .recvmsg = inet_recvmsg,
  18. .mmap = sock_no_mmap,
  19. .sendpage = inet_sendpage,
  20. .splice_read = tcp_splice_read,
  21. #ifdef CONFIG_COMPAT
  22. .compat_setsockopt = compat_sock_common_setsockopt,
  23. .compat_getsockopt = compat_sock_common_getsockopt,
  24. .compat_ioctl = inet_compat_ioctl,
  25. #endif
  26. };
UDP協議在INET層操作集inet_dgram_ops
  1. const struct proto_ops inet_dgram_ops = {
  2. .family = PF_INET,
  3. .owner = THIS_MODULE,
  4. .release = inet_release,
  5. .bind = inet_bind,
  6. .connect = inet_dgram_connect,
  7. .socketpair = sock_no_socketpair,
  8. .accept = sock_no_accept,
  9. .getname = inet_getname,
  10. .poll = udp_poll,
  11. .ioctl = inet_ioctl,
  12. .listen = sock_no_listen,
  13. .shutdown = inet_shutdown,
  14. .setsockopt = sock_common_setsockopt,
  15. .getsockopt = sock_common_getsockopt,
  16. .sendmsg = inet_sendmsg,
  17. .recvmsg = inet_recvmsg,
  18. .mmap = sock_no_mmap,
  19. .sendpage = inet_sendpage,
  20. #ifdef CONFIG_COMPAT
  21. .compat_setsockopt = compat_sock_common_setsockopt,
  22. .compat_getsockopt = compat_sock_common_getsockopt,
  23. .compat_ioctl = inet_compat_ioctl,
  24. #endif
  25. };
上面兩個操作集是屬於INET協議族層次,可以由協議族層套接字socket來管理,下面是協議族層析的套接字結構體(BSD Socket)定義:
  1. /**
  2. * struct socket - general BSD socket
  3. * @state: socket state (%SS_CONNECTED, etc)
  4. * @type: socket type (%SOCK_STREAM, etc)
  5. * @flags: socket flags (%SOCK_ASYNC_NOSPACE, etc)
  6. * @ops: protocol specific socket operations
  7. * @file: File back pointer for gc
  8. * @sk: internal networking protocol agnostic socket representation
  9. * @wq: wait queue for several uses
  10. */
  11. struct socket {
  12. socket_state state;
  13. kmemcheck_bitfield_begin(type);
  14. short type;
  15. kmemcheck_bitfield_end(type);
  16. unsigned long flags;
  17. struct socket_wq __rcu *wq;
  18. struct file *file;
  19. struct sock *sk;
  20. const struct proto_ops *ops;
  21. };
Copyright © Linux教程網 All Rights Reserved