Title: User Datagram Protocol
1User Datagram Protocol
- An initial look at using the UDP transport
protocol for sending and receiving network
packets
2The Client/Server Paradigm
- A great many network applications employ this
asymmetrical program-design idea
client application runs on station B
server application runs on station A
request
time
response
3The sockets API for server
struct sockaddr_in saddr 0 int salen
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_in peer 0 int plen sizeof( peer
) char buf BUFSIZ 0 recvfrom( sock,
buf, BUFSIZ, 0, (sockaddr)peer, plen )
sendto( sock, buf, BUFSIZ, 0, (sockaddr)peer,
plen ) close( sock )
server
4The sockets API for client
struct hostent pp gethostbyname( peername,
NLEN ) struct sockaddr_in peer 0
int plen sizeof( peer ) peer.sin_family
AF_INET peer.sin_port htons( port )
peer.sin_addr.s_addr (uint32_t)pp-gth_addr
sock socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP
) char msg MSGSIZ Hello, world! \n
sendto( sock, msg, MSGSIZ, 0, (sockaddr)peer,
plen ) char buf BUFSIZ 0 recvfrom(
sock, buf, BUFSIZ, 0, (sockaddr)peer, plen )
close( sock )
client
5udpserver.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
6The packet format
Ethernet Frame Header
Internet Protocol Header
UDP Header
applications 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
7The UDP header
32 bits
Source port
Destination port
UDP Checksum
UDP Length
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
8The IP header
32 bits
Header length
Total Length (in bytes)
Type of Service
IP version
Identification
Fragment offset
D
M
Time-to-Live
Header Checksum
Protocol ID-number
Source IP-address
Destination IP-address
Options
9The Frame header
14 bytes
Destination MAC-address (6 bytes)
Source MAC-address (6 bytes)
Type/Length (2 bytes)
An integer which describes the type of this
packet, or its length in 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
Used for filtering packets that are not
intended for a particular host interface
Needed when sending back replies to
requests, and for error-notifications
10Algorithm
Rough idea for a simplified traceroute
algorithm int ttl 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 lt 30
)
Implementing this basic traceroute algorithm
would require us to modify the value of the
Time-to-Live field in an outgoing packets
IP-header, but doing that directly is prohibited
by our lack of access to kernel data
11Using 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
packets IP header
unsigned char ttl 5 // maximum of five
hops int tlen sizeof( ttl ) // length of
the option data if ( setsockopt( sock, SOL_IP,
IP_TTL, ttl, tlen ) lt 0 ) perror(
setsockopt TTL ) exit(1)
12Demo 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 54321 5
- You can watch the outgoing packet, and any ICPM
reply-message, with nicwatch