130 likes | 262 Vues
In this lecture of Advanced UNIX Programming, we explore key networking concepts including socket options, the distinction between TCP and UDP, and the intricacies of the Domain Name System (DNS). Key functions such as `gethostbyname`, `gethostbyaddr`, and `getservbyname` are discussed, along with the hierarchical structure of DNS and how names serve to abstract IP addresses. Enhancements like caching and resource record types such as A, AAAA, MX, and CNAME are also introduced, providing students with a comprehensive understanding of networking in UNIX systems.
E N D
Advanced UNIX programming Fall 2002 Instructor: Ashok Srinivasan Lecture 25 Acknowledgements: The syllabus and power point presentations are modified versions of those by T. Baker and X. Yuan
Announcements • Reading assignment • Chapter 9 • Sections 9.1 to 9.9 • Midterm Monday • Clarifications on project and HW3 • Midterm review
Week 9 Topics • Socket options • getsockopt, setsockopt • fcntl • ioctl • Introduction to UDP • TCP vs UDP • UDP interface
Week 9 Topics ... continued • Name and address conversions • Domain name system • gethostbyname • gethostbyaddr • uname • gethostname • getservbyname • getservbyport
Name and address conversions • Names are easier to use • Names add a layer of indirection • Numeric addresses can be changed without modifying the name • A program can be more portable by using a name • The mapping between hostnames and IP addresses is done by the domain name system (DNS)
Domain name system • Mapping between names and addresses • xi.cs.fsu.edu <--> 128.186.121.41 • References • See http://www.internic.net/faqs/authoritative-dns.html for information on • DNS organization • Why they should be the sole authority!
Domain name system ... continued • Hierarchical naming scheme • Name space partitioned into subdomains • Top level of domains • .com, .edu, .gov, .org, .us, .ca, .in, etc • Each domain can have subdomains • Distributed delegation of naming authority • Each domain has the authority to allow names within that domain • Naming follows organization boundary not physical network boundary
Resource records • Each server keeps resource records (RRs) • Information • IP address, record type, name, etc • Some relevant RR types • A : Maps a hostname to an IPv4 address • AAAA: Maps a hostname to an IPv6 address • PTR: Pointer records, map IP addresses to hostnames • MX: Mail exchanger for a host • CNAME: Canonical name • Used to assign CNAME records for common services
Name servers • Name server • When a name server receives a DNS request, if the server is the authority for the name, it finds the resource record and replies • Otherwise it recursively asks the next level • Example: gethostbyname(“www.cs.yale.edu”) xi.cs.fsu.edu ---> cs.fsu.edu --> edu --> yale.edu -->cs.yale.edu -->yale.edu-->edu -->cs.fsu.edu-->xi.cs.fsu.edu • Optimizations • Replication and caching
gethostbyname #include <netdb.h> struct hostent *gethostbyname(const char *hostname) struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; }; • This function queries A or AAAA records
gethostbyaddr #include <netdb.h> struct hostent *gethostbyaddr(const char *addr, size_t len, int family) • addr is a pointer to an in_addr structure • len = 4 for IPv4 and 16 for IPv6 • This function queries PTR records • See example1.c and example2.c • These two system calls incur significant communication overhead • You can observe this in example1a.c
uname and gethostbyname • Information on name, os, and hardware • #include <sys/utsname.h> int uname (struct utsname *name) struct utsname { char sysname[_UTS_NAMESIZE]; char nodename[_UTS_NODESIZE]; char release[_UTS_NAMESIZE]; char version[_UTS_NAMESIZE]; char machine[_UTS_NAMESIZE]; } • See example2.c • gethostbyname can be used to get host name
getservbyname and getservbyport • Get service information • Not querying the DNS, but a system specific file, for example /etc/services #include <netdb.h> struct servent *getservbyname(const char *servname, const char *protoname); struct servent *getservbyport(int port, const char*protoname); struct servent { char *s_name; char** s_aliases; int s_port; char *s_proto; } • See example3.c and example4.c