User Datagram Protocol An initial look at using the UDP transport protocol for sending and receiving network packets
The Client/Server Paradigm A great many network applications employ this asymmetrical program-design idea: server application runs on station A time client application runs on station B request response
The sockets API for server server struct sockaddr_insaddr = {0}; intsalen = sizeof( saddr ); saddr.sin_family = AF_INET; saddr.sin_port = htons( port ); saddr.sin_addr = htonl( INADDR_ANY ); sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); bind( sock, (sockaddr*)&saddr, salen ); struct sockaddr_inpeer = {0}; intplen = sizeof( peer ); charbuf[ BUFSIZ ] = {0}; recvfrom( sock, buf, BUFSIZ, 0, (sockaddr*)&peer, &plen ); sendto( sock, buf, BUFSIZ, 0, (sockaddr*)&peer, plen ); close( sock );
The sockets API for client client struct hostent*pp = gethostbyname( peername, NLEN ); struct sockaddr_inpeer = {0}; intplen = sizeof( peer ); peer.sin_family = AF_INET; peer.sin_port = htons( port ); peer.sin_addr.s_addr = *(uint32_t*)pp->h_addr; sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); charmsg[ MSGSIZ ] = “Hello, world! \n”; sendto( sock, msg, MSGSIZ, 0, (sockaddr*)&peer, plen ); charbuf[ BUFSIZ ] = {0}; recvfrom( sock, buf, BUFSIZ, 0, (sockaddr*)&peer, &plen ); close( sock );
‘udpserver.cpp’ and ‘udpclient.cpp’ This pair of network application-programs provides us with a simple illustration of the basic paradigm: –First, launch ‘udpserver’ on station A –Then launch ‘udpclient’ on station B We can watch the ethernet frames being sent and received using our ‘nicwatch’
The packet format Ethernet Frame Header Internet Protocol Header UDP Header application’s message This message is written to the socket by the application This header is added by the transport layer This header is added by the network layer This header is added by the link layer
The UDP header Source portDestination port UDP ChecksumUDP Length 32 bits The UDP Length field is the total number of bytes of data, plus the 8 bytes that comprise this UDP Header structure The UDP Checksum field is computed using an algorithm based upon ones-complement addition of the 16-bit words in the entire UDP segment (its data and its header), along with an extra structure known as the UDP Pseudo-Header
The IP header Time-to-Live Header Checksum Source IP-address Destination IP-address IdentificationFragment offset Header length Total Length (in bytes) Type of Service IP version Protocol ID-number DM 32 bits Options
The Frame header Destination MAC-address (6 bytes) Source MAC-address (6 bytes) Type/Length (2 bytes ) 14 bytes The unique hardware-address for the network interface which should receive this packet The unique hardware-address for the network interface which is transmitting this packet An integer which describes the type of this packet, or its length in bytes Used for ‘filtering’ packets that are not intended for a particular host interface Needed when sending back replies to requests, and for error-notifications
Algorithm # Rough idea for a simplified ‘traceroute’ algorithm intttl = 1; do{ send UDP message toward host using ttl; receive response from router or from host; if ‘Resource temporarily unavailable’, break; if ‘No route to Host’, then show who sent it; } while ( ++ttl < 30 ); Implementing this basic ‘traceroute’ algorithm would require us to modify the value of the ‘Time-to-Live’ field in an outgoing packet’s IP-header, but doing that directly is prohibited by our lack of access to kernel data
Using ‘setsockopt()’ There is a socket-option at the IP-Level which allows an application program to adjust the ‘Time-to-Live’ value assigned to any outgoing UDP packet’s IP header unsigned charttl = 5;// maximum of five ‘hops’ inttlen = sizeof( ttl );// length of the option data if ( setsockopt( sock, SOL_IP, IP_TTL, &ttl, tlen ) < 0 ) { perror( “setsockopt TTL” ); exit(1); }
Demo: ‘tweakttl.cpp’ This program allows a user to specify the destination hostname, the port-number, and the desired ‘Time-to-Live’ value For example: $./tweakttl stargate You can watch the outgoing packet, and any ICPM reply-message, with ‘nicwatch’