� � � � � � � � � � 308-435B TCP/IP programming Juan de Lara, Hans Vangheluwe McGill University Winter Term 2001 Resources 1. Request For Comments (RFC): structured overview TCP/IP related RFCs: http://www.webzone.net/machadospage/RFC.html complete overview (with search): http://www.faqs.org/rfcs/ example RFCs: the Transport Control Protocol (TCP) RFC 793: rfc793.txt the User Datagram Protocol (UDP) RFC 768: rfc768.txt 2. man pages: the Single UNIX specification (searchable): http://www.opengroup.org/onlinepubs/7908799/index.html man on local machine 3. books: UNIX network programming, Volume 1: Networking APIs: Sockets and XTI Richard Stevens, Prentice Hall, 1998, 2nd Edition. This text is mostly based on the above book and its earlier edition. Network Layers Divide-and-conquer: network layers. 7 layer OSI (Open Systems Interconnection) model (later than TCP/IP): 1. Physical: transmission of bit streams over physical medium. 2. Data Link: adds reliability services to physical layer. 3. Network: source-to-destination delivery across multiple networks. 4. Transport: source-to-destination delivery of entire message. 5. Session: network dialog controller. 6. Presentation: syntax and semantics of exchangedinformation. 7. Application: user access to the network. 1
� � � ✁ � � � � � � � � � � � � Protocols at each level. TCP/IP model: 1. Physical. 2. Data Link. 3. Network: Internetworking Protocol (IP) ICMP (Internet Control Message Protocol) IGMP (Internet Group Message Protocol) ARP (Address Resolution Protocol) RARP (Reverse Address Resolution Protocol) 4. Transport: Transmission Control Protocol (TCP) User Datagram Protocol (UDP) Communication (API) between Application and Transport layer: sockets . 5. Application: OSI’s Session, Presentation, Application. FTP (File Transport Protocol) (TCP) TFTP (Trivial File Transfer Protocol) (UDP) TELNET (remote login) SMTP (Simple Mail Transfer Protocol) . . . Common architecture: client-server . TCP/IP protocol suite 1980s: standard for the ARPANET and associated DoD networks 1987: protocol for communication in the NSFNET (supercomputers) 2
� � � � � � � � � � � � � � � � � � � � � � ✂ � � � � � � � � � now: protocol the ”Internet”. Characteristics of the protocol suite : not vendor-specific implemented on almost all platforms used for both local and wide area networks wide use thanks to inclusion in the BSD Unix system around 1982. User interaction with the TCP/IP protocol suite: IP is not accessed directly. unreliable connectionless no error checking or tracking data transported in packets called datagrams , transported separately may travel along different routes can arrive out of sequence may be duplicated UDP/IP: unreliable connectionless IP + port numbers length optional checksum for verification TCP/IP: reliable (checksums, positive acknowledgements, timeouts) connection-oriented (establish - transmission - terminate) full-duplex (end-to-end flow control) byte-stream service (sequencing) Internet addesses uniquely identify networks and computers addressing is protocol-specific IP (internet address): 32 bits, encoding network ID and host ID. Related to but not the same as symbolic “domain” names such as www.cs.mcgill.ca. Number of recipients: unicast address: single recipient multicast address: group of recipients broadcast address: all the host in the network (255.255.255.255) 3
✄ ✂ Format classes (later): written as 4 dot-separated decimal numbers ( e.g., 132.206.51.10). Usually At tranport layer: add a port number (a 16-bit integer) identify communicating processes in host. TCP and UDP define well-known addresses (port numbers) for well-known services . In /etc/services: daytime 13/tcp daytime 13/udp netstat 15/tcp qotd 17/tcp quote msp 18/tcp # message send protocol msp 18/udp # message send protocol chargen 19/tcp ttytst source chargen 19/udp ttytst source ftp-data 20/tcp ftp 21/tcp fsp 21/udp fspd ssh 22/tcp # SSH Remote Login Protocol ssh 22/udp # SSH Remote Login Protocol telnet 23/tcp # 24 - private smtp 25/tcp mail Communicate with sendmail process on smtp (25) port on localhost: telnet localhost smtp Check active internet connections: hv@lookfar 59% netstat --inet -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 HSE-Montreal-ppp34:1023 mimi.CS.McGill.CA:ssh ESTABLISHED tcp 0 0 *:X *:* LISTEN tcp 0 0 *:www *:* LISTEN tcp 0 0 *:https *:* LISTEN tcp 0 0 *:587 *:* LISTEN tcp 0 0 *:smtp *:* LISTEN tcp 0 0 *:printer *:* LISTEN tcp 0 0 *:ssh *:* LISTEN tcp 0 0 *:finger *:* LISTEN raw 0 0 *:icmp *:* 7 raw 0 0 *:tcp *:* 7 4
� � � � � � � � socket addresses socket = API to network services UNIX: I/O by read/write from/to a file descriptor. file descriptor = integer associated with an open file open file can be a network connection, a FIFO, a pipe, a terminal, , etc. invoke socket() to get a socket types of sockets: DARPA Internet addresses (Internet Sockets), path names on a local node (Unix Sock- ets), CCITT X.25 addresses, , etc. The socket address structure (in <sys/socket.h> ) struct sockaddr { u_short sa_family; /* address family: AF_XXX value */ char sa_data[14]; /* up to 14 bytes of protocol-specific address */ }; sa_family : address family ( AF_INET ) sa_data : interpretation depends on the address family. In case of the Internet family: destination address and socket port number. Easy to fill in using (in <netinet/in.h> ): struct in_addr { u_long s_addr; /* 32-bit address, in network byte order */ }; struct sockaddr_in { short sin_family; /* AF_INET */ u_short sin_port; /* 16-bit port number, in network byte order */ struct in_addr sin_addr; /* 32-bit address, in network byte order */ char sin_zero[8]; /* unused */ }; u_short and u_long are defined in <sys/types.h> . For some API calls, an explicit cast from struct sockaddr_in * to (struct sockaddr *) in needed. sin_zero (padding the structure to the length of struct sockaddr ) must be set to all zeros ( e.g., with memset() ). Network and Host byte orders Difference in storage order of integers’ bytes on different machine architectures. For example a 16-bit integer, made up of 2 bytes can be stored in two different ways: 5
� � � � � ☎ � Little (low) endian: stores the low-order byte at the starting address. Big (high) endian: the high-order byte is stored at the staring address. Note: this does not apply to character strings. For networking: network byte order . Conversion routines: #include <sys/types.h> #include <netinet/in.h> u_long htonl (u_long hostlong); u_short htons (u_short hostshort); u_long ntohl (u_long netlong); u_short ntohs (u_short netshoert); h stands for host n stands for network l stands for long s stands for short sin_addr and sin_port fields must be in Network Byte Order as they get encapsulated in the packet at the IP and UDP layers, respectively. sin_family is only used by the kernel to determine what type of address the structure contains, so it must be in Host Byte Order. It is not sent over the network. Address convertion routines An Internet address is usually written in the dotted-decimal format ( e.g., , 10.12.110.57 ). Conversion between dotted-decimal format (a string) and a in_addr structure: #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> unsigned long inet_addr(char * ptr); char * inet_ntoa(struct in_addr inaddr); inet_addr() converts a character string in dotted-decimal notation to a 32-bit Internet address (in Network Byte Order). It returns -1 on error. Beware ! -1 corresponds to the IP address 255.255.255.255, the broadcast address. Example: convert the IP address ”10.12.110.57” and store it ina.sin_addr.s_addr = inet_addr("10.12.110.57"); if ( ina.sin_addr.s_addr == -1 ) /* error */ { ... /* error handling */ } 6
� � � � � � Remarks: inet_ntoa() takes a struct in_addr as argument, not a long . inet_ntoa() returns a char * pointing to a statically stored char array inside inet_ntoa() . The string will be overwritten at each call: char *a1, *a2; . . a1 = inet_ntoa(ina1.sin_addr); // assume this holds 192.168.4.14 a2 = inet_ntoa(ina2.sin_addr); // assume this holds 10.12.110.57 printf("address 1: %s\n",a1); printf("address 2: %s\n",a2); will print address 1: 10.12.110.57 address 2: 10.12.110.57 Elementary Socket System Calls: socket() Invoke socket() to specify the type of communication protocol desired (TCP, UDP , etc. ). #include <sys/types.h> #include <sys/socket.h> int socket(int family, int type, int protocol); family is set to AF_INET type is SOCK_STREAM for TCP and SOCK_DGRAM for UDP. socket() returns a socket descriptor that can be used in later system calls, or -1 on error. Global variable errno is set to the error’s value (use perror() to print msg). TCP client/server architecture Typical sequence of system calls to implement TCP clients and servers. Server Client socket() | V bind() | 7
Recommend
More recommend