ارسال چند درخواست HTTP بر روی یک کانکشن TCP توسط هدر Connection: Keep-Alive

اگر برنامه نویس وب باشید به احتمال زیاد تاحالا این هدر رو دیدید، اما شاید ندونید که دقیقا کاربردش چیه و کجا و چطور و چرا ازش استفاده میکنن.
نرم افزارهای کلاینت، مانند مرورگرهای وب، برای دریافت دیتای هر موجودیت (محتوای HTML یک صفحهء وب، محتوای باینری یک تصویر، دستورات یک فایل جاوااسکریپت، CSS و غیره) از سرویس دهندهء وب، ابتدا با استفاده از سوکت یک کانکشن TCP با وب سرور ایجاد میکنن، سپس روی این کانکشن درخواست به فرمت HTTP رو ارسال میکنن و وب سرور هم پاسخ HTTP رو که شامل محتوای درخواست شده میشه به کلاینت ارسال میکنه.
توسط هدر Connection: Keep-Alive که مرورگر در درخواست HTTP به سرور ارسال میکنه، به سرور میگه که بعد از ارسال پاسخ درخواست HTTP جاری کانکشن/سوکت TCP رو خاتمه نده و همچنان باز نگه داره چون مرورگر میخواد یا ممکنه که به زودی درخواستهای HTTP دیگری رو روی همون سوکت ارسال کنه. به این طریق از کانکشن های TCP استفادهء بهینه تری میشه. البته حداکثر تعداد درخواستهای ارسالی روی یک سوکت و همچنین حداکثر فاصلهء ارسال اونا از طرف کلاینت (timeout)، محدودیت داره و بسته به کانفیگ وب سرور است.
بنا به کاربرد و نیازی که شخصی در فروم برنامه نویس داشتن، بنده این قضیه رو عملا تست کردم و نمونه کدی که چگونگی کارکرد و استفاده این مکانیزم رو به نمایش میذاره نوشتم که کدش رو براتون ضمیمه میکنم. دانلود: دانلود
فولدر test را در ریشهء www قرار بدید.
آدرس http://localhost/test/client.php رو در مرورگر وارد کنید.
نتیجه اجرای برنامه دیده میشه.
اگر داخل client.php رو نگاه کنید، ما فقط یک سوکت رو فقط یک بار با fsockopen(“localhost”, 80)‎ باز کردیم، بعد با استفاده از همون سوکت در مجموع 3 درخواست HTTP ارسال کردیم و 3 پاسخ رو دریافت کردیم.
با تست هایی که انجام دادم متوجه شدم شما میتونید یک درخواست HTTP جدید رو هر موقعی ارسال کنید، اما تا وقتی که اجرای اسکریپتی که برای پردازش درخواست قبلی run شده تموم نشه، درخواست جدید در سرور پردازش نمیشه.
بطور مثال بواسطهء خط 28، ما قبل از اینکه آخرین خروجی server.php، یعنی req1: data3 رو دریافت کنیم، با دستور break از حلقهء دریافت خارج شده و درخواست جدیدی رو روی سوکت ارسال میکنیم، اما در مرورگر مشاهده میکنیم که تا وقتی که آخرین خروجی دریافت نشده و اجرای درخواست قبلی تموم نشده، پردازش درخواست جدید پردازش شروع نمیشه.
چند نکته دیگر:
- دقت کنید که در آخرین درخواست از Connection: Close استفاده کردیم که باعث میشه وقتی پردازش آخرین درخواست تموم شد، کانکشن TCP بلافاصله بسته بشه.
- هدر Keep-Alive: timeout=5 که در پاسخهای سرور ارسال میشه داره میگه که timeout سوکت 5 ثانیه است (بسته به کانفیگ ممکنه این مقدار روی سرورهای دیگر متفاوت باشه). یعنی اگر پس از تمام شدن پردازش آخرین درخواست (خاتمهء اسکریپت)، به مدت 5 ثانیه درخواست جدیدی از کلاینت به سرور روی اون سوکت ارسال نشه، سوکت از سمت سرور بسته خواهد شد.
- فکر میکنم تعداد درخواستهای ارسالی روی یک سوکت هم محدودیت داشته باشه (احتمالا اون پارامتر max=99 داره این رو میگه).

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>