מנגנון תקשורת ב-Linux סכמת שרת לקוח: client/server

Slides:



Advertisements
Similar presentations
Sockets: Network IPC Internet Socket UNIX Domain Socket.
Advertisements

Today’s topic: Basic TCP API –Socket –Bind –Listen –Connect –Accept –Read –Write –Close.
ZSocket address structure in : struct sockaddr{ u_shortsa_family;/* address family: AF_xxx value */ charsa_data[14];/* up to 14 bytes of protocol- */ /*
Socket Programming Application Programming Interface.
Sockets Programming CS144 Review Session 1 April 4, 2008 Ben Nham.
Networks: TCP/IP Socket Calls1 Elementary TCP Sockets Chapter 4 UNIX Network Programming Vol. 1, Second Ed. Stevens.
Quick Overview. 2 ISO/OSI Reference Model Application Application Presentation Presentation Session Session Transport Transport Network Network Data Link.
Multimedia Networking Sockets. Outline Socket basics Socket details (TCP and UDP) Socket options Final notes.
מערכות הפעלה ( אביב 2009) חגית עטיה © 1 אפליקציות שרת - לקוח  פרדיגמת שרת לקוח  מושג ה socket  מבנה שרת - לקוח  קצת יותר על רשתות.
Socket Programming: a Primer Socket to me!. Feb. 23, 2001EE122, UCB2 Why does one need sockets? application network protocol sockets network.
Network Programming UNIX Internet Socket API. Everything in Unix is a File –When Unix programs do any sort of I/O, they do it by reading or writing to.
תקשורת באינטרנט Tutorial 8. 2 n Socket programming u What is socket ? u Sockets architecture u Types of Sockets u The Socket system calls u Data Transfer.
Tutorial 8 Socket Programming
Client Server Model The client machine (or the client process) makes the request for some resource or service, and the server machine (the server process)
EECC694 - Shaaban #1 lec #14 Spring The Application Layer Client/Server Computing, Basic Approaches: –Passing Messages. Example: Communication.
Computer Networks Sockets. Outline F Socket basics F Socket details.
Operating Systems Sockets. Outline F Socket basics F TCP sockets F Socket details F Socket options F Final notes F Project 3.
1 Tutorial on Socket Programming Computer Networks - CSC 458 Department of Computer Science Yukun Zhu (Slides are mainly from Monia Ghobadi, and Amin Tootoonchian,
Network Programming Using Internet Sockets Wu Xuanxuan Lai Xinyu 吴璇璇 赖新宇
Network Programming Sockets and Winsock. Please Be Responsible We all know that the Internet is full of security holes –most of them do not require any.
Basic Socket Programming TCP/IP overview. TCP interface Reference: –UNIX Network Programming, by Richard Stevens. –UNIX man page.
UNIX Socket Programming CS 6378
TCP Socket Programming. r An abstract interface provided to the application programmer  File descriptor, allows apps to read/write to the network r Allows.
ECE453 – Introduction to Computer Networks Lecture 15 – Transport Layer (II)
ECE 4110 – Internetwork Programming Client-Server Model.
Operating Systems Chapter 9 Distributed Communication.
Zhu Reference: Daniel Spangenberger Computer Networks, Fall 2007 PPT-4 Socket Programming.
CS345 Operating Systems Φροντιστήριο Άσκησης 2. Inter-process communication Exchange data among processes Methods –Signal –Pipe –Sockets.
Sirak Kaewjamnong Computer Network Systems
Server Sockets: A server socket listens on a given port Many different clients may be connecting to that port Ideally, you would like a separate file descriptor.
Ports Port - A 16-bit number that identifies the application process that receives an incoming message. Reserved ports or well-known ports (0 to 1023)
Remote Shell CS230 Project #4 Assigned : Due date :
Socket programming case study NCKU Multimedia Networking Lab Pei Chuan Liu.
Networking Tutorial Special Interest Group for Software Engineering Luke Rajlich.
Network programming Nov 16, 2000 Topics Client-server model Sockets interface Echo client and server class24.ppt “The course that gives CMU its.
Introduction to Socket
Socket Programming Lab 1 1CS Computer Networks.
2: Application Layer1 Chapter 2: Application layer r 2.1 Principles of network applications r 2.2 Web and HTTP r 2.3 FTP r 2.4 Electronic Mail  SMTP,
S OCKET P ROGRAMMING IN C Professor: Dr. Shu-Ching Chen TA: HsinYu Ha.
Introduction to Sockets
UNIX Internet Socket API
S OCKET P ROGRAMMING IN C Professor: Dr. Shu-Ching Chen TA: Hsin-Yu Ha.
Read() recv() connection establishment Server (connection-oriented protocol) blocks until connection from client Client socket() bind() listen() accept()
OS view of networking – Sockets API (an exercise in planning for the future) David E. Culler CS162 – Operating Systems and Systems Programming Lecture.
2: Application Layer 1 Socket Programming UNIX Network Programming, Socket Programming Tutorial:
CSCI 330 UNIX and Network Programming Unit XIV: User Datagram Protocol.
回到第一頁 Client/sever model n Client asks (request) – server provides (response) n Typically: single server - multiple clients n The server does not need.
1 Spring Semester 2008, Dept. of Computer Science, Technion Internet Networking recitation #7 Socket Programming.
Socket Programming Jignesh Patel Palanivel Rathinam connecting processes.
Socket Programming(1/2). Outline  1. Introduction to Network Programming  2. Network Architecture – Client/Server Model  3. TCP Socket Programming.
1 Socket Interface. 2 Basic Sockets API Review Socket Library TCPUDP IP EthernetPPP ARP DHCP, Mail, WWW, TELNET, FTP... Network cardCom Layer 4 / Transport.
Cs288 Intensive Programming in Linux
Socket programming Péter Verhás August 2002
Network Programming CSC- 341
Network and Sockets Today: Get started doing network programming
Socket Programming in C
Socket Programming in C
Transport layer API: Socket Programming
תקשורת ומחשוב תרגול 3-5 סוקטים ב-C.
CSE454 Internet Technology. Asst. Prof. Dr
Socket Programming in C
ECS152b Behrooz Khorashadi
TCP/IP Socket Programming in C
Socket Programming(1/2)
Sockets Programming Socket to me!.
Sockets Programming Socket to me!.
Internet Networking recitation #8
Outline Communications in Distributed Systems Socket Programming
Sockets.
Today’s topic: Basic TCP API
Presentation transcript:

מנגנון תקשורת ב-Linux סכמת שרת לקוח: client/server תקשורת ב-Linux ו-Unix מנגנון תקשורת ב-Linux סכמת שרת לקוח: client/server

תרגול 11 – ניהול זיכרון ב-Linux: סקירה מודל השכבות רשת תקשורת: חיבורים המאפשרים תקשורת בין מחשבים פרוטוקולי תקשורת מאפשרים העברת נתונים ברשת פועלים בשכבות שונות, כשלכל שכבה תפקיד משלה. אוסף פרוטוקולי התקשורת הנפוץ ביותר נקרא TCP/IP מכיל 4 שכבות אפליקציות המשתמשות ברשת Application (telnet, ftp …) תקשורת בין תהליכים (ולא מחשבים) Transport (TCP, UDP) ניתוב חבילות בין תחנות (לא שכנות) Internet (IP) העברת חבילה בין תחנות שכנות Data Link (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

Networking API של Linux נתמקד בתמיכה של Linux בפרוטוקולי TCP/IP: קריאות מערכת המאפשרות יצירת תקשורת עם תהליכים מרוחקים. מבני נתונים המשמשים את קריאות המערכת הנ"ל כל קריאות המערכת שנראה משתמשות ב-sockets. תחילה נגדיר את ה-socket, ואח"כ נחבר אותו לפורט המתאים עבור כל הקריאות צריך להוסיף : #include <sys/types.h> #include <sys/socket.h> (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

הממשק: יצירת socket חדש int socket(int family, int type, int protocol) פרמטרים: family ארכיטקטורת הרשת לביצוע התקשורת (AF_INET) type מודל התקשורת ברשת. SOCK_STREAM עבור תקשורת connection oriented , מבוססת stream ואמינה (ממומשת ע"י TCP) protocol מגדיר את פרוטוקול התקשורת של שכבת ה Transport. פרמטר 0 בוחר את פרוטוקול ברירת המחדל (TCP עבור SOCK_STREAM) ערך חזרה: במקרה של הצלחה, מחזיר descriptor המצביע ל-socket החדש שייך ל-PDT של התהליך כמו descriptors אחרים המצביעים על קבצים פתוחים, pipes, ... (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

הממשק: קישור של socket לפורט int bind(int sockfd, struct sockaddr * my_addr, int addrlen) פרמטרים: sockfd ה-descriptor של ה-socket אותו מחברים. my_addr כתובת אליה מקשרים. הכתובת מכילה את כתובת ה-IP של המחשב המקומי ואת מספר ה-port אליו יקושר ה-socket addrlen אורך של my_addr בבתים. ערך חזרה: 0 במקרה של הצלחה, 1 במקרה של כישלון. (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה הממשק: האזנה הצהרת כוונה לקבל בקשות תקשורת והגדרת אורך תור מקסימלי של בקשות ממתינות. int listen(int sockfd, int num) פרמטרים: sockfd מזהה של ה-socket num מספר מקסימלי של בקשות התחברות ממתינות ערך חזרה: 0 במקרה של הצלחה, 1 במקרה של כישלון. (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה הממשק: קבלת בקשות מחכה על ה-socket הנתון לבקשות תקשורת. אם יש בקשות הממתינות בתור: מוציא בקשה מהתור יוצר socket חדש ומקצה לו descriptor חדש. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) פרמטרים: sockfd ה-descriptor של ה-socket עליו מחכים לבקשות תקשורת Addr כתובת שולח בקשת תקשורת שהתקבלה, מוצב בתוך הקריאה. addrlen אורך הכתובת בבתים. ערך חזרה: במקרה של הצלחה ה-descriptor של ה-socket החדש שנוצר, אחרת 1-. (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה הממשק: התחברות מנסה ליצור תקשורת עם תהליך שמקשיב על הכתובת serv_addr (מורכבת מכתובת IP ומספר port) int connect(int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen) פרמטרים: sockfd ה-descriptor של socket serv_addrהכתובת עליה מקשיב התהליך איתו מנסים להתקשר addrlen אורך הכתובת בבתים. ערך חזרה: 0 במקרה של הצלחה, 1 במקרה של כישלון. (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה הממשק: כתיבה ל socket אפשר לכתוב ל-socket באמצעות קריאת write, כמו לקבצים. ה-descriptor שמועבר הוא descriptor של ה-socket השולח, וההודעה תועבר ל-socket אליו מקשיב התהליך השני. פעולה מיוחדת, עם דגלים לאפשרויות שליחה מיוחדות int send(int sockfd,const void *msg, size_t len, int flags) ערך חזרה: במקרה של הצלחה, מספר הבתים שנשלחו, אחרת 1-. (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה הממשק: קריאה מה socket ניתן לקרוא מה-socket באמצעות קריאת read, כמו לקבצים. ה-descriptor שמועבר הוא descriptor של ה-socket הקורא, שחייב להיות מחובר (connected) ל- socket אחר. פעולה מיוחדת, עם דגלים לאפשרויות קריאה מיוחדות int recv(int sockfd, void *buf, size_t len, int flags) ערך חזרה: במקרה של הצלחה, מספר הבתים שנקראו, אחרת 1-. (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה הממשק: סגירת socket סגירת התקשורת עם המחשב המרוחק ושחרור ה-descriptor שהצביע על ה-socket. int close (int sockfd) פרמטר: sockfd ה-descriptor של ה- socket לסגירה. ערך חזרה: 0 במקרה של הצלחה, 1 במקרה של כישלון. (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

סכמת שרת לקוח: client/server תהליך אחד, הלקוח, מבקש שירות מתהליך אחר, השרת. למשל, שרתי telnet, web, ftp. השרת מטפל בבקשות של מספר לקוחות בו זמנית. לדוגמה, שרת telnet "מקשיב" על פורט 23 לבקשות התחברות מלקוחות (שזהותם לא ידועה מראש) כשמתקבלת בקשת התחברות נוצר telnet session בין השרת ללקוח שהתחבר. נשתמש ב-sockets: מאפשרים לאפליקציה להבדיל בין telnet sessions שונים. לכל session מתאים זוג sockets בשרת ובלקוח. (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

יצירת connection באופן לא סימטרי השרת יוצר socket מחבר אותו לפורט עליו הוא מקשיב מחכה על ה socket לבקשות תקשורת נכנסות הלקוח יוצר socket מנסה להתחבר אל כתובת IP ופורט של השרת כאשר connection מוקם, התקשורת היא סימטרית: שני הצדדים יכולים לשלוח הודעות אחד לשני דרך ה socket כל TCP session שנוצר כך מוגדר באופן חד ערכי ע"י רביעיה (source IP, source Port, destination IP, destination Port) (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה מימוש של שרת-לקוח עם sockets Client side: sd=socket() connect(sd, dst) write(sd, …) read(sd, …) close(sd) Server side: sd=socket() bind(sd, port) listen(sd,…) new_sd=accept(sd) write(new_sd, …) read(new_sd, …) close(new_sd) (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

מימוש שרת-לקוח עם sockets: הסברים השרת חייב לקרוא ל bind() כדי לחבר את ה sdשלו ל port מסוים (אחרת הוא יחכה לבקשות על port אקראי) בדרך כלל כמה לקוחות שולחים בקשות לתקשורת עם השרת. בקשות אלה נשמרות ע"י הkernel בתוך תור. כאמור listen מגדירה את אורך התור. השרת מקבל כל פעם בקשה אחת ע"י accept() כאשר הטיפול בבקשה הוא ארוך, כדאי אחרי accept() לעשות fork() ולתת לבן לטפל בבקשה ולאב לקבל את הבקשות האחרות. אפשרות נוספת היא טיפול בבקשות ע"י חוטים חדשים (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה מציאת כתובת מציאת כתובת IP של מחשב ברשת לפי שם המחשב (hostname). struct hostent * gethostbyname(const char *hostname); פרמטרים: hostname – שם המחשב ערך חזרה: struct hostent * - מצביע למבנה נתונים המתאר את המחשב המבוקש. דוגמא: struct hostent *h = gethostbyname(“t2.technion.ac.il”) h->h_addr יכיל את כתובת ה IP של t2 h->h_lenght אורך ה h->h_addr h->h_name יכיל את המחרוזת t2.technion.ac.il (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה החלפת Endians במעבדים שונים, יש סדר שונה בין LSB (least significant byte) ו MSB (most significant byte). כדי שנוכל להעביר אינפורמציה בין מחשבים שונים ברשת, צריכים להעביר את המספרים (int, short, long) ליצוג אחיד. בזה מטפלות 4 הפונקציות הבאות: u_long htonl(u_long); // host to network long (32 bits) u_short htons(u_short); // host to network short (16 bits) u_long ntohl(u_long); // network to host long (32 bits) u_short ntohs(u_short); // network to host short (16 bits) הסבר לציור: הביטוי endian בא ממסעות גוליבר (של יונתן סוויפט) שהוא פוגש שני שבטי גמדים שנלחמים כי אין הסכמה מאיזה צד לאכול את הביצה הרכה (הרחב או הצר). זה ציור מהספר. (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה מבני נתונים לכתובות struct sockaddr_in { short int sin_family; //Address family, AF_xxx unsigned short int sin_port; // Port number struct in_addr sin_addr; // Internet address unsigned char sin_zero[8]; // for allignments }; struct sockaddr { unsigned short sa_family; // address family, AF_xxx char sa_data[14]; // 14 bytes of protocol address struct in_addr { unsigned long s_addr; //32-bit long,(4 bytes) IP address } (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה קוד שרת 1 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> void error(char *msg) { perror(msg); exit(1); } int main(int argc, char *argv[]) { int sockfd, newsockfd, portno, clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; if (argc < 2) { fprintf(stderr,"ERROR, no port provided\n"); (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה קוד שרת 2 sockfd = socket(AF_INET,SOCK_STREAM,0); if (sockfd < 0) error("ERROR opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); listen(sockfd,5); clilen = sizeof(cli_addr); (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

קוד שרת 3 האם הקוד הנ"ל תמיד יעבוד נכון? newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("ERROR on accept"); bzero(buffer,256); n = read(newsockfd, buffer, 255); if (n < 0) error("ERROR reading from socket"); printf("Here is the message: %s\n",buffer); n = write(newsockfd,"I got your message",18); error("ERROR writing to socket"); close(newsockfd); close(sockfd); //or goto accept to wait for another clients return 0; האם הקוד הנ"ל תמיד יעבוד נכון? (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה קוד לקוח 1 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> void error(char *msg) { perror(msg); exit(0); } int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; char buffer[256]; (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

תרגול 11 – ניהול זיכרון ב-Linux: סקירה קוד לקוח 2 if (argc < 3) { fprintf(stderr,"usage %s hostname port\n", argv[0]); exit(0); } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); portno = atoi(argv[2]); server = gethostbyname(argv[1]); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה

קוד לקוח 3 האם הקוד הנ"ל תמיד יעבוד נכון? bcopy((char *)server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(portno); if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0)( error("ERROR connecting"); n = write(sockfd, ”HELLO THERE”, sizeof(“HELLO THERE”)); if (n < 0) error("ERROR writing to socket"); bzero(buffer,256); n = read(sockfd,buffer,255); error("ERROR reading from socket"); printf("%s\n",buffer); close(sockfd); return 0; } האם הקוד הנ"ל תמיד יעבוד נכון? (c) ארז חדד 2003 תרגול 11 – ניהול זיכרון ב-Linux: סקירה