Loading AI tools
פרוטוקול תקשורת מוויקיפדיה, האנציקלופדיה החופשית
Hypertext Transfer Protocol (ראשי תיבות: HTTP) הוא פרוטוקול תקשורת שנועד להעברת דפי HTML ואובייקטים שהם מכילים (כמו תמונות, קובצי קול, סרטונים וכו') ברשת האינטרנט וברשתות אינטראנט. הפרוטוקול פועל בשכבת היישום של מודל ה-OSI ובשכבת היישום של מודל TCP/IP. שרתי HTTP הם שרתי התוכן המרכזיים ברשת האינטרנט ודפדפנים הם תוכנות הלקוח הנפוצות ביותר לפרוטוקול HTTP. הדרך הנפוצה ביותר כיום להשתמש בפרוטוקול היא HTTPS, שמוסיף הצפנה מעל הפרוטוקול.
התקשורת ב־HTTP מתחילה ביצירת שיחה בין השרת ללקוח באמצעות פרוטוקול TCP או UDP בגרסה 3 של הפרוטוקול, ונמשכת בסדרה של בקשות (requests) ותשובות (responses) שנשלחות על ידי הלקוח והשרת, בהתאמה. ראשית, הלקוח יוצר חיבור לכתובת ה-IP ולפורט שבו השרת נמצא, בדרך כלל פורט 80 או 443. לאחר מכן נשלחת הבקשה, הכוללת את הכתובת של האובייקט המבוקש (למשל, דף HTML) ופרטים נוספים על הבקשה ועל הלקוח. השרת קורא את הבקשה, מפענח אותה, שולח ללקוח תשובה בהתאם ומנתק את החיבור ללקוח כשהשליחה הסתיימה, או משאיר אותו פתוח לבקשות נוספות.
מעצם הגדרתו, פרוטוקול HTTP הוא stateless protocol – חסר מצבים. על מנת ליצור תקשורת בין הלקוח לשרת שמבוססת על היסטוריית הבקשות-תשובות בין השרת ללקוח נעשה שימוש בעוגיות (cookies). לדוגמה, שרת יכול לבקש ממחשב הלקוח לשמור עוגייה עם אישור שהלקוח התחבר לחשבון מסוים עם סיסמה נכונה על מנת שלא יצטרך להקיש סיסמה בכל התחברות מחדש לאתר שמתארח על השרת.
בשנת 1991 פורסמה הגרסה הראשונה של הפרוטוקול שהייתה בשימוש (0.9). גרסה זו הייתה פשוטה ביותר ולא תמכה ברוב האפשרויות הקיימות כיום. שיטת הבקשה היחידה בגרסה זו הייתה GET, לא הוגדרו שדות כותרת והבקשות לא כללו את גרסת ה-HTTP כפי שהן כיום. כתוצאה מכך הלקוח לא יכול היה להעביר לשרת שום אינפורמציה נוספת פרט לכתובת של העמוד המבוקש. התשובה של השרת הכילה את האובייקט שכתובתו ניתנה בבקשה, גם כן ללא שדות כותרת, ואינדיקציה לסוף ההודעה ניתנה על ידי ניתוק חיבור ה-TCP על ידי השרת. מכיוון שהתשובות הכילו רק את האובייקט המבוקש, הודעות שגיאה נשלחו גם הן בפורמט HTML ולא היה ניתן להבחין ביניהן לבין דפים רגילים.
במאי 1996 התפרסמה גרסה 1.0 של הפרוטוקול, שנמצאת עדיין (אוקטובר 2007) בשימוש נרחב בעיקר על ידי שרתי פרוקסי. בגרסה זו נוספו שיטות הבקשה HEAD, POST, PUT, DELETE, LINK ו-UNLINK ובקשות נדרשו לציין את גרסת הפרוטוקול. תשובות השרת כללו עתה פרט לתוכן הדף המבוקש, קוד מיוחד שמציין את תוצאת הבקשה (ראו להלן), מלווה בהסבר טקסטואלי בן מספר מילים על משמעות הקוד. הוגדרו כ-30 שדות כותרת, שנועדו בין השאר לייעל את השימוש במטמון, לציין מראש את אורך ההודעה, לאפשר הפניות אוטומטיות בין דפים ולהעביר מידע נוסף.
הגרסה הנוכחית, HTTP/1.1, פורסמה ביוני 1999 והתבססה ברובה על גרסה 1.0. ההבדלים העיקריים בין גרסה זו לקודמתה הם שליטה טובה יותר במטמון, הוספת שיטות הבקשה OPTIONS ו-TRACE, תמיכה ב-virtual hosts, ותוספות מתקדמות שמטרתן לייעל את אופן הפעולה של הפרוטוקול. כמו כן, הוסרו מספר אפשרויות שהיו קיימות בגרסה הקודמת, לרוב משום שנמצאו לא שימושיות. מאפיין חשוב שנתמך בגרסה זו הוא האפשרות להשתמש בחיבור יחיד עבור מספר בקשות, במקום לפתוח חיבור חדש עבור כל אובייקט שנמצא בדף שהתקבל בתשובה הראשונה.
ב-2015, 15 שנה אחרי הגרסה האחרונה של HTTP, יצאה גרסה HTTP/2 (במקור HTTP/2.0) של הפרוטוקול. הגרסה שמרה על הסמנטיקות של הפרוטוקול, כגון סוגי הבקשות והתשובות, אולם שינתה את המנגנון מתחת, לדוגמה, היא מאפשרת שליחת מספר בקשות במקביל באותו חיבור ודחיסה של שדות הכותרת.
ב-16 ביוני 2022 הIETF פרסם את גרסה HTTP/3 של הפרוטוקול, שמבוססת על QUIC, פרוטוקול ריבוי ערוצי תעבורה (multiplexed) שמבוסס על פרוטוקול UDP, במקום TCP שבו השתמשו הגרסאות הקודמות. הפרוטוקול שומר על הסמנטיקה של הגרסאות הקודמות, אולם הוא משנה את הדרך שבה המידע מועבר, וגורם לשיפור במהירות הטעינה, במיוחד למכשירים עם latency גבוה[1]. הפרוטוקול מתוקנן על ידי RFC 9114[2].
בקשות HTTP מורכבות מהנתונים הבאים:
מאז גרסה 1.1, קיימות 8 שיטות בקשה: GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE ו-CONNECT. ניתן לסווג אותן בשני אופנים: שיטות בטוחות לעומת שיטות לא בטוחות, ושיטות אידמפוטנטיות (idempotent) לעומת שיטות שאינן אידמפוטנטיות. סיווגים אלו נועדו להוות אינדקציה כללית עבור שרתים, דפדפנים ובוני אתרים באשר למידת ההשפעה של כל אחת מהשיטות על השרת ועל הלקוח.
שיטות בטוחות מוגדרות ככאלה שמיועדות רק לשם קבלת מידע מהשרת; הן לא אמורות לשמש, למשל, לשליחת מידע מהלקוח לשרת, לביצוע שינויים כלשהם במסדי נתונים שנמצאים על השרת וכו'. במילים אחרות, אין לשיטות אלה תופעות לוואי, למשל תוצאות, פרט לקבלת מידע. GET ו-HEAD נחשבות לשיטות בטוחות.
שיטות אידמפוטנטיות הן שיטות ששליחה חוזרת שלהן גורמת בדיוק לאותן תוצאות כמו שליחה אחת. שיטות שהן בטוחות הן, לפי ההגדרה, גם אידמפוטנטיות, משום שאין להן כלל תופעות לוואי. השיטות PUT ו-DELETE גם הן נכללות בסיווג זה. במקרה של DELETE, למשל, בקשה נוספת למחיקה של אותו פריט תגרום לכך שהפריט לא ימצא על השרת. אפילו אם הוא כבר לא היה עליו אחרי בקשה אחת, התוצאה של הבקשות החוזרות היא בדיוק אותה תוצאה של הבקשה הראשונה.
אלו הן שיטות הבקשה הנתמכות בגרסה 1.1:
כל שרתי ה- HTTP הכלליים נדרשים ליישם לפחות את שיטות ה-GET וה-HEAD. כל שיטה אחרת נחשבת אופציונלית.
כתובת בבקשת HTTP יכולה להיות כתובת מלאה (כמו: http://www.w3.org/Protocols) או כתובת יחסית לשרת (בדוגמה זו, Protocols/). השימוש בכתובות יחסיות הוא הנפוץ ביותר, דבר שהקשה בעבר על אחסון של מספר אתרים על אותו שרת, משום שהשרת לא יכול היה לדעת לאיזה אתר מבין האתרים המאוחסנים אצלו מכוונת הבקשה. כדי לפתור את הבעיה מבלי לאבד את התמיכה לאחור בגרסאות קודמות, גרסה 1.1 מחייבת כל בקשה לכלול שדה כותרת בשם host, שערכו הוא שם המתחם של האתר אליו מיועדת הבקשה.
לאחר קריאת הבקשה ששלח הלקוח, השרת מחזיר תשובה שמכילה:
כאמור, קוד המצב מורכב ממספר תלת ספרתי והסבר קצר (בן שורה אחת) על משמעות הקוד. המספרים מחולקים ל-5 קטגוריות, בהתאם לספרה הראשונה שלהם:
1xx – ההודעה מכילה מידע בלבד.
2xx – הבקשה ששלח הלקוח בוצעה בהצלחה על ידי השרת, והתשובה מכילה את מה שהשרת נתבקש לשלוח בהתאם לשיטת הבקשה.
3xx – הבקשה פוענחה בהצלחה, אך מסיבות כלשהן התשובה אינה כוללת את האובייקט המבוקש (למשל, משום שהעמוד מפנה אוטומטית לעמוד אחר).
4xx – נמצאה שגיאה כלשהי בבקשה עצמה.
5xx – השרת לא הצליח למלא אחר הבקשה כתוצאה מכשל פנימי.
אם לקוח מקבל תשובה מהשרת שמכילה קוד שלא מוכר לו, הפרוטוקול מציע ללקוח לשייך את הקוד לאחת המחלקות הנ"ל לפי הספרה הראשונה ולפעול כאילו שתי הספרות הנותרות היו 00. כך מתאפשרת הרחבה של הפרוטוקול תוך שמירה על תמיכה לאחור.
HTTP 1.1 מגדיר 41 מספרי מצב בצירוף ההסבר הטקסטואלי הנלווה להם, אף על פי שאין חובה להשתמש בהסברים המופיעים בפרוטוקול.
להלן כמה ממספרי המצב הנפוצים ברשת האינטרנט:
שדות כותרת (באנגלית: Headers) הם מחרוזות שנשלחות כחלק מכל הודעת HTTP שכוללות מידע עליה, כגון אורכה, מזהה של התוכנה ששלחה את ההודעה ועוד. שדות הכותרת לרוב לא מוצגים למשתמשים אלא רק נשמרים בלוגים של השרת או תוכנת הלקוח ומשפיעים על הטיפול של ההודעות. רבים מהשדות מבוססים על פרוטוקול MIME המשמש לשליחת הודעות בדואר אלקטרוני. כמעט כל השדות הם אופציונליים, פרט ל-host עבור בקשות, ושדות מסוימים המציינים את אורך גוף ההודעה עבור הודעות שבהן הוא לא ריק.
שם | הסבר | דוגמה |
---|---|---|
Content-Length | האורך של ההודעה בבתים | Content-Length: 439 |
Content-Type | הפורמט של תוכן ההודעה | Content-Type: image/png |
Cookie | העוגייה שהלקוח שומר אצלו, נשלח בבקשות אל השרת | Cookie: Username=Dor; Skin=new; |
Date | התאריך שבו ההודעה נשלחה | Date: Sun, 20 Oct 1996 04:11:43 GMT |
Host | הדומיין שאליו נשלח הבקשה, והפורט שאליו פונים, אם הוא לא הפורט הסטנדרטי לשירות המבוקש. השדה הוא חובה מאז HTTP/1.1 [3]. | Host: he.wikipedia.org
|
User-Agent | מחרוזת שמזהה את התוכנה (user agent (אנ')) שמשמשת לצפייה בבקשה | User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:108.0) Gecko/20100101 Firefox/108.0 |
עד גרסה 1.0 הלקוח נאלץ לפתוח ולסגור את החיבור מחדש פעמים רבות, גם כשהיה ידוע מראש על מספר בקשות שעתידות להישלח לאותו שרת. סגירה של החיבור כאשר ידוע שמיד יתבקש לפתוח אותו מחדש, ובקשה לפתיחה שלו מיד לאחר מכן, יוצרת עומס מיותר. לכן לקוחות ושרתים ניסו ליישם שיטה לשימוש בחיבור יחיד עבור מספר בקשות. השיטה שיושמה ייעלה מצבים שתוארו לעיל, אך יצרה מספר בעיות בחיבורים לשרתי פרוקסי.
גרסה 1.1 שיפרה את המנגנון כך שיהיה ניתן להשתמש בו גם עם שרתי פרוקסי. המנגנון נוצר כך שיתאים גם למנגנון הקודם וגם לשרתים ישנים יותר. בנוסף, תוארו מספר מנגנונים ומוסכמות לשימוש יעיל ב"חיבור קבוע" (persistent connections), הוגדר אופן הטיפול בבעיות שעלולות להיווצר באחת או יותר מהבקשות והוקדש קוד מצב מיוחד, שמספרו 100, לניצול נוסף של המנגנון.
השליטה במטמון ב-HTTP נעשית בשני אופנים, הנקראים "מנגנון האימות" ו"מנגנון התפוגה". מנגנון האימות מבוסס על פריט מידע שמוצמד לכל עמוד ונשלח יחד איתו. פריט המידע הזה יכול להיות התאריך האחרון בו שונה העמוד או מספר זיהוי הקרוי Entity tag המשתנה בכל פעם שתוכן העמוד משתנה. כשלקוח או שרת מטמון שולחים בקשה לעמוד מסוים שיש בידם עותק שלו שהתקבל מבקשה קודמת, הם מצרפים לבקשה את אחד מהנתונים האלו שנשלח בפעם האחרונה שהעמוד התקבל. לפי הנתון הזה, השרת יכול לדעת אם העותק עדכני, ואם לא – לשלוח את העמוד המעודכן במלואו, כפי שהיה שולח בתגובה לבקשה רגילה (כולל הנתונים החדשים שמצורפים אליו). אם העמוד לא השתנה, השרת שולח תשובה קצרה ללא גוף, שקוד המצב שלה הוא 304 (Not Modified), ובכך חוסך את שליחת העמוד כולו.
מנגנון התפוגה מבוסס על הצמדת "תאריך תפוגה" לכל עמוד שמתקבל מהשרת. עד לתאריך זה, ניתן להשתמש בעמוד שהתקבל ללא כל תקשורת נוספת עם השרת. לאחר שהתאריך עבר, הבקשה הראשונה שתתקבל תישלח אל השרת לשם קבלה מחודשת של העמוד, לעיתים תוך שימוש במנגנון האימות. תאריך התפוגה יכול להיקבע על ידי השרת, אולם לרוב הוא נקבע בעזרת כללי אצבע על ידי המטמון בהתחשב בתאריך הנוכחי, בתאריך השינוי האחרון של העמוד אם הוא ידוע ובנתונים נוספים.
מנגנונים אלה פועלים בעזרת מספר שדות כותרת מיוחדים, ובעיקר בעזרת השדה Cache-Control המשמש הן לקוחות והן שרתים לשליטה באופן שבו הצד השני יטפל במטמון. בעזרתו, לקוח יכול להורות לשרת מטמון שעשוי להימצא בינו לבין השרת המקורי לאמת את העמוד שהוא מבקש אפילו אם נמצא אצלו עותק תקף של אותו עמוד, או לחלופין לשלוח לו את העמוד רק אם הוא נמצא אצלו בזיכרון מבלי לתקשר עם השרת. שרתים יכולים להורות ללקוח או לשרתי מטמון לא לשמור את העמוד שהם שולחים, לשמור אותו רק בתנאים מסוימים וכו'. שדות כותרת נוספים משמשים להצמדת נתונים רלוונטיים לעמודים שהשרת שולח או לבקשות אימות של עמודים שנמצאים בזיכרון מטמון.
הדוגמאות הבאות התקבלו בעזרת לקוח טלנט של יוניקס[4], עם
telnet www.google.com 80
80 הוא מספר הפורט בו השרת ממתין לפניות. telnet הוא שם התוכנית המפעילה לקוח טלנט במרבית מערכות ההפעלה. www.google.com הוא שם המתחם בו נמצא השרת. הוא יתורגם על ידי לקוח הטלנט לכתובת IP לפני שהלקוח יוכל לפנות לשרת.
מספור השורות להלן נועד לנוחות, ואינו חלק מהפרוטוקול. שורות ריקות המתחיבות על ידי הפרוטוקול מסומנות בצבע צהוב, וכיתוב בהן אינו חלק מהפרוטוקול.
GET /
HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.co.il/?gfe_rd=cr&i=LhIOWOfFM6Hz8wfj_ICADQ
Content-Length: 261
Date: Mon, 24 Oct 2016 13:52:46 GMT
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.il/?gfe_rd=cr&ei=lCYOWIy6EKvz8wfG_YCQBA">here</A>.
</BODY></HTML>
GET / HTTP/1.1
host: www.google.com
בסוף הכותרת נדרשת שורה ריקה
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.co.il/?gfe_rd=cr&ei=-DYOWN3AIcqC8QeS9ID4Cw
Content-Length: 261
Date: Mon, 24 Oct 2016 16:29:44 GMT
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.il/?gfe_rd=cr&ei=-DYOWN3AIcqC8QeS9ID4Cw">here</A>.
</BODY></HTML>
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.