Title: Communication Networks
1Communication Networks
2Administrative
- David Raz
- Schreiber M21, (640)6455
- Email davidraz_at_post.tau.ac.il
- website http//www.cs.tau.ac.il/davidraz/course
s/comnet06/ - Grader Hadas Zur zurhadas_at_post.tau.ac.il
3TCP/IP Socket Programming
4What is a socket?
- An interface between application and the network
- The application can send/receive data to/from the
network -- communicate
Application
Network API
Protocol A
Protocol B
Protocol C
5A Socket-eye view of the Internet
medellin.cs.columbia.edu (128.59.21.14)
newworld.cs.umass.edu (128.119.245.93)
cluster.cs.columbia.edu (128.59.21.14,
128.59.16.7, 128.59.16.5, 128.59.16.4)
- Each host machine has an IP address
6Ports
- Each host has 65,536 ports
- Some ports are reserved for specific apps
- 20,21 FTP
- 23 Telnet
- 80 HTTP
Port 0
Port 1
Port 65535
7Address Pair
- An address is an IPport
- A socket provides an interface to an IPport pair
Remote IP 123.45.6.78 Remote Port 3726
Local IP 111.22.3.4 Local Port 2249
8Functions needed
- Specify local and remote communication endpoints
- Initiate a connection
- Send and receive data
- Terminate a connection
9Socket Creation in C socket()
- int s socket(domain, type, protocol)
- s socket descriptor (an integer, like a
file-handle) - domain integer, communication domain
- e.g., PF_INET (IPv4 protocol) typically used
- type communication type
- SOCK_STREAM reliable, 2-way, connection-based
service - SOCK_DGRAM unreliable, connectionless,
- protocol specifies protocol (see file
/etc/protocols for a list of options) - usually
set to 0
10Socket Descriptor Data Structure
Descriptor Table
Family PF_INET Service SOCK_STREAM Local IP
111.22.3.4 Remote IP 123.45.6.78 Local Port
2249 Remote Port 3726
0
1
2
3
4
11Two essential types of sockets
- SOCK_DGRAM
- a.k.a. UDP
- unreliable delivery
- no order guarantees
- no notion of connection
- can send or receive
- SOCK_STREAM
- a.k.a. TCP
- reliable delivery
- in-order guaranteed
- connection-oriented
- bidirectional
12The bind() function
- associates and (can exclusively) reserves a port
for use by the socket - Done by the server
- int status bind(sockid, addrport, size)
- status error status, -1 if bind failed
- sockid integer, socket descriptor
- addrport struct sockaddr, the (IP) address and
port of the machine. (address usually set to
INADDR_ANY chooses a local address) - size the size (in bytes) of the addrport
structure
13The struct sockaddr
- The Internet-specific
- struct sockaddr_in
- short sin_family
- u_short sin_port
- struct in_addr sin_addr
- char sin_zero8
-
- sin_family AF_INET
- sin_port port (0-65535)
- sin_addr IP-address
- sin_zero unused
- The generic
- struct sockaddr
- u_short sa_family
- char sa_data14
-
- sa_family
- specifies which address family is being used
- determines how the remaining 14 bytes are used
14Address and port byte-ordering
- Problem
- different machines / OSs use different word
orderings - little-endian lower bytes first
- big-endian higher bytes first
- these machines may communicate with one another
over the network
Big-Endian machine
Little-Endian machine
12.40.119.128
128.119.40.12
15Network Byte Order
- All values stored in a sockaddr_in must be in
network byte order. - Whenever the source of the address isnt the
network, use htonl and htons
Common Mistake Ignoring Network Byte Order
16Example
- int sock
- sock socket(PF_INET, SOCK_STREAM, 0)
- if (socklt0) / ERROR /
- struct sockaddr_in myaddr
- myaddr.sin_family AF_INET
- myaddr.sin_port htons( 80 )
- myaddr.sin_addr htonl( INADDR_ANY )
- bind(sock, myaddr, sizeof(myaddr))
17Connection Setup (SOCK_STREAM)
- A connection occurs between two kinds of
participants - passive waits for an active participant to
request connection - active initiates connection request to passive
side - Once connection is established, passive and
active participants are similar - both can send receive data
- either can terminate the connection
18Connection setup contd
- Active participant
- step 2 request establish connection
- step 4 data transfer
- Passive participant
- step 1 listen (for incoming requests)
- step 3 accept (a request)
- step 4 data transfer
- The accepted connection is on a new socket
- The old socket continues to listen
Passive Participant
Active 1
Active 2
19Connection est. listen() accept()
- Called by passive participant
- int status listen(sock, queuelen)
- status 0 if listening, -1 if error
- sock integer, socket descriptor
- queuelen integer, of active participants that
can wait for a connection - int s accept(sock, name, namelen)
- s integer, the new socket (used for
data-transfer) - sock integer, the orig. socket (being listened
on) - name struct sockaddr, address of the active
participant - namelen sizeof(name) value/result parameter
20Connection est. connect()
- Called by active participant
- int status connect(sock, name, namelen)
- status 0 if successful connect, -1 otherwise
- sock integer, socket to be used in connection
- name struct sockaddr address of passive
participant - namelen integer, sizeof(name)
21Server example
int sock sock socket(PF_INET, SOCK_STREAM,
0) if (socklt0) / ERROR / struct
sockaddr_in myaddr myaddr.sin_family
AF_INET myaddr.sin_port htons( 80
) myaddr.sin_addr htonl( INADDR_ANY
) bind(sock, myaddr, sizeof(myaddr))
22Server example
listen(sock, 5) int new_sock struct sockaddr_in
their_addr sin_size sizeof(struct
sockaddr_in) new_sock accept(sock, (struct
sockaddr )their_addr, sin_size)
23Client example
int sock sock socket(PF_INET, SOCK_STREAM,
0) if (socklt0) / ERROR / struct
sockaddr_in dest_addr dest_addr.sin_family
AF_INET dest_addr.sin_port htons( 80
) dest_addr.sin_addr inet_addr(128.2.5.10)
connect(sock, (struct sockaddr )dest_addr,
sizeof(struct sockaddr))