HTTP/2 คืออะไร แตกต่างจาก HTTP/1.1 อย่างไร?

Thanwa Jindarattana
3 min readOct 5, 2018

--

ช่วงนี้ผมได้ศึกษาเกี่ยวกับ gRPC สำหรับการส่ง message ระหว่า client กับ server ซึ่งผมจะมาอธิบายในบทความต่อไปถึงความสามารถของ gRPC ซึ่งเขาเคลมว่ามีโอกาสที่จะมาแทนการส่ง message แบบ REST ในปัจจุบัน (อ่านต่อได้จาก ที่นี่)

แต่ด้วยเทคโนโลยีนี้จะเกิดขึ้นไม่ได้หากไม่มี HTTP/2 เกิดขึ้นมาก่อน โดยบทความนี้ผมจะกล่าวถึงความแตกต่างที่ชัดเจนระหว่าง HTTP/1.1 และ HTTP/2

ก่อนอื่นเรามาดูความแตกต่างแบบ virtualize กันว่ามันต่างกันอย่างไรโดยเข้าชมได้จากลิงก์นี้ https://imagekit.io/demo/http2-vs-http1 ซึ่งมันจะโหลดภาพเล็กๆ จำนวน 100 ภาพขึ้นมาประกอบเป็นภาพใหญ่ โดยฝั่งซ้ายจะเป็น HTTP/2 และฝั่งขวาเป็น HTTP/1.1 ซึ่งจะเห็นความแตกต่างชัดมากหากใช้งานอินเทอร์เน็ตที่มีความเร็วไม่มากนัก

ตัวอย่างหน้าเว็บเมื่อโหลดเสร็จแล้ว

ย้อนกลับไปยังปี 1997 HTTP/1.1 ได้ถูกปล่อยออกมาและใช้งานกันอย่างแพร่หลายและมันใช้งานได้ดีมาเกือบสองทศวรรษ ตลอดระยะเวลานี้เทคโนโลยีของเว็บไซต์ได้เปลี่ยนไปมาก แต่ standard ไม่ได้ถูกเปลี่ยนแปลง

หลักการของ HTTP/1.1 คือมันจะเปิด TCP connection เพื่อเชื่อมต่อไปยังเซิร์ฟเวอร์ทุกๆ request ซึ่งมันสิ้นเปลืองมาก และมันก็ไม่ได้ compress header การส่งจะเป็น plaintext ธรรมดาซึ่งยิ่งทำให้สิ้นเปลือง bandwidth เข้าไปอีก

การทำงานของ HTTP/1.1 นั้น มันจะทำงานแบบ request และ response เช่น ต้องการข้อมูลสภาพอากาศ client ต้องทำการส่ง request ไปยัง server แล้ว server จะทำการส่งข้อมูลสภาพอากาศกลับมาให้ ซึ่งหมายความว่า หากเราไม่ request ไปยัง server เป็นไปไม่ได้ที่ server จะ push ข้อมูลมาให้เรา

HTTP/1.1 นั้น ดั้งเดิมของมันมีแค่ 2 methods คือ

  1. GET: ใช้เพื่อขอข้อมูล
  2. POST: ใช้เพื่อส่งข้อมูล

แต่เมื่อเวลาผ่านไป ก็มี method อื่นๆ เพิ่มเข้ามาเช่น PATCH, PUSH, DELETE เป็นต้น

ปัจจุบันนี้ เว็บไซต์โหลด asset หรือ resource จาก server เพิ่มมากขึ้น (เช่น html, css, image) โดยเฉลี่ยแล้วประมาณ 80 assets ต่อ 1 เว็บไซต์

และแน่นอนว่า header จะถูกส่งออกไปทุกๆ request และเป็นแบบ plaintext ซึ่งข้อมูลมันจะมีขนาดใหญ่ และทุกๆ ครั้งที่เราส่ง header ที่เหมือนกัน มันจะใช้ bandwidth ที่เยอะมาก (เริ่มเห็นข้อเสียกันแล้วใช่ไหม)

อย่างที่บอกว่าแต่ละ request ของ HTTP/1.1 มันจะเปิด TCP connection ทุกๆ อันซึ่งมันไม่มีประสิทธิภาพ เพราะต้องเสียเวลากับการเปิด TCP connection ทำให้ latency เพิ่มสูงขึ้นไปอีก และการทำแบบนี้ packet size ของ network ก็จะบวมขึ้นไปอีก

Thanks, Stephane Maarek

จากภาพสมมติว่า request 1 เป็นการขอ html file จาก server ซึ่ง server ก็ทำการส่งไฟล์ html กลับไปให้ นี่นับเป็น 1 TCP connection ซึ่งภายใน TCP connection นี้จะมี header ถูกส่งไปมาหากัน ต่อมา request 2 ขอ css file จาก server ก็ต้องทำการส่ง header ไปหา server อีกครั้งทำแบบนี้ไปเรื่อยๆ จนกว่าจะมี asset ที่ครบตามต้องการ ถ้าเป็นเมื่อก่อนคงไม่มีปัญหาอะไร แต่ถ้าเป็นปัจจุบันมันจะค่อนข้างช้าเพราะมีจำนวน asset ที่เพิ่มขึ้น

“แล้ว HTTP/2 ล่ะ มันเข้ามาแก้ปัญหาเหล่านี้ใช่ไหม?”

คำตอบคือ ใช่ เรามาดูว่ามันเหมือนหรือแตกต่างกับ HTTP/1.1 อย่างไร

  • HTTP/2 ถูกปล่อยออกมาครั้งแรกเมื่อปี 2015 (ก็ยังไม่นานมาก) ซึ่งห่างกับ HTTP/1.1 ถึง 18 ปี และมันถูกทดสอบมาหลายครั้งก่อนหน้านี้รวมถึง Google ก็ร่วมทดสอบด้วยโดยใช้นามว่า SPDY
  • HTTP/2 รองรับ multiplexing ซึ่งหมายความว่า client และ server สามารถที่จะ push message แบบ parallel บน TCP connection เดียวกันได้ (ว้าวว ครั้งที่ 1) ทำให้สามารถลด network latency ได้ดีขึ้น
  • HTTP/2 รองรับ server push ซึ่งก็คือ server สามารถที่จะส่ง message (ซึ่งอาจจะมีหลาย messages) มาให้ client โดย client อาจใช้แค่ 1 request เท่านั้น (ว้าวว ครั้งที่ 2) ซึ่งสามารถลดจำนวนของ round trips ได้อีก ทำให้ latency ลงลงไปอีก
  • HTTP/2 สามารถที่จะ compression header ได้กรณีที่เป็น text based ซึ่งช่วยให้ประหยัด bandwidth ได้อีก และมีผลกระทบน้อยมากกับขนาดของ network packet (ว้าวว ครั้งที่3)
  • HTTP/2 เป็น binary (ผมว่าอันนี้คือพระเอก) ซึ่งเป็นข้อแตกต่างอย่างชัดเจนกับ HTTP/1.1 แน่นอนว่า HTTP/1.1 นั้นคนสามารถอ่านมันได้ง่าย และทำให้ debug ง่าย แต่มันไม่มีประสิทธิภาพหากจะนำข้อมูลเหล่านี้ส่งผ่านทาง network (นี่คือสาเหตุที่ทำไม Protocol buffers ถึง require HTTP/2 เพราะ Protocol buffers เป็น binary)
  • สุดท้าย HTTP/2 มีความปลอดภัยกว่า HTTP/1.1 แม้ว่า HTTP/2 จะไม่ require SSL แต่มันถูก recommand โดย default
Thanks, Stephane Maarek

จากรูปจะเห็นว่า client ทำการเปิดท่อ TCP ขึ้นมาแค่ 1 connection และทำการ request ไปยัง server เพียงครั้งเดียว หลังจากนั้น server จะทำการส่ง resource กลับมาให้โดยไม่ต้องส่ง request ไปขอ server จะทำการ push ข้อมูลกลับมาให้ client เอง (ไม่ต้องขอ เดี๋ยวพี่จัดให้) ซึ่งลดจำนวน round trips ได้มหาศาล

สรุป

  • HTTP/2 ตัดข้อมูลที่ไม่จำเป็นออก
  • HTTP/2 มีประสิทธิภาพสูงขึ้น (ใช้ bandwidth น้อยลง)
  • HTTP/2 ลด latency
  • HTTP/2 เพิ่ม security

และสุดท้าย มันสามารถที่จะนำไปต่อยอดกับเทคโนโลยีอื่นๆ ได้อีกมากมาย เพราะมันเป็นระดับ protocol เช่น gRPC framework (on top บท protocol buffers อีกทีหนึ่ง)

ขอจบเพียงเท่านี้ หากมีข้อผิดพลาดประการใดสามารถคอมเมนต์ใต้บทความได้เลยครับ ขอบคุณครับ

--

--

No responses yet