EECS122 Communications Networks Socket Programming January 30th, 2003 Jörn Altmann
EECS122 - UCB2 Questions that will be Addressed During the Lecture What mechanisms are available for a programmer who writes network applications? How to write a network application that sends packets between hosts (client and server) across an IP network? Client Server IP Network
EECS122 - UCB3 EE122 Projects – S03 First assignment: – Implement the client side of an client-server architecture (C programming) – Handle exceptions in the communication – Measure performance of the network and the server
EECS122 - UCB4 Socket Programming Table of Contents 1. Network Application Programming Interface: Sockets and Internet Sockets Network Application Programming Interface 2. Network Programming Tips Network Programming Tips 3. Client-Server Architecture Client-Server Architecture 4. Example: Client Programming Example: Client Programming 5. Example: Server Programming Example: Server Programming 6. Network Programmer’s Mistakes Network Programmer’s Mistakes
EECS122 - UCB5 Layers of the IP Protocol Suite Link Layer Transport Layer Network Layer Application Layer Link Layer Transport Layer Network Layer Application Layer Ethernet e.g. ftp e.g. TCP, UDP e.g. IP
EECS122 - UCB6 Protocol Suite Location Internet Protocol Layer Link Layer Transport Layer (TCP, UDP) Network Layer (IP) Application Layer Network Card & Device Driver (e.g. Ethernet card) Operating System (e.g. Unix) Applications (e.g. browser, game, ftp) Application Programming Interface (API) (e.g. network API) Interface to the Network Card Location
EECS122 - UCB7 Network API Operating system provides Application Programming Interface (API) for network application API is defined by a set of function types, data structures, and constants Desirable characteristics of the network interface Simple to use Flexible independent from any application allows program to use all functionality of the network Standardized allows programmer to learn once, write anywhere Application Programming Interface for networks is called socket
EECS122 - UCB8 Sockets Sockets provide mechanisms to communicate between computers across a network There are different kind of sockets DARPA Internet addresses (Internet Sockets) Unix interprocess communication (Unix Sockets) CCITT X.25 addresses and many others Berkeley sockets is the most popular Internet Socket runs on Linux, FreeBSD, OS X, Windows fed by the popularity of TCP/IP
EECS122 - UCB9 Internet Sockets Support stream and datagram packets (e.g. TCP, UDP, IP) Is Similar to UNIX file I/O API ( provides a file descriptor) Based on C, single thread model does not require multiple threads
EECS122 - UCB10 Types of Internet Sockets Different types of sockets implement different communication types (stream vs. datagram) Type of socket: stream socket connection-oriented two way communication reliable (error free), in order delivery can use the Transmission Control Protocol (TCP) e.g. telnet, ssh, http Type of socket: datagram socket connectionless, does not maintain an open connection, each packet is independent can use the User Datagram Protocol (UDP) e.g. IP telephony Other types exist: similar to the one above
EECS122 - UCB11 Network Programming Tips Byte Ordering Naming Addressing
EECS122 - UCB12 Byte Ordering of Integers Different CPU architectures have different byte ordering D3 high-order bytelow-order byte memory address A memory address A +1 Stored at little-endian computer Stored at big-endian computer low-order bytehigh-order byte F2 Integer representation (2 byte)
EECS122 - UCB13 Message in Memory of of big-endian Computer Message is sent across Network C 4C 6F Byte Ordering Problem Question: What would happen if two computers with different integer byte ordering communicate? Message is: [Hello,1] Message is: [Hello,512] Processing C 4C 6F Message in Memory of little-endian Computer Processing Answer: Nothing if they do not exchange integers! But: If they exchange integers, they would get the wrong order of bytes, therefore, the wrong value! Example:
EECS122 - UCB14 Byte Ordering Solution There are two solutions if computers with different byte ordering system want to communicate They must know the kind of architecture of the sending computer (bad solution, it has not been implemented) Introduction of a network byte order. The functions are: uint16_t htons(uint16_t host16bitvalue) uint32_t htonl(uint32_t host32bitvalue) uint16_t ntohs(uint16_t net16bitvalue) uint32_t ntohs(uint32_t net32bitvalue) Note: use for all integers (short and long), which are sent across the network Including port numbers But not for IP addresses
EECS122 - UCB15 Network Programming Tips Byte Ordering Naming Addressing
EECS122 - UCB16 Naming and Addressing Host name identifies a single host (see Domain Name System slides) variable length string (e.g. is mapped to one or more IP addresses IP Address 32 bits (not a number!) written as dotted octets (e.g ) Port number identifies an application on a host 16 bit number
EECS122 - UCB17 Client-Server Architecture Client requests service from server Server responds with sending service or error message to client Example: Remote Procedure Call ClientServer request response
EECS122 - UCB18 Simple Client-Server Example ClientServer request response socket() connect() send() recv() close() socket() bind() listen() accept() recv() send() recv() close() Connection establishment Data response Data request End-of-file notification
EECS122 - UCB19 Example: Client Programming Create stream socket ( socket() ) Connect to server ( connect() ) While still connected: send message to server (send() ) receive (recv() ) data from server and process it
EECS122 - UCB20 Initializing Socket Getting the file descriptor int chat_sock; if ((chat_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("socket"); printf("Failed to create socket\n"); abort (); } 1.parameter specifies protocol/address family 2.parameter specifies the communication type 3.parameter specifies the protocol
EECS122 - UCB21 Connecting to Server struct sockaddr_in sin; struct hostent *host = gethostbyname (argv[1]); unsigned int server_address = *(unsigned long *) host->h_addr_list[0]; unsigned short server_port = atoi (argv[2]); memset (&sin, 0, sizeof (sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = server_address; sin.sin_port = htons (server_port); if (connect(chat_sock, (struct sockaddr *) &sin, sizeof (sin)) < 0) { perror("connect"); printf("Cannot connect to server\n"); abort(); }
EECS122 - UCB22 Sending Packets int send_packets(char *buffer, int buffer_len) { sent_bytes = send(chat_sock, buffer, buffer_len, 0); if (send_bytes < 0) { perror (“send"); } return 0; } Needs socket descriptor, Buffer containing the message, and Length of the message
EECS122 - UCB23 Receiving Packets: Separating Data in a Stream Use records (data structures) to partition the data stream B Fixed length record 013 C Variable length record C2 Variable length record 5 D 9687 D A
EECS122 - UCB24 Receiving Packets int receive_packets(char *buffer, int buffer_len, int *bytes_read) { int left = buffer_len - *bytes_read; received = recv(chat_sock, buffer + *bytes_read, left, 0); if (received < 0) { perror (“recv"); } if (received <= 0) { return close_connection(); } *bytes_read += received; while (*bytes_read > RECORD_LEN) { process_packet(buffer, RECORD_LEN); *bytes_read -= RECORD_LEN; memmove(buffer, buffer + RECORD_LEN, *bytes_read); } return 0; }
EECS122 - UCB25 Example: Server Programming create stream socket ( socket() ) Bind port to socket ( bind() ) Listen for new client ( listen() ) Wait ( select() ) until user connects (accept() ) data arrives from client (recv() ) data has to be send to client (send() ) timeout (select() )
EECS122 - UCB26 I/O Multiplexing using select() waits on multiple file descriptors and timeout returns when any file descriptor is ready to be read or written or indicate an error, or timeout exceeded advantages simple application does not consume CPU cycles while waiting disadvantages does not scale to large number of file descriptors
EECS122 - UCB27 Network Programmer’s Mistakes byte ordering separating records in streams use of select() misinterpreting the project specification not knowing all available system calls
EECS122 - UCB28 There are more System Calls Depends on communication type Datagram sockets use recvfrom() and sendto() for receiving and sending data Closing connection: close(), shutdown() Getting information about a host: gethostbyname()
EECS122 - UCB29 Literature Unix Network Programming, volumes 1 and 2 by W. Richard Stevens. Published by Prentice Hall; ISBNs for volumes 1 and 2: X, Advanced Programming in the Unix Environment by W. Richard Stevens. Published by Addison Wesley. ISBN man pages on a Unix computer
EECS122 - UCB30 The End
EECS122 - UCB31 EECS Syllabus 1. Logistics; Goals; Themes; Outline; Introduction 2. Examples of Network Applications/Design 3. Internet Architecture 4. Socket Programming 5. Network Performance Metrics; ns 6. DNS and WWW 7. Transport Protocols: UDP and TCP 8. Congestion Control and Avoidance 9. Congestion Control and Avoidance(cont) 10. Intradomain Routing: Distance Vector; Link State 11. Interdomain Routing: BGP 12. Switching and Forwarding; Router Architecture 13. Packet Scheduling and Classification 14. Router Support for Congestion Control: RED and FQ 15. Midterm Exam
EECS122 - UCB32 I/O Multiplexing (1) while (1) { if (receive_packets(buffer, buffer_len, &bytes_read) != 0) { break; } if (read_user(user_buffer, user_buffer_len, &user_bytes_read) != 0) { break; }
EECS122 - UCB33 I/O Multiplexing (2): Non- blocking int opts = fcntl (chat_sock, F_GETFL); if (opts < 0) { perror ("fcntl(F_GETFL)"); abort (); } opts = (opts | O_NONBLOCK); if (fcntl (chat_sock, F_SETFL, opts) < 0) { perror ("fcntl(F_SETFL)"); abort (); } while (1) { if (receive_packets(buffer, buffer_len, &bytes_read) != 0) { break; } if (read_user(user_buffer, user_buffer_len, &user_bytes_read) != 0) { break; }
EECS122 - UCB34 I/O Multiplexing (3): select() // already set descriptors non-blocking fd_set read_set; while (1) { FD_ZERO (read_set); FD_SET (stdin, read_set); FD_SET (chat_sock, read_set); select_retval = select(MAX(stdin, chat_sock) + 1, &read_set, NULL, NULL, &time_out); if (select_retval < 0) { perror ("select"); abort (); } if (select_retval > 0) { if (FD_ISSET(chat_sock, read_set)) { if (receive_packets(buffer, buffer_len, &bytes_read) != 0) { break; } if (FD_ISSET(stdin, read_set)) { if (read_user(user_buffer, user_buffer_len, &user_bytes_read) != 0) { break; }
EECS122 - UCB35 Other I/O Models Signal driven application notified when I/O operation can be initiated achieves similar CPU efficiency as select() Asynchronous application notified when I/O operation is completed can achieve higher CPU efficiency than select()/signals on architectures that have DMA and available system bus bandwidth mainly useful for very high bandwidth I/O Both add significant complexity relative to select() must use locks to deal with being interrupted at arbitrary code locations sample complexity cost as threads