كيف تعمل المتصفحات
عندما تكتب https://shop.example.com/products/42 وتضغط Enter، ينفّذ المتصفح سلسلة الخطوات التي تقف وراء تحميل أي صفحة: يسأل نظام أسماء النطاقات (DNS) عن عنوان IP للخادم، أي العنوان الرقمي للجهاز، ويفتح اتصالاً ويشفّره عبر TLS، ثم يرسل طلب HTTP ويتلقى الاستجابة. بعد ذلك يحوّل ما تلقّاه من HTML وCSS وJavaScript إلى بكسلات على الشاشة. النصف الأول من السلسلة يجلب البايتات، والنصف الثاني يعرضها.
وهذه السلسلة خريطة للمختبِر: فكل إخفاق ظاهر يقع عند إحدى خطواتها، وكل خطوة تترك أدلة يمكنك فحصها داخل المتصفح نفسه.
لماذا يهم
عبارة «الموقع معطّل» قد تعني سجل DNS يشير إلى خادم خاطئ، أو شهادة منتهية الصلاحية، أو استجابة 500، أو ورقة أنماط أعادت 404، أو خطأ JavaScript أوقف معالج النقر. ولكلٍّ منها مالك مختلف وإصلاح مختلف. والمختبِر الذي يعرف الخطوات يستطيع تحديد أيّها حدث وإرفاق الدليل، بدلاً من تقرير لا يستطيع أحد التصرف بناءً عليه.
والخطوات تبيّن أيضاً ما يجب اختباره. فالصفحة عشرات الطلبات وعدة مراحل من المعالجة، وكل منها قد يخفق وحده: على شبكة بطيئة، أو في متصفح آخر، أو مع نسخة قديمة في الذاكرة المؤقتة.
جلب الصفحة: من العنوان إلى الاستجابة
يقسم المتصفح العنوان إلى المخطط (https) والمضيف (shop.example.com) والمسار والاستعلام والجزء (fragment)؛ والجزء، مثل #reviews، لا يُرسَل إلى الخادم أبداً. وإذا كانت الذاكرة المؤقتة (cache) للمتصفح تحتفظ بنسخة حديثة من الاستجابة، فقد يستغني المتصفح عن الشبكة كلياً. وإلا جرت خطوات الشبكة بالترتيب:
- استعلام DNS: يتحوّل اسم المضيف إلى عنوان IP، مثل
203.0.113.10. والإجابات تُخزَّن مؤقتاً، لذلك قد لا يظهر تغيير DNS فوراً. وإذا تعذّر حلّ الاسم، يعرض المتصفح صفحة خطأ خاصة به (في Chrome:DNS_PROBE_FINISHED_NXDOMAINأوERR_NAME_NOT_RESOLVED) ولا يصل أي طلب إلى الخادم. - الاتصال: يفتح المتصفح اتصال TCP، على المنفذ 443 في HTTPS، ويُبقيه مفتوحاً للطلبات اللاحقة. أما HTTP/3 فيستخدم بدلاً منه بروتوكول QUIC فوق UDP، الذي يُنشئ الاتصال وتشفير TLS معاً في مصافحة واحدة مدمجة.
- مصافحة TLS: يتفق المتصفح والخادم على مفاتيح التشفير، ويتحقق المتصفح من أن شهادة الخادم صادرة عن جهة موثوقة، وسارية، وتغطي اسم المضيف هذا. وإذا أخفق أيٌّ من هذه الفحوص ظهر تحذير يملأ الصفحة بدلاً من الموقع، مع رمز مثل
NET::ERR_CERT_DATE_INVALIDفي Chrome. - طلب HTTP: طريقة ومسار، مثل
GET /products/42، مع ترويسات مثلHostوUser-Agent، وملفات تعريف الارتباط (cookies) المخزّنة للموقع. - استجابة HTTP: رمز حالة مثل
200أو404أو500، وترويسات مثلContent-Type(نوع الملف، مثلtext/html) وCache-Control، ومحتوى (body). وإعادة التوجيه (301أو302) تعيد المتصفح إلى الخطوة الأولى بالعنوان الوارد في ترويسةLocation.
بناء الصفحة: HTML وCSS وJavaScript والعرض
يحلّل المتصفح HTML وهو لا يزال يصل: يفكّ ترميز البايتات بمجموعة الأحرف (charset) المعلنة، ويبني DOM، وهو شجرة العناصر التي تعمل عليها السكربتات وأدوات الاختبار. ويُصلح المحلّل الوسوم المعطوبة بصمت، لذلك نادراً ما يُظهر HTML الخاطئ رسالة خطأ. وكل ورقة أنماط وسكربت وصورة وخط تشير إليه الصفحة يصبح طلباً آخر، وقد يخفق أيٌّ منها بينما تعيد الصفحة نفسها 200.
- CSS: أوراق الأنماط داخل
<head>تحجب العرض. ينتظرها المتصفح قبل الرسم الأول، وإذا لم تُحمَّل إحداها ظهرت الصفحة بلا تنسيقها. - JavaScript: الوسم
<script src>العادي يوقف المحلّل حتى يُشغَّل السكربت؛ وdeferينتظر انتهاء التحليل، وasyncيعمل فور وصوله. وتغيّر السكربتات DOM، وتربط معالجات النقر، وتطلب البيانات. والخطأ غير المعالَج يوقف الشيفرة التي كانت تعمل، فقد تبدو الصفحة كاملة بينما لا يفعل زرٌّ شيئاً. - العرض: يحسب المتصفح نمط كل عنصر، ويحدد مواضع الصناديق وأحجامها (التخطيط)، ثم يرسم البكسلات. والتغييرات اللاحقة، مثل صورة بلا مساحة محجوزة أو شريط يُدرجه سكربت، تعيد التخطيط والرسم، ولهذا قد يقفز المحتوى.
- المعالم: يُطلَق الحدث
DOMContentLoadedعندما ينتهي تحليل HTML وتعمل السكربتات المؤجلة؛ ويُطلَقloadعندما تكتمل الصور وأوراق الأنماط والموارد الأخرى أيضاً.
ما يستطيع المختبِر ملاحظته في كل خطوة
تُظهر أدوات المطوّرين (DevTools: المفتاح F12 في Chrome وEdge وFirefox، أو Cmd+Option+I على Mac) كل خطوة تقريباً، وسيعرض درس لاحق لوحاتها. ويسرد تبويب Network صفاً لكل طلب مع رمز الحالة والنوع والحجم والتوقيت، ويعرض شريط الملخص أسفله توقيتَي DOMContentLoaded وload. وهو لا يسجّل إلا وهو مفتوح، فافتحه أولاً ثم أعد تحميل الصفحة. ويمكنه تصدير كل الصفوف في ملف HAR (HTTP Archive)، وهو ملف JSON يستطيع شخص آخر فتحه في أدوات المطوّرين لديه.
الجلب: من العنوان إلى الاستجابة
يتكرر لكل ورقة أنماط وسكربت وصورة وخط تحتاجه الصفحة
- 1قراءة العنوانشريط العنوان، وعنوان الطلب في تبويب Network
https://shop.example.com/products/42 - 2استعلام DNSTiming: مرحلة DNS
shop.example.com → 203.0.113.10فرع: تعذّر حلّ الاسم: صفحة خطأ المتصفح نفسهفشل
- 3الاتصال: TCP ثم TLSTiming: الاتصال وTLS؛ وعارض الشهادة
فرع: شهادة منتهية أو لاسم آخر: تحذير يملأ الصفحةفشل
- 4طلب HTTPتبويب Headers: الطريقة والعنوان وترويسات الطلب وملفات تعريف الارتباط
GET /products/42 - 5استجابة HTTPعمود الحالة وترويسات الاستجابة وتبويب Response
200 OK · text/htmlفرع: إعادة توجيه
3xx: عودة إلى الخطوة 1 بعنوانLocation
العرض: من البايتات إلى البكسلات
- 6تحليل HTML وبناء DOMمصدر الصفحة ولوحة Elements؛ وكل ملف تشير إليه يبدأ جلباً جديداً
- 7تطبيق CSSصفوف أوراق الأنماط؛ والرسم الأول ينتظرها
فرع: تعذّر تحميل ورقة الأنماط: الصفحة بلا تنسيقهافشل
- 8تشغيل JavaScriptوحدة التحكم؛ وصفوف Fetch/XHR للبيانات التي تصل لاحقاً
فرع: خطأ غير معالَج: زر لا يفعل شيئاًفشل
- 9الأنماط والتخطيط والرسمالشاشة؛ وتوقيتا
DOMContentLoadedوloadيتكرر: يتكرر عند تغيّر DOM أو وصول صور أو خطوط، فقد يقفز المحتوى
صورة مبسّطة: يبدأ العرض بينما لا تزال البايتات والملفات تصل، ويُعاد استخدام الاتصالات المفتوحة. وتذكر كل بطاقة أين ينظر المختبِر.
- قبل أي طلب: إخفاقات DNS والاتصال والشهادة تُظهر رمزاً في صفحة خطأ المتصفح نفسه. ولم يُرسَل أي طلب HTTP، فلا يوجد له أي قيد في سجلات الوصول (access logs) على الخادم. وأيقونة معلومات الموقع في بداية شريط العنوان تفتح الشهادة، مع الجهة المُصدِرة وتواريخ الصلاحية.
- عرض Timing لطلب واحد: مراحل مثل استعلام DNS والاتصال وTLS وانتظار الخادم والتنزيل. وتختلف الأسماء قليلاً بين المتصفحات.
- تبويبا Headers وResponse: ما أُرسل (الطريقة والعنوان والترويسات وملفات تعريف الارتباط) وما عاد (رمز الحالة والترويسات والمحتوى). ويكتب Chrome
(disk cache)أو(memory cache)للصفوف المخدومة من الذاكرة المؤقتة، وتجعل خانة «Disable cache» عند تفعيلها إعادة التحميل تتجاوز الذاكرة المؤقتة للمتصفح ما دامت أدوات المطوّرين مفتوحة. - مصدر الصفحة ولوحة Elements: يعرض «View page source» (Ctrl+U على Windows) شيفرة HTML كما وصلت تماماً، بينما تعرض لوحة Elements (واسمها Inspector في Firefox) شجرة DOM بعد إصلاحات المحلّل وتغييرات السكربتات.
- وحدة التحكم (Console): أخطاء JavaScript والموارد المرفوضة مع الملف والسطر. أما مشكلات العرض فلا تظهر إلا على الشاشة، فالتقط لقطات شاشة أو تسجيلاً.
مثال تطبيقي: صفحة منتج بلا تنسيق
بعد إصدار جديد على بيئة Staging، وهي نسخة الاختبار من الموقع التي يُفحص فيها الإصدار قبل أن يصل إلى بيئة الإنتاج، يفتح المختبِر https://staging.shop.example.com/products/42. يظهر النص والصور، لكن في عمود واحد بسيط وبالخطوط الافتراضية. والسير على الخطوات يكشف السبب في دقائق:
- ظهرت الصفحة، إذن نجحت خطوات DNS والاتصال وTLS. وصف المستند يحمل
200والنص مقروء، إذن وصل HTML وفُكّ ترميزه بشكل صحيح. - صف الملف
app.3f9c1e.cssيحمل404معContent-Type: text/html: أرسل الخادم صفحة «غير موجود» بدلاً من ورقة الأنماط، وتقول وحدة التحكم إن المتصفح رفضها لأن نوع MIME، أي نوع الملف المذكور فيContent-Type، ليسtext/css. - إذن يشير HTML إلى ملف CSS غير موجود على الخادم: فإما أن الملف لم يُنشر، وإما أن HTML يذكر اسم ملف خاطئاً. إنه عيب في البناء أو النشر لا في شيفرة CSS، ويظهر في كل المتصفحات. ويحمل تقرير الخطأ الأدلة:
Title: صفحة المنتج بلا تنسيق على Staging: الملف app.3f9c1e.css يعيد 404
URL: https://staging.shop.example.com/products/42
Build: web 2.14.0 on staging
Request: GET https://staging.shop.example.com/assets/app.3f9c1e.css
Response: 404 Not Found, Content-Type: text/html; charset=utf-8
Console: Refused to apply style from '.../assets/app.3f9c1e.css' because its
MIME type ('text/html') is not a supported stylesheet MIME type,
and strict MIME checking is enabled.
Expected: 200 with Content-Type: text/css
Evidence: لقطة شاشة؛ ملف HAR لإعادة تحميل مع تعطيل الذاكرة المؤقتةأخطاء شائعة
- الإبلاغ بعبارة «الصفحة لا تعمل» دون تحديد الخطوة: صفحة خطأ المتصفح، ورمز حالة خطأ من HTTP، وصفحة معطوبة بعد
200عيوب مختلفة لها مالكون مختلفون. - الاختبار فقط والملفات محفوظة مسبقاً في الذاكرة المؤقتة. أعد التحميل مع تعطيل الذاكرة المؤقتة، وتحقق مرة في نافذة خاصة جديدة، فهي تبدأ دون ملفات تعريف الارتباط والملفات المخزّنة لديك.
- الاكتفاء برمز الحالة: فقد تحمل
200صفحة خطأ. - فتح أدوات المطوّرين بعد ظهور المشكلة، حين لا يكون تبويب Network قد سجّل شيئاً، أو عدم فتح وحدة التحكم أصلاً.
- افتراض أن كل إخفاق في شيفرة التطبيق. فسجلات DNS والشهادات وشبكات توصيل المحتوى (CDN)، التي تقدّم نسخاً من الملفات من خوادم قريبة من المستخدم، والذاكرة المؤقتة تخفق أيضاً، وفي إخفاقات DNS والشهادة لا تُظهر سجلات الوصول في الخادم شيئاً.
من منظور ضمان الجودة
قبل تسجيل العيب، ضع الإخفاق على خطوة: صفحة خطأ المتصفح نفسه (DNS أو الاتصال أو TLS)، أو رمز حالة المستند، أو طلب فرعي فاشل، أو خطأ في وحدة التحكم، أو مشكلة عرض رغم اكتمال التحميل. فهذا القرار وحده يخبر الفريق بمن يجب أن ينظر فيه: المسؤول عن DNS والشهادات، أو مطورو الواجهة الخلفية أو الأمامية، أو خط النشر.
وسجّل العنوان بالضبط، ورمز الحالة وContent-Type للطلب الفاشل، ورسالة وحدة التحكم، والمتصفح وإصداره، وهل كانت الذاكرة المؤقتة معطّلة. ويفيد ملف HAR عندما تتعدد الطلبات المعنية، لكنه قد يحتوي ملفات تعريف الارتباط والرموز المميزة (tokens) وبيانات شخصية (يستبعد Chrome افتراضياً ترويسات ملفات تعريف الارتباط وترويسة Authorization، وقد لا تفعل ذلك متصفحات أخرى)، فاحذف الأسرار قبل إرفاقه. واسأل مبكراً حين يكون السبب خارج الصفحة: «هل تُنشر ملفات الأصول الجديدة قبل HTML الذي يستخدمها؟»
تمرين عملي
ضع ستة أعراض على خطوات تحميل الصفحة
تختبر متجراً إلكترونياً على https://shop.example.com. لكل ملاحظة أدناه، سمِّ خطوة تحميل الصفحة التي يقع فيها الإخفاق، والدليل الذي سترفقه بتقرير الخطأ.
1. على شبكة المكتب فقط، يعرض المتصفح ERR_NAME_NOT_RESOLVED
للاسم shop.example.com.
2. تحذير يملأ الصفحة يقول إن الاتصال ليس خاصاً؛ وقد انتهت صلاحية
الشهادة أمس.
3. تعرض /checkout صفحة خطأ الخادم؛ وصف المستند يحمل 500.
4. تبدو الصفحة سليمة، لكن «أضف إلى السلة» لا يفعل شيئاً. وحدة التحكم:
Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')
5. تظهر أسماء المنتجات العربية بشكل "ال..." في كل صفحات المنتجات.
6. تقفز كتلة السعر إلى الأسفل عند ظهور شريط ترويجي.- قرّر هل وصل المتصفح إلى إرسال طلب HTTP.
- إن وصل، فاختر بين استجابة المستند، وطلب فرعي، وتحليل HTML، وJavaScript، والعرض.
- اكتب الخطوة والدليل لكل ملاحظة.
إظهار الإجابة النموذجية
1. استعلام DNS: لم يصل أي طلب إلى الخادم. الدليل: رمز الخطأ، والشبكة التي كنت عليها، وناتج nslookup shop.example.com (أمر يسأل DNS عن العنوان) على تلك الشبكة وعلى شبكة أخرى.
2. مصافحة TLS. الدليل: صفحة التحذير مع رمز الخطأ فيها (في Chrome: NET::ERR_CERT_DATE_INVALID)، وتواريخ صلاحية الشهادة، وتاريخ الاختبار ووقته.
3. استجابة المستند: وصل الطلب إلى الخادم وأخفق هناك. الدليل: الطريقة والعنوان، ورمز الحالة 500، ومحتوى الاستجابة، والوقت بالضبط ليجد المطور السطر المقابل في السجل.
4. JavaScript: بحث السكربت عن عنصر غير موجود (لم يُضَف إلى DOM بعد، أو تغيّر معرّفه)، فلم يُربط معالج النقر أبداً. الدليل: رسالة وحدة التحكم كاملة مع الملف والسطر.
5. تحليل HTML: بايتات UTF-8 فُكّ ترميزها بمجموعة أحرف خاطئة. الدليل: ترويسة الاستجابة Content-Type (هل تذكر charset=utf-8؟) والوسم <meta charset> في مصدر الصفحة. وإذا كان كلاهما يعلن UTF-8، فالأسماء كانت مشوّهة أصلاً على الخادم، في قاعدة البيانات مثلاً، والعيب يخص الواجهة الخلفية.
6. العرض: يُدرَج الشريط بعد الرسم الأول دون مساحة محجوزة، فيُعاد التخطيط. الدليل: تسجيل للشاشة، واسم المتصفح، وحجم النافذة.
أسئلة شائعة
هل أحتاج إلى معرفة الشبكات لاختبار تطبيقات الويب؟
ليس بعمق. تحتاج إلى ترتيب الخطوات وإلى شكل كل منها حين تخفق، لتحدد موضع المشكلة وتجمع الدليل المناسب. وتتعمق وحدة HTTP في خارطة الطريق في الطلبات والاستجابات والترويسات والتخزين المؤقت.
لماذا تعمل الصفحة عندي ولا تعمل عند زميلي؟
لأن خطوة ما تختلف بينكما: إجابة DNS مختلفة (شبكة المكتب، أو VPN، أو سطر في ملف hosts)، أو نسخة مخزّنة مختلفة، أو ملفات تعريف ارتباط مختلفة، أو متصفح آخر، أو إضافة. قارن تبويبَي Network لديكما؛ فأول صف يختلف نقطة بداية جيدة.
هل الأمر نفسه في كل المتصفحات؟
الترتيب واحد في Chrome وEdge وFirefox وSafari، لأنه يتبع معايير مشتركة: معيارَي HTML وFetch من WHATWG، ومواصفات HTTP وTLS. أما رسائل الخطأ وأسماء أدوات المطوّرين وتفاصيل التوقيت فتختلف. والأهم أن كل محرّك متصفح (Blink في Chrome وEdge، وGecko في Firefox، وWebKit في Safari) يطبّق تلك المعايير بثغراته وأخطائه الخاصة، ولهذا يوجد اختبار التوافق بين المتصفحات.
المراجع
- HTML Living Standardلغة HTML، بما فيها مراجع المحارف المسماة (الكيانات) وقواعد التحليل التي تتبعها المتصفحات.
- Fetch Standardيعرّف CORS: طلبات التحقق المسبق وترويسات Access-Control-* والاستجابات التي يسمح المتصفح للصفحة برؤيتها.
- RFC 9110: HTTP Semanticsمعاني أساليب HTTP وحقول الترويسات ورموز الحالة والتفاوض على المحتوى، بغضّ النظر عن إصدار البروتوكول.
- RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3مصافحة TLS 1.3 وبروتوكول السجلات اللذان يحميان حركة HTTPS.
تدرّب بأدوات متقن
تفكيك عنوان URL إلى البروتوكول والمضيف والمنفذ والمسار ومعاملات الاستعلام والجزء (fragment) وبيانات الاعتماد.
تتبّع سلاسل إعادة التوجيه (301/302/307/308) وعرض كل قفزة وحالتها وعنوان URL النهائي.
افحص ترويسات الطلب التي يرسلها متصفحك أو عميلك، مع شرح لكل منها.
تحليل ترويسات طلبات واستجابات HTTP الخام إلى جدول منظّم مع الشروحات.
التحقق من صحة ترويسات Content-Type والتأكد من أن متن الاستجابة يطابق فعلاً نوع الوسائط المعلن.
ابحث عن أي رمز حالة HTTP لمعرفة معناه ومرجعه في RFC ومتى يُستخدم.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.