user/include/netinet/in.h 说明

时间:2022-08-11 15:47:39
http://blog.chinaunix.net/uid-25909722-id-2779771.html

分类: LINUX

在学习了计算机网络的理论基础知识之后,如果能够对Linux下的TCP/IP实现代码进行一定的分析,将十分有利于加深对计算机网络理论的理解,同时能够使我们对网络既有理性的理解,也具有感性的认识。下面我们对Linux ubuntu 2.6.38-8-generic中的/usr/include/netinet/in.h文件结合网络理论进行一些分析。
  1. /* Standard well-defined IP protocols. */
  2. enum
  3. {
  4.     IPPROTO_IP = 0,       /* Dummy protocol for TCP. */
  5. #define IPPROTO_IP        IPPROTO_IP
  6.     IPPROTO_HOPOPTS = 0,  /* IPv6 Hop-by-Hop options. */
  7. #define IPPROTO_HOPOPTS        IPPROTO_HOPOPTS
  8.     IPPROTO_ICMP = 1,     /* Internet Control Message Protocol. */
  9. #define IPPROTO_ICMP        IPPROTO_ICMP
  10.     IPPROTO_IGMP = 2,     /* Internet Group Management Protocol. */
  11. #define IPPROTO_IGMP        IPPROTO_IGMP
  12.     IPPROTO_IPIP = 4,     /* IPIP tunnels (older KA9Q tunnels use 94). */
  13. #define IPPROTO_IPIP        IPPROTO_IPIP
  14.     IPPROTO_TCP = 6,      /* Transmission Control Protocol. */
  15. #define IPPROTO_TCP        IPPROTO_TCP
  16.     IPPROTO_EGP = 8,      /* Exterior Gateway Protocol. */
  17. #define IPPROTO_EGP        IPPROTO_EGP
  18.     IPPROTO_PUP = 12,     /* PUP protocol. */
  19. #define IPPROTO_PUP        IPPROTO_PUP
  20.     IPPROTO_UDP = 17,     /* User Datagram Protocol. */
  21. #define IPPROTO_UDP        IPPROTO_UDP
  22.     IPPROTO_IDP = 22,     /* XNS IDP protocol. */
  23. #define IPPROTO_IDP        IPPROTO_IDP
  24.     IPPROTO_TP = 29,      /* SO Transport Protocol Class 4. */
  25. #define IPPROTO_TP        IPPROTO_TP
  26.     IPPROTO_DCCP = 33,    /* Datagram Congestion Control Protocol. */
  27. #define IPPROTO_DCCP        IPPROTO_DCCP
  28.     IPPROTO_IPV6 = 41,    /* IPv6 header. */
  29. #define IPPROTO_IPV6        IPPROTO_IPV6
  30.     IPPROTO_ROUTING = 43, /* IPv6 routing header. */
  31. #define IPPROTO_ROUTING        IPPROTO_ROUTING
  32.     IPPROTO_FRAGMENT = 44/* IPv6 fragmentation header. */
  33. #define IPPROTO_FRAGMENT    IPPROTO_FRAGMENT
  34.     IPPROTO_RSVP = 46,    /* Reservation Protocol. */
  35. #define IPPROTO_RSVP        IPPROTO_RSVP
  36.     IPPROTO_GRE = 47,     /* General Routing Encapsulation. */
  37. #define IPPROTO_GRE        IPPROTO_GRE
  38.     IPPROTO_ESP = 50,     /* encapsulating security payload. */
  39. #define IPPROTO_ESP        IPPROTO_ESP
  40.     IPPROTO_AH = 51,      /* authentication header. */
  41. #define IPPROTO_AH        IPPROTO_AH
  42.     IPPROTO_ICMPV6 = 58,  /* ICMPv6. */
  43. #define IPPROTO_ICMPV6        IPPROTO_ICMPV6
  44.     IPPROTO_NONE = 59,    /* IPv6 no next header. */
  45. #define IPPROTO_NONE        IPPROTO_NONE
  46.     IPPROTO_DSTOPTS = 60, /* IPv6 destination options. */
  47. #define IPPROTO_DSTOPTS        IPPROTO_DSTOPTS
  48.     IPPROTO_MTP = 92,     /* Multicast Transport Protocol. */
  49. #define IPPROTO_MTP        IPPROTO_MTP
  50.     IPPROTO_ENCAP = 98,   /* Encapsulation Header. */
  51. #define IPPROTO_ENCAP        IPPROTO_ENCAP
  52.     IPPROTO_PIM = 103,    /* Protocol Independent Multicast. */
  53. #define IPPROTO_PIM        IPPROTO_PIM
  54.     IPPROTO_COMP = 108,   /* Compression Header Protocol. */
  55. #define IPPROTO_COMP        IPPROTO_COMP
  56.     IPPROTO_SCTP = 132,   /* Stream Control Transmission Protocol. */
  57. #define IPPROTO_SCTP        IPPROTO_SCTP
  58.     IPPROTO_UDPLITE = 136/* UDP-Lite protocol. */
  59. #define IPPROTO_UDPLITE        IPPROTO_UDPLITE
  60.     IPPROTO_RAW = 255,     /* Raw IP packets. */
  61. #define IPPROTO_RAW        IPPROTO_RAW
  62.     IPPROTO_MAX
  63. };
很显然,上面的代码定义了所以基于IP协议的一些协议的枚举。
其中为我们大多数人熟知的协议如下:
1.    IPPROTO_ICMP = 1,    /* Internet Control Message Protocol.  */
      该协议简写为ICMP,即 Internet控制报文协议,著名的ping命令就是利用该协议来实现的。
2.    IPPROTO_TCP = 6,    /* Transmission Control Protocol.  */
       TCP协议,即传输层控制协议。
3.    IPPROTO_UDP = 17,    /* User Datagram Protocol.  */
       UDP协议,即用户数据报协议。
4.    IPPROTO_MTP = 92,    /* Multicast Transport Protocol.  */
       多播传输协议。
还有它们对应的IPv6的协议。
  1. /* Type to represent a port. */
  2. typedef uint16_t in_port_t;
  3. /* Standard well-known ports. */
  4. enum
  5. {
  6.     IPPORT_ECHO = 7,           /* Echo service. */
  7.     IPPORT_DISCARD = 9,        /* Discard transmissions service. */
  8.     IPPORT_SYSTAT = 11,        /* System status service. */
  9.     IPPORT_DAYTIME = 13,       /* Time of day service. */
  10.     IPPORT_NETSTAT = 15,       /* Network status service. */
  11.     IPPORT_FTP = 21,           /* File Transfer Protocol. */
  12.     IPPORT_TELNET = 23,        /* Telnet protocol. */
  13.     IPPORT_SMTP = 25,          /* Simple Mail Transfer Protocol. */
  14.     IPPORT_TIMESERVER = 37,    /* Timeserver service. */
  15.     IPPORT_NAMESERVER = 42,    /* Domain Name Service. */
  16.     IPPORT_WHOIS = 43,         /* Internet Whois service. */
  17.     IPPORT_MTP = 57,

  18.     IPPORT_TFTP = 69,          /* Trivial File Transfer Protocol. */
  19.     IPPORT_RJE = 77,
  20.     IPPORT_FINGER = 79,        /* Finger service. */
  21.     IPPORT_TTYLINK = 87,
  22.     IPPORT_SUPDUP = 95,        /* SUPDUP protocol. */


  23.     IPPORT_EXECSERVER = 512,    /* execd service. */
  24.     IPPORT_LOGINSERVER = 513,   /* rlogind service. */
  25.     IPPORT_CMDSERVER = 514,
  26.     IPPORT_EFSSERVER = 520,

  27.     /* UDP ports. */
  28.     IPPORT_BIFFUDP = 512,
  29.     IPPORT_WHOSERVER = 513,
  30.     IPPORT_ROUTESERVER = 520,

  31.     /* Ports less than this value are reserved for privileged processes. */
  32.     IPPORT_RESERVED = 1024,

  33.     /* Ports greater this value are reserved for (non-privileged) servers. */
  34.     IPPORT_USERRESERVED = 5000
  35. };
typedef uint16_t in_port_t;定义了端口为一个16位的无符号整数。
接下来的enum定义了一些系统常用的端口号。
    IPPORT_NETSTAT = 15,        /* Network status service.  */  提供netstat命令行服务的端口号
    IPPORT_FTP = 21,        /* File Transfer Protocol.  */  FTP使用的端口号
    IPPORT_TELNET = 23,               /* Telnet protocol.  */  提供telent命令行服务的端口号
    IPPORT_SMTP = 25,        /* Simple Mail Transfer Protocol.  */ 简单邮件协议的端口号
    IPPORT_NAMESERVER = 42,     /* Domain Name Service.  */  DNS的端口号

    /* Ports less than this value are reserved for privileged processes.  */
    IPPORT_RESERVED = 1024,
所以小于1024的端口号是系统预用的端口号。
  1. /* Internet address. */
  2. typedef uint32_t in_addr_t;
  3. struct in_addr
  4. {
  5.     in_addr_t s_addr;
  6. };
上面的结构定义了IP地址,为一个32位的无符号整数。
  1. /* Definitions of the bits in an Internet address integer.
  2.    On subnets, host and network parts are found according to
  3.    the subnet mask, not these masks. 
  4. */
  5. #define    IN_CLASSA(a)        ((((in_addr_t)(a)) & 0x80000000) == 0)
  6. #define    IN_CLASSA_NET        0xff000000
  7. #define    IN_CLASSA_NSHIFT    24
  8. #define    IN_CLASSA_HOST        (0xffffffff & ~IN_CLASSA_NET)
  9. #define    IN_CLASSA_MAX        128

  10. #define    IN_CLASSB(a)        ((((in_addr_t)(a)) & 0xc0000000) == 0x80000000)
  11. #define    IN_CLASSB_NET        0xffff0000
  12. #define    IN_CLASSB_NSHIFT    16
  13. #define    IN_CLASSB_HOST        (0xffffffff & ~IN_CLASSB_NET)
  14. #define    IN_CLASSB_MAX        65536

  15. #define    IN_CLASSC(a)        ((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
  16. #define    IN_CLASSC_NET        0xffffff00
  17. #define    IN_CLASSC_NSHIFT    8
  18. #define    IN_CLASSC_HOST        (0xffffffff & ~IN_CLASSC_NET)

  19. #define    IN_CLASSD(a)        ((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)
  20. #define    IN_MULTICAST(a)        IN_CLASSD(a)

  21. #define    IN_EXPERIMENTAL(a)    ((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)
  22. #define    IN_BADCLASS(a)        ((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)

  23. /* Address to accept any incoming messages. */
  24. #define    INADDR_ANY        ((in_addr_t) 0x00000000)
  25. /* Address to send to all hosts. */
  26. #define    INADDR_BROADCAST    ((in_addr_t) 0xffffffff)
  27. /* Address indicating an error return. */
  28. #define    INADDR_NONE        ((in_addr_t) 0xffffffff)

  29. /* Network number for local host loopback. */
  30. #define    IN_LOOPBACKNET        127
  31. /* Address to loopback in software to local host. */
  32. #ifndef INADDR_LOOPBACK
  33. # define INADDR_LOOPBACK    ((in_addr_t) 0x7f000001) /* Inet 127.0.0.1. */
  34. #endif

  35. /* Defines for Multicast INADDR. */
  36. #define INADDR_UNSPEC_GROUP    ((in_addr_t) 0xe0000000) /* 224.0.0.*/
  37. #define INADDR_ALLHOSTS_GROUP    ((in_addr_t) 0xe0000001) /* 224.0.0.*/
  38. #define INADDR_ALLRTRS_GROUP ((in_addr_t) 0xe0000002) /* 224.0.0.*/
  39. #define INADDR_MAX_LOCAL_GROUP ((in_addr_t) 0xe00000ff) /* 224.0.0.255 */
#define IN_CLASSA(a)              ((((in_addr_t)(a)) & 0x80000000) == 0)
#define IN_CLASSB(a) ((((in_addr_t)(a)) & 0xc0000000) == 0x80000000)
#define IN_CLASSC(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
#define IN_CLASSD(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)

#define IN_EXPERIMENTAL(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)
#define IN_BADCLASS(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)

该宏用于判断一个IP地址是否是一个A类地址,因为我们知道:
A类地址的最高位为:0
B类地址的最高位为:10
C类地址的最高位为:110
D类地址的最高位为:1110
这几个宏分别:
提起IP地址的最高1位,如果最高位是0,则是A类IP地址
提起IP地址的最高2位,如果最高2位是10,则是B类IP地址
提起IP地址的最高3位,如果最高3位是110,则是C类IP地址
提起IP地址的最高4位,如果最高4位是1110,则是D类IP地址

#define IN_CLASSA_NET 0xff000000
用于提起A类IP地址的网络地址部分。
#define IN_CLASSA_NSHIFT 24
定义了A类IP地址的网络地址部分开始的偏移为24.(24--31位)
#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET)
用于提起A类IP地址的主机地址部分。
#define IN_CLASSA_MAX 128
定义了A类IP地址允许有128个子网(2的7次方等于128)。
其他关于B、C、D类地址的相关定义类似。

/* Address to accept any incoming messages.  */
#define INADDR_ANY ((in_addr_t) 0x00000000)
该宏定义的IP地址可以接收所有发送过来的数据包。

/* Address to send to all hosts.  */
#define INADDR_BROADCAST ((in_addr_t) 0xffffffff)
该宏定义了“有限广播地址”或者称为“本地网广播地址”,它用于在 本地子网中进行广播。因为它的32位全部为1,所以它不可能去表示一个IP地址的网络地址部分,所以它只能用于本地子网进行广播。我们还有另外一种广播形式成为“定向广播”,它由某个Internate子网的网络部分加上全1的主机地址组成,可以用于定向向该Internate子网中的所有的主机进行广播,因为它可以指定向某个子网进行广播,所以叫“定向广播”。

/* Network number for local host loopback.  */
#define IN_LOOPBACKNET 127
定义了本地回网的 网络地址部分。

/* Address to loopback in software to local host.  */
#ifndef INADDR_LOOPBACK
# define INADDR_LOOPBACK ((in_addr_t) 0x7f000001) /* Inet 127.0.0.1.  */
#endif
定义了本地回网的IP地址。

/* Defines for Multicast INADDR.  */
#define INADDR_UNSPEC_GROUP ((in_addr_t) 0xe0000000) /* 224.0.0.0 */
#define INADDR_ALLHOSTS_GROUP ((in_addr_t) 0xe0000001) /* 224.0.0.1 */
#define INADDR_ALLRTRS_GROUP    ((in_addr_t) 0xe0000002) /* 224.0.0.2 */
#define INADDR_MAX_LOCAL_GROUP  ((in_addr_t) 0xe00000ff) /* 224.0.0.255 */
这些宏定义了相关的组播地址。

#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46
定义了IPv4的IP地址的长度为16个字节,IPv6的IP地址长度为46字节。
  1. /* Structure describing an Internet socket address. */
  2. struct sockaddr_in
  3. {
  4.     __SOCKADDR_COMMON (sin_);
  5.     in_port_t sin_port;             /* Port number. */
  6.     struct in_addr sin_addr;        /* Internet address. */

  7.     /* Pad to size of `struct sockaddr'. */
  8.     unsigned char sin_zero[sizeof (struct sockaddr) -
  9.              __SOCKADDR_COMMON_SIZE -
  10.              sizeof (in_port_t) -
  11.              sizeof (struct in_addr)];
  12. };
定义了表示IP地址的结构体。显然该结构体的大小和struct sockaddr的大小一样。
  1. /* IPv4 multicast request. */
  2. struct ip_mreq
  3. {
  4.     /* IP multicast address of group. */
  5.     struct in_addr imr_multiaddr;

  6.     /* Local IP address of interface. */
  7.     struct in_addr imr_interface;
  8. };

  9. struct ip_mreq_source
  10. {
  11.     /* IP multicast address of group. */
  12.     struct in_addr imr_multiaddr;

  13.     /* IP address of source. */
  14.     struct in_addr imr_interface;

  15.     /* IP address of interface. */
  16.     struct in_addr imr_sourceaddr;
  17. };
定义了组播相关的结构体。