OSI Layer 5 of 7

Session Layer

ชั้นที่มีเนื้อหาน้อยที่สุดในเอกสารต้นฉบับของวิชานี้ — แต่ยังมีแนวคิดที่ควรเข้าใจ และมีตัวอย่างจริงให้เห็นในบทอื่น ๆ ของคอร์ส

🔗
เทียบเท่าใน TCP/IP: Application Layer (TCP/IP ไม่มี Session แยกต่างหาก) — อ่านคำอธิบายเพิ่ม →

1นิยามตาม OSI

หน้าที่ตาม OSI (ตามที่ระบุในเอกสารต้นฉบับ)
ทำหน้าที่จัดตั้ง ดูแล การเชื่อมต่อ (Connection) ระหว่าง Application ต้นทางและปลายทาง แบ่งการเชื่อมต่อสื่อสารออกเป็น Session — ให้ name space ที่ใช้ผูก (tie together) transport stream ที่อาจต่างกันหลายเส้น ให้เป็นส่วนหนึ่งของ application เดียวกัน
หมายเหตุความซื่อตรงต่อแหล่งข้อมูล
เอกสารการสอนต้นฉบับของวิชานี้กล่าวถึง Session Layer ในระดับนิยามสั้น ๆ เท่านั้น ไม่มีรายละเอียดเชิงลึก (algorithm, protocol header, ตัวอย่างคำนวณ) เหมือนชั้นอื่น — หน้านี้จึงสั้นกว่าหน้าอื่นโดยตั้งใจ เพื่อไม่เสริมเนื้อหาที่ไม่มีอยู่ในเอกสารการสอนจริง แต่จะอธิบายแนวคิดเชิงมโนทัศน์ และชี้ตัวอย่างที่ใกล้เคียงซึ่งปรากฏในบทอื่นของคอร์สแทน

2ทำไม Session Layer ถึง "หายไป" ใน TCP/IP

ในทางปฏิบัติ ฟังก์ชันที่ OSI มอบให้ Session Layer มักถูก implementภายใน application เอง แทนที่จะแยกเป็นโปรโตคอลชั้นกลางต่างหาก — นี่คือเหตุผลที่ TCP/IP model ไม่มีชั้นนี้แยกออกมา (ยุบรวมเข้ากับ Application Layer)

แนวคิดของ Session Layerตัวอย่างที่ใกล้เคียงในคอร์สนี้ (อยู่ที่ Application Layer จริง)
การจัดตั้ง/ดูแล session ระหว่างต้นทาง-ปลายทางSIP (Session Initiation Protocol) ใน Application Layer — ทำหน้าที่ setup/manage session ของการสนทนา VoIP โดยตรง (ดูรายละเอียดในหน้า Application Layer หัวข้อ Multimedia Applications)
Name space ผูก transport stream หลายเส้นเป็น application เดียวSDP (Session Description Protocol) ที่บอกรายละเอียด session (media type, port, encoding) ให้ทุกฝ่ายที่เกี่ยวข้อง
รักษาสถานะการสนทนาข้าม request หลายครั้งHTTP Cookie ที่ Application Layer ใช้จำลอง "session state" บนโปรโตคอลที่เป็น stateless โดยกำเนิด (HTTP เองไม่มี session concept ในตัว)
มุมมองเชิงวิพากษ์สำหรับข้อสอบ
ถ้าโจทย์ถามว่า "เครือข่าย Internet จริงมี Session Layer หรือไม่" คำตอบที่แม่นยำคือ: ไม่มีในเชิงสถาปัตยกรรม (TCP/IP ไม่กำหนดไว้) แต่มีในเชิงหน้าที่ (functional) เพราะแอปพลิเคชันหลายตัว (SIP, HTTP+Cookie) implement สิ่งที่ทำหน้าที่เดียวกับ session management ไว้ในชั้นของตัวเอง — นี่คือตัวอย่างที่ดีของความแตกต่างระหว่าง "โมเดลอ้างอิงทางทฤษฎี" กับ "การ implement จริง"

3Session ไม่ใช่ Connection และไม่ใช่ Identity

Transport connection คือช่องทางส่งข้อมูลระหว่าง endpoints ส่วน session คือบริบทของกิจกรรมที่ต่อเนื่อง และ identity คือคำตอบว่า actor เป็นใคร สามอย่างนี้เกี่ยวข้องกันแต่ไม่ควรถูกผูกเป็นสิ่งเดียว Session หนึ่งอาจอยู่ต่อหลัง TCP connection ขาด ผู้ใช้หนึ่งคนมีหลาย session จากหลายอุปกรณ์ และ connection หนึ่งบรรทุกหลาย logical session ได้

ลองนึกถึงการโทรศัพท์

โทรศัพท์คือ connection ส่วนเรื่องที่กำลังคุยคือ session ถ้าสายหลุดแล้วโทรใหม่ เรายังพูดเรื่องเดิมต่อได้ ขณะที่คนคนเดียวอาจคุยหลายเรื่องผ่านสายเดียว การมีสายต่ออยู่ก็ไม่ได้พิสูจน์ว่าคนปลายสายเป็นบุคคลที่อ้าง ต้องมี authentication แยกต่างหาก

แนวคิดตอบคำถามตัวอย่าง
Connectionข้อมูลเดินทางผ่านช่องทางใดTCP connection
Sessionกำลังทำกิจกรรมใดและถึงขั้นไหนLogin, upload, meeting
IdentityใครกำลังทำกิจกรรมAccount, certificate
Stateต้องจำข้อมูลอะไรเพื่อทำต่อCart, checkpoint, role

4เริ่ม ดูแล และยุติ Session

ตอนเริ่ม session ทั้งสองฝ่ายอาจตกลง protocol version, capability, role, encoding และสิทธิ์ใช้งาน ขั้นนี้ต่างจาก TCP handshake ซึ่งสร้าง transport connection เท่านั้น TCP connected แล้ว application negotiation ยังล้มเหลวได้ Session establishment มักสร้าง session ID หรือ token สำหรับอ้างถึงบริบทใน request ถัดไป

ระหว่างใช้งาน ระบบต้องดู dialogue control ว่าใครส่งได้เมื่อใด บางงานส่งสองทิศพร้อมกัน บางงานต้องผลัดกันพูดหรือถือ token เพื่อแก้ไข resource เมื่อปิด session แบบปกติควรบันทึกผล ปล่อย resource และ revoke credential ตามนโยบาย แต่ถ้า client หายไปโดยไม่แจ้ง server ต้องพึ่ง expiry, heartbeat หรือ lease

Dialogue control เหมือนไมโครโฟนในห้องประชุม

ช่องเสียงเปิดให้ทุกคน แต่การมีไมโครโฟนบอกว่าใครพูดอยู่ หากผู้ถือเดินออกจากห้อง ระบบต้องมีเวลาหมดอายุ ไม่เช่นนั้นคนที่เหลือจะรอสิทธิ์ที่ไม่มีวันกลับมา

ความเงียบไม่ได้พิสูจน์ว่าอีกฝ่ายตาย

Connection อาจขาด เครื่องอาจ pause หรือ network อาจ partition Timeout เป็นการตัดสินใจของผู้รอ ไม่ใช่หลักฐานสมบูรณ์เกี่ยวกับผู้ถูกเรียก ผลของ session expiry จึงต้องออกแบบให้ย้อนกลับหรือกู้คืนได้ตามความเสี่ยง

5Synchronization และ Checkpoint

งานขนาดใหญ่ไม่ควรเริ่มใหม่ทั้งหมดเมื่อการสื่อสารสะดุด Checkpoint แบ่งงานเป็นช่วงและบอกจุดล่าสุดที่ยืนยันแล้ว เมื่อ reconnect ทั้งสองฝ่ายถามสถานะและทำต่อจากจุดนั้น แนวคิดนี้ใช้กับ resumable upload, database replication, workflow และการแก้เอกสารร่วมกัน

Checkpoint เหมือนที่คั่นหนังสือ

อ่านถึงหน้า 300 แล้วไฟดับ เราไม่ต้องเริ่มหน้าแรก แต่ที่คั่นต้องผูกกับหนังสือฉบับที่ถูกต้อง หากเนื้อหาถูกแก้ เลขหน้าเดิมอาจชี้คนละย่อหน้า Checkpoint จึงต้องมี version, object identity หรือ hash ประกอบ ไม่ใช่เก็บเลขตำแหน่งอย่างเดียว

ตัวอย่าง Resumable Upload

  1. Server สร้าง upload ID และกำหนดขนาด/เงื่อนไข
  2. Client ส่ง chunk พร้อม offset หรือ part number
  3. Server ตรวจ hash และบันทึกแบบ durable ก่อนตอบว่าได้รับแล้ว
  4. ถ้าสายหลุด Client ถามสถานะด้วย upload ID
  5. ส่งต่อจากส่วนที่ server ยืนยัน ไม่ใช้จำนวน byte ที่ send() รับเป็นหลักฐาน

TCP ACK ยืนยันว่า byte ถึง transport stack ไม่ได้ยืนยันว่า application เขียนลง storage แล้ว Checkpoint ระดับงานต้องมี application acknowledgment หลัง durable commit และต้องรับมือ chunk ซ้ำด้วย idempotency

Checkpoint ไม่เท่ากับ transaction Checkpoint บอกจุดกลับมาทำต่อ ส่วน transaction กำหนด atomicity หากงานมี side effect เช่นตัดเงินหรือส่งอีเมล การย้อน checkpoint ไม่ทำให้ผลภายนอกหาย ต้องใช้ idempotency key หรือ compensating action

6Session ใน Web: Cookie, Token และ Server-side State

HTTP request แต่ละครั้งตีความได้โดยไม่ต้องมี transport connection เดิม แต่ web application สร้างความต่อเนื่องด้วย cookie หรือ authorization token Cookie เป็นกลไกที่ browser เก็บและแนบข้อมูลตาม domain, path และ security attributes ไม่ใช่ session ทั้งหมด Cookie อาจถือ opaque session ID ที่ชี้ไป server-side store หรือถือ signed token ที่มี claim อยู่ภายใน

แนวทางข้อดีข้อแลกเปลี่ยน
Opaque Session IDแก้และ revoke state ฝั่ง server ได้ง่ายต้องมี session store, replication และ expiry
Signed Tokenตรวจ claim ได้โดยไม่ lookup ทุก requestrevoke ก่อนหมดอายุยาก, ต้องจัดการ key rotation
State ใน Clientลด state ที่ server บางส่วนห้ามเชื่อข้อมูลที่แก้ได้ ต้อง sign/encrypt ตามโจทย์

Stateless service ไม่ได้หมายถึงระบบไม่มี state แต่หมายถึง instance ไม่พึ่ง conversational state ที่ซ่อนอยู่เฉพาะ memory ของตัวเอง Request จึงไป instance ใดก็ได้โดยอ่าน state จาก token หรือ shared store Database และ session store ยังเป็น state เพียงถูกย้ายตำแหน่งให้จัดการ scaling ง่ายขึ้น

Session ID เหมือนบัตรรับฝากของ

บัตรไม่ได้บรรจุของ แต่อ้างถึงตู้ฝั่งร้าน ใครขโมยบัตรอาจรับของแทนได้ จึงต้องป้องกันการเดาและการขโมย Signed token คล้ายบัตรที่พิมพ์ข้อมูลพร้อมตราประทับ ตรวจได้โดยไม่เปิดตู้กลาง แต่การเรียกคืนก่อนวันหมดอายุทำได้ยากกว่า

ความปลอดภัยของ Session

7Session ในระบบที่มีหลาย Server

ถ้าเก็บ session ใน memory ของ instance เดียว Request ที่ load balancer ส่งไปเครื่องอื่นจะหา state ไม่เจอ Sticky session บังคับให้กลับเครื่องเดิม ช่วยง่ายช่วงแรกแต่ทำให้ failover และ balancing ยาก Shared store ทำให้ instance ทดแทนกันได้แต่เพิ่ม dependency และ latency ส่วน self-contained token ลด lookup แต่เพิ่มปัญหา revocation และ stale claim

Sticky session เหมือนต้องกลับไปหาเจ้าหน้าที่คนเดิม

เจ้าหน้าที่จำเรื่องไว้ในสมุดส่วนตัว งานเร็วเมื่อเขาอยู่ แต่ถ้าเขาลาหรือโต๊ะเต็ม ลูกค้าไปต่อไม่ได้ Shared store เหมือนแฟ้มกลางที่ทุกคนเปิดได้ ยืดหยุ่นขึ้น แต่แฟ้มกลางต้องพร้อมและรองรับคนจำนวนมาก

ถ้า session store replicate แบบ asynchronous แล้ว primary ล่ม การอัปเดตล่าสุดอาจหาย ผู้ใช้อาจย้อนสถานะหรือสิทธิ์ที่เพิ่งถอนกลับมาใช้ได้ Consistency requirement ต้องดูผลเสีย ตะกร้าหายหนึ่งรายการต่างจาก admin permission ที่ถูกเพิกถอน

หลาย tab หรือหลาย request อาจแก้ session พร้อมกัน Last-write-wins ทำข้อมูลหายได้ Optimistic concurrency ใช้ version ตรวจ conflict งานบางชนิดต้อง serialize หรือออกแบบ operation ให้ commutative ระบบกระจายไม่ได้มีปัญหาเพราะ session “อยู่ผิดชั้น” แต่เพราะ state มีเจ้าของและความสอดคล้องที่ต้องนิยาม

ย้าย Session เข้า Redis ไม่ได้สร้าง High Availability โดยอัตโนมัติ

Store กลายเป็น dependency กลาง ต้องมี capacity, replication, persistence, timeout และ failure policy หาก store ช้า ทุก request ที่แตะ session ก็ช้า สถาปัตยกรรมไม่ได้ลบ state แต่เลือกตำแหน่งรับความซับซ้อน

8Heartbeat, Lease และ Presence

ระบบประชุม เกม และ service discovery ต้องอนุมานว่าสมาชิกยังอยู่ Heartbeat เป็นหลักฐานล่าสุด ส่วน lease เป็นสิทธิ์ที่หมดอายุหากไม่ต่อเวลา Heartbeat ถี่ตรวจ failure เร็วแต่เพิ่ม overhead และ false positive เมื่อระบบ pause Heartbeat ห่างลดภาระแต่ตรวจช้า ค่า timeout จึงต้องสัมพันธ์กับ jitter และ recovery objective

Lease สำหรับ distributed lock ยังมีปัญหา client เก่าที่หยุดนานแล้วฟื้นขึ้นมาและคิดว่าตนถือ lock ต้องใช้ fencing token ที่เพิ่มทุก lease ให้ resource ปฏิเสธคำสั่งจากเจ้าของรุ่นเก่า Timeout อย่างเดียวไม่หยุด zombie client

สถานะ Online เหมือนไฟหน้าห้อง

ไฟเพิ่งติดบอกว่าเมื่อครู่นี้มีคนอยู่ แต่ไม่ได้พิสูจน์ว่ายังนั่งที่โต๊ะในวินาทีนี้ Presence เป็น inference จากสัญญาณที่มาช้าได้ ไม่ใช่ความจริงแบบ atomic

9การวิเคราะห์ปัญหา Session

  1. แยก authentication failure, session lookup failure และ authorization failure
  2. ตรวจว่า client ส่ง cookie/token หรือไม่ และ domain, path, expiry, SameSite ถูกหรือเปล่า
  3. ตรวจ session store ว่า record หมดอายุ ถูก evict หรือ replicate ช้า
  4. ตรวจ clock skew เมื่อ token ใช้ iat, nbf และ exp
  5. ตรวจ sticky policy, instance restart และตำแหน่งที่ state ถูกเก็บ
  6. ใช้ correlation/session ID ใน log โดยไม่เปิดเผย secret

อาการ login แล้วหลุดเมื่อ refresh อาจเกิดจาก cookie ไม่ถูกส่ง, key sign ไม่ตรงกันระหว่าง instances, session store หาย หรือ reverse proxy เปลี่ยน scheme/domain การเปิด TCP ใหม่ไม่ช่วยถ้าบริบทหาไม่พบ ต้องตามเส้นทางของ token และ state ไม่ใช่เส้นทาง packet เพียงอย่างเดียว

Troubleshooting เหมือนตามแฟ้มงาน

โทรศัพท์ต่อได้แต่เจ้าหน้าที่หาแฟ้มไม่เจอ ต้องดูเลขอ้างอิง ตู้เก็บ ผู้ถือแฟ้ม และวันหมดอายุ ไม่ควรต่อสายใหม่ซ้ำ ๆ เพราะปัญหาอยู่ที่บริบท ไม่ใช่ช่องทางส่งเสียง

10SIP, SDP และ Media Session

SIP ใช้เริ่ม ปรับ และยุติ multimedia session ส่วน SDP บรรยาย media type, codec, address และ port ที่ผู้เข้าร่วมเสนอ ทั้งสองไม่ได้ขนเสียงหรือวิดีโอเอง Media มักเดินผ่าน RTP/RTCP และอาจใช้ transport path คนละเส้นกับ signalling จึงเกิดกรณีโทรติดแต่ไม่ได้ยินเสียง เพราะ session negotiation สำเร็จแต่ media path ถูก NAT/firewall ขวาง

Session การประชุมหนึ่งครั้งอาจมี signalling connection หลายช่วง, audio stream, video stream และ screen-sharing stream แต่ทั้งหมดผูกด้วย call/dialog identifiers และ negotiation context การคิดว่า session ต้องตรงกับ socket หนึ่งตัวจึงอธิบาย multimedia ไม่พอ

SIP เหมือนโทรนัดประชุม SDP เหมือนใบรายการอุปกรณ์

การโทรบอกว่าเริ่มประชุมกี่โมงไม่ใช่เสียงประชุมจริง ใบรายการบอกว่าใช้ภาษา ไมโครโฟน และช่องใด ส่วนเสียงเดินทางผ่านช่อง media อีกชุด หากห้องประชุมเปิดแต่สายลำโพงขาด การนัดยังสำเร็จแต่ผู้เข้าร่วมไม่ได้ยินกัน

Re-negotiation และ Session Version

เมื่อผู้ใช้เปิดกล้อง เปลี่ยน network หรือเพิ่ม participant ระบบอาจ negotiate capability ใหม่ State ต้องรู้ offer/answer รุ่นใดกำลังใช้งานและป้องกันข้อความเก่าที่มาช้ากลับมาทับค่าใหม่ Sequence/version จึงสำคัญไม่แพ้ session ID

เมื่อ Bandwidth ลดลง คุณภาพไม่ได้ลดแบบเดียวทุกระบบ

Video แบบบันทึกล่วงหน้ามักมีเวลาสะสม buffer และสลับไป rendition ที่ bitrate ต่ำกว่าได้ ผู้ชมอาจเห็นความละเอียดลดจาก 1080p เป็น 720p หรือ 480p แต่ภาพยังเล่นต่อเนื่อง เพราะระบบยอมเพิ่มเวลา buffer เพื่อแลกกับความลื่น ส่วน live streaming มี buffer สั้นกว่าและการประชุมแบบ real-time สั้นยิ่งกว่า เพราะภาพที่คมแต่ช้ากว่าคู่สนทนาหลายวินาทีแทบใช้โต้ตอบไม่ได้

เมื่อ available bandwidth ลด Encoder มีหลายปุ่มให้ปรับ ไม่ใช่ลด “ความคมชัด” เพียงค่าเดียว ได้แก่ bitrate, resolution, frame rate, quantization, keyframe interval, spatial/temporal layers และ audio mode การลด resolution ช่วยลดรายละเอียด การลด frame rate ทำให้การเคลื่อนไหวไม่ลื่น การเพิ่ม compression ทำให้เกิด block/blur ส่วนการลด audio bitrate อาจทำให้เสียงแคบและ artifact มากขึ้น ระบบประชุมมักรักษาเสียงก่อนภาพ เพราะเสียงต่อเนื่องยังช่วยให้ประชุมเดินต่อได้แม้ภาพหยุดชั่วคราว

สัญญาณจากเครือข่ายผลที่ผู้ใช้เห็นการปรับที่เป็นไปได้
Throughput ลดภาพแตก ค้าง หรือ buffer เพิ่มลด bitrate/resolution/frame rate หรือหยุดส่งบาง stream
Packet lossภาพเป็นบล็อก เสียงขาด และ frame อ้างอิงเสียต่อเนื่องFEC, retransmission เมื่อทัน deadline, request keyframe, ลด rate
Jitter สูงเสียง/ภาพมาไม่สม่ำเสมอเพิ่ม jitter buffer แต่แลกกับ latency
RTT สูงคุยทับกัน การควบคุมตอบช้าลด buffer/เส้นทางอ้อม และหลีกเลี่ยง recovery ที่รอนาน
CPU encoder เต็มframe drop แม้ network ยังพอลด resolution/frame rate หรือเลือก codec mode ที่เบากว่า
การประชุมสดเหมือนส่งข่าวสด ไม่ใช่ส่งภาพยนตร์เป็นไฟล์

ภาพยนตร์ยอมรอรถส่งม้วนถัดไปก่อนเปิดฉายได้ แต่ข่าวสดที่มาถึงช้า 30 วินาทีไม่สดแล้ว Real-time media จึงมี deadline Packet เก่าที่มาหลังเวลาเล่นอาจไม่มีประโยชน์ ต่อให้ส่งมาครบ ความครบถ้วนจึงอาจแพ้ความทันเวลา ต่างจากการดาวน์โหลดไฟล์ที่ byte ทุกส่วนต้องมาครบ

Adaptation ระหว่าง Session กับ Re-negotiation ไม่เหมือนกันทุกครั้ง

การเปลี่ยน bitrate ภายใน codec configuration ที่ตกลงไว้ อาจทำได้ต่อเนื่องโดยไม่ต้องเจรจา SIP/SDP ใหม่ Sender ใช้ feedback จาก RTCP, transport-wide congestion control หรือ bandwidth estimator ปรับ encoder และ pacing ได้ทันที แต่ถ้าจะเพิ่ม/ลบ media track, เปลี่ยน codec ที่ยังไม่ได้ตกลง, เปลี่ยน direction จาก receive-only เป็น send-receive หรือเปลี่ยน parameter ที่กระทบ session description จึงอาจต้อง offer/answer หรือ re-INVITE/UPDATE ตาม protocol

คำว่า “ต้องเจรจาใหม่เมื่อความเร็วตก” จึงควรแยกสองระดับ ระดับแรกคือ rate adaptation ภายในข้อตกลงเดิม เกิดถี่และรวดเร็ว ระดับที่สองคือ session renegotiation เมื่อ capability หรือโครงสร้าง stream เปลี่ยน หาก renegotiate ทุกครั้งที่ bandwidth แกว่ง ระบบ signalling จะหนักและปรับไม่ทันเครือข่าย

เครือข่ายไม่ได้ส่งข้อความมาว่า “ตอนนี้เหลือ 1.2 Mb/s” อย่างแม่นยำ

Endpoint ประมาณจาก packet arrival, loss, delay trend, ACK/feedback และ queue การประมาณอาจช้าเกินหรือแกว่ง ถ้าลด rate ช้า queue จะโต ถ้าเพิ่มเร็วเกินเกิด loss รอบใหม่ Adaptive media จึงเป็น feedback-control problem ไม่ใช่เลือกความละเอียดจาก speed test ครั้งเดียวตอนเริ่มประชุม

Simulcast และ Scalable Video Coding

ในการประชุมหลายคน Sender อาจส่ง simulcast หลาย encoding เช่นต่ำ กลาง สูง ให้ SFU เลือกส่งตามขนาดหน้าจอและ bandwidth ของผู้รับแต่ละคน ข้อดีคือ receiver ช้าไม่บังคับทุกคนรับคุณภาพต่ำ แต่ sender ใช้ CPU และ upload มากขึ้น ส่วน Scalable Video Coding แบ่ง base layer กับ enhancement layers ผู้รับอย่างน้อยรับ base layer แล้วเพิ่ม spatial/temporal quality เมื่อ bandwidth พอ

เมื่อหน้าจอแสดงผู้เข้าร่วม 20 คนเป็นช่องเล็ก ไม่จำเป็นต้องส่งทุกคน 1080p SFU เลือก layer ตาม layout และ active speaker ได้ เมื่อผู้ใช้ pin คนหนึ่งจึงขอ layer สูงขึ้น นี่คือ session context มีผลต่อ resource allocation: network condition บอกว่ารับได้เท่าไร ส่วน UI context บอกว่าคุณภาพสูงตรงไหนมีคุณค่า

Keyframe, Reference Frame และผลของ Loss

Video codec บีบอัดโดยให้ frame จำนวนมากอ้างอิง frame ก่อนหน้า หาก packet สำคัญของ reference frame หาย ความเสียหายอาจลากต่อหลาย frame Receiver อาจส่ง feedback ขอ keyframe เพื่อเริ่มภาพใหม่ที่ไม่พึ่ง chain เดิม แต่ keyframe ใหญ่ ทำให้ bandwidth spike หากผู้รับจำนวนมากขอพร้อมกันอาจยิ่งทำ congestion ต้องรวมคำขอและควบคุมการส่ง

Retransmission มีประโยชน์เมื่อ packet ที่ส่งใหม่ยังมาถึงก่อน playback deadline ใน RTT ต่ำอาจช่วยได้ แต่ในเส้นทาง RTT สูง packet ที่มาช้าไม่มีประโยชน์ FEC ส่ง redundancy ล่วงหน้าเพื่อซ่อม loss โดยไม่รอ RTT แต่กิน bandwidth แม้ไม่มี loss ระบบจึงปรับสัดส่วน recovery ตามสภาพและชนิด media

Audio/Video Synchronization

Audio กับ video อาจใช้ RTP stream คนละชุดและ timestamp คนละ clock rate RTCP Sender Report ช่วยผูก RTP timestamp กับเวลาอ้างอิงเพื่อให้ receiver sync ปากกับเสียง Jitter buffer ของแต่ละ stream ต้องประสานกัน หาก video ช้ากว่าอาจหน่วง audio เล็กน้อย แต่ถ้าหน่วงมากเกิน การรักษา lip-sync กลับทำให้การสนทนาช้าทั้งหมด ระบบจึงมี threshold ว่าจะรอ drop หรือปรับ playback

สำหรับการประชุม เสียงมักสำคัญกว่า video หาก bandwidth ตกมาก ระบบอาจปิดวิดีโอ ลด video frame rate เหลือไม่กี่ภาพต่อวินาที แต่รักษา audio packet, echo cancellation และ jitter buffer ให้ใช้งานได้ การ share screen มีธรรมชาติต่างจากกล้อง: ตัวหนังสือต้องคม แต่การเคลื่อนไหวอาจต่ำ จึงเลือก resolution สูง frame rate ต่ำได้ ขณะที่กีฬา/ท่าทางต้องการ temporal quality มากกว่า

ตัวอย่างการปรับระหว่างประชุม
  1. เริ่ม session ตกลง codecs และ RTP parameters ผ่าน offer/answer
  2. Network ดี: ส่งกล้อง 720p 30 fps พร้อม audio คุณภาพสูง
  3. Bandwidth ลดและ queue delay สูง: estimator ลด target bitrate, encoder เพิ่ม compression และลด resolution โดยยังใช้ codec เดิม จึงไม่จำเป็นต้อง re-negotiate
  4. Loss ต่อเนื่อง: ส่ง feedback ขอ keyframe/ปรับ FEC และอาจลด frame rate
  5. ผู้ใช้เริ่ม share screen track ใหม่: ต้องปรับ session description หรือ signalling ตามระบบ แล้วจัดสรร bandwidth ใหม่โดยให้เสียงก่อน
  6. Network ฟื้น: เพิ่มคุณภาพอย่างค่อยเป็นค่อยไป ไม่กระโดดเต็ม rate จนเกิด congestion ซ้ำ

Quality of Experience ไม่ใช่ Bitrate ตัวเดียว

คุณภาพที่ผู้ใช้รับรู้รวม join time, freezes, resolution, frame rate, audio concealment, lip-sync, end-to-end latency และความถี่ที่คุณภาพแกว่ง ภาพ 720p คงที่อาจรู้สึกดีกว่า 1080p ที่สลับลง 360p ทุกไม่กี่วินาที Adaptation จึงควรมี hysteresis และช่วงเวลาประเมินเพื่อไม่ไล่ตาม noise ของ measurement มากเกินไป

Metric ควรแยก sender, network และ receiver เช่น encode time, packets sent/lost, RTT, jitter, frames decoded/dropped และ playback delay หากดูเพียง bitrate ต่ำ เราไม่รู้ว่า network จำกัด encoder CPU เต็ม หรือผู้รับแสดงหน้าต่างเล็กแล้วตั้งใจขอ layer ต่ำ Observability ต้องเก็บบริบทการตัดสินใจ ไม่ใช่ตัวเลขผลลัพธ์อย่างเดียว

11WebSocket และ Long-lived Session

WebSocket เริ่มจาก HTTP upgrade แล้วเปลี่ยนเป็นช่องทางสองทิศที่ยาวนาน แต่ WebSocket connection ยังไม่เท่ากับ user session เมื่อ connection หลุด Client อาจ reconnect ด้วย credential เดิมและขอ resume จาก event ID ล่าสุด Server ต้องกำหนดว่า message ระหว่างช่วงขาดจะเก็บไว้ ส่งซ้ำ หรือถือว่าหาย

Long-lived connection ต้องมี heartbeat, idle timeout, authentication refresh และ backpressure หาก token หมดอายุระหว่าง connection เปิด ระบบจะยอมจนปิดหรือ re-authenticate กลางทาง หาก server restart connection ทั้งหมดขาดพร้อมกัน Client จำนวนมากอาจ reconnect พร้อมกันจนเกิด thundering herd จึงต้องใช้ randomized backoff

ปัญหาแนวทางข้อควรระวัง
Connection หลุดReconnect + resume token/event offsetต้องจัด duplicate และ gap
Server restartกระจาย reconnect ด้วย backoff+jitterSession state ต้องไม่อยู่เฉพาะ memory
Client อ่านช้าBounded queue และ disconnect policyห้าม buffer ไม่จำกัด
Credential หมดอายุRe-authenticate หรือจำกัด connection lifetimeอย่าปล่อยสิทธิ์เก่าค้างตลอด
Persistent connection ไม่ได้แปลว่า durable session

Connection อยู่ใน memory และหายเมื่อ process ล่ม หากต้องกลับมาทำต่อ ต้องเก็บ session/event state แบบ durable แยกต่างหาก ความยาวนานของช่องทางกับความคงทนของบริบทเป็นคนละคุณสมบัติ

12Workflow Session และ Saga

งานธุรกิจหนึ่งครั้งอาจกินเวลานาทีหรือวันและเรียกหลาย service เช่นรับคำสั่งซื้อ ตัดสต็อก ชำระเงิน และจัดส่ง การเก็บ TCP connection เปิดรอตลอดไม่สมเหตุผล Session ของ workflow จึงอยู่ใน durable state machine แต่ละ step มี status, input, output, retry policy และ compensation

Workflow เหมือนแฟ้มขออนุมัติที่เดินหลายโต๊ะ

แฟ้มไม่จำเป็นต้องถือสายโทรศัพท์ค้างกับทุกฝ่าย มันมีเลขเรื่องและตราว่าผ่านโต๊ะใดแล้ว หากโต๊ะหนึ่งปฏิเสธต้องรู้ว่าจะส่งกลับ แก้เอกสาร หรือยกเลิกผลของโต๊ะก่อนหน้า Durable workflow คือ session ที่มีอายุยาวกว่า connection และ process หลายรอบ

Saga แบ่ง transaction ข้าม service เป็น local transactions และ compensating actions แต่ compensation ไม่ใช่ rollback ทางกายภาพเสมอ เช่นอีเมลที่ส่งแล้วเรียกคืนไม่ได้ ทำได้เพียงส่งข้อความแก้ไข การออกแบบ session state ต้องบันทึก intent และผลจริงเพื่อรู้ว่าควรทำต่อหรือชดเชยอะไร

Idempotency กับ Session Command

Client อาจ retry command หลัง timeout Workflow ต้องใช้ command ID หรือ idempotency key ตรวจว่าคำสั่งเดิมถูกทำแล้วหรือยัง ผลลัพธ์ควรถูกเก็บร่วมกับ key ตามขอบเขตเวลา ไม่ใช่เพียงทิ้ง duplicate เพราะ client ต้องได้คำตอบเดิมกลับด้วย

Exactly-once effect ต้องอาศัย durable deduplication และ transaction boundary ที่เหมาะสม Session ID เพียงค่าเดียวไม่พอ หากบันทึกว่า “รับคำสั่งแล้ว” แต่ crash ก่อนทำงาน หรือทำงานแล้ว crash ก่อนบันทึกผล ระบบยังมีความกำกวม ต้องออกแบบ state transition แบบ recoverable

13Observability และ Privacy ของ Session

การตามปัญหาข้าม request ต้องมี correlation ID, trace ID หรือ session reference แต่ identifier ที่ใช้ค้น log ไม่ควรเป็น bearer token ที่ใช้เข้าถึงระบบได้ Log ควร hash หรือ redact secret และกำหนด retention เพราะ session trail อาจเปิดเผยพฤติกรรมผู้ใช้

ข้อมูลที่ควรเห็นประโยชน์สิ่งที่ไม่ควรบันทึกตรง ๆ
Session/correlation referenceเชื่อมเหตุการณ์หลาย serviceCookie หรือ access token เต็มค่า
State transitionรู้ว่า workflow ค้างขั้นไหนข้อมูลส่วนบุคคลเกินจำเป็น
Expiry/revocation reasonแยกหมดอายุจาก security actionCredential และ private key
Instance/store latencyแยกปัญหา app จาก session storePayload ลับโดยไม่มีการกรอง

Metric ที่มี session ID เป็น label โดยตรงสร้าง cardinality สูงจนระบบ monitoring รับไม่ไหว ควรใช้ log/trace สำหรับ identifier ราย session และใช้ metric แบบ aggregate เช่น active sessions, create rate, expiry rate, lookup latency และ error count

สิ่งที่ช่วย Debug อาจกลายเป็นช่องข้อมูลรั่ว

การเก็บทุกอย่างทำให้ตามเหตุการณ์ง่ายในวันแรก แต่เพิ่มผลกระทบเมื่อ log ถูกเข้าถึง ต้องออกแบบ observability พร้อม data minimization, access control และอายุข้อมูล ไม่ใช่เติม privacy หลัง incident

14Session Timeout และการต่ออายุ

Session มักมีทั้ง idle timeout และ absolute lifetime Idle timeout เลื่อนออกเมื่อมีกิจกรรมเพื่อปิด session ที่ถูกทิ้งไว้ ส่วน absolute lifetime บังคับให้ยืนยันตัวตนใหม่แม้ใช้งานต่อเนื่อง ลดเวลาที่ credential ถูกขโมยแล้วใช้ได้ การมี sliding expiration อย่างเดียวอาจทำให้ session อยู่ตลอดกาล

การต่ออายุ token ต้องแยก access token อายุสั้นจาก refresh token ที่ป้องกันเข้มกว่า Refresh token rotation ช่วยตรวจ reuse เมื่อ token เก่าถูกนำกลับมาใช้ แต่ต้องเก็บ token family state และจัดการ race จาก request พร้อมกัน การเพิ่ม token หลายชนิดไม่ได้ปลอดภัยเองหากเก็บทั้งหมดในที่ที่ script ขโมยได้เท่ากัน

ตัวอย่างนโยบาย

ระบบทั่วไปอาจให้ access token 15 นาที, idle session 30 นาที และ absolute session 8 ชั่วโมง เมื่อ user ทำงาน token ต่ออายุได้ภายใน session แต่ครบ 8 ชั่วโมงต้อง authenticate ใหม่ งานการเงินอาจสั้นกว่าและขอ step-up authentication ก่อนคำสั่งสำคัญ ตัวเลขต้องมาจากความเสี่ยงและ usability ไม่ใช่คัดลอกจากระบบอื่น

Clock skew ระหว่าง client, service และ identity provider ทำให้ token ดูว่ายังไม่เริ่มหรือหมดอายุแล้ว ต้อง sync เวลาและมี tolerance จำกัด การเผื่อมากเกินไปกลับขยายเวลาที่ token หมดอายุยังใช้ได้ Log ควรเก็บเวลา issuer/verifier เพื่อแยก clock problem จาก signature failure

15Session Migration และการเปลี่ยน Version

เมื่อ deploy application รุ่นใหม่ session เก่าอาจมี schema ต่างจาก code ใหม่ การล้าง session ทั้งหมดง่ายแต่บังคับ logout ผู้ใช้และทำ workflow หาย ทางเลือกคืออ่านได้หลาย version, migrate lazily ตอน access หรือเขียน state แบบ backward compatible ช่วง rolling deployment

Session schema เหมือนแบบฟอร์มราชการคนละรุ่น

เจ้าหน้าที่ใหม่ต้องอ่านแฟ้มที่กรอกด้วยแบบเก่าได้ระหว่างช่วงเปลี่ยนผ่าน ถ้าเปลี่ยนชื่อช่องโดยไม่มีกติกา แฟ้มเดิมไม่ได้ผิดแต่ระบบใหม่อ่านไม่ออก Version field และ migration คือคู่มือแปลง ไม่ใช่การหวังว่าชื่อใกล้กันแล้วจะเข้าใจเอง

Signed token ที่มี claim ฝังอยู่เปลี่ยน schema ยากกว่า opaque ID เพราะ token เก่ายังอยู่จนหมดอายุ Service ใหม่ต้องรองรับ claim รุ่นเก่าหรือบังคับอายุสั้น Key rotation ก็ต้องมีช่วง overlap ให้ verifier รู้ public key เก่า จน token รุ่นเก่าหมดอายุ การลบ key ทันทีทำให้ session ทั้งระบบเสียพร้อมกัน

Session migration ระหว่าง region ต้องคิด data residency, latency และ conflict ผู้ใช้ย้าย region ขณะมี request ค้างอาจเกิด state สองสำเนา ต้องกำหนด home region, leader, version vector หรือ reconciliation ตามความสำคัญ ไม่ใช้คำว่า multi-region เป็นคำตอบโดยไม่กำหนดผู้ตัดสินเมื่อข้อมูลต่างกัน

16Session Anti-pattern ที่พบบ่อย

Anti-patternผลที่เกิดแนวคิดแก้
เก็บทุกอย่างใน sessionstate ใหญ่ replicate ช้าและแก้ schema ยากเก็บ reference และเฉพาะบริบทที่จำเป็น
Session ไม่หมดอายุresource/credential ค้างและความเสี่ยงสะสมidle + absolute expiry พร้อม revoke
ผูก session กับ IP แบบตายตัวผู้ใช้ mobile/NAT เปลี่ยน IP แล้วหลุดใช้เป็น risk signal ไม่ใช่ identity เดียว
ใช้ in-memory state ในหลาย instancerequest สลับเครื่องแล้วหายshared/durable state หรือ token ตามโจทย์
Retry สร้าง session ใหม่ทุกครั้งduplicate session และ resource leakidempotency key สำหรับ establishment
Log token เต็มค่าผู้เข้าถึง log ยึด session ได้redact/hash reference และจำกัดสิทธิ์

อีก anti-pattern คือใช้ session เป็นฐานข้อมูลเงา เก็บ object สำเนาจำนวนมากจนข้อมูลต้นทางเปลี่ยนแต่ session ยังเก่า ทางแก้ไม่ใช่ refresh ทุกอย่างตลอดเวลา แต่กำหนด ownership ว่าข้อมูลใดเป็น snapshot สำหรับ workflow และข้อมูลใดต้องอ่านจาก source of truth พร้อม version ที่ตรวจได้

Session ที่สะดวกเกินไปมักซ่อน dependency

เมื่อ function ใดก็หยิบ global session state ได้ การทดสอบและ scale ยากขึ้น Interface ควรรับข้อมูลจำเป็นอย่างชัดเจนและจำกัดผู้มีสิทธิ์แก้ state ความสะดวกของการเขียนวันนี้อาจเป็น coupling ที่จ่ายดอกเบี้ยทุก deployment

17วิธีออกแบบ Session ให้ตอบคำถามได้ครบ

  1. กำหนดขอบเขต — session เริ่มเมื่อใด จบเมื่อใด และหนึ่ง user มีได้กี่ session
  2. กำหนดเจ้าของ state — client, instance, shared store หรือ workflow engine ใครเป็น source of truth
  3. กำหนด identity และสิทธิ์ — session อ้างถึงใคร และ privilege เปลี่ยนแล้ว session เก่าทำอย่างไร
  4. กำหนด lifecycle — idle timeout, absolute lifetime, renewal, logout และ revocation
  5. กำหนด failure — reconnect, resume, duplicate, concurrent request และ store unavailable
  6. กำหนดหลักฐาน — log state transition, metric แบบ aggregate และ audit โดยไม่เปิด secret
  7. กำหนด migration — code รุ่นใหม่อ่าน session รุ่นเก่าและ rollback ได้อย่างไร

คำถามเหล่านี้ทำให้คำว่า session จากกล่องกว้าง ๆ กลายเป็น contract ที่ทดสอบได้ เช่น “logout ต้อง revoke ภายในกี่วินาที”, “upload resume หลัง server restart ได้จาก checkpoint ใด” หรือ “ถ้า session store ล่ม request ใด fail closed และ request ใดใช้ cached state ได้” เมื่อระบุผลลัพธ์ได้ ทีมจึงเลือก cookie, token, Redis หรือ database จากโจทย์ ไม่ใช่เลือกเครื่องมือแล้วค่อยสร้างเหตุผลตามหลัง

Session architecture เหมือนระบบฝากสัมภาระ

ต้องรู้ว่าใครออกบัตร ตู้ไหนเก็บของ บัตรหมดอายุเมื่อใด หากตู้ย้ายอาคารจะตามอย่างไร และถ้าบัตรหายใครมีสิทธิ์ออกใหม่ การตอบเพียงว่า “ใช้ QR code” ยังไม่ได้ออกแบบระบบ เพราะ QR เป็นเพียงรูปแบบของกุญแจ ไม่ได้ตอบ lifecycle และความรับผิดชอบทั้งหมด

Session Layer มีคุณค่าเพราะบังคับให้เราถามเรื่องความต่อเนื่อง

แม้ TCP/IP ไม่มีกล่องชื่อ Session แยก แต่ระบบที่มีหลาย request หลาย connection และหลาย service หลีกเลี่ยงคำถามนี้ไม่ได้ การไม่ตั้งชื่อชั้นไม่ได้ทำให้ state, expiry, resume และ dialogue หายไป มันเพียงทำให้เราต้องตามหาว่าใครรับผิดชอบอยู่จริง

18สรุปและขั้นตอนถัดไป

  • Session Layer ดูแลบริบทของการสนทนา ไม่ใช่ transport connection เพียงอย่างเดียว
  • หน้าที่หลักคือ establishment, dialogue control, checkpoint และ termination
  • TCP/IP ไม่มีชั้นแยก แต่หน้าที่กระจายใน protocol, framework, token, database และ service state
  • Cookie เป็นกลไกขนข้อมูล ไม่ใช่ session ทั้งหมด
  • Checkpoint บอกจุด resume ส่วน transaction บอก atomicity
  • Stateless service ไม่ได้แปลว่าระบบไม่มี state แต่ลด state ที่ผูกกับ instance
  • Heartbeat และ lease อนุมาน liveness ภายใต้ความไม่แน่นอน
  • Session security ต้องคิด fixation, hijacking, expiry และ revocation
คำถามซ้อมความเข้าใจ
  1. แยก TCP connection, login session และ user identity
  2. ออกแบบ resumable upload ที่ไม่เขียน chunk ซ้ำ
  3. เปรียบเทียบ opaque session ID กับ signed token
  4. อธิบายข้อแลกเปลี่ยนของ sticky session และ shared store
  5. ออกแบบ lease พร้อม fencing token

ขั้นตอนถัดไปคือ Presentation Layer ซึ่งถามว่าข้อมูลใน session ถูกแทนอย่างไร ทั้ง serialization, character encoding, compression และ encryption Session ช่วยจำว่าเราคุยเรื่องเดิม ส่วน Presentation ช่วยให้ทั้งสองฝ่ายตีความ byte ตรงกัน