2.6 פרוטוקול HTTP הרצאה
פרוטוקול http¶
פרוטוקול http שזה קיצור של (Hypertext Transfer Protocol).
מאפשר לנו ליצור דפי אינטרנט, שרתי http נקראים גם אתרי אינטרנט ומשרתים בפורט 80. כדי להתחבר לאתרים אנחנו משתמשים בדפדפן (כמו chrome או Firefox).
קישור: url¶
אנחנו ניגשים לאתרים באמצעות url - קישור שמציין את האתר אליו אנחנו רוצים לגשת בדפדפן, דוגמה לurl-ים:
https://www.google.com
https://www.google.com/search?q=hello
https://mail.google.com
כל קישור למעלה, כאשר אנחנו שמים אותו בדפדפן הוא יוביל אותנו לאתר אחר.
מבנה הurl:

- החלק הראשון הוא הפרוטוקול, בו אנחנו בוחרים את הפרוטוקול בדפדפן, כמעט תמיד הפרוטוקול יהיה http או https. (פרוטוקולי דפדפני אינטרנט)
- החלק השני הוא הדומיין / הip של השרת אינטרנט אילו אנחנו מתחברים, במקרה הזה מדובר על הדומיין של גוגל. יכול להיות גם ממש כתובת ip, למשל אם אנחנו נרים אתר אינטרנט על המחשב שלנו, הip שנשים יהיה 127.0.0.1 או localhost שמכוונים על loopback (הip שלנו)
- החלק השלישי הוא העמוד אינטרנט הספציפי בגוגל אילו אנחנו ניגשים, לכל אתר יכולים להיות קיימים המון דפי אינטרנט, בדוגמה שלנו אנחנו ניגשים לעמוד search של גוגל, שמאפשר לנו לחפש דברים במנוע חיפוש של גוגל.
- החלק הרביעי הוא פרמטר, לכל עמוד אינטרנט אנחנו יכולים להעביר פרמטר, במקרה הזה אנחנו מעבירים את הפרמטר q עם הערך hello לעמוד search.
- הurl הבא יחפש את המילה hello במנוע חיפוש של גוגל. הדפדפן יודע לאן לכוון אותנו באמצעות הurl שמוכנס אילו.
אז איך כל הקסם הזה קורה? איך הדפדפן באמצעות url-ים יודע להכניס אותנו לדפי אינטרנט? באמצעות פרוטוקול http.
- פרוטוקול http בנוי על ידי שרת ולקוח, כאשר השרת הוא האתר אינטרנט שאילו ניגשים עם url, והלקוח הוא הדפדפן שאיתו אנחנו משתמשים כדי לגשת לאתרים.
- בפרוטוקול http הלקוח שולח http request (בקשת http), ומקבל תשובה מהאתר (http response). בדרך כלל הלקוח מבקש דף אינטרנט, והשרת שולח קבצים ללקוח שאמורים ליצור את הדף אינטרנט שאותו הלקוח מבקש
- אתרי http בדרך כלל מתחלקים לשני חלקים:
1. האתר עצמו - השרת http ששולח את הניראות של האתר- נקרא גם הfrontend, האתר שאחראי להביא לנו את כל הדפים.
2. הapi- שרת http שאחראי לבצע פעולות לוגיות באתר, נקח לדוגמה את יוטיוב, אז הapi יהיה אחראי על העלת סרטונים לאתר, התאמתות לחשבון, שליחת תגובות לסרטונים ובעצם כל דבר שמשפיע על האתר מאחורי הקלעים. זה נקרא גם הbackend.
-
הקבצים שבדרך כלל השרת frontend שולח (האתר) לדפדפן.
- קובץ html: קובץ שמכיל את המבנה של האתר, מציין כיצד הוא אמור להיראות במבנה שלנו, ובנוי על ידי אלמנטים
- קובץ css: קובץ שמכיל עיצובים לכל האלמנטים שמוגדרים בhtml באתר
- קבצי תמונות (png, jpg, favicon): מכילים תמונות שמוגדרות בhtml
- קובץ ttf: קובץ שמכיל פונט (כיצד הטקסט באתר צריך להיראות)
- קובץ java-script: קובץ קוד (סקריפט) מכיל לוגיקה (בקוד) שאמורה לקרות בכל מיני אירועים באתר.
-
לאחר שאנחנו שמים url בדפדפן, אנחנו מקבלים דף כלשהו על ידי הfrontend. הדף מכיל html, css, java-script שבונה את הדף והדפדפן מציג לנו אותו ויזואלית.
- אז איך שרת הhttp של הbackend נכנס לסיפור? למשל נקח את גוגל, אחרי שאנחנו בדף הבית, כאשר נלחץ על כפתור ההתחברות באתר- ירוץ קוד java-script שהוגדר בhtml שיתחיל את תהליך ההתחברות, בסוף הקוד java-script הזה יפנה בעצמו לשרת הbackend (שלא גלוי לנו), וישלח בקשות http בעצמו לapi כדי לבצע את תהליך ההתחברות.
- בסוף אנחנו מקבלים דף התחברות לאחר לחיצה על כפתור ההתחברות. אבל מאחורי הקלעים האתר בעצמו מתקשר עם הapi כדי לבצע את התהליך.
- לרוב כאשר הjava script שאנחנו מקבלים מהfrontend מדבר עם הbackend, הוא מעביר מידע עם קבצי xml ו- json, ומקבל מידע עם xml ו- json. למי שלא מכיר, (ולא עשה את קורס תכנות) הם סוגי קבצים שמטרתם להעביר מידע בצורה מסודרת וקלה לקריאה.
אחרי שדיברנו קצת על מבנה נפוץ של אתרים, נדבר על איך בקשות ותשובות http נראות בפרוטוקול שמאפשרות לנו לעשות את זה.
מבנה בקשת http¶
בקשת HTTP מורכבת מכמה חלקים עיקריים:
שורת הבקשה (Request Line):
- מכילה את שיטת הבקשה (Request Method),
- נתיב העמוד (Path),
- וגרסת הפרוטוקול (HTTP Version).
לדוגמה:
שיטת הבקשה- request method מגדירה את הפעולה שאותה הלקוח רוצה לבצע על האתר, הנה דוגמה לשיטות בקשה:
- בקשת GET: בקשה לקבלת עמוד מהשרת. זוהי הבקשה הנפוצה ביותר ולרוב כשאנחנו נכנסים לאתר דרך הדפדפן עם הקלדת url זוהי הבקשה שהדפדפן שולח.
- בקשת POST: בקשה לשליחת נתונים לשרת, זוהי בקשה גם נפוצה שבדרך כלל משומשת בapi-ים. את הבקשה הזו הדפדפן לא מבצע כשאנחנו מקלידים url, אלה בדרך כלל קיים קוד java-script שמבצע בקשות post לapi של האתר, לדוגמה כדי ליצור תגובה לסרטון באתר.
קיימים גם עוד סוגי בקשות, פחות נפוצות שבדרך כלל בשימוש בapi-ים.
- בקשת PUT: בקשה לעדכון משאב קיים או יצירת משאב חדש אם הוא לא קיים.
- בקשת PATCH: בקשה לעדכון חלקי של משאב.
- בקשת DELETE: בקשה למחיקת משאב מהשרת.
- בקשת HEAD: בקשה לקבלת הכותרות בלבד של העמוד, ללא גוף.
- בקשת OPTIONS: בקשה לקבלת מידע על הrequest method-ים הקיימים לאותו עמוד.
נתיב העמוד- Path הוא נתיב של העמוד ספציפי אליו אנחנו רוצים לגשת בשרת הhttp, דוגמה לנתיבים:
/index
/index.html
/dashboard
/account/settings
/account/settings.js
/account/settings1.png
/image1.jpg
/hello.php
- למעשה כל שרת http יכול להגדיר איך הוא רוצה לחלק את העמודים וקבצים שלו, ובכל טכנולוגית לפיתוח frontend או backend זה מתנהל בצורה שונה לחלוטין.
- בנוסף אם אנחנו רוצים להעביר פרמטר בבקשת get (הפרמטרים שאנחנו מעבירים שאנחנו ניגשים לurl כמו בדוגמה למעלה) זה יעבור בחלק הזה של הבקשה.
גרסת הפרוטוקול: בבקשת http גם מצויין הגרסת פרוטוקול, כדי שהשרת http ידע איך לקרוא את הבקשה ולהבין אותה.
אחרי שורת הבקשה מוגדר "כותרות הבקשה" או באנגלית requests headers - הheader-ים של הבקשה.
כותרות הבקשה (Request Headers): מידע נוסף על הבקשה, כגון סוג התוכן שהלקוח מצפה לקבל או פרטים על הלקוח עצמו (למשל, סוג הדפדפן). כל כותרת היא מפתח וערך מופרדים בנקודתיים:
- קיימים המון header-ים נפוצים, שנהוג להעביר בבקשות http, בדרך כלל הדפדפן אחראי להעביר בכל בקשה את הheader-ים הכרחיים.
דוגמה לheader-ים נפוצים:
- ההדר- host: אחראי לציין בדיוק את הדומיין אליו אנחנו רוצים לפנות, המון פעמים לאתרים יש מספר של דומיינים, למשל:
mail.google.com, www.google.com, maps.google.com
וכל אחד מהדומיינים האלה, מכוון לאתר אחר. אך לפעמים האתר הזה יהיה מאחורי אותה כותבת ip. (לפעמים רוצים לאחסן כמה אתרים מאחורי אותה כתובת - אותו מחשב) זאת אומרת שאחרי שנרזלב את הדומיינים עם dns נקבל את אותה כותבת ip, אז בבקשת http, כיצד השרת יודע לאיזה אתר הוא רוצה לפנות? באמצעות header הhost. שבו אנחנו מציינים את הדומיין אליו רצינו לפנות ובכך השרת יודע לאיזה אתר לכוון אותנו.
- ההדר- user-agent: הדפדפן מעביר בו את שמו, כדי ששרת הhttp ידע כיצד להחזיר את הבקשה, יכול להיות שהאתר שיחזור לטלפונים, יהיה אתר שונה מאתר שיחזור למחשבים.
- ההדר- accept: מציין את הסוג מידע שהדפדפן מצפה לקבל מהבקשה, למשל האם זה html, תמונה או json.
- קיימים עוד המון header-ים נפוצים, תכירו אותם בהמשך.
אחרי שורת הבקשה, וכותרות הבקשה, קיים גוף הבקשה. שזה המידע שאנחנו רוצים להעביר בבקשה.
אם אנחנו עושים בקשת get, כנראה שלא נעביר כלום בגוף הבקשה, אבל אם אנחנו עושים בקשה לשרת הapi, עם מתודות כמו post או put, כנראה שנעביר מידע בגוף הבקשה.
תשובת http¶
תשובת HTTP מורכבת גם היא מכמה חלקים עיקריים:
שורת התשובה (Status Line): מכילה את גרסת הפרוטוקול וקוד המצב (Status Code)
- הstatus code הוא מספר תלת ספרתי שמייצג את תוצאת הבקשה. כלומר, אם הבקשה הגיעה, אם היא התקבלה, וכו. דוגמה לstatus code-ים:
- (מידע): אינפורמטיבי 1xx
- סטטוס 100 Continue: הלקוח יכול להמשיך לשלוח את הגוף של הבקשה.
- (הצלחה): הצלחה 2xx
- סטטוס 200 OK: הבקשה הצליחה.
- סטטוס 201 Created: המשאב נוצר בהצלחה.
- (הפניה מחדש): הפניה מחדש 3xx
- סטטוס 301 Moved Permanently: המשאב הועבר לצמיתות.
- סטטוס 302 Found: המשאב נמצא, אך זמנית נמצא בכתובת אחרת.
- (שגיאת לקוח): שגיאת לקוח 4xx
- סטטוס 400 Bad Request: הבקשה לא נכונה או בלתי מובנת.
- סטטוס 401 Unauthorized: דרושה הרשאה.
- סטטוס 404 Not Found: המשאב לא נמצא.
- (שגיאת שרת): שגיאת שרת 5xx
- סטטוס 500 Internal Server Error: שגיאה פנימית בשרת.
- סטטוס 503 Service Unavailable: השרת לא זמין זמנית.
דוגמה לבקשת HTTP ותשובה¶
בקשה:
תשובה:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 138
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Welcome to example.com!</h1>
</body>
</html>
פקודת curl¶
הפקודה curl היא כלי שמאפשר שליחה וקליטה של בקשות HTTP (וגם פרוטוקולים אחרים) דרך שורת הפקודה. ניתן להשתמש בה לשליחת בקשות GET, POST, PUT, DELETE ועוד, כדי לבדוק את התגובות שהשרתים שולחים, או כדי לבצע פעולות אוטומטיות עם אתרים שונים.
דגל -v או --verbose¶
הדגל -v (או --verbose) בפקודה curl מספק מידע מפורט על הבקשה והתשובה. הוא מציג את שורת הבקשה, כותרות הבקשה, כותרות התשובה ומידע נוסף שיכול לעזור בהבנת איך מתנהלת האינטראקציה בין הלקוח לשרת.
דוגמה לשימוש ב-curl עם דגל -v¶
נניח שאתה רוצה לשלוח בקשה GET לאתר www.example.com ולראות את כל המידע שנשלח והתקבל. תוכל להריץ את הפקודה הבאה:
תשובה לדוגמה שתקבל (תצוגה מפורטת של בקשה ותשובה):
* Trying 93.184.216.34:443...
* Connected to www.example.com (93.184.216.34) port 443 (#0)
* ALPN, offering http/1.1
* Cipher selection: ECDHE-RSA-AES128-GCM-SHA256
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Finished (14):
* TLSv1.2 (OUT), TLS handshake, Finished (16):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* Server certificate:
* subject: CN=www.example.com
* start date: May 12 00:00:00 2020 GMT
* expire date: May 12 23:59:59 2023 GMT
* subjectAltName: host "www.example.com" matched cert's "www.example.com"
* issuer: C=US; O=Let's Encrypt; CN=R3
* SSL certificate verify ok.
> GET / HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=UTF-8
< Content-Length: 1256
< Connection: keep-alive
< Date: Thu, 01 Jan 2025 12:00:00 GMT
< Server: Apache
<
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Example Domain</title>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
h1 { color: #4CAF50; }
</style>
</head>
<body>
<h1>Example Domain</h1>
<p>This domain is established to be used for illustrative examples in documents.</p>
</body>
</html>
* Connection #0 to host www.example.com left intact
הסבר על התגובה:¶
- שורת הבקשה:
GET / HTTP/1.1: בקשה מסוג GET לשלוף את עמוד הבית של האתר עם גרסת פרוטוקול HTTP/1.1.Host: www.example.com: ציון שם הדומיין שאליו מתבצעת הפנייה.User-Agent: curl/7.64.1: ציון מידע על הלקוח (במקרה זה,curl).Accept: */*: הגדרה של סוגי התוכן שהלקוח יכול לקבל.
- שורת התשובה:
HTTP/1.1 200 OK: פרוטוקול HTTP גרסה 1.1 עם קוד סטטוס 200, שמשמעותו שהבקשה הצליחה.- כותרות התשובה (response headers) כוללות מידע על סוג התוכן, אורך התוכן, ותאריך התשובה.
- גוף התשובה מכיל את התוכן של הדף עצמו, במקרה זה HTML שמייצג את העמוד הראשי של
example.com.
שליחת בקשות אחרות עם curl¶
בנוסף ל-GET, ניתן להשתמש ב-curl לשלוח בקשות POST, PUT, DELETE ועוד. לדוגמה, אם נרצה לשלוח בקשת POST עם נתונים, נוכל לעשות זאת כך:
-X POST: מציין שהבקשה היא מסוג POST.-d: מציין את הנתונים שנשלחים ב-body של הבקשה.
הפקודה curl -v היא כלי חזק ומועיל למפתחי אתרים ולמפתחים של API, כיוון שהיא מאפשרת להבין איך בקשות HTTP נשלחות ומתקבלות, וכיצד להציג ולהתמודד עם בעיות תקשורת בין הלקוח לשרת.
פרוטוקול https¶
פרוטוקול https הוא זהה לפרוטוקול http רק מוצפן עם הצפנת tls.
- קודם כל הtcp session נוצר, אחרכך נוצר הtls session שמצפין את הtcp, ואז מעל הטווח המוצפן ה"tcp המוצפן", מעליו תהיה התעבורת http.
- נשים לב שאם נפתח wireshark לא נוכל לראות את התעבורת http, כי נראה רק את התעבורת tls המוצפנת.