1. ספרייה
  2. HTTP והרשת
  3. יסודות HTTP

עודכן לפני חודש

הרשת היא שיחה. כל דף שראית פעם התחיל בכך שהדפדפן שלך שאל שאלה ושרת ענה עליה.

השיחה הזו מתנהלת לפי פרוטוקול — HTTP, פרוטוקול העברת ההיפרטקסט. זו השפה שדפדפנים ושרתים מדברים בה כדי להחליף דפי אינטרנט, תמונות, סרטונים ונתונים. להבין HTTP פירושו להבין איך הרשת באמת עובדת: לא כקסם, אלא כדיאלוג פשוט באופן מדהים, שחוזר על עצמו מיליארדי פעמים ביום.

מה HTTP בעצם עושה

HTTP מגדיר איך לבקש דברים ואיך להגיב עליהם. זה הכל. לקוח (הדפדפן שלך) שולח בקשה: "תן לי את הדף ב-/about." שרת שולח תגובה: "הנה הוא" או "לא מצאתי את זה" או "אין לך הרשאה לראות את זה."

טים ברנרס-לי יצר את HTTP ב-1989 כחלק מה-World Wide Web המקורי. הפרוטוקול עבר מספר גרסאות, אך הליבה נשארה ללא שינוי: בקשה, תגובה, סיום.

HTTP רץ מעל TCP, שמטפל בעבודה המורכבת של העברת נתונים בפועל דרך האינטרנט. כשמוסיפים הצפנת TLS, HTTP הופך ל-HTTPS — הגרסה המאובטחת שמגינה על התקשורת שלך ממצותתים. אבל השיחה עצמה נשארת זהה.

מבנה הבקשה

כשאתה לוחץ על קישור, הדפדפן שלך בונה בקשת HTTP עם שלושה חלקים:

שורת הבקשה מציינת מה אתה רוצה: השיטה (GET לאחזור משהו, POST לשליחת משהו), הנתיב (/products/shoes), וגרסת ה-HTTP.

כותרות מספקות הקשר: אילו סוגי תוכן הדפדפן שלך מבין, איזו שפה אתה מעדיף, האם אתה מחובר, ואיזה דף הפנה אותך לכאן.

הגוף נושא נתונים כשאתה שולח משהו — שליחת טפסים, העלאת קבצים, קריאות API. לבקשות GET בדרך כלל אין גוף; לבקשות POST בדרך כלל יש.

בקשה אמיתית עשויה להיראות כך:

GET /articles/http HTTP/1.1
Host: connected.app
Accept: text/html
Accept-Language: en-US

ארבע שורות. זה כל מה שצריך כדי לבקש דף אינטרנט.

מבנה התגובה

תגובת השרת משקפת את אותו המבנה:

שורת הסטטוס מודיעה על התוצאה: גרסת HTTP, קוד סטטוס בן שלוש ספרות, והודעה קריאה. ראית את הקודים האלה — 200 מציין הצלחה, 404 מציין שלא נמצא, 500 מציין שהשרת קרס.

כותרות מתארות מה מגיע: סוג תוכן, גודל, כללי שמירה במטמון, ומתי התוכן שונה לאחרונה.

הגוף מכיל את התוכן בפועל — HTML, JSON, תמונה, מה שביקשת.

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 4523

<!DOCTYPE html>...

בקשה, תגובה, שיחה הושלמה.

פרוטוקול הדגים הזהבים

HTTP הוא חסר-מצב — יש לו זיכרון של דג זהב. כל בקשה מגיעה כאילו זו הפעם הראשונה שנפגשתם. השרת לא זוכר שלחצת "הוסף לעגלה" לפני שלוש שניות.

זה נשמע כמו פגם בתכנון. זה בעצם כוח-על.

חוסר-המצב פירושו שהשרתים לא צריכים לעקוב אחרי מיליוני שיחות מתמשכות. כל שרת יכול לטפל בכל בקשה. אם שרת אחד קורס, שרת אחר תופס את מקומו בצורה חלקה. הפרוטוקול נשאר פשוט, מהיר ומדרגי.

אבל הרשת זקוקה לזיכרון. עגלות קניות, כניסות למערכת, העדפות — אלה דורשים לדעת מי אתה פני בקשות מרובות. אז בנינו זיכרון מעל לדג הזהב:

עוגיות הן פיסות קטנות של נתונים שהשרתים מבקשים מהדפדפנים לזכור ולשלוח חזרה עם בקשות עתידיות. "הנה מזהה הפעלה — כלול אותו בפעם הבאה כדי שאדע שזה אתה."

הפעלות מקשרות את העוגיות האלה לאחסון בצד השרת. העוגייה אומרת "user-12345"; השרת מחפש מה יש ל-user-12345 בעגלה שלו.

אסימונים מקודדים מידע ישירות, כך שהשרתים יכולים לאמת את זהותך מבלי לבצע חיפוש כלשהו.

HTTP נשאר חסר-מצב. כל מה שנבנה מעליו מוסיף בדיוק מספיק מצב כדי להיות שימושי.

לשיטות יש משמעות

שיטות HTTP אינן שרירותיות — הן נושאות משמעות סמנטית:

GET מאחזר מבלי לשנות דבר. בטוח לחזור עליו, בטוח לשמור במטמון, בטוח לטעון מראש. כשאתה טוען דף, הדפדפן שלך שולח בקשות GET ל-HTML, CSS, JavaScript, תמונות — כל מה שצריך כדי להציג אותו.

POST שולח נתונים ועלול לשנות דברים. יצירת חשבונות, פרסום תגובות, עיבוד תשלומים. לא בטוח לחזור עליו בעיוורון — רענון של POST עלול לשלוח את ההזמנה שלך פעמיים.

PUT מחליף משאב לחלוטין. PATCH משנה אותו חלקית. DELETE מסיר אותו.

HEAD מבקש כותרות בלבד, ללא הגוף — שימושי לבדיקה אם משהו השתנה מבלי להוריד אותו שוב.

OPTIONS שואל אילו שיטות מותרות — חשוב כש-JavaScript מדומיין אחד רוצה לתקשר עם דומיין אחר.

דפדפנים ושרתים משתמשים בסמנטיקה הזו כדי לקבל החלטות חכמות. תגובות GET ניתן לשמור במטמון באופן אגרסיבי. בקשות POST צריכות אישור לפני ניסיון חוזר. המשמעות נמצאת בשיטה.

השכבות שמתחת

HTTP לא מעביר את עצמו. הוא מוסר הודעות ל-TCP, שמחלק אותן למנות, שולח אותן דרך האינטרנט, מרכיב אותן מחדש בסדר הנכון, ומשדר מחדש כל מנה שאבדה. HTTP רק כותב וקורא; TCP מטפל בדרך.

עבור HTTPS, TLS יושב בין HTTP ל-TCP. לפני שכל שיחת HTTP מתחילה, הלקוח והשרת מבצעים לחיצת יד TLS: מאמתים זהות דרך אישורים דיגיטליים, מסכימים על הצפנה, ומחליפים מפתחות. לאחר מכן כל הודעת HTTP מוצפנת לפני ש-TCP נוגע בה, ומפוענחת עם הגעתה.

השכבתיות הזו אלגנטית. HTTP מתמקד במבנה השיחה. TLS מספק אבטחה. TCP מבטיח אמינות. כל שכבה עושה עבודה אחת היטב, ויחד הן יוצרות משהו חזק יותר ממה שכל אחת מהן יכולה להיות לבד.

מה קורה כשטוענים דף

אתה מקליד כתובת URL ולוחץ Enter. הנה השיחה שמתרחשת:

  1. הדפדפן שלך שואל את DNS לגבי כתובת ה-IP של השרת
  2. הוא פותח חיבור TCP (ועם לחיצת יד TLS עבור HTTPS)
  3. הוא שולח בקשת GET למסמך ה-HTML
  4. השרת מגיב עם HTML
  5. הדפדפן שלך מנתח את ה-HTML ומגלה שהוא צריך CSS, JavaScript ותמונות
  6. הוא שולח בקשות GET מקבילות לכל משאב
  7. כשהתגובות מגיעות, הוא מיישם CSS, מריץ JavaScript ומציג תמונות
  8. JavaScript עלול להפעיל בקשות נוספות לנתונים
  9. הדף מוצג במלואו

דף אינטרנט "פשוט" עשוי לכלול 50-100 בקשות HTTP. יישום אינטרנט מורכב — מאות. כל אחת עוקבת אחרי אותו דפוס: בקשה, תגובה, סיום.

נקודות מפתח

HTTP הוא פרוטוקול שיחה — לקוחות שואלים, שרתים עונים. העיצוב חסר-המצב שלו מספק מדרגיות, בעוד עוגיות והפעלות מוסיפות את הזיכרון שיישומי הרשת זקוקים לו. שיטות נושאות משמעות סמנטית שמאפשרת שמירה במטמון, אבטחה ואופטימיזציה. TCP מעביר את ההודעות בצורה אמינה; TLS מצפין אותן בצורה מאובטחת. כל דף אינטרנט שטענת פעם הורכב ממאות החלפות פשוטות כאלה, שכל אחת מהן עוקבת אחרי אותו דפוס בקשה-תגובה ש-HTTP משתמש בו מאז 1989.

הפרוטוקול פשוט כמעט עד אבסורד. הפשטות הזו היא הסיבה שהוא הפך לבסיס של הרשת המודרנית.

שאלות נפוצות על HTTP

מה ההבדל בין HTTP ל-HTTPS?

HTTPS הוא HTTP עם הצפנה. השיחה זהה — אותן בקשות, אותן תגובות, אותן שיטות. אבל TLS מצפין הכל לפני שהנתונים נוסעים ברשת, ומונע ממצותתים לקרוא את הנתונים שלך או לטפל בהם. ה-"S" מייצג Secure (מאובטח), וזה צריך להיות ברירת המחדל עבור כל תעבורת האינטרנט כיום.

למה אני רואה קודי סטטוס HTTP שונים?

קודי הסטטוס הם הדרך של השרת לסווג את תגובתו. קודי 2xx מציינים הצלחה (200 OK, 201 Created). קודי 3xx מציינים הפניה מחדש (301 Moved Permanently, 304 Not Modified). קודי 4xx מציינים שגיאת לקוח — ביקשת משהו לא נכון (400 Bad Request, 404 Not Found, 403 Forbidden). קודי 5xx מציינים שגיאת שרת — משהו נשבר בצידם (500 Internal Server Error, 503 Service Unavailable).

איך עוגיות עובדות עם העיצוב חסר-המצב של HTTP?

עוגיות הן פתרון עקיף חכם. השרת שולח כותרת Set-Cookie עם תגובתו: "זכור את הערך הזה." הדפדפן שלך שומר אותו וכולל אותו בבקשות עתידיות לאותו שרת דרך כותרת Cookie. HTTP נשאר חסר-מצב — הוא לא זוכר שום דבר — אבל עוגיות מאפשרות לשרת לזהות אותך לפי המזהה שאתה נושא עם כל בקשה.

מה ההבדל בין GET ל-POST?

GET מאחזר נתונים מבלי לשנות דבר. פרמטרי הבקשה נמצאים בכתובת ה-URL, ניתן לשמור אותה במטמון, לסמן אותה כסימנייה ולחזור עליה בבטחה. POST שולח נתונים שעלולים לשנות את מצב השרת. הנתונים נמצאים בגוף הבקשה, לא צריך לשמור אותם במטמון, וחזרה עליהם עלולה לגרום לפעולות כפולות. השתמש ב-GET לקריאה, ב-POST לכתיבה.

האם דף זה היה מועיל?

😔
🤨
😃
מה זה HTTP ואיך הוא עובד? • ספרייה • Connected