Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Communication Networks Recitation 1 Netcomm 2010 - Recitation 1: Sockets 1 Administrative • Hillel Avni – Email: [email protected] – website: http://www.cs.tau.ac.il/~hillelav/courses/co mnet10.html – Grader: Eran Cohen – [email protected] Netcomm 2010 - Recitation 1: Sockets 2 TCP/IP Socket Programming Netcomm 2010 - Recitation 1: Sockets 3 What 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 Netcomm 2010 - Recitation 1: Sockets 4 A 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 Netcomm 2010 - Recitation 1: Sockets 5 Ports • Each host has 65,536 ports • Some ports are reserved for specific apps Port 0 Port 1 Port 65535 – 20,21: FTP – 23: Telnet – 80: HTTP Netcomm 2010 - Recitation 1: Sockets 6 Address Pair • An address is an IP+port • A socket provides an interface to an IP:port pair Local IP: 111.22.3.4 Local Port: 2249 Remote IP: 123.45.6.78 Remote Port: 3726 Netcomm 2010 - Recitation 1: Sockets 7 Functions needed: • Specify local and remote communication endpoints • Initiate a connection • Send and receive data • Terminate a connection Netcomm 2010 - Recitation 1: Sockets 8 Socket 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 Netcomm 2010 - Recitation 1: Sockets 9 Two essential types of sockets • SOCK_STREAM – a.k.a. TCP – reliable delivery – in-order guaranteed – connection-oriented – bidirectional App 3 2 1 • SOCK_DGRAM – a.k.a. UDP – unreliable delivery – no order guarantees – no notion of “connection” – can send or receive D1 App socket Dest. 3 2 1 D2 socket D3 Netcomm 2010 - Recitation 1: Sockets 11 The 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 Netcomm 2010 - Recitation 1: Sockets 12 The struct sockaddr • The Internet-specific: • The generic: struct sockaddr { u_short sa_family; char sa_data[14]; }; – sa_family • specifies which address family is being used • determines how the remaining 14 bytes are used struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; – sin_family = AF_INET – sin_port: port # (065535) – sin_addr: IP-address – sin_zero: unused Netcomm 2010 - Recitation 1: Sockets 13 Address and port byte-ordering Problem: different machines / OS’s use different word orderings • little-endian: lower bytes first • big-endian: higher bytes first these machines may communicate with one another over the network 128.119.40.12 128 Big-Endian machine 119 40 12 Little-Endian machine 128 Netcomm 2010 - Recitation 1: Sockets 119 12.40.119.128 40 12 14 Network Byte Order • All values stored in a sockaddr_in must be in network byte order. • Whenever the source of the address isn’t the network, use htonl and htons Netcomm 2010 - Recitation 1: Sockets 15 Example int sock; sock = socket(PF_INET, SOCK_STREAM, 0); if (sock<0) { /* 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)); Netcomm 2010 - Recitation 1: Sockets 16 Connection 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 Netcomm 2010 - Recitation 1: Sockets 17 Connection setup cont’d • 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 • Active participant – step 2: request & establish connection – step 4: data transfer Passive Participant a-sock-1 l-sock a-sock-2 socket socket Active 1 Active 2 Netcomm 2010 - Recitation 1: Sockets 18 Connection 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 Netcomm 2010 - Recitation 1: Sockets 19 Connection 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) Netcomm 2010 - Recitation 1: Sockets 20 Server example int sock; sock = socket(PF_INET, SOCK_STREAM, 0); if (sock<0) { /* 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)); Netcomm 2010 - Recitation 1: Sockets 21 Server 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); Netcomm 2010 - Recitation 1: Sockets 22 Client example int sock; sock = socket(PF_INET, SOCK_STREAM, 0); if (sock<0) { /* 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)); Netcomm 2010 - Recitation 1: Sockets 23