• No results found

Goal: learn how to build client/server application that communicate using sockets. An interface between application and network

N/A
N/A
Protected

Academic year: 2021

Share "Goal: learn how to build client/server application that communicate using sockets. An interface between application and network"

Copied!
20
0
0

Loading.... (view fulltext now)

Full text

(1)

2: Application Layer 1

Socket programming

Socket API

❒ introduced in BSD4.1 UNIX,

1981

❒ explicitly created, used,

released by apps

❒ client/server paradigm ❒ two types of transport

service via socket API:

❍ unreliable datagram ❍ reliable, byte

stream-oriented

a host-local,

application-created,

OS-controlled interface (a “door”) into which application process can

both send and receivemessages to/from

another application process

socket

Goal: learn how to build client/server application that communicate using sockets

2: Application Layer 2

What is a socket?

An interface between application and

network

❍The application creates a socket ❍The socket type dictates the style of

communication

• reliable vs. best effort

• connection-oriented vs. connectionless

Once configured the application can

❍pass data to the socket for network

transmission

❍receive data from the socket (transmitted

(2)

2: Application Layer 3

Two essential types of sockets

❒ SOCK_STREAM ❍ a.k.a. TCP ❍ reliable delivery ❍ in-order guaranteed ❍ connection-oriented ❍ bidirectional ❒ SOCK_DGRAM ❍ a.k.a. UDP ❍ unreliable delivery ❍ no order guarantees ❍ no notion of “connection” –

app indicates dest. for each packet

❍ can send or receive

App socket 3 2 1 Dest. App socket 3 2 1 D1 D3 D2 2: Application Layer 4

Stream jargon

❒ A streamis a sequence of characters that flow into or out of

a process.

❒ An input streamis attached to some input source for the

process, eg, keyboard or socket.

❒ An output streamis attached to an output source, eg, monitor

(3)

2: Application Layer 5

A Socket-eye view of the

Internet

Each host machine has an IP address

When a packet arrives at a host

css3a0.engr.ccny.cuny.edu Aliases:csfhome.engr.ccny.cuny.edu (134.74.112.43) newworld.cs.umass.edu (128.119.245.93) 2: Application Layer 6

Ports

Port 0 Port 1 Port 65535

Each host has 65,536

ports

Some ports are

reserved for specific

apps

❍20,21: FTP ❍23: Telnet ❍80: HTTP ❍see RFC 1700 (about 2000 ports are reserved)

❒ A socket provides an interface

to send data to/from the network through a port

(4)

2: Application Layer 7

Addresses, Ports and Sockets

❒ Like apartments and mailboxes ❍ You are the application

❍ Your apartment building address is the address ❍ Your mailbox is the port

❍ The post-office is the network

❍ The socket is the key that gives you access to the right

mailbox (one difference: assume outgoing mail is placed by you in your mailbox)

❒ Q: How do you choose which port a socket

connects to?

2: Application Layer 8

Socket programming with TCP

Socket:a door between application process and end-end-transport protocol (UCP or TCP)

TCP service: reliable transfer of bytesfrom one process to another process TCP with buffers, variables socket controlled by application developer controlled by operating system host or server process TCP with buffers, variables socket controlled by application developer controlled by operating system host or server internet

(5)

2: Application Layer 9

Socket programming with TCP

Client must contact server

server process must first be running

server must have created socket (door)

that welcomes client’s contact

Client contacts server by:

creating client-local TCP socket

specifying IP address, port number of

server process

When

client creates socket

: client TCP

establishes connection to server TCP

2: Application Layer 10

Socket programming with TCP

❒ When contacted by client,

server TCP creates new socketfor server process to communicate with client

❍ allows server to talk with

multiple clients

❍ source port numbers

used to distinguish clients (more in Chap 3)

TCP provides reliable, in-order transfer of bytes (“pipe”) between client and server

application viewpoint client TCP socket client process server connection TCP socket server process server welcoming TCP socket three-w ay handsha ke byte pipe

(6)

2: Application Layer 11

Socket programming with TCP

Example client-server app: 1) client reads line from

standard input (inFromUser

stream) , sends to server via socket (outToServer

stream)

2) server reads line from socket 3) server converts line to

uppercase, sends back to client

4) client reads, prints modified line from socket

(inFromServerstream)

out

ToServer

to network from network

inFromServer inFromUser keyboard monitor Process clientSocket input stream input stream output stream TCP socket Client process client TCP socket 2: Application Layer 12

Client/server socket interaction: TCP

wait for incoming connection request connectionSocket = welcomeSocket.accept() create socket, port=x, for incoming request: welcomeSocket = ServerSocket() create socket,

connect to hostid, port=x clientSocket =

Socket()

close

connectionSocket

read reply from

clientSocket

close

clientSocket

Server (running on hostid) Client

send request using

clientSocket

read request from

connectionSocket

write reply to

connectionSocket

TCP connection setup

(7)

2: Application Layer 13

Example: Java client (TCP)

import java.io.*; import java.net.*; class TCPClient {

public static void main(String argv[]) throws Exception {

String sentence;

String modifiedSentence; BufferedReader inFromUser =

new BufferedReader(new InputStreamReader(System.in)); Socket clientSocket = new Socket("hostname", 6789);

DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); Create input stream Create client socket, connect to server Create output stream attached to socket 2: Application Layer 14

Example: Java client (TCP), cont.

BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + '\n'); modifiedSentence = inFromServer.readLine();

System.out.println("FROM SERVER: " + modifiedSentence);

clientSocket.close(); } } Create input stream attached to socket Send line to server Read line from server

(8)

2: Application Layer 15

Example: Java server (TCP)

import java.io.*; import java.net.*; class TCPServer {

public static void main(String argv[]) throws Exception {

String clientSentence; String capitalizedSentence;

ServerSocket welcomeSocket = new ServerSocket(6789); while(true) {

Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); Create welcoming socket at port 6789 Wait, on welcoming

socket for contact by client Create input stream, attached to socket

2: Application Layer 16

Example: Java server (TCP), cont

DataOutputStream outToClient =

new DataOutputStream(connectionSocket.getOutputStream());

clientSentence = inFromClient.readLine(); capitalizedSentence = clientSentence.toUpperCase() + '\n'; outToClient.writeBytes(capitalizedSentence); } } } Read in line from socket Create output stream, attached to socket

Write out line to socket

End of while loop, loop back and wait for another client connection

(9)

2: Application Layer 17

Socket programming

with UDP

UDP: no “connection” between client and server

❒ no handshaking

❒ sender explicitly attaches

IP address and port of destination to each packet

❒ server must extract IP

address, port of sender from received packet

UDP: transmitted data may be received out of order, or lost

application viewpoint

UDP provides unreliable transfer of groups of bytes (“datagrams”)

between client and server

2: Application Layer 18

Client/server socket interaction: UDP

close

clientSocket

Server (running on hostid)

read reply from

clientSocket

create socket,

clientSocket = DatagramSocket()

Client

Create, address (hostid, port=x,

send datagram request using clientSocket create socket, port=x, for incoming request: serverSocket = DatagramSocket()

read request from

serverSocket write reply to serverSocket specifying client host address, port number

(10)

2: Application Layer 19

Example: Java client (UDP)

sendPac

ke

t

to network from network

re ce ive P acke t in FromUs er keyboard monitor Process clientSocket UDP packet input stream UDP packet UDP socket Output: sends packet (TCP sent “byte stream”) Input: receives packet (TCP received “byte stream”) Client process client UDP socket 2: Application Layer 20

Example: Java client (UDP)

import java.io.*; import java.net.*; class UDPClient {

public static void main(String args[]) throws Exception {

BufferedReader inFromUser =

new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName("hostname"); byte[] sendData = new byte[1024];

byte[] receiveData = new byte[1024]; String sentence = inFromUser.readLine(); sendData = sentence.getBytes(); Create input stream Create client socket Translate hostname to IP address using DNS

(11)

2: Application Layer 21

Example: Java client (UDP), cont.

DatagramPacket sendPacket =

new DatagramPacket(sendData, sendData.length, IPAddress, 9876); clientSocket.send(sendPacket);

DatagramPacket receivePacket =

new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket);

String modifiedSentence =

new String(receivePacket.getData());

System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close();

} }

Create datagram with data-to-send, length, IP addr, port Send datagram

to server Read datagram from server

2: Application Layer 22

Example: Java server (UDP)

import java.io.*; import java.net.*; class UDPServer {

public static void main(String args[]) throws Exception {

DatagramSocket serverSocket = new DatagramSocket(9876); byte[] receiveData = new byte[1024];

byte[] sendData = new byte[1024]; while(true)

{

DatagramPacket receivePacket =

new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket);

Create datagram socket at port 9876

Create space for received datagram Receive datagram

(12)

2: Application Layer 23

Example: Java server (UDP), cont

String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort();

String capitalizedSentence = sentence.toUpperCase(); sendData = capitalizedSentence.getBytes();

DatagramPacket sendPacket =

new DatagramPacket(sendData, sendData.length, IPAddress, port); serverSocket.send(sendPacket); } } } Get IP addr port #, of sender Write out datagram to socket

End of while loop, loop back and wait for another datagram Create datagram

to send to client

2: Application Layer 24

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,

• other values: need root permission, rarely used, or obsolete

❍ protocol: specifies protocol (see file /etc/protocolsfor a list

of options) - usually set to 0

❒ NOTE: socketcall does not specify where data will be coming

from, nor where it will be going to – it just creates the interface!

(13)

2: Application Layer 25

The

bind

function

associates and (can exclusively) reserves a

port for use by the socket

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

2: Application Layer 26

Connection setup:

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

❍ listenis non-blocking: returns immediately ❒ 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

• must be set appropriately before call • adjusted by OS upon return

(14)

2: Application Layer 27

connect

call

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)

connect

is

blocking

2: Application Layer 28

Sending / Receiving Data

With a connection (

SOCK_STREAM

):

❍int count = send(sock, &buf, len, flags); • count: # bytes transmitted (-1 if error) • buf: char[],buffer to be transmitted

• len: integer, length of buffer (in bytes) to transmit • flags: integer, special options, usually just 0

❍int count = recv(sock, &buf, len, flags); • count: # bytes received (-1 if error) • buf: void[],stores received bytes • len: # bytes received

• flags: integer, special options, usually just 0

❍Calls are blocking[returns only after data is sent

(15)

2: Application Layer 29

close

When finished using a socket, the socket

should be closed:

status = close(s);

❍status: 0 if successful, -1 if error

❍s: the file descriptor (socket being closed)

Closing a socket

❍closes a connection (for SOCK_STREAM) ❍frees up the port used by the socket

2: Application Layer 30

Typical Client Structure

sd = socket( ) create a socket bind(sd) bind to port connect(sd,server) connect to server send (sd) send request to server rvcd (sd) receive data from server close (sd) close connection

(16)

2: Application Layer 31

Typical Server

sd = socket( ) // create a socket bind(sd) // bind to port listen(sd,n) // listen to clients while(1)

newSd= accept (sd) // accept connection from client rvcd (newSd) // receive request from client send (newSd) // send reply to client

close (newSd ) //close connection

2: Application Layer 32

The

struct sockaddr

❒ 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 ❒ The Internet-specific: 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 # (0-65535) ❍ sin_addr: IP-address ❍ sin_zero: unused

(17)

2: Application Layer 33

Address and port byte-ordering

❒ Address and port are stored as

integers

❍ u_short sin_port; (16 bit) ❍ in_addr sin_addr; (32 bit)

struct in_addr { u_long s_addr; };

❒ 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 119 40 12 12.40.119.128 128 119 40 12 Big-Endian machine Little-Endian machine

WR

ON

G!!!

2: Application Layer 34

Solution: Network Byte-Ordering

Defs:

❍Host Byte-Ordering: the byte ordering used by

a host (big or little)

❍Network Byte-Ordering: the byte ordering used

by the network – always big-endian

❒ Any words sent through the network should be

converted to Network Byte-Order prior to transmission (and back to Host Byte-Order once received)

❒ Q: should the socket perform the conversion

automatically?

❒ Q: Given big-endian machines don’t need

conversion routines and little-endian machines do, how do we avoid writing two versions of code?

(18)

2: Application Layer 35

UNIX’s byte-ordering funcs

❒ u_long htonl(u_long x); ❒ u_short htons(u_short x);

❒ u_long ntohl(u_long x); ❒ u_short ntohs(u_short x);

❒ On big-endian machines, these routines do nothing ❒ On little-endian machines, they reverse the byte

order

❒ Same code would have worked regardless of

endian-ness of the two machines

128.119.40.12 128 119 40 12 128.119.40.12 128 119 40 12 Big-Endian machine Little-Endian machine hton l ntohl 128 119 40 12 12 40 119 128 2: Application Layer 36

Other useful functions

❒ bzero(char* c, int n): 0’s n bytes starting at c

❒ gethostname(char *name, int len): gets the name of

the current host

❒ gethostbyaddr(char *addr, int len, int type):converts

IP hostname to structure containing long integer

❒ inet_addr(const char *cp): converts dotted-decimal

char-string to long integer

❒ inet_ntoa(const struct in_addr in): converts long to

dotted-decimal notation

❒ Warning: check function assumptions about

byte-ordering (host or network). Often, they assume parameters / return solutions in network byte-order

(19)

2: Application Layer 37

Release of ports

❒ Sometimes, a “rough” exit from a program (e.g.,

ctrl-c) does not properly free up a port

❒ Eventually (after a few minutes), the port will be

freed

❒ To reduce the likelihood of this problem, include

the following code: #include <signal.h> void cleanExit(){exit(0);} ❍ in socket code: signal(SIGTERM, cleanExit); signal(SIGINT, cleanExit); 2: Application Layer 38

Socket programming: references

C-language tutorial(audio/slides):

❒ “Unix Network Programming” (J. Kurose),

http://manic.cs.umass.edu/courses2.html

Java-tutorials:

❒ “All About Sockets” (Sun tutorial),

http://java.sun.com/docs/books/tutorial/networking/soc kets

❒ “Socket Programming in Java: a tutorial” (Java World),

http://www.javaworld.com/javaworld/jw-12-1996/jw-12-sockets.html

(20)

2: Application Layer 39

Chapter 2: Summary

❒ application service requirements: ❍ reliability, bandwidth, delay ❒ client-server paradigm ❒ Internet transport service model ❍ connection-oriented, reliable: TCP ❍ unreliable, datagrams: UDP

Our study of network apps now complete!

❒ specific protocols: ❍ HTTP ❍ FTP ❍ SMTP, POP, IMAP ❍ DNS ❒ socket programming ❒ content distribution ❍ caches, CDNs ❍ P2P 2: Application Layer 40

Chapter 2: Summary

❒ typical request/reply message exchange:

❍ client requests info or

service

❍ server responds with

data, status code

❒ message formats: ❍ headers: fields giving

info about data

❍ data: info being

communicated

Most importantly: learned about

protocols

❒ control vs. data msgs ❍ in-band, out-of-band ❒ centralized vs. decentralized ❒ stateless vs. stateful ❒ reliable vs. unreliable msg transfer ❒ “complexity at network edge” ❒ security: authentication

References

Related documents

4 yrs Integrated Degree Course from R.C.E. of NCERT in concerned subject with at least 50% marks in aggregate. OR Bachelor Degree or equivalent from Recognized University

[r]

blue background for “Central Europe”, “Atlantic Polluted”, and “At- lantic Clean” air masses, respectively), time series of calculated ab- solute continental contribution

Liquefaction Exploration and Production LNG Marketing and Trading Maritime transport4. around joint ventures

A servo mechanical press is different from a traditional mechanical press in such a way that it involves servo actuation design with programmable motors and punching mechanism

Participants select a theme and display two place setting, including table covering, dishes,?. I o wa S ta te U niv e r

SEE Plugin SELinux Plugin OpenVPN Plugin iptables SELinux OpenVPN iptables Enforcement Plugins Apply assurance for selected plugin Projection Engine SSMs Configure SSM 10

Mas o grupo das víti- mas provocativas revela mais comportamentos de violência fora da escola, tem uma pior relação com os pais, apresenta mais sintomas de depres- são e de queixas