บทที่ 3 HTTP
(HyperText Transfer Protocol)
วัตถุประสงค์การเรียนรู้
1) อธิบายหลักการทำงานของ Socket Programming ได้
2) เขียนโปรแกรม TCP Server ได้
3) เขียนโปรแกรม TCP Client ได้
4) เขียนโปรแกรมรับส่งข้อมูลด้วย UDP ได้
5) อธิบายความแตกต่างระหว่าง TCP และ UDP ในเชิงการเขียนโปรแกรมได้
https://python3.wannaphong.com/2015/01/socket-python-1.html https://www.borntodev.com/2020/05/12/socket-programming-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3%E0%B8%AB%E0%B8%A7%E0%B9%88%E0%B8%B2/3.1 ความหมายของ HTTP
HTTP (HyperText Transfer Protocol) เป็นโปรโตคอลในชั้น Application Layer ของแบบจำลอง TCP/IP ใช้สำหรับการแลกเปลี่ยนข้อมูลระหว่าง Client และ Server ผ่านเครือข่ายอินเทอร์เน็ตหรือเครือข่ายภายในองค์กร (Intranet)
เดิม HTTP ถูกออกแบบมาเพื่อรับส่งเอกสารเว็บเพจ (HTML) แต่ในปัจจุบันได้กลายเป็นโปรโตคอลมาตรฐานสำหรับการแลกเปลี่ยนข้อมูลระหว่างระบบคอมพิวเตอร์ แอปพลิเคชันบนโทรศัพท์มือถือ ระบบ Cloud และอุปกรณ์ Internet of Things (IoT)
ตัวอย่างการใช้งาน ได้แก่
- Web Browser ติดต่อ Web Server
- Mobile Application ติดต่อ Cloud Server
- ESP32 ส่งข้อมูล Sensor ไปยัง Server
- ระบบ Smart Factory ส่งข้อมูลไปยังฐานข้อมูล
- ระบบ Smart Building รายงานสถานะอุปกรณ์
3.2 สถาปัตยกรรม Client-Server
HTTP ใช้รูปแบบการสื่อสารแบบ Client-Server
สถาปัตยกรรม Client-Server (Client-Server Architecture) เป็นรูปแบบการสื่อสารข้อมูลผ่านเครือข่ายที่ได้รับความนิยมมากที่สุดในปัจจุบัน โดยแบ่งบทบาทของอุปกรณ์ออกเป็น 2 ส่วน ได้แก่
Client ทำหน้าที่ร้องขอข้อมูลหรือบริการ (Request) เช่น Chrome ESP32 Python Program หรือ Mobile Application
Server ทำหน้าที่ให้บริการและตอบกลับข้อมูล (Response)
รูปแบบนี้ช่วยให้การบริหารจัดการข้อมูลและทรัพยากรเป็นระบบ สามารถรองรับผู้ใช้งานจำนวนมาก และเป็นพื้นฐานของระบบเครือข่ายสมัยใหม่ เช่น เว็บไซต์ ระบบ Cloud ระบบฐานข้อมูล และระบบ Internet of Things (IoT)
การทำงานของระบบ Client-Server เริ่มต้นเมื่อ Client ส่งคำร้องขอ (Request) ไปยัง Server ผ่านเครือข่าย จากนั้น Server จะประมวลผลคำร้องขอและส่งผลลัพธ์กลับมาเป็น Response
ตัวอย่าง
- Web Browser ขอหน้าเว็บไซต์จาก Web Server
- โทรศัพท์มือถือร้องขอข้อมูลจาก Cloud Server
- ESP32 ส่งข้อมูลอุณหภูมิไปยัง Server
- โปรแกรม Python ขอข้อมูลจากฐานข้อมูลผ่าน REST API
3.2 องค์ประกอบของระบบ Client-Server
ระบบ Client-Server ประกอบด้วยองค์ประกอบหลัก ดังนี้
1) Client
Client คืออุปกรณ์หรือโปรแกรมที่ทำหน้าที่ส่งคำร้องขอไปยัง Server
ตัวอย่าง Client ได้แก่
- Web Browser
- โปรแกรม Python
- โทรศัพท์มือถือ
- ESP32
- Raspberry Pi
- PLC ที่รองรับ Ethernet
หน้าที่ของ Client คือเชื่อมต่อกับ Server ส่งข้อมูลหรือคำสั่ง รับผลลัพธ์จาก Server แสดงผลแก่ผู้ใช้งาน
2) Server
Server คือคอมพิวเตอร์หรือโปรแกรมที่ให้บริการแก่ Client
ตัวอย่าง Server ได้แก่
- Apache
- Nginx
- Node.js
- Database Server
หน้าที่ของ Server รอรับการเชื่อมต่อจาก Client ประมวลผลข้อมูล ติดต่อฐานข้อมูล ติดต่อฐานข้อมูล
3) Network
Client และ Server ติดต่อกันผ่านเครือข่าย เช่น Ethernet Wi-Fi Internet โดยใช้โปรโตคอล TCP/IP เป็นมาตรฐานในการสื่อสาร
3.3 HTTP ทำงานบน TCP
HTTP (HyperText Transfer Protocol) เป็นโปรโตคอลที่ทำงานอยู่ใน Application Layer ของแบบจำลอง TCP/IP โดย HTTP ไม่มีความสามารถในการรับส่งข้อมูลผ่านเครือข่ายได้ด้วยตนเอง แต่จะอาศัย Transmission Control Protocol (TCP) ซึ่งอยู่ในชั้น Transport Layer เป็นผู้รับผิดชอบในการส่งข้อมูลระหว่าง Client และ Server
กล่าวอีกนัยหนึ่ง HTTP เป็นเพียง รูปแบบ (Format) หรือ กฎเกณฑ์ (Protocol) ในการแลกเปลี่ยนข้อมูล ส่วน TCP เป็นผู้รับผิดชอบในการส่งข้อมูลเหล่านั้นให้ถึงปลายทางอย่างถูกต้อง
หากไม่มี TCP แล้ว HTTP จะไม่สามารถทำงานได้
จากรูปจะเห็นว่า HTTP ทำงานอยู่เหนือ TCP โดยทุกครั้งที่มีการส่ง HTTP Request หรือ HTTP Response ข้อมูลจะถูกส่งผ่าน TCP ก่อนเสมอ
ขั้นตอนการสื่อสารของ HTTP ผ่าน TCP
เมื่อผู้ใช้เปิดเว็บไซต์หรือ ESP32 ส่งข้อมูลไปยัง Server จะเกิดขั้นตอนดังนี้
1) Client ตรวจสอบหมายเลข IP ของ Server
2) Client สร้างการเชื่อมต่อ TCP ไปยัง Server
3) TCP ทำการ Three-Way Handshake
4) เมื่อเชื่อมต่อสำเร็จ Client ส่ง HTTP Request
5) Server ประมวลผลคำร้องขอ
6) Server ส่ง HTTP Response กลับมายัง Client
7) TCP ปิดการเชื่อมต่อ (หรือคงการเชื่อมต่อไว้ในกรณี Keep-Alive)
สามารถสรุปเป็นลำดับการทำงานดังรูป
สรุปขั้นตอนจากภาพ (TCP Handshake & HTTP Lifecycle)
1. TCP Three-Way Handshake (สร้างการเชื่อมต่อ)
- SYN: Client ส่งสัญญาณขอเชื่อมต่อไปยัง Server
- SYN + ACK: Server ตอบรับคำขอและส่งสัญญาณกลับมา
- ACK: Client ส่งสัญญาณยืนยันการรับรู้กลับไป
2. TCP Connected
- สถานะเปลี่ยนเป็นเชื่อมต่อสำเร็จ พร้อมสำหรับการรับส่งข้อมูล
3. HTTP Communication (การรับส่งข้อมูล)
- HTTP Request: Client ส่งคำร้องขอข้อมูลไปยัง Server
- HTTP Response: Server ประมวลผลและส่งข้อมูลตอบกลับมายัง Client
4. TCP Connection Termination (ตัดการเชื่อมต่อ)
- TCP FIN: Client ส่งสัญญาณแจ้งขอปิดการเชื่อมต่อ
-TCP ACK: Server ตอบรับการปิดระบบอย่างสมบูรณ์
จะเห็นว่า ก่อนที่ HTTP จะเริ่มส่งข้อมูล จะต้องมีการสร้างการเชื่อมต่อ TCP ให้เรียบร้อยก่อนเสมอ
TCP มีคุณสมบัติที่เหมาะสมกับการรับส่งข้อมูลของ HTTP ดังนี้
- รับประกันว่าข้อมูลจะส่งถึงปลายทางครบถ้วน
- ตรวจสอบความถูกต้องของข้อมูล (Error Detection)
- จัดเรียงลำดับข้อมูล (Sequence Number)
- ส่งข้อมูลใหม่อัตโนมัติเมื่อเกิดการสูญหาย (Retransmission)
- ควบคุมอัตราการรับส่งข้อมูล (Flow Control)
- ลดปัญหาความแออัดของเครือข่าย (Congestion Control)
ตัวอย่างข้อมูลที่ ESP32 ส่งไปยัง Server
HTTP Request ทั้งหมดนี้จะถูกบรรจุอยู่ภายใน TCP Segment ก่อนส่งผ่านเครือข่าย
เมื่อ Server ประมวลผลเสร็จ จะส่งข้อมูลกลับ
ข้อดีของการใช้ TCP กับ HTTP ทำให้ HTTP มีความน่าเชื่อถือสูง เนื่องจาก
- ข้อมูลไม่สูญหายระหว่างทาง
- ข้อมูลมาถึงตามลำดับที่ถูกต้อง
- หากข้อมูลสูญหาย TCP จะส่งใหม่อัตโนมัติ
- เหมาะสำหรับการรับส่งข้อมูลที่ต้องการความถูกต้อง เช่น เว็บเพจ ระบบฐานข้อมูล และ REST AP
ตัวอย่างในงาน Industrial IoT เช่นนระบบตรวจวัดอุณหภูมิของโรงงาน
ESP32 ทำหน้าที่เป็น HTTP Client ส่วน FastAPI ทำหน้าที่เป็น HTTP Server ข้อมูลทั้งหมดถูกส่งผ่าน TCP ทำให้มั่นใจได้ว่าค่าที่วัดได้จะถูกบันทึกลงฐานข้อมูลอย่างถูกต้อง
HTTP เป็นโปรโตคอลในชั้น Application Layer ที่อาศัย TCP ซึ่งอยู่ในชั้น Transport Layer ในการรับส่งข้อมูลผ่านเครือข่าย ทุกครั้งที่มีการแลกเปลี่ยน HTTP Request และ HTTP Response จะต้องมีการสร้างการเชื่อมต่อ TCP ก่อนเสมอ TCP มีหน้าที่รับประกันความถูกต้อง ความครบถ้วน และลำดับของข้อมูล ทำให้ HTTP เหมาะสำหรับงานที่ต้องการความน่าเชื่อถือ เช่น เว็บไซต์ ระบบฐานข้อมูล ระบบ Cloud และ Industrial IoT
3.4 ขั้นตอนการสื่อสารของ HTTP (HTTP Communication Process)
HTTP (HyperText Transfer Protocol) เป็นโปรโตคอลที่ใช้รูปแบบการสื่อสารแบบ Request-Response กล่าวคือ การสื่อสารทุกครั้งจะเริ่มต้นจาก Client ส่งคำร้องขอ (Request) ไปยัง Server เมื่อ Server ประมวลผลคำร้องขอแล้ว จึงส่งผลลัพธ์กลับมาในรูปแบบ Response
ลักษณะการสื่อสารดังกล่าวแตกต่างจากโปรโตคอลบางชนิด เช่น MQTT ซึ่งสามารถส่งข้อมูลได้โดยไม่ต้องรอให้ Client ร้องขอก่อน
การทำงานของ HTTP สามารถสรุปได้ดังภาพ
ขั้นตอนการสื่อสารของ HTTP
การรับส่งข้อมูลผ่าน HTTP ประกอบด้วยขั้นตอนสำคัญ ดังนี้
ขั้นตอนที่ 1 Client เตรียมข้อมูล
Client อาจเป็น Web Browser โปรแกรม Python แอปพลิเคชันบนโทรศัพท์มือถือ ESP32 หรือ Raspberry Pi โดย Client จะสร้างข้อมูลที่ต้องการส่ง เช่น URL,HTTP Method ,Header,Body
ขั้นตอนที่ 2 สร้างการเชื่อมต่อ TCP
ก่อนส่ง HTTP Request อุปกรณ์ Client จะสร้างการเชื่อมต่อกับ Server ผ่าน TCP ประกอบด้วย
1) SYN/p>
2) SYN-ACK
3) ACK
เมื่อเชื่อมต่อสำเร็จ HTTP จึงเริ่มส่งข้อมูลได้
ขั้นตอนที่ 3 ส่ง HTTP Request
เมื่อเชื่อมต่อสำเร็จ Client จะส่ง HTTP Request ไปยัง Server
3.5 HTTP Request
HTTP Request คือ ข้อความ (Message) ที่ Client ส่งไปยัง Server เพื่อร้องขอข้อมูลหรือขอให้ Server ดำเนินการบางอย่าง เช่น การอ่านข้อมูล การเพิ่มข้อมูล การแก้ไขข้อมูล หรือการลบข้อมูล
HTTP Request เป็นจุดเริ่มต้นของการสื่อสารแบบ Request-Response โดย Client จะเป็นผู้ส่ง Request ก่อนเสมอ และ Server จะตอบกลับด้วย HTTP Response โดยโครงสร้างของ HTTP Request ประกอบด้วยองค์ประกอบหลัก 4 ส่วน ได้แก่
1. Request Line
2. Header
3. Blank Line
4. Body
1. Request Line เป็นบรรทัดแรกของ HTTP Request ประกอบด้วย
- HTTP Method
- URI (Uniform Resource Identifier)
- HTTP Version
เช่น
หมายถึง ร้องขอข้อมูลนักศึกษา
2. Header
Header เป็นส่วนที่ใช้ส่งข้อมูลเพิ่มเติมเกี่ยวกับ Request ไปยัง Server เพื่อให้ Server เข้าใจวิธีการประมวลผลข้อมูล
ตัวอย่าง Header
3.Blank Line
หลังจาก Header จะมีบรรทัดว่างหนึ่งบรรทัด เพื่อบอกว่า Header สิ้นสุดแล้ว และข้อมูลถัดไปคือ Body บรรทัดว่างนี้เป็นส่วนหนึ่งของมาตรฐาน HTTP และไม่ควรละเว้น
4.Body
Body เป็นส่วนที่ใช้ส่งข้อมูลจริงจาก Client ไปยัง Server โดยจะใช้กับ HTTP Method เช่น
- POST
- PUT
- PATCH
ส่วนใหญ่ข้อมูลในปัจจุบันจะอยู่ในรูปแบบ JSON
ตัวอย่าง เช่น
ข้อมูลใน Body จะถูก Server อ่านและนำไปประมวลผล เช่น บันทึกลงฐานข้อมูล หรือคำนวณค่าต่าง ๆ
ตัวอย่างการใช้งานใน Web Browser
เมื่อผู้ใช้พิมพ์ http://www.example.com ในช่อง url ของเวปบราวเซอร์ Browser จะสร้าง HTTP Request โดยอัตโนมัติ
Server จะตอบกลับด้วยหน้าเว็บ HTML ผู้ใช้จึงเห็นเว็บไซต์บนหน้าจอ
ซึ่งหากต้องการเห็นลักษณะข้อความขั้นคอนการสื่อสารของ HTTP กับเซิฟเวอร์สามารถใช้โปรแกม wireshaqe เพื่อดูแพ๊กเก็ตข้อมูลได้
การทดลองส่งข้อมูลจาก Client ไปแสดงผลบน Sever ด้วย HTTP
1. ติดตั้ง FastAPI ด้วยคำสั่ง
pip install fastapi uvicorn
และ
python -m pip install fastapi uvicorn requests
2. สร้างไฟล์ server_test.py
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class SensorData(BaseModel):
device_id: str
temperature: float
humidity: float
@app.post("/sensor")
def receive_sensor(data: SensorData):
print("=" * 40)
print("Device :", data.device_id)
print("Temp :", data.temperature)
print("Humid :", data.humidity)
print("=" * 40)
return {
"status": "OK"
}
3. รัน Server
เปิด Command Prompt
uvicorn server_test:app --host 0.0.0.0 --port 8000
หรือ
python -m uvicorn server:app --host 0.0.0.0 --port 8000
เปิด Browser ป้อน http://127.0.0.1:8000/docs ถ้าขึ้นดังรูปแสดงว่าเซิฟเวอร์พร้อมใช้งาน
4. สร้างไฟล์ client.py ดังโค้ดในตัวอย่างโดยจะสุ่มค่าตัวเลขอุณหภูมิและค่า่ความชื้นส่งไปยังเซิฟเวอร์ในรูปแบบของ JSON
import requests
import random
import time
url = "http://127.0.0.1:8000/sensor"
while True:
data = {
"device_id": "PC001",
"temperature": round(random.uniform(28,35),2),
"humidity": round(random.uniform(60,80),2)
}
response = requests.post(url, json=data)
print(response.json())
time.sleep(3)
ให้ทำการรันไฟล์ client เพื่อส่งข้อมูลไปยังเซิฟเวอร์ จะเห็นขึ้อมูลปรากฏที่ฝั่ง Server และ Client ดังรูป
ข้อความฝั่ง Server
ข้อความฝั่ง Client