กลับไปหน้าบทความ

อ่าน 3 นาที

การเชื่อมต่อแบบถาวร HTTP

การเชื่อมต่อแบบถาวร ของ HTTP หรือที่เรียกว่า HTTP keep-alive หรือ HTTP connection reuse คือแนวคิดของการใช้ การเชื่อมต่อ TCP เดียว ในการส่งและรับ คำขอ/การตอบกลับ HTTP หลายรายการ...

การเชื่อมต่อแบบถาวร HTTP

การเชื่อมต่อแบบถาวรของ HTTPหรือที่เรียกว่า HTTP keep-aliveหรือ HTTP connection reuseคือแนวคิดของการใช้ การเชื่อมต่อ TCP เดียว ในการส่งและรับคำขอ/การตอบกลับ HTTP หลายรายการ แทนที่จะเปิดการเชื่อมต่อใหม่สำหรับทุกคู่คำขอ/การตอบกลับ โปรโตคอล HTTP/2 ที่ใหม่กว่า ใช้แนวคิดเดียวกันนี้และพัฒนาต่อไปเพื่อให้สามารถส่งคำขอ/การตอบกลับพร้อมกันหลายรายการผ่านการเชื่อมต่อเดียวได้

การดำเนินการ

HTTP 1.0

ภายใต้ HTTP 1.0 การเชื่อมต่อควรถูกปิดโดยเซิร์ฟเวอร์เสมอหลังจากส่งการตอบกลับ[ 1 ]

ตั้งแต่ช่วงปลายปี 1995 เป็นอย่างน้อย[ 2 ]นักพัฒนาผลิตภัณฑ์ยอดนิยม (เบราว์เซอร์ เว็บเซิร์ฟเวอร์ ฯลฯ) ที่ใช้ HTTP/1.0 เริ่มเพิ่มส่วนขยายที่ไม่เป็นทางการ (ให้กับโปรโตคอล) ที่ชื่อว่า "keep-alive" เพื่ออนุญาตให้ใช้การเชื่อมต่อซ้ำสำหรับการร้องขอ/การตอบกลับหลายครั้ง[ 3 ] [ 4 ]

หากไคลเอ็นต์รองรับ keep-alive ระบบจะเพิ่มส่วนหัวเพิ่มเติมลงในคำขอ:

การเชื่อมต่อ: keep-alive 

เมื่อเซิร์ฟเวอร์ได้รับคำขอและสร้างการตอบกลับ หากเซิร์ฟเวอร์รองรับ keep-alive ก็จะเพิ่มส่วนหัวเดียวกันกับข้างต้นลงในการตอบกลับด้วย หลังจากนั้น การเชื่อมต่อจะไม่ถูกตัด แต่จะยังคงเปิดอยู่ เมื่อไคลเอนต์ส่งคำขออื่น ก็จะใช้การเชื่อมต่อเดียวกันนั้น

กระบวนการนี้จะดำเนินต่อไปจนกว่าฝ่ายใดฝ่ายหนึ่งจะตัดสินใจว่าการสนทนาสิ้นสุดลงแล้ว และในกรณีนี้ พวกเขาจะลบส่วน"Connection:"หัวออกจากข้อความสุดท้ายที่ส่งไป หรือที่ดีกว่านั้นคือ พวกเขาจะเพิ่มคำว่า "close" ต่อท้ายข้อความนั้น

การเชื่อมต่อ: ปิด 

หลังจากนั้น การเชื่อมต่อจะถูกปิดตามกฎที่กำหนดไว้

ตั้งแต่ปี พ.ศ. 2540 ข้อกำหนด HTTP/1.1 เวอร์ชันต่างๆ ยอมรับการใช้งานส่วนขยายที่ไม่เป็นทางการนี้ และรวมข้อควรระวังบางประการเกี่ยวกับการทำงานร่วมกันระหว่างไคลเอ็นต์/เซิร์ฟเวอร์ HTTP/1.0 (keep-alive) และ HTTP/1.1 [ 5 ]

ทศนิยม 1.1

ใน HTTP 1.1 การเชื่อมต่อทั้งหมดจะถือว่าเป็นการเชื่อมต่อแบบถาวร เว้นแต่จะประกาศเป็นอย่างอื่น[ 5 ]การเชื่อมต่อแบบถาวรของ HTTP ไม่ได้ใช้ข้อความ keepalive แยกต่างหาก แต่จะอนุญาตให้คำขอหลายรายการใช้การเชื่อมต่อเดียว อย่างไรก็ตาม เวลาหมดอายุการเชื่อมต่อเริ่มต้นของ Apache httpd 1.3 และ 2.0 นั้นสั้นเพียง 15 วินาที[ 6 ] [ 7 ]และเพียง 5 วินาทีสำหรับ Apache httpd 2.2 ขึ้นไป[ 8 ] [ 9 ] ข้อดีของเวลาหมดอายุที่สั้นคือความสามารถในการส่งมอบส่วนประกอบหลายส่วนของเว็บเพจได้อย่างรวดเร็วโดยไม่ต้องใช้ทรัพยากรในการเรียกใช้กระบวนการหรือเธรดเซิร์ฟเวอร์หลายตัวเป็นเวลานานเกินไป[ 10 ]

การรักษาการเชื่อมต่อด้วยการเข้ารหัสการถ่ายโอนแบบแบ่งส่วน

Keepalive ทำให้ไคลเอนต์ระบุจุดสิ้นสุดของการตอบสนองหนึ่งและจุดเริ่มต้นของการตอบสนองถัดไปได้ยาก โดยเฉพาะอย่างยิ่งในระหว่างการดำเนินการ HTTP แบบ pipelined [ 11 ]นี่เป็นปัญหาที่ร้ายแรงเมื่อContent-Lengthไม่สามารถใช้งานได้เนื่องจากการสตรีม[ 12 ]เพื่อแก้ปัญหานี้ HTTP 1.1 ได้แนะนำการเข้ารหัสการถ่ายโอนแบบ chunkedซึ่งกำหนดlast-chunkบิต[ 13 ] บิต นี้last-chunkจะถูกตั้งค่าเมื่อสิ้นสุดการตอบสนองแต่ละครั้ง เพื่อให้ไคลเอนต์รู้ว่าจุดเริ่มต้นของการตอบสนองถัดไปอยู่ที่ใด

ข้อดี

ตามRFC 7230 มาตรา 6.4ระบุว่า "ไคลเอ็นต์ควรจำกัดจำนวนการเชื่อมต่อที่เปิดพร้อมกันที่รักษาไว้กับเซิร์ฟเวอร์ที่กำหนด" ข้อกำหนด HTTP/1.1 เวอร์ชันก่อนหน้าระบุค่าสูงสุดที่เฉพาะเจาะจงแต่ตามคำกล่าวของ RFC 7230 "พบว่าสิ่งนี้ไม่สามารถนำไปใช้ได้จริงสำหรับแอปพลิเคชันจำนวนมาก... ดังนั้น... ควรระมัดระวังเมื่อเปิดการเชื่อมต่อหลายรายการ" แนวทางเหล่านี้มีจุดประสงค์เพื่อปรับปรุงเวลาตอบสนองของ HTTP และหลีกเลี่ยงความแออัด หากมีการใช้งาน HTTP pipelining อย่างถูกต้อง จะไม่มีประโยชน์ด้านประสิทธิภาพใด ๆ ที่จะได้รับจากการเชื่อมต่อเพิ่มเติม ในขณะที่การเชื่อมต่อเพิ่มเติมอาจทำให้เกิดปัญหาความแออัด[ 14 ]

ข้อเสีย

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

นอกจากนี้ ยัง อาจเกิด สภาวะการแข่งขัน (race condition)ขึ้นได้ โดยที่ไคลเอนต์ส่งคำขอไปยังเซิร์ฟเวอร์ในเวลาเดียวกันกับที่เซิร์ฟเวอร์ปิดการเชื่อมต่อ TCP [ 15 ]เซิร์ฟเวอร์ควรส่งรหัสสถานะ 408 Request Timeout ไปยังไคลเอนต์ทันทีก่อนที่จะปิดการเชื่อมต่อ เมื่อไคลเอนต์ได้รับรหัสสถานะ 408 หลังจากส่งคำขอแล้ว ไคลเอนต์อาจเปิดการเชื่อมต่อใหม่กับเซิร์ฟเวอร์และส่งคำขออีกครั้ง[ 16 ] ไม่ใช่ว่าไคลเอนต์ทั้งหมดจะส่งคำขออีกครั้ง และหลายไคลเอนต์ที่ทำเช่นนั้นก็จะทำก็ต่อเมื่อคำขอมี วิธีการ HTTP ที่สามารถทำซ้ำได้ (idempotent HTTP method ) เท่านั้น

ใช้งานในเว็บเบราว์เซอร์

แผนผังแสดงความสัมพันธ์ระหว่างการเชื่อมต่อหลายรายการกับการเชื่อมต่อแบบถาวร

เว็บเบราว์เซอร์สมัยใหม่ทั้งหมด รวมถึงChrome , Edge , Firefox , Opera (ตั้งแต่เวอร์ชัน 4.0) [ 17 ]และSafariใช้การเชื่อมต่อแบบถาวร

ใน Firefox สามารถปรับแต่งจำนวนการเชื่อมต่อพร้อมกันได้ (ต่อเซิร์ฟเวอร์ ต่อพร็อกซี รวมทั้งหมด) การเชื่อมต่อแบบถาวรจะหมดเวลาหลังจากไม่มีการใช้งานเป็นเวลา 115 วินาที (1.92 นาที) ซึ่งสามารถเปลี่ยนแปลงได้ผ่านการกำหนดค่า[ 18 ]

การดำเนินการ

requestsไลบรารีของ Python ประกอบด้วย requests.Session()ซึ่งสร้างการเชื่อมต่อ HTTP แบบถาวร ทำให้สามารถนำการเชื่อมต่อ TCP พื้นฐานกลับมาใช้ใหม่ได้ ซึ่งอาจส่งผลให้ประสิทธิภาพเพิ่มขึ้นอย่างมาก[ 19 ]

ดูเพิ่มเติม

  • การส่งข้อมูล แบบ HTTP pipeliningซึ่งช่วยให้สามารถส่งคำขอหลายรายการได้โดยไม่ต้องรอการตอบกลับ
  • HTTP/2อนุญาตให้มีการประมวลผลคำขอและการตอบสนองแบบไม่เรียงลำดับ และยังสามารถส่งเนื้อหาล่วงหน้าก่อนที่จะมีการร้องขอได้ อีกด้วย
  • โปรโตคอลการถ่ายโอนไฮเปอร์เท็กซ์ (HTTP/1.1): ไวยากรณ์ข้อความและการกำหนดเส้นทาง การจัดการการเชื่อมต่อ การคงอยู่ของข้อมูล
  • พฤติกรรมการเชื่อมต่อแบบต่อเนื่องของเบราว์เซอร์ยอดนิยม (ข้อมูลเก่า)
  • การสนับสนุนการรักษาการเชื่อมต่อ (Keep-Alive) ของ Apache HTTPD
  • ผลกระทบต่อประสิทธิภาพเครือข่ายของ HTTP/1.1, CSS1 และ PNG
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=HTTP_persistent_connection&oldid=1324875059 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การเชื่อมต่อแบบถาวร HTTP

การเชื่อมต่อแบบถาวร ของ HTTP หรือที่เรียกว่า HTTP keep-alive หรือ HTTP connection reuse คือแนวคิดของการใช้ การเชื่อมต่อ TCP เดียว ในการส่งและรับ คำขอ/การตอบกลับ HTTP หลายรายการ...

HTTP 1.0

ภายใต้ HTTP 1.0 การเชื่อมต่อควรถูก ปิด โดยเซิร์ฟเวอร์เสมอหลังจากส่งการตอบกลับ [ 1 ]

ทศนิยม 1.1

ใน HTTP 1.1 การเชื่อมต่อทั้งหมดจะถือว่าเป็นการเชื่อมต่อแบบถาวร เว้นแต่จะประกาศเป็นอย่างอื่น [ 5 ] การเชื่อมต่อแบบถาวร ของ HTTP ไม่ได้ใช้ข้อความ keepalive แยกต่างหาก แต่จะอนุญาตให้คำขอหลายรายการใช้การเชื่อมต่อเดียว อย่างไรก็ตาม...

ข้อดี

ตามRFC 7230 มาตรา 6.4ระบุว่า "ไคลเอ็นต์ควรจำกัดจำนวนการเชื่อมต่อที่เปิดพร้อมกันที่รักษาไว้กับเซิร์ฟเวอร์ที่กำหนด" ข้อกำหนด HTTP/1.