การเข้ารหัสขนส่งเป็นชิ้นส่วน

จากวิกิพีเดีย สารานุกรมเสรี
Jump to navigation Jump to search

การเข้ารหัสขนส่งเป็นชิ้นส่วน (อังกฤษ: chunked transfer encoding) เป็นวิธีหนึ่งของเว็บเซิร์ฟเวอร์เอชทีทีพี ในการส่งถ่ายข้อมูลไปยังโปรแกรมประยุกต์ของเครื่องลูกข่าย (ซึ่งมักจะเป็นเว็บเบราว์เซอร์) ปกติแล้วข้อมูลที่ได้รับจากข้อความตอบรับเอชทีทีพีจะถูกส่งมาเป็นข้อมูลชิ้นเดียว ซึ่งขนาดของเนื้อหานั้นได้แสดงไว้ในส่วนหัว Content-Length ขนาดของข้อมูลเป็นสิ่งสำคัญ เพราะว่าเครื่องลูกข่ายจำเป็นต้องทราบว่า เมื่อไรข้อความตอบรับจะสิ้นสุดและเมื่อไรข้อความถัดไปจะตามมา และด้วยการใช้การเข้ารหัสขนส่งเป็นชิ้นส่วน ข้อมูลจะถูกแบ่งออกเป็นบล็อกย่อย ๆ และถูกส่งออกไปเป็นหนึ่งหรือหลาย "ชิ้นส่วน" (chunk) ดังนั้นเครื่องแม่ข่ายอาจเริ่มส่งข้อมูลก่อนที่มันจะทราบว่าขนาดรวมทั้งหมดของเนื้อหาเป็นเท่าใด บ่อยครั้งที่ขนาดของบล็อกจะเท่ากันหมด แต่ก็ไม่แน่เสมอไป

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

รูปแบบ[แก้]

เครื่องแม่ข่ายจะส่งส่วนหัวของการตอบรับ Transfer-Encoding โดยกำหนดค่าเป็น chunked แต่ละชิ้นส่วนจะขึ้นต้นด้วยขนาดของข้อมูลในชิ้นส่วนนั้นเป็นเลขฐานสิบหก ตามด้วยอักขระปัดแคร่ (carriage return) อักขระป้อนบรรทัด (line feed) และข้อมูลในส่วนนั้น ในการนำไปใช้บางอย่าง จะมีอักขระช่องว่าง (0x20) เพิ่มเข้ามาระหว่างขนาดของชิ้นส่วน กับอักขระปัดแคร่ป้อนบรรทัด และเมื่อไม่มีข้อมูลที่จะส่งต่อแล้ว ชิ้นส่วนตอบรับสุดท้ายจะจบด้วยขนาดที่เท่ากับ 0

ตัวอย่างข้อความตอบรับ[แก้]

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

23
This is the data in the first chunk

1A
and this is the second one

0

แหล่งข้อมูลอื่น[แก้]