TCP/IP Layer 3 of 4

Transport Layer

เปลี่ยน host-to-host packet delivery ให้เป็น process-to-process channel — UDP, TCP, และ Socket API

📚
เทียบเท่าใน OSI: Transport Layer (ชื่อเดียวกัน) — อ่านฉบับเต็ม →
🧭 TCP/IP และ OSI ใช้ชื่อ Transport Layer เหมือนกัน แต่ไม่ได้แปลว่ารายละเอียดตรงกันทั้งหมด หน้านี้เน้นสิ่งที่เกิดจาก TCP, UDP, QUIC และ socket จริง ส่วนสูตรและกลไกพื้นฐานแบบเต็มอ่านต่อจากหน้า OSI

1UDP vs TCP

UDPTCP
ConnectionConnectionlessConnection-oriented (3-way handshake)
Reliabilityไม่มี (แค่ demux ผ่าน port)Reliable byte-stream
Flow/Congestion controlไม่มีมีทั้งคู่
ใช้เมื่อไหร่real-time, loss-tolerant (เช่น RTP)ต้องการข้อมูลครบถ้วนถูกลำดับ (HTTP, FTP, Email)

2TCP: Header, Handshake, Sliding Window

3-Way Handshake และการปิดสองทิศทาง
การเปิดใช้ SYN → SYN+ACK → ACK ส่วนการปิดปกติแต่ละทิศทางมี FIN และ ACK ของตน จึงมักเห็น FIN → ACK → FIN → ACK แม้บาง segment สามารถรวม flag ได้ ฝั่งที่ active close มักเข้าสู่ TIME_WAIT ชั่วคราว
Sliding Window Invariant
Sender: LastByteAcked ≤ LastByteSent ≤ LastByteWritten
AdvertisedWindow = MaxRcvBuffer − ((NextByteExpected−1) − LastByteRead)

TCP sliding window ทำ 3 อย่างพร้อมกัน: reliability, ordering, flow control — SequenceNum 32-bit ต้องไม่ wrap ภายใน MSL=120 วินาที

3Congestion Control: AIMD

Slow Start → Congestion Avoidance
CW=1, +1 ทุก ACK (exponential) จนถึง ssthresh → สลับเป็น +1 ทุก RTT (linear, Additive Increase) — เมื่อ loss: ssthresh=CW/2 แล้ว CW/=2 (Fast Retransmit) หรือ CW=1 (Timeout, Multiplicative Decrease)

Fast Retransmit: duplicate ACK 3 ครั้ง → retransmit ทันที ไม่ต้องรอ timeout เต็มรอบ — RTO คำนวณจาก Jacobson/Karels algorithm ที่นับทั้ง EstimatedRTT และ Deviation

4RTP/RTCP สำหรับสื่อ Real-Time

RTP วิ่งบน UDP — ให้ sequence number (จัดลำดับ/ตรวจ loss) และ timestamp (synchronize หลายแหล่ง) RTCP รายงานคุณภาพผ่าน Sender/Receiver Report

5Socket API

# TCP Client/Server (Python) — โครงสร้างย่อ
# Server: bind() → listen() → accept() → recv()/send()
# Client: connect() → send()/recv()

# UDP: ไม่มี connection — ต้องระบุ address ทุกครั้งด้วย sendto()/recvfrom()

Code เต็มพร้อมคำอธิบายทีละบรรทัด (UDP และ TCP) → ดูเต็มที่หน้า OSI Transport Layer

ชื่อชั้นเหมือนกัน แต่ OSI เริ่มจากบริการ ส่วน TCP/IP เริ่มจาก Protocol ที่มีอยู่จริง

OSI อธิบายว่า Transport ควรให้บริการ process-to-process และอาจมีบริการหลายระดับ ส่วน TCP/IP มีตัวเลือกหลักที่เรียบง่ายกว่า คือ UDP กับ TCP Application ต้องเลือกเองว่าจะรับบริการแบบ datagram ที่เบา หรือ byte stream ที่เชื่อถือได้ การเลือกนี้ไม่ใช่ระดับคุณภาพของ protocol เดียว แต่เป็นคนละ abstraction

ประเด็นมุมมอง OSIมุมมอง TCP/IP
จุดเริ่มต้นนิยามบริการและขอบเขต Transport อย่างเป็นระบบอธิบายจาก TCP, UDP และพฤติกรรมที่ deploy จริง
ความน่าเชื่อถือเป็นคุณสมบัติหนึ่งของบริการ TransportTCP มีให้ แต่ UDP ไม่มี และ application เสริมเองได้
ConnectionแบบจำลองรองรับการจัดประเภทบริการTCP connection กับ UDP datagram เป็นตัวเลือกหลัก
InterfaceService primitive ตามแบบจำลองApplication มักพบผ่าน Socket API ของระบบปฏิบัติการ

UDP ไม่ได้ “ทำอะไรเลย”

UDP เพิ่ม source port, destination port, length และ checksum เหนือ IP ทำให้หลาย process ใช้เครือข่ายบน host เดียวกันได้และรักษาขอบเขตของ message ไว้ หาก application ส่ง datagram หนึ่งก้อน ผู้รับรับเป็นก้อน ไม่ใช่ byte stream ต่อเนื่อง แต่ UDP ไม่รับประกันการถึง ลำดับ การส่งซ้ำ หรือ congestion control

อุปมา: โปสการ์ดกับสายพาน
UDP เหมือนส่งโปสการ์ดแต่ละใบ แต่ละใบมีขอบเขตของตนและอาจหายหรือสลับลำดับ TCP เหมือนส่งข้อมูลบนสายพานที่รับรองว่าของจะถูกจัดกลับตามลำดับ แต่ผู้รับเห็นเป็นกระแสต่อเนื่อง ไม่เห็นว่าผู้ส่งเคยแบ่งเป็นกล่องคำสั่งกี่ครั้ง Application บน TCP จึงต้องกำหนด message framing เอง

TCP เป็น Byte Stream ไม่ใช่ Message Protocol

การเรียก send() สองครั้งฝั่งส่งไม่ได้รับประกันว่าฝั่งรับจะได้ recv() สองครั้งในขนาดเดียวกัน TCP อาจรวมข้อมูลหรือแบ่งออกตาม buffer และสภาพเครือข่าย Protocol ระดับ application ต้องบอกขอบเขตด้วย delimiter, length prefix, fixed length หรือโครงสร้างอื่น หากลืมเรื่องนี้ โปรแกรมอาจทำงานดีบนเครื่องเดียวแล้วพังเมื่อเจอ network จริง

End-to-End Reliability ต่างจาก Link Reliability

Link Layer อาจส่ง frame ซ้ำบน Wi-Fi หนึ่งช่วง แต่ยังมี router, queue และ link อื่นตลอดทาง TCP จึงตรวจ sequence และ acknowledgement จากปลายทางจริง หลัก end-to-end บอกว่า คุณสมบัติบางอย่างจะยืนยันได้สมบูรณ์ก็ต่อเมื่อปลายทางตรวจเอง แม้กลไกชั้นล่างช่วยเพิ่มประสิทธิภาพได้

Flow Control กับ Congestion Control มองคนละคอขวด

Flow control ป้องกันไม่ให้ sender ส่งเร็วเกิน buffer ของ receiver ส่วน congestion control ป้องกันไม่ให้ส่งเร็วเกินความสามารถของเครือข่ายระหว่างทาง Receiver อาจมีหน่วยความจำเหลือมาก แต่ router กลางกำลังแน่น หรือเครือข่ายอาจว่างแต่ application ปลายทางอ่านไม่ทัน ทั้งสองจึงต้องมีตัวแปรและสัญญาณคนละชุด

หน้าต่างที่ส่งได้จริง
Effective send window = min(receiver window, congestion window)

TCP Congestion Control เป็นกลไกของ Internet จริง ไม่ใช่ข้อกำหนดทั่วไปของ OSI

OSI ระบุหน้าที่เป็นแบบจำลอง แต่ slow start, congestion avoidance, fast retransmit และการตีความ loss เป็นสัญญาณ congestion เติบโตจากประสบการณ์ของ TCP บน Internet Algorithm เปลี่ยนตามเวลาได้ เช่น Reno, CUBIC หรือ BBR อาจประเมินเครือข่ายต่างกัน แม้ยังให้ application เห็น TCP socket คล้ายเดิม

นี่คือความต่างระหว่าง service interface กับ internal algorithm โปรแกรมยังเรียก send() เหมือนเดิม แต่ระบบข้างในอาจเปลี่ยนวิธีควบคุมอัตราส่งได้ การซ่อนรายละเอียดช่วยให้พัฒนา protocol โดยไม่ต้องแก้ application ทุกตัว

QUIC ทำให้เส้นแบ่ง Transport กับ Application ไม่เรียบร้อยอีกครั้ง

QUIC ทำงานบน UDP แต่สร้าง connection, reliability, congestion control, stream และ TLS 1.3 ขึ้นมาเอง โดยทั่วไปนำไปใช้กับ HTTP/3 ข้อดีคือพัฒนาใน user space ได้เร็วและลดปัญหา stream หนึ่งรออีก stream แบบ TCP บางกรณี แต่ในแผนภาพสี่ชั้น เราอาจถามว่า QUIC อยู่ Transport หรือ Application คำตอบขึ้นกับว่าเรากำลังจัดตามหน้าที่หรือตามตำแหน่งที่สร้างระบบจริง

บทเรียนจาก QUIC
Protocol จริงไม่ได้ขออนุญาต model ก่อนวิวัฒนาการ Model ยังมีประโยชน์สำหรับแยกหน้าที่ แต่ถ้าใช้ model เป็นกล่องแข็ง เราจะอธิบายระบบใหม่ไม่ออก หรือพยายามบังคับให้ชื่อของกล่องสำคัญกว่าพฤติกรรมจริง

Socket เป็น Programming Interface ไม่ใช่ Protocol บนสาย

Socket API เป็นวิธีที่โปรแกรมขอใช้ TCP หรือ UDP จากระบบปฏิบัติการ คำสั่ง bind(), connect() และ accept() ไม่ได้ถูกส่งเป็น packet ชื่อเดียวกันไปบนเครือข่าย เครื่องอีกฝั่งเห็น TCP segment หรือ UDP datagram ไม่ได้เห็น function call ใน source code

Port ระบุ Process Endpoint แต่ไม่ใช่ตัวตนถาวรของบริการเสมอไป

Server มักผูก well-known port ส่วน client ใช้ ephemeral port ที่ระบบเลือก Connection ของ TCP จึงแยกได้ด้วยข้อมูลต้นทางและปลายทางร่วมกัน ไม่ใช่ดู destination port เพียงตัวเดียว Load balancer, proxy และ NAT ยังอาจเปลี่ยน endpoint ที่เห็นระหว่างทาง ทำให้ “IP + port ของ server” ไม่จำเป็นต้องตรงกับ process ปลายทางจริงเพียงเครื่องเดียว

แก่นที่ต่างจาก OSI
Transport ของ TCP/IP ไม่ได้เป็นเพียงคำอธิบายว่าชั้นที่ 4 ควรทำอะไร แต่เป็นชุด trade-off ที่ application เลือกใช้จริง TCP ยอมเพิ่ม state และเวลาเพื่อให้ byte stream เชื่อถือได้ UDP รักษาความเรียบง่าย แล้วเปิดให้ application เช่น RTP, DNS หรือ QUIC เลือกสร้างสิ่งที่ต้องการเพิ่มเอง

การเปิด Connection ไม่ได้แปลว่ามีสายเสมือนถูกจองไว้

TCP connection คือ state ที่ endpoint สองฝั่งเก็บร่วมกัน เช่น sequence number, window และ timer Router กลางทั่วไปไม่ต้องเก็บ TCP connection ทุกเส้นและไม่ได้จอง bandwidth ไว้ให้ 3-way handshake จึงยืนยันความพร้อมและเริ่มต้น state ของปลายทาง ไม่ได้โทรไปสั่ง router ทุกตัวให้กันช่องทางเฉพาะ

เหตุใดต้องใช้ 3-Way Handshake

สองฝั่งต้องยืนยันว่าเส้นทางสื่อสารใช้ได้ทั้งไปและกลับ พร้อมแลก initial sequence number เพื่อแยก byte ใหม่ออกจาก segment เก่าที่อาจค้างในเครือข่าย หากมีเพียงสองข้อความ ฝั่งหนึ่งอาจยังไม่รู้ว่า acknowledgement ของตนกลับถึงอีกฝ่ายแล้ว ขั้นที่สามจึงปิดวงของการยืนยัน

อุปมา: ทดลองวิทยุสื่อสาร
A เรียก B และบอกเลขเริ่มต้น B ตอบว่าได้ยิน A พร้อมบอกเลขของตน A ตอบกลับว่าได้ยิน B เช่นกัน หลังจากนั้นทั้งคู่จึงรู้ว่าการสื่อสารสองทิศทางทำงานและตกลงจุดเริ่มของข้อมูลแล้ว

Checksum, Reliability และ Security ไม่ใช่สิ่งเดียวกัน

Checksum ช่วยตรวจความเสียหายที่เกิดโดยไม่ตั้งใจระหว่างส่ง TCP ใช้ acknowledgement และ retransmission ทำให้ byte stream ครบตามลำดับ แต่ทั้งสองอย่างไม่ได้ยืนยันว่าคู่สื่อสารเป็นใครหรือป้องกันผู้โจมตีแก้ข้อมูลอย่างมีเจตนา งานนั้นต้องใช้กลไก cryptographic เช่น TLS การมี reliable connection จึงไม่เท่ากับมี secure connection

Transport เลือกเวลาให้ Application ไม่ได้ทุกเรื่อง

TCP รับรองลำดับ ทำให้ byte หลังส่วนที่หายอาจต้องรอแม้มาถึงแล้ว สำหรับไฟล์นี่เป็นพฤติกรรมที่ต้องการ แต่สื่อ real-time อาจยอมทิ้งเสียงช่วงเก่าแล้วเล่นช่วงใหม่ต่อ Application จึงเลือก UDP, RTP หรือ QUIC stream/datagram ตาม deadline ของข้อมูล ไม่ใช่เลือกจากคำสั้น ๆ ว่า “TCP ดี UDP เร็ว”

คำถามเลือก Protocol
อย่าถามเพียงว่าข้อมูลหายได้หรือไม่ ต้องถามด้วยว่าถ้าหายแล้วควรส่งซ้ำภายในกี่มิลลิวินาที ข้อมูลก้อนใหม่ต้องรอก้อนเก่าหรือไม่ ต้องรักษาขอบเขต message หรือเปล่า และ application พร้อมทำ congestion control กับ security เองมากเพียงใด

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

  • ชื่อ Transport Layer เหมือน OSI แต่ TCP/IP อธิบายผ่าน protocol ที่ใช้จริง ได้แก่ UDP, TCP และ QUIC
  • UDP รักษาขอบเขต datagram และใช้ port ช่วยแยก process ส่วน TCP ให้ reliable ordered byte stream
  • Sliding window ของ TCP ทำ 3 หน้าที่พร้อมกัน (reliability, ordering, flow control)
  • Flow control ป้องกัน receiver ส่วน congestion control ป้องกันเครือข่ายระหว่างทาง
  • Socket API เป็น interface ของโปรแกรม ไม่ใช่ protocol ที่ส่งอยู่บนสาย
คำถามซ้อมสอบ
ดูชุดคำถามซ้อมสอบแบบละเอียดที่หน้า OSI Transport Layer — ครอบคลุมเนื้อหาเดียวกับหน้านี้ทั้งหมด