CSci 4061 Introduction to Operating Systems · •Symbolic names can be assigned to addresses to...

Post on 22-Mar-2020

3 views 0 download

transcript

CSci 4061Introduction to Operating Systems

Network Systems Programming

Goal:

• Enable communication between processes on

different machines.

Network Layers

• Physical Layer

• media: cat5, radio, transmits bits

• electrical, data, rates, connectors

• Link layer

• 802.3 (Ethernet),802.11 (wifi) transmits error-free

• framing, CRC codes, …

• Network layer

• Routing (path from A to B)

• Send packets; packets contain addresses

• Transport layer: systems-programming interface

applicationtransportnetworkdata linkphysical

advantage of layers?

Protocols

• Transport protocols• TCP

• Out of order pocket assembly• Re-transmits packets lost or corrupted• Connection-oriented (expensive)

• UDP• Connectionless• Unreliable

• Application protocols• Applications

• Data formats• Meaning of data• …ftp,http,etc

phone call

mailing a letter

Some network app/protocols

• E-mail

•Web

• Instant messaging

• Remote login

• P2P file sharing

•Multi-user network games

• Streaming stored video clips

• Voice over IP

• Real-time video conferencing

App-layer protocol defines

• Types of messages exchanged

• e.g. request, response

•Message syntax

• What fields in messages & how fields are delineated

•Message semantics

• Meaning of information in fields

• Rules for when and how processes send & respond to messages

HTTP Example

Request:

GET http://www.cnn.com/ HTTP/1.0

Accept: text/html If-Modified-Since:

Saturday, 15-January-2000 14:37:11

GMT

User-Agent: Mozilla/4.0

Response:

HTTP/1.0 200 OK

Date: Sat, 15 Jan 2000 14:37:12 GMT

Server: Microsoft-IIS/2.0

Content-Type: text/HTML

Content-Length: 1245

Last-Modified: Fri, 14 Jan 2000 08:25:13 GMT

This is the webpage contents ….

Addresses

• Local IPC—easy? pid, mailbox, etc

• Network communication: IP address • Machine + network interface• IPv4 a.b.c.d: 4x2^32, ~4 x 10^9 addresses

• Network layer routes packet to destination address (a.b.c.d)

• Symbolic names can be assigned to addresses to identify domains and end hosts• caesar.cs.umn.edu resolves to a.b.c.d by domain

name service (DNS)

Creating a network app

write programs that• run on (different) end systems

• communicate over network

• e.g., web server software communicates with

browser software

applicationtransportnetworkdata linkphysical

applicationtransportnetworkdata linkphysical

applicationtransportnetworkdata linkphysical

Application architectures

• Client-server

• Peer-to-peer (P2P)

Client-server architecture

server:• always-on host

• permanent IP address

• server farms for scaling

clients:• communicate with server

(know its IP address)

• may be intermittently connected

• may have dynamic IP addresses – why does a client have an IP address?

• do not communicate directly with each other

client/server

Pure P2P architecture

• no always-on server

• arbitrary end systems “directly” communicate

• peers are intermittently connected and change IP addresses could change

• Highly scalable but difficult to manage

--why?

peer-peer

Systems programming: Processes communicating

• Processes in different hosts communicate by exchanging messages, packets are message fragments

Client process: process that initiates communication

Server process: process that waits to be contacted

Abstraction:

• Socket – abstraction of a communication endpoint

Sockets

• Process sends/receives messages to/from its socket

• socket analogous to door• sending process shoves

message out door

• sending process relies on transport infrastructure on other side of door which brings message to socket at receiving process

process

TCP with

buffers,

variables

socket

host or

server

process

TCP with

buffers,

variables

socket

host or

server

Internet

controlled

by OS

controlled by

app developer

• API:

• (1) choice of transport protocol

• (2) ability to fix a few parameters

• TCP or UDP sockets

Addressing processes

• To receive messages, process must have an address or identifier

• Host device has unique 32-bit IP address

(well, could have >1, but ignore for now)

• Q: Does IP address of host on which process runs suffice for identifying the process?

Addressing processes

• To receive messages, process must have address or identifier • Identifier includes both IP address and port numbers associated

with process on host.

• Host device has unique 32-bit IP address• Example port numbers:

• HTTP server: 80

• Mail server: 25

• To send HTTP message to caesar.cs.umn.edu web server:• IP address: 128.119.245.12

• Port number: 80

Internet transport protocols services

TCP service:

• Connection-oriented: setup required between client and server processes

• Reliable transport between sending and receiving process

• Does not provide: timing, minimum throughput guarantees, security

UDP service:

• Connectionless: does notprovide: connection setup, reliability, throughput guarantee, security

• unreliable data transfer between sending and receiving process

Message oriented

Q: why bother? Why is there a UDP?

Network Programming

Socket headers

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <netdb.h>

Creating a socket

int socket (int domain, int type, int protocol);

• Creates a communication end-point, returns a fd

• Domain is the communication domain:• PF_UNIX is for local Unix communication

• PF_INET/INET6 is for IPv4/v6 Internet

communication

Creating a socket (cont’d)

• Type specifies the communication style

• TCP

• SOCK_STREAM

• stream of bytes

• UDP

• SOCK_DGRAM

• Unreliable message delivery

fd = socket (PF_INET, SOCK_STREAM, 0);

Using sockets: client-server

• Server• Creates a socket with socket()

• Binds the socket to a local or network address with bind()

• Set up a queue for incoming connection requests with listen()

• accept () a connection

Using sockets (cont’d)

• Accept connection requests with accept()

• Creates a new socket connected to the client

• Returns new socket identifier as an fd

• Read and write to/from the socket fd with our old friends read/write

• Close the socket fd with close() when you are done

Socket addressing

• bind() takes a socket address structure

with an address format that depends on

domain

int bind (int sockfd, struct sockaddr *my_addr,

socklen_t addrlen);

struct sockaddr{

sa_family_t sin_famly; // AF_INET, same as PF_INET

u_intl6_t sin_port; // port: network byte order

struct in_addr sin_addr; // IP address: network byte order

}

len? different sizes for differenttypes (IPv4, IPv6, …)

Using bind

int port = 6666;

struct sockaddr_in addr:

addr.sin_family= AF_INET;

addr.sin_addr.s_addr= htonl(INADDR_ANY);

addr.sin_port= htons(port); //server picks the port

bind (fd,(struct sockaddr*)&addr, sizeof(addr));

INADDR_ANY:

OS pick local IP address—if multi-homed, then may want to hand-pick address.

Network byte order

Avoiding Port Collision

• If you are testing your server… bind … then crash …

• OS holds port for a while and you may get a bind error next time you run the server

int enable = 1;

setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,

(char*)&enable, sizeof(int));

• Gives back ports to OS: call before bind so next bind call does not fail

Choosing Ports

• You can pick >1024 (up to 65536) usually

• netstat will list active ports

Listen and accept

listen() sets up a queue for incoming connection requests

accept() gives you a channel to the requester

#include <sys/types.h>

#include <sys/socket.h>

int listen (int fd, int backlog);

int accept (int fd, struct sockaddr* addr;

socklen_t* addrlen);

// create a socket … enable/reuse … bind

listen (fd, 5); //queue up 5 pending requests

new_fd = accept (fd,(struct sockaddr*)&client_addr, &addr_len);

//can read or write to new_fd so can the other side

Accept

accept () returns a fd for a new socket

accept() blocks until a request arrives

Server Styles

• Single thread, one request at a time …

• Thread/request

• Each new request is handled by a new thread

• Could also have a thread pool

Server Styles (cont’d)

•Multiplexed

• Each thread does a portion of request handling (i.e. lab #4)

• Server cannot selectively accept clients!

• Cannot say, accept from IP 128.118.44.3

• Can, however, block/pass it through with a firewall

Host Lookup

#include <netdb.h>

struct hostent* gethostbyname(const char *name);

hostent contains sockaddr

Client Scenario

• Create socket with socket ()

• Resolve host address

• No need to bind, OS does it automatically (when you connect) and finds a free port

• Connect to the server with connect ()

• Read and write to/from the socket with • read/write () or other socket I/O calls• close the socket with close()

Look at tcp_client.c, tcp_server.c (chapter 13)1. Show bind error2. Show server not ready

Internet Addresses

• Internet addresses• IP + port

• Must be understandable by the network layer (routers) and end-host

• Network byte order

• Functions to convert components from host to network formats and vice-versa.

#include <inet.h>

uint32_t htonl(uint32_t hostlong); //long for IP

uint32_t htonl(uint32_t netlong);

• short int conversion for ports

Socket programming with UDP

UDP (User Datagram Protocol):

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

Some sites block UDP!

UDP servers

• Same header files

• Specify SOCK_DGRAM for socket type

• Bind to a port

• No need to listen or accept : why?

• Send and receive messages with sendto() and

recvfrom() with contained addresses

UDP (cont’d)

int sendto

(int sockfd, const void *buf, size_t len,

int flags, const struct sockaddr *dest_addr,

socklen_t addrlen);

ssize_t recvfrom

(int sockfd, void *buf, size_t len,

int flags,struct sockaddr *src_addr,

socklen_t *addrlen);

• Each message is addressed separately• this is why you can’t use read/write• max “packet” size ~ 64K