域名系统

域名系统(DNS)

DNS 中的条目称为资源记录(RR)

  • A 记录 把一个主机名映射成一个32位的IPv4 地址
  • AAAA 称为“四A”,是映射到一个128位的IPv6
  • PTR 称为“指针记录”的PTR记录把IP地址映射成主机名,对IPv4地址,32位地址的4个字节先反转顺序,每个字节都转换成各自的十进制ASCII,再添上in-addr.arpa,结果字符串用于PTR查询
  • MX MX记录把一个主机指定作为给定主机的“邮件交换器” 当存在多个MX记录时,我们按照优先级顺序使用,值越小优先级越高
  • CNAME 规范名字,它的常见用法是为了常用的服务指派CANME记录

c库代码

#include 
struct hostent * gethostbyname(const char *hostname);  // 把主机名映射成IPv4地址
struct hostent {
  char *h_name;
  char ** h_aliases;
  int h_addrtype;
  int h_length;
  char ** h_addr_list;
}
struct hostent * gethostbyaddr(const char *addr, socklen_t len, int family)  // 把IPv4地址转换为主机名
// 根据服务名字查询端口
struct servent {
  char *s_name,
  char **s_aliases,
  int s_port,
  char *s_proto 
}
struct servent * getservbyname(const char *servname, const char *protoname);
struct servent * getservbyport(int port, const char * protoname);
// ipv6 的地址
struct addrinfo {
  int ai_flags;
  int ai_family;
  int ai_socktype;
  int ai_protocol;
  socklen_t ai_addrlen;
  char *ai_canonname;
  struct sockaddr * ai_addr;
  struct addrinfo *ai_next;
}
int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo, **result);
int getnameinfo(const struct sockaddr *sockaddr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags)
const char * gai_strerror(int error); // 解析getaddrinfo的错误返回码
void freeaddrinfo(struct addrinfo *al); //  getaddrinfo返回的addrinfo 都是动态返回的

LINUX 系统主机

文件/etc/resolv.conf通常包含本地名字服务器主机的IP地址

不可重入函数

gethostbyname
gethostbyaddr
getservbyname
getservbyport
// 上述4个函数不可重入,它们都返回指向同一个静态结构的指针
// 为了支持4个函数的可重入版本,名字都是以_r结尾
inet_pton
inet_ntop 
// 是可重入的
inet_ntoa // 不可重入

函数图文结构

信息 数据文件 结构 键值查找函数
主机 /etc/hosts/ hostent gethostbyaddr、gethostbyname
网络 /etc/networks netent getnetbyaddr、getnetbyname
协议 /etc/protocols protoent getprotobyname、getprotobynumber
服务 /etc/services servent getservbyname、getservbyport

你可能感兴趣的:(域名系统)