מה זה stateful ו-stateless

מה זה סטייט? למה אנחנו צריכים לדעת מה זה ואיך רואים את זה ממש בעיניים.
ממנטו עם גמל אין לי מושג למה אני עושה דברים

עוד מונח שיוצא לי להסביר יותר מדי ושווה לכתוב עליו כאן הוא פרוטוקול stateless מול פרוטוקול stateful כאשר זה לא חייב להיות פרוטוקול אלא עניין של הנדסת תוכנה פרופר. אבל בפרוטוקול ממש רואים את זה. הכוונה ב-state היא שימוש ב״מצב״. מה זה אומר בגדול? זכרון. אם המערכת היא stateful היא ״זוכרת״ אותי. אם היא stateless היא לא זוכרת אותי כלל. נגעתי? נסעתי. באתי שוב פעם? אני חדש לגמרי. בדיוק כמו הסרט ממנטו למי שמכיר (בטח אף אחד אבל אני מבוגר ויש פה רפרנסים של זקנים).

stateless

בואו ונדגים עם פרוטוקול HTTP שהוא פרוטוקול stateless. כדי לבצע את ההדגמה, אני אשתמש ב-Wireshark, למי שלא מכיר, מדובר בתוכנה מבוססת קוד פתוח שמבצעת ניטור של תנועת הרשת ואפשר לבחון באמצעותה את כל התנועה של הרשת מ/אל יעד מסוים. אני מאד אוהב להשתמש בה כדי להבין לעומק התנהגות בסביבות ווב (גם לא בסביבות ווב אבל זה סיפור אחר).

יצרתי שרת אינטרנט קטן בפייתון ואני אשגר אליו בקשת GET עם דפדפן. אני פשוט אקליד את הכתובת שלו בדפדפן ואלחץ על אנטר. תסתכלו על הבקשה – תראו שאין שום דבר מזהה. שום id או session או שום דבר אחר. ברגע שהבקשה נסגרת והדפדפן טוען את הדף, נגמר הסיפור. אם אני אפתח פיירפוקס חדש עם חלון אינקוגניטו ואשלח בקשה, הבקשה תהיה זהה לחלוטין.

מבחינת השרת? ברגע שהוא הגיב לבקשה שלי? נגמר הסיפור בינינו. בפעם הבאה שאגיע? אני כאילו זר מוחלט. זה קצת מעליב אבל זה הפרוטוקול. הפרוטוקול הוא stateless. נגמרה התנועה? נגמר הסיפור בינינו.

יכול להיות שיקח זמן לבקשה לרוץ, יכול להיות ששליחת הבקשה וקבלת המידע יקחו נצח נצחים, אבל ברגע שהשרת שלח את הבקשה הוא שוכח מאיתנו. זה המשמעות של stateless.

הרבה פעמים אנחנו רוצים את זה. למשל בשירותים שאנחנו מפעילים כמו API. יש לי למשל API שמשרת שירותים אחרים במערכות שבודק אם משתמש מסוים קיים במערכת. אם מישהו שולח לי את ה-id של המשתמש – למשל user/check/ID כשה-ID הוא מספר, אני בודק בדיקה מסוימת במסד הנתונים ומחזיר תשובה. אני לא צריך אינטראקציה נוספת וזה מאד מקל כאשר אני מטפל בבקשות מרובות כי לזכרון יש משמעות מחשובית, הוא עולה כסף ומשאבים וצריך לתחזק אותו. ב-stateless זה פשוט. באתי, קיבלתי, הלכתי וכמאמר השיר ״יאללה ביי״. תחשבו על רוב האינטראקציות שיש לנו באינטרנט – אני נכנס לאתר חדשות למשל, הוא נטען ו… זהו! נגמר הסיפור בינינו. אני קורא את החדשות בדפדפן שלי והשרת של אתר החדשות פנוי לקבל בקשות חדשות. כמה נוח!

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

stateful

אבל לא תמיד זה מתאים. למשל מה קורה עם מערכת שבה אני צריך לשמור זכרון? למשל… אתר בנק! אני מבצע לוגין לאתר הבנק, הוא מציג לי את פרטי החשבון שלי כולל הכסף. אני צריך להעביר כסף לגנן. אלחץ על כפתור ואעבור למסך אחר ושוב אצטרך לעשות לוגין? או למשל בפייסבוק? איך אני יכול למשל לשלוח תגובה או אימוג׳י של 👍? על כך אימוג׳י צריך לשלוח את שם המשתמש שלי והסיסמה?

אז יש לנו שתי דרכים בגדול. הראשונה היא להשתמש בפרוטוקול אחר! 😱 למשל RDP שזה פרוטוקול שמאפשר לנו להתחבר במחשב אחר בסביבת חלונות. או SSH שזה פרוטוקול שמאפשר לנו להתחבר למחשב אחר בסביבת לינוקס או מק או אפילו FTP. אבל אנחנו רוצים כן להשתמש בפרוטוקול http, כלומר דפדפן והכל. בשביל זה אנחנו צריכים לגרום לצד השני לזכור אותנו ולזכור שאנחנו מחוברים אליו ולהפוך את ה-stateless ל-stateful. איך? למשל עם מספר מזהה סודי.

הופכים את ה-stateless ל-stateful

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

זה נקרא טוקן ובאנגלית token וזה בדיוק המנגנון שדפדפנים עובדים איתו. כאשר דפדפנים יכולים לאחסן את המידע הזה בעוגיות (קבצים קטנים שנשמרים בזכרון הדפדפן) או במנגנונים אחרים כמו local storage\ session storage או indexDB. לא חסרים מקומות. בטעינה הראשונה, כשהשרת מחליט, הוא שולח הוראה לדפדפן – ״תשמור את העוגיה עם הערך שאני אומר לך״. אם הדפדפן מציית, הוא ישלח את הערך הזה בכל בקשה חדשה והדפדפן ידע שזה אני כי אם הערך ייחודי (וכדאי מאד שהוא יהיה ייחודי) אז הוא יודע שזה אני. הנה הדוגמה מ-wireshark עם הבקשה מהדפדפן – שים את העוגיה ובאנגלית set cookie, זה ליטרלי הטקסט שהוא משתמש בו. set cookie עם הערך הזה והזה.

ומעכשיו כל בקשה של השרת תהיה עם העוגיה הזו.

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

אז זה לא בדיוק stateful פרוטוקול אלא stateless שגורמים לו להיות stateful. אבל יש פרוטוקולים שהם ממש stateful. בפוסט הבא, אם זה יעניין מישהו, אני אכתוב עליהם ונציץ עליהם ב-wireshark כדי לראות איך הם עושים את זה. ספוילר: פחות או יותר באותה דרך, אבל מובנה בפרוטוקול.

פוסטים נוספים שכדאי לקרוא

חדשות אינטרנט

אז מה הקטע עם Moltbook?

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

בינה מלאכותית

מה זה Agentic AI או AI Agents

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

בינה מלאכותית

יצירת mcp client

יצירת mcp client משלנו כדי שיתחבר לשרתי mcp שונים ויחבר את ה-LLM להכל באופן סטנדרטי.

גלילה לראש העמוד