ترميز النقل المجزأ
ترميز النقل المجزأ هو آلية لنقل البيانات المتدفقة متوفرة في بروتوكول نقل النص التشعبي (HTTP) الإصدار 1.1، والمحددة في RFC 9112 §7.1 . في هذا الترميز، يُقسّم تدفق البيانات إلى سلسلة من "الأجزاء" غير المتداخلة. تُرسل هذه الأجزاء وتُستقبل بشكل مستقل عن بعضها البعض. في أي لحظة، لا يحتاج المرسل أو المستقبل إلى معرفة أي شيء عن تدفق البيانات خارج الجزء الذي تتم معالجته حاليًا.
يُسبق كل جزء بحجمه بالبايت، وينتهي الإرسال عند استلام جزء فارغ. تُستخدم الكلمة المفتاحية chunked في ترويسة Transfer-Encoding للإشارة إلى نقل البيانات على شكل أجزاء.
لا يدعم بروتوكول HTTP/2 ترميز نقل البيانات المجزأة ، والذي يوفر آلياته الخاصة لتدفق البيانات. [ 1 ]
الأساس المنطقي
أدى إدخال التشفير المجزأ إلى توفير فوائد متنوعة:
- يُمكّن ترميز النقل المُجزأ الخادم من الحفاظ على اتصال HTTP دائم للمحتوى المُنشأ ديناميكيًا. في هذه الحالة، لا يُمكن استخدام ترويسة HTTP Content-Length لتحديد المحتوى وطلب/استجابة HTTP التالية، نظرًا لعدم معرفة حجم المحتوى بعد. يتميز الترميز المُجزأ بأنه لا يتطلب إنشاء المحتوى بالكامل قبل كتابة الترويسة، إذ يسمح ببث المحتوى على شكل أجزاء والإشارة صراحةً إلى نهاية المحتوى، مما يجعل الاتصال متاحًا لطلب/استجابة HTTP التالية.
- تتيح تقنية التشفير المُجزأ للمرسل إرسال حقول رأسية إضافية بعد نص الرسالة. وهذا مهم في الحالات التي لا يمكن فيها معرفة قيم حقل ما إلا بعد إنشاء المحتوى، كما هو الحال عند اشتراط توقيع محتوى الرسالة رقميًا. فبدون التشفير المُجزأ، سيضطر المرسل إلى تخزين المحتوى مؤقتًا حتى اكتماله لحساب قيمة حقل ما وإرسالها قبل المحتوى.
قابلية التطبيق
في الإصدار 1.1 من بروتوكول HTTP، تُعتبر آلية النقل المُجزأ مقبولة دائمًا وفي جميع الأحوال، حتى لو لم تكن مُدرجة في حقل رأس طلب Transfer-Encoding (TE). وعند استخدامها مع آليات نقل أخرى، يجب تطبيقها دائمًا على البيانات المنقولة أخيرًا، وبمرة واحدة فقط. تسمح طريقة ترميز النقل هذه أيضًا بإرسال حقول رأس كيان إضافية بعد الجزء الأخير إذا حدد العميل مُعامل "trailers" كوسيط في حقل طلب TE. يمكن لخادم المصدر أيضًا إرسال تذييلات كيان إضافية حتى لو لم يُحدد العميل مُعامل "trailers"، ولكن فقط إذا كانت البيانات الوصفية اختيارية (أي يمكن للعميل استخدام الكيان المُستلم بدونها). عند استخدام التذييلات، يجب على الخادم إدراج أسمائها في حقل رأس Trailer؛ ويُحظر تحديدًا ظهور ثلاثة أنواع من حقول الرأس كحقل تذييل: Content-Length و Trailer و Transfer-Encoding .
شكل
إذا تم تحديد حقل Transfer-Encoding بقيمة " chunked " في رسالة HTTP (سواء كان طلبًا مرسلًا من عميل أو استجابة من الخادم)، فإن نص الرسالة يتكون من جزء واحد أو أكثر وجزء نهائي واحد مع تذييل اختياري قبل التسلسل النهائي ␍␊ (أي إرجاع السطر متبوعًا بتغذية السطر ).
تبدأ كل وحدة بيانات بعدد البايتات التي تحتويها، مُعبَّرًا عنها برقم سداسي عشري في نظام ASCII ، متبوعًا بمعاملات اختيارية ( امتداد الوحدة ) وتسلسل إنهاء ␍␊، ثم بيانات الوحدة. تنتهي الوحدة بـ ␍␊.
في حال توفير امتدادات للأجزاء، يُختتم حجم الجزء بفاصلة منقوطة، متبوعًا بالمعلمات، وكل منها مفصول أيضًا بفواصل منقوطة. تُشفّر كل معلمة باسم الامتداد متبوعًا بعلامة يساوي اختيارية وقيمة. يمكن استخدام هذه المعلمات لتلخيص الرسائل الجارية أو التوقيع الرقمي ، أو للإشارة إلى التقدم المُقدّر في عملية النقل، على سبيل المثال.
الجزء النهائي هو جزء خاص طوله صفر. قد يحتوي على تذييل، يتألف من سلسلة (قد تكون فارغة) من حقول رأس الكيان. عادةً، تُرسل حقول الرأس هذه في رأس الرسالة؛ إلا أنه قد يكون من الأنسب تحديدها بعد معالجة كيان الرسالة بالكامل. في هذه الحالة، يُفضّل إرسال هذه الرؤوس في التذييل.
الحقول الرأسية التي تنظم استخدام التذييلات هي Transfer-Encoding مع المعلمة "trailers" (المستخدمة في الطلبات) و Trailer (المستخدمة في الاستجابات).
استخدم مع الضغط
تستخدم خوادم HTTP غالبًا الضغط لتحسين نقل البيانات، على سبيل المثال باستخدام Content-Encoding: gzip أو Content-Encoding: deflate . في حال تفعيل كلٍ من الضغط والترميز المُجزأ، يتم ضغط دفق المحتوى أولًا، ثم تقسيمه إلى أجزاء؛ وبالتالي لا يتم ضغط ترميز الأجزاء نفسه، ويتم ضغط البيانات في كل جزء بشكل شامل (أي بناءً على المحتوى بأكمله). بعد ذلك، يقوم الطرف البعيد بفك تشفير الدفق عن طريق دمج الأجزاء وفك ضغط الناتج.
مثال
البيانات المشفرة
يحتوي المثال التالي على ثلاث أجزاء من البيانات بحجم 4 و 7 و 11 (السداسي العشري "B") بايت.
4␍␊Wiki␍␊7␍␊pedia i␍␊B␍␊n ␍␊chunks.␍␊0␍␊␍␊
فيما يلي نسخة مشروحة من البيانات المشفرة.
4␍␊ (حجم الجزء أربعة بايتات) ويكي (أربعة بايتات من البيانات) ␍␊ (نهاية الجزء) 7␍␊ (حجم الجزء سبعة بايتات) pedia i (سبعة بايتات من البيانات) ␍␊ (نهاية الجزء) B␍␊ (حجم الجزء أحد عشر بايتًا) n ␍␊ أجزاء. (أحد عشر بايتًا من البيانات) ␍␊ (نهاية الجزء) 0␍␊ (حجم الجزء صفر بايت، لا يوجد المزيد من الأجزاء) ␍␊ (نهاية الجزء الأخير مع صفر بايت من البيانات)
ملاحظة: حجم كل جزء لا يشمل البايتين ␍␊ اللذين ينهيان بيانات كل جزء.
البيانات التي تم فك تشفيرها
ينتج عن فك تشفير المثال أعلاه الأجزاء الثمانية التالية:
ويكيبيديا في أجزاء.
تُعرض البايتات المذكورة أعلاه عادةً على النحو التالي:
ويكيبيديا في قطع.
انظر أيضاً
مراجع
روابط خارجية
- "ترميز النقل المجزأ" . HTTP/1.1 . IETF . يونيو 2022. القسم 7.1. doi : 10.17487/RFC9112 . RFC 9112 .
- إدارة البيانات
- رؤوس بروتوكول نقل النص التشعبي
