Networking Sockets API in Operating Systems

OS view of networking –
Sockets API
(an exercise in planning for the future)
David E. Culler
 CS162 – Operating Systems and Systems
Programming
Lecture 5
Sept. 10, 2014
Reading: OSC 2.7, 3.6
HW: 1 is out, due 9/15
Proj:
Adjustment on Culler Office Hours:
 - Tue 9-10, Wed 2-3, Th 1-2  in 449 Soda
Real Reading
Unix Network Programming.  The Sockets
Networking API, Stevens (et al), Ch 3-5
“Elementary Sockets”
Lots of on-line tutorials
This lecture and the code
http://cs162.eecs.berkeley.edu/static/lectures/code05/eclient.c
http://cs162.eecs.berkeley.edu/static/lectures/code05/eserver.c
http://cs162.eecs.berkeley.edu/static/lectures/code05/feserver.c
9/10/14
cs162 fa14 L5
2
Communication between processes
Producer and Consumer of a file may be
distinct processes
May be separated in time (or not)
9/10/14
cs162 fa14 L5
3
write(wfd, wbuf, wlen);
n = read(rfd,rbuf,rmax);
Communication Across the world looks like file IO
 
But what’s the analog of open?
What is the namespace?
How are they connected in time?
9/10/14
cs162 fa14 L5
4
write(wfd, wbuf, wlen);
n = read(rfd,rbuf,rmax);
Request Response Protocol
9/10/14
cs162 fa14 L5
5
write(rqfd, rqbuf, buflen);
 
n = read(rfd,rbuf,rmax);
Client (issues requests)
Server (performs operations)
requests
responses
 
write(wfd, respbuf, len);
 
n = read(resfd,resbuf,resmax);
 
service request
wait
Request Response Protocol
9/10/14
cs162 fa14 L5
6
write(rqfd, rqbuf, buflen);
n = read(rfd,rbuf,rmax);
Client (issues requests)
Server (performs operations)
requests
responses
write(wfd, respbuf, len);
n = read(resfd,resbuf,resmax);
service request
wait
Client-Server Models
File servers, web, FTP, Databases, …
Many clients accessing a common server
9/10/14
cs162 fa14 L5
7
Server
Client 1
Client 2
Client n
***
Sockets
Mechanism for inter-process communication
Data transfer like files
Read / Write against a descriptor
Over ANY kind of network
Local to a machine
Over the internet (TCP/IP, UDP/IP)
OSI, Appletalk, SNA, IPX, SIP, NS, …
9/10/14
cs162 fa14 L5
8
Silly Echo Server – running example
9/10/14
cs162 fa14 L5
9
write(fd, buf,len);
n = read(fd,buf,);
Client (issues requests)
Server (performs operations)
requests
responses
write(fd, buf,);
n = read(fd,rcvbuf, );
print
wait
gets(fd,sndbuf, …);
print
Echo client-server example
9/10/14
cs162 fa14 L5
10
void client(int sockfd) {
  int n;
  char sndbuf[MAXIN]; char rcvbuf[MAXOUT];
  
getreq
(sndbuf, MAXIN);        /* prompt */
  while (strlen(sndbuf) > 0) {
    write(sockfd, sndbuf, strlen(sndbuf)); /* send */
    memset(rcvbuf,0,MAXOUT);               /* clear */
    n=read(sockfd, rcvbuf, MAXOUT-1);      /* receive
*/
    write(STDOUT_FILENO, rcvbuf, n);
 
      /* echo */
    
getreq
(sndbuf, MAXIN);                 /* prompt */
  }
}
void server(int consockfd) {
  char reqbuf[MAXREQ];
  int n;
  while (1) {
    memset(reqbuf,0, MAXREQ);
    n = read(consockfd,reqbuf,MAXREQ-1); /* Recv */
    if (n <= 0) return;
    n = write(STDOUT_FILENO, reqbuf, strlen(reqbuf));
    n = write(consockfd, reqbuf, strlen(reqbuf)); /* echo*/
  }
}
Prompt for input
9/10/14
cs162 fa14 L5
11
char *getreq(char *inbuf, int len) {
  /* Get request char stream */
  printf("REQ: ");              /* prompt */
  memset(inbuf,0,len);          /* clear for good measure */
  return fgets(inbuf,len,stdin); /* read up to a EOL */
}
Socket creation and connection
 
File systems provide a collection of permanent
objects in structured name space
Processes open, read/write/close them
Files exist independent of the processes
Sockets provide a means for processes to
communicate (transfer data) to other
processes.
Creation and connection is more complex
Form 2-way pipes between processes
Possibly worlds away
9/10/14
cs162 fa14 L5
12
Sockets in concept
9/10/14
cs162 fa14 L5
13
Client
Server
 
read response
 
Close Client Socket
 
Close Connection Socket
 
Close Server Socket
Client Protocol
9/10/14
cs162 fa14 L5
14
char *hostname;
int sockfd, portno;
struct sockaddr_in serv_addr;
struct hostent *server;
server = buildServerAddr(&serv_addr, hostname, portno);
/* Create a TCP socket */
sockfd = 
socket
(AF_INET, SOCK_STREAM, 0)
/* Connect to server on port */
connect
(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)
printf("Connected to %s:%d\n",server->h_name, portno);
/* Carry out Client-Server protocol */
client(sockfd);
/* Clean up on termination */
close(sockfd);
Server Protocol (v1)
9/10/14
cs162 fa14 L5
15
/* Create Socket to receive requests*/
lstnsockfd = 
socket
(AF_INET, SOCK_STREAM, 0);
/* Bind socket to port */
bind
(lstnsockfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr));
while (1) {
/* Listen for incoming connections */
   
listen
(lstnsockfd, MAXQUEUE);
/* Accept incoming connection, obtaining a new socket for it */
   consockfd = 
accept
(lstnsockfd, (struct sockaddr *) &cli_addr,
                      &clilen);
   
server(consockfd);
   close(consockfd);
  }
close(lstnsockfd);
Administrative break
 
9/10/14
cs162 fa14 L5
16
How does the server protect itself?
Isolate the handling of each connection
By forking it off as another process
9/10/14
cs162 fa14 L5
17
Sockets in concept
9/10/14
cs162 fa14 L5
18
Client
Server
Create Client Socket
Connect it to server (host:port)
write request
read response
Close Client Socket
Create Server Socket
Bind it to an Address (host:port)
Listen for Connection
Accept connection
read request
write response
Close Connection Socket
Close Server Socket
Connection Socket
child
Close Connection Socket
Close Listen Socket
Parent
Wait for child
Server Protocol (v2)
9/10/14
cs162 fa14 L5
19
while (1) {
    listen(lstnsockfd, MAXQUEUE);
    consockfd = accept(lstnsockfd, (struct sockaddr *) &cli_addr,
       
 &clilen);
    cpid = fork();              /* new process for connection */
    if (cpid > 0) {             /* parent process */
      close(consockfd);
      tcpid = wait(&cstatus);
    } else if (cpid == 0) {      /* child process */
      close(lstnsockfd);        /* let go of listen socket */
      
server(consockfd)
;
      close(consockfd);
      exit(EXIT_SUCCESS);         /* exit child normally */
    }
  }
close(lstnsockfd);
Concurrent Server
Listen will queue requests
Buffering present elsewhere
But server waits for each connection to
terminate before initiating the next
9/10/14
cs162 fa14 L5
20
Sockets in concept
9/10/14
cs162 fa14 L5
21
Client
Server
Create Client Socket
Connect it to server (host:port)
write request
read response
Close Client Socket
Create Server Socket
Bind it to an Address (host:port)
Listen for Connection
Accept connection
read request
write response
Close Connection Socket
Close Server Socket
Connection Socket
child
Close Connection Socket
Close Listen Socket
Parent
Server Protocol (v3)
9/10/14
cs162 fa14 L5
22
while (1) {
    listen(lstnsockfd, MAXQUEUE);
    consockfd = accept(lstnsockfd, (struct sockaddr *) &cli_addr,
       
 &clilen);
    cpid = fork();              /* new process for connection */
    if (cpid > 0) {             /* parent process */
      close(consockfd);
      
//tcpid = wait(&cstatus);
    } else if (cpid == 0) {      /* child process */
      close(lstnsockfd);        /* let go of listen socket */
      
server(consockfd)
;
      close(consockfd);
      exit(EXIT_SUCCESS);         /* exit child normally */
    }
  }
close(lstnsockfd);
Server Address - itself
Simple form
Internet Protocol
accepting any connections on the specified port
In “network byte ordering”
9/10/14
cs162 fa14 L5
23
 memset((char *) &serv_addr,0, sizeof(serv_addr));
 serv_addr.sin_family      = AF_INET;
 serv_addr.sin_addr.s_addr = INADDR_ANY;
 serv_addr.sin_port        = htons(portno);
Client: getting the server address
9/10/14
cs162 fa14 L5
24
struct hostent *buildServerAddr(struct sockaddr_in *serv_addr,
                                char *hostname, int portno) {
  struct hostent *server;
  /* Get host entry associated with a hostname or IP address */
  server = 
gethostbyname
(hostname);
  if (server == NULL) {
    fprintf(stderr,"ERROR, no such host\n");
    exit(1);
  }
  /* Construct an address for remote server */
  memset((char *) serv_addr, 0, sizeof(struct sockaddr_in));
  serv_addr->sin_family = AF_INET;
  bcopy((char *)
server->h_addr
,
 
    (char *)&(serv_addr->sin_addr.s_addr), server->h_length);
  serv_addr->sin_port = htons(portno);
return server;
}
Namespaces for communication
Hostname
www.eecs.berkeley.edu
IP address
128.32.244.172  (ipv6?)
Port Number
0-1023 are “
well known
” or “system” ports
Superuser privileges to bind to one
1024 – 49151 are “registered” ports (
registry
)
Assigned by IANA for specific services
49152–65535 (2
15
+2
14
 to 2
16
−1) are “dynamic” or
“private”
Automatically allocated as “ephemeral Ports”
9/10/14
cs162 fa14 L5
25
Recall: UNIX Process Management
UNIX fork – system call to create a copy of the
current process, and start it running
No arguments!
UNIX exec – system call to 
change the
program 
being run by the current process
UNIX wait – system call to wait for a process to
finish
UNIX signal – system call to send a notification
to another process
9/10/14
cs162 fa14 L5
26
Signals – infloop.c
9/10/14
cs162 fa14 L5
27
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
void signal_callback_handler(int signum)
{
  printf("Caught signal %d - phew!\n",signum);
  exit(1);
}
int main() {
  
signal(SIGINT, signal_callback_handler);
  while (1) {}
}
Got top?
Process races: fork.c
9/10/14
cs162 fa14 L5
28
 if (cpid > 0) {
    mypid = getpid();
    printf("[%d] parent of [%d]\n", mypid, cpid);
    for (i=0; i<100; i++) {
      printf("[%d] parent: %d\n", mypid, i);
      //      sleep(1);
    }
  }  else if (cpid == 0) {
    mypid = getpid();
    printf("[%d] child\n", mypid);
    for (i=0; i>-100; i--) {
      printf("[%d] child: %d\n", mypid, i);
      //      sleep(1);
    }
  }
BIG OS Concepts so far
Processes
Address Space
Protection
Dual Mode
Interrupt handlers (including syscall and trap)
File System
Integrates processes, users, cwd, protection
Key Layers: OS Lib, Syscall, Subsystem, Driver
User handler on OS descriptors
Process control
fork, wait, signal --- exec
Communication through sockets
Client-Server Protocol
9/10/14
cs162 fa14 L5
29
Course Structure: Spiral
9/10/14
cs162 fa14 L5
30
intro
Slide Note
Embed
Share

Delve into networking sockets API for inter-process communication and data transfer, exploring client-server models, request-response protocols, and communication paradigms across different networks. Learn about the mechanisms in OS for networking, examining practical examples, codes, and readings to enhance your understanding in systems programming.

  • Networking
  • Sockets
  • OS
  • Systems Programming
  • Client-Server

Uploaded on Oct 03, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. OS view of networking Sockets API (an exercise in planning for the future) David E. Culler CS162 Operating Systems and Systems Programming Lecture 5 Sept. 10, 2014 Reading: OSC 2.7, 3.6 HW: 1 is out, due 9/15 Proj: Adjustment on Culler Office Hours: - Tue 9-10, Wed 2-3, Th 1-2 in 449 Soda

  2. Real Reading Unix Network Programming. The Sockets Networking API, Stevens (et al), Ch 3-5 Elementary Sockets Lots of on-line tutorials This lecture and the code http://cs162.eecs.berkeley.edu/static/lectures/code05/eclient.c http://cs162.eecs.berkeley.edu/static/lectures/code05/eserver.c http://cs162.eecs.berkeley.edu/static/lectures/code05/feserver.c 9/10/14 cs162 fa14 L5 2

  3. Communication between processes write(wfd, wbuf, wlen); n = read(rfd,rbuf,rmax); Producer and Consumer of a file may be distinct processes May be separated in time (or not) 9/10/14 cs162 fa14 L5 3

  4. Communication Across the world looks like file IO write(wfd, wbuf, wlen); n = read(rfd,rbuf,rmax); But what s the analog of open? What is the namespace? How are they connected in time? 9/10/14 cs162 fa14 L5 4

  5. Request Response Protocol Client (issues requests) Server (performs operations) write(rqfd, rqbuf, buflen); requests n = read(rfd,rbuf,rmax); wait service request write(wfd, respbuf, len); responses n = read(resfd,resbuf,resmax); 9/10/14 cs162 fa14 L5 5

  6. Request Response Protocol Client (issues requests) Server (performs operations) write(rqfd, rqbuf, buflen); requests n = read(rfd,rbuf,rmax); wait service request write(wfd, respbuf, len); responses n = read(resfd,resbuf,resmax); 9/10/14 cs162 fa14 L5 6

  7. Client-Server Models Client 1 Client 2 Server *** Client n File servers, web, FTP, Databases, Many clients accessing a common server 9/10/14 cs162 fa14 L5 7

  8. Sockets Mechanism for inter-process communication Data transfer like files Read / Write against a descriptor Over ANY kind of network Local to a machine Over the internet (TCP/IP, UDP/IP) OSI, Appletalk, SNA, IPX, SIP, NS, 9/10/14 cs162 fa14 L5 8

  9. Silly Echo Server running example Client (issues requests) Server (performs operations) gets(fd,sndbuf, ); requests write(fd, buf,len); n = read(fd,buf,); wait print write(fd, buf,); responses n = read(fd,rcvbuf, ); print 9/10/14 cs162 fa14 L5 9

  10. Echo client-server example void client(int sockfd) { int n; char sndbuf[MAXIN]; char rcvbuf[MAXOUT]; getreq(sndbuf, MAXIN); /* prompt */ while (strlen(sndbuf) > 0) { write(sockfd, sndbuf, strlen(sndbuf)); /* send */ memset(rcvbuf,0,MAXOUT); n=read(sockfd, rcvbuf, MAXOUT-1); */ write(STDOUT_FILENO, rcvbuf, n); getreq(sndbuf, MAXIN); } } void server(int consockfd) { char reqbuf[MAXREQ]; int n; while (1) { memset(reqbuf,0, MAXREQ); n = read(consockfd,reqbuf,MAXREQ-1); /* Recv */ if (n <= 0) return; n = write(STDOUT_FILENO, reqbuf, strlen(reqbuf)); n = write(consockfd, reqbuf, strlen(reqbuf)); /* echo*/ } } /* clear */ /* receive /* echo */ /* prompt */ 9/10/14 cs162 fa14 L5 10

  11. Prompt for input char *getreq(char *inbuf, int len) { /* Get request char stream */ printf("REQ: "); /* prompt */ memset(inbuf,0,len); /* clear for good measure */ return fgets(inbuf,len,stdin); /* read up to a EOL */ } 9/10/14 cs162 fa14 L5 11

  12. Socket creation and connection File systems provide a collection of permanent objects in structured name space Processes open, read/write/close them Files exist independent of the processes Sockets provide a means for processes to communicate (transfer data) to other processes. Creation and connection is more complex Form 2-way pipes between processes Possibly worlds away 9/10/14 cs162 fa14 L5 12

  13. Sockets in concept Client Server Create Server Socket Create Client Socket Bind it to an Address (host:port) Listen for Connection Connect it to server (host:port) Accept connection Connection Socket write request read request read response write response Close Client Socket Close Connection Socket Close Server Socket 9/10/14 cs162 fa14 L5 13

  14. Client Protocol char *hostname; int sockfd, portno; struct sockaddr_in serv_addr; struct hostent *server; server = buildServerAddr(&serv_addr, hostname, portno); /* Create a TCP socket */ sockfd = socket(AF_INET, SOCK_STREAM, 0) /* Connect to server on port */ connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr) printf("Connected to %s:%d\n",server->h_name, portno); /* Carry out Client-Server protocol */ client(sockfd); /* Clean up on termination */ close(sockfd); 9/10/14 cs162 fa14 L5 14

  15. Server Protocol (v1) /* Create Socket to receive requests*/ lstnsockfd = socket(AF_INET, SOCK_STREAM, 0); /* Bind socket to port */ bind(lstnsockfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)); while (1) { /* Listen for incoming connections */ listen(lstnsockfd, MAXQUEUE); /* Accept incoming connection, obtaining a new socket for it */ consockfd = accept(lstnsockfd, (struct sockaddr *) &cli_addr, &clilen); server(consockfd); close(consockfd); } close(lstnsockfd); 9/10/14 cs162 fa14 L5 15

  16. Administrative break 9/10/14 cs162 fa14 L5 16

  17. How does the server protect itself? Isolate the handling of each connection By forking it off as another process 9/10/14 cs162 fa14 L5 17

  18. Sockets in concept Client Server Create Server Socket Create Client Socket Bind it to an Address (host:port) Listen for Connection Connect it to server (host:port) Accept connection child Connection Socket Parent Close Listen Socket Close Connection Socket write request read request read response write response Close Connection Socket Wait for child Close Client Socket Close Server Socket 9/10/14 cs162 fa14 L5 18

  19. Server Protocol (v2) while (1) { listen(lstnsockfd, MAXQUEUE); consockfd = accept(lstnsockfd, (struct sockaddr *) &cli_addr, &clilen); cpid = fork(); /* new process for connection */ if (cpid > 0) { /* parent process */ close(consockfd); tcpid = wait(&cstatus); } else if (cpid == 0) { /* child process */ close(lstnsockfd); /* let go of listen socket */ server(consockfd); close(consockfd); exit(EXIT_SUCCESS); /* exit child normally */ } } close(lstnsockfd); 9/10/14 cs162 fa14 L5 19

  20. Concurrent Server Listen will queue requests Buffering present elsewhere But server waits for each connection to terminate before initiating the next 9/10/14 cs162 fa14 L5 20

  21. Sockets in concept Client Server Create Server Socket Create Client Socket Bind it to an Address (host:port) Listen for Connection Connect it to server (host:port) Accept connection child Connection Socket Parent Close Listen Socket Close Connection Socket write request read request read response write response Close Connection Socket Close Client Socket Close Server Socket 9/10/14 cs162 fa14 L5 21

  22. Server Protocol (v3) while (1) { listen(lstnsockfd, MAXQUEUE); consockfd = accept(lstnsockfd, (struct sockaddr *) &cli_addr, &clilen); cpid = fork(); /* new process for connection */ if (cpid > 0) { /* parent process */ close(consockfd); //tcpid = wait(&cstatus); } else if (cpid == 0) { /* child process */ close(lstnsockfd); /* let go of listen socket */ server(consockfd); close(consockfd); exit(EXIT_SUCCESS); /* exit child normally */ } } close(lstnsockfd); 9/10/14 cs162 fa14 L5 22

  23. Server Address - itself memset((char *) &serv_addr,0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); Simple form Internet Protocol accepting any connections on the specified port In network byte ordering 9/10/14 cs162 fa14 L5 23

  24. Client: getting the server address struct hostent *buildServerAddr(struct sockaddr_in *serv_addr, char *hostname, int portno) { struct hostent *server; /* Get host entry associated with a hostname or IP address */ server = gethostbyname(hostname); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(1); } /* Construct an address for remote server */ memset((char *) serv_addr, 0, sizeof(struct sockaddr_in)); serv_addr->sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&(serv_addr->sin_addr.s_addr), server->h_length); serv_addr->sin_port = htons(portno); return server; } 9/10/14 cs162 fa14 L5 24

  25. Namespaces for communication Hostname www.eecs.berkeley.edu IP address 128.32.244.172 (ipv6?) Port Number 0-1023 are well known or system ports Superuser privileges to bind to one 1024 49151 are registered ports (registry) Assigned by IANA for specific services 49152 65535 (215+214 to 216 1) are dynamic or private Automatically allocated as ephemeral Ports 9/10/14 cs162 fa14 L5 25

  26. Recall: UNIX Process Management UNIX fork system call to create a copy of the current process, and start it running No arguments! UNIX exec system call to change the program being run by the current process UNIX wait system call to wait for a process to finish UNIX signal system call to send a notification to another process 9/10/14 cs162 fa14 L5 26

  27. Signals infloop.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <signal.h> void signal_callback_handler(int signum) { printf("Caught signal %d - phew!\n",signum); exit(1); } int main() { signal(SIGINT, signal_callback_handler); while (1) {} } 9/10/14 cs162 fa14 L5 27

  28. Process races: fork.c if (cpid > 0) { mypid = getpid(); printf("[%d] parent of [%d]\n", mypid, cpid); for (i=0; i<100; i++) { printf("[%d] parent: %d\n", mypid, i); // sleep(1); } } else if (cpid == 0) { mypid = getpid(); printf("[%d] child\n", mypid); for (i=0; i>-100; i--) { printf("[%d] child: %d\n", mypid, i); // sleep(1); } } 9/10/14 cs162 fa14 L5 28

  29. BIG OS Concepts so far Processes Address Space Protection Dual Mode Interrupt handlers (including syscall and trap) File System Integrates processes, users, cwd, protection Key Layers: OS Lib, Syscall, Subsystem, Driver User handler on OS descriptors Process control fork, wait, signal --- exec Communication through sockets Client-Server Protocol 9/10/14 cs162 fa14 L5 29

  30. Course Structure: Spiral File Systems (8) AddressSpace(4) Distributed Systems(8) OSConcepts(3) intro Reliability, Security, Cloud (8) Concurrency(6) 9/10/14 cs162 fa14 L5 30

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#