دانشگاه شهید بهشتی ترم اول ۹۱-۹۰ |
شبکههای کامپیوتریگروه درسی بر روی گوگل |
استاد :
دکتر احسان ملکیان
کمک درس : عباس نادری |
پروژه دوم : سرور وب
فهرست عناوین
مقدمه
یکی از مهمترین پروتکلهای موجود در شبکه و خصوصا اینترنت که اکثر افراد اینترنت را با آن میشناسند، تور گسترده جهانی یا به عبارت ساده وب است. تیم برنرز لی ، پروفسر کنونی دانشگاه ام آی تی، در سال ۱۹۹۱ وب را عرضه کرد.
در حال حاضر، وب تا حدی پیشرفت کرده و عمومی شده که بسیاری از سازمانها سیستمهای خود را مبتنی بر آن کردهاند. نرمافزارهای دفتری تحت وب (مانند HyperOffice )، فضاهای ذخیرهسازی تحت وب ( مانند Dropbox ) و حتی سیستم عاملهای تحت وب امروزه عمدهترین بازار اینگونه نرمافزارها را به خود اختصاص دادهاند.
ویژگیهای اصلی وب که باعث انتقال سیستمهای قدیمی بر روی آن شده است، میتواند موارد زیر و همچنین دهها دلیل دیگر باشد :
- وب مستقل از بستر است. تنها استانداردهای وب، از جمله HTML, CSS, HTTP, Javascript, XML به گونهای تنظیم و تدوین میشوند که بر روی همه سیستمها، از یک گوشی موبایل گرفته تا یک ابر رایانه یکسان دیده و استفاده شوند.
- وب امن است. نرمافزارهای تحت وب اجازه دسترسی مستقیم به سختافزار سیستم را ندارند و در یک محیط کنترل شده و امن ایجاد شده توسط کاوشگر وب به فعالیت میپردازند.
- توسعه نرمافزار وب راحتتر است. به روز رسانی یک نرمافزار وب به سادگی انجام میشود و احتیاجی به ارسال هزاران دیسک به کاربران نیست.
- نرمافزار بر روی سرور اجرا میشود، لذا طراح آن میتواند مکانیزمهای درآمدزایی و امنیتی کافی به کار بگیرد و همچنین هر سیستمی بدون داشتن امکانات سختافزاری خاصی میتواند از آن بهره بگیرد. همچنین نرمافزار مبتنی بر سکو نیست.
در حال حاضر توسعه نرمافزار برای وب به حدی رشد کرده است که بسیاری از برنامهنویسان ترجیح میدهند برنامههای ساده خود را نیز مبتنی بر وب بنویسند و بر روی یک وب سرور بر روی سیستم خود اجرا کنند. در این پروژه ما قصد داریم یک وب سرور خوب بنویسیم. در حال حاضر وب سرورهای بسیاری در بازار نرمافزار وجود دارند که معروفترین و موفقترین انها پروژه متن باز Apache است که درصدی معادل ۶۳ درصد کل سایتهای دنیا را سرویس میدهد. همچنین وب سرور IIS محصول مایکروسافت، وب سرور Nginx متن باز و وب سرور Lighttpd متن باز نیز از دیگر وب سرورهای قابل توجه هستند.
مفاهیم
قبل از تعریف پروژه لازم است تا مفاهیم مختلفی معرفی شده از یکدیگر تفکیک شوند تا دانشجو با شفافیت بتواند کار را تشخیص داده، به کیفیت انجام دهد. این مفاهیم در این قسمت معرفی میشوند.
Web Server
وب سرور نرمافزاریست که معمولا بر روی پورت ۸۰ TCP به سرویس دهی میپردازد. این نرمافزار با دریافت درخواستهای مشتریها در قالب پروتکل HTTP ، آنها را به محل مناسب ارجا داده و نتایج مورد نظر را به مشتری در قالب HTTP باز میگرداند.
عمده کار یک سرور تشخیص پروتکل HTTP و پردازش درخواست و پاسخ آن است. در حال حاضر چالش اصلی پیش روی وب سرورها در دنیا، امنیت و سرعت است، زیرا سایتهای بسیاری بیش از چند میلیون کاربر را به صورت همزمان سرویس میدهند و تلاشهای بسیاری برای هک کردن انها میشود.
HTTP
HyperText Transfer Protocol یا پروتکل انتقال ابرمتن، پروتکل متنی سادهایست که درخواستها و پاسخهای وب را تشکیل میدهد. این پروتکل از چند دستور متنی ساده به همراه یک بدنه که معمولا در قالب HTML است تشکیل شده است.
پروتکل HTTP ماهیت درخواست پاسخی دارد، بدین معنا که مشتری به سرور متصل میشود، درخواست خود را ارسال میکند، پاسخ مقتضی را میگیرد و از سرور منقطع میشود. لذا صفحاتی که در کاوشگر وب مشاهده میکنیم، یکبار بارگیری شدهاند و اتصال ما به سرور دیگر قطع شده است.
HTML
HyperText Markup Language یا زبان ارائه ابرمتن، یک زبان متنی بسیار ساده برای ارائه صفحات وب است. این زبان از برچسبهایی تشکیل شده است که توسط نرمافزارهای Web Browser قابل تشخیص و نمایش صحیح است.
Web Browser
کاوشگر وب، نرمافزاریست که نقش مشتری وب را دارد. کاربر با وارد کردن یک آدرس اینترنتی URL در کاوشگر وب خود، درخواستی را به یک سرور وب ارسال میکند. سرور نیز با پردازش درخواست، پاسخ مبتنی در پروتکل HTTP را به کاوشگر ارسال مینماید. کاوشگر علاوه بر امکان ارسال و دریافت پاسخ در قالب HTTP ، امکان پردازش دادههای HTML و نمایش آنها بر روی صفحه را دارد.
کاوشگرهای امروزی وب، علاوه بر امکان پردازش HTML امکانات بسیار دیگری نیز دارند. آنها امکان پردازش فایلهای CSS ، تصاویر ، فیلمها ، صوتها و پردازش فایلهای فلش از طریق افزونه را نیز دارا هستند. همچنین آنها به صورت خودکار تمام فایلهایی که در یک سند HTML نام برده شده اند (تصاویر، فیلمها، صوتها و ...) به صورت خودکار از سرور دریافت مینمایند. در واقع به ازای هر آدرسی که ما در کاوشگر خود وارد میکنیم، کاوشگر چندین درخواست به سرور ارسال میکند و تمام فایلهایی که برای نمایش کامل آن صفحه لازم است دریافت کرده، یکجا و پردازش شده به ما نمایش میدهد.
کاوشگرهای معروف امروزی عبارتند از Mozilla Firefox, Google Chrome, Opera, Internet Explorer
Server-side Scripts
اکثر وب سرورها، علاوه بر محتوای ثابت (از جمله فایلهای HTML, تصاویر، صوت و غیره) محتوای پویا نیز ارائه میدهند. برای ارائه محتوای پویا، لازم است تا برنامهای بر روی سرور اجرا شود که محتوا را تولید نماید و وب سرور خروجی برنامه را به مشتری خود بفرستد. لذا اکثر سرورها امکان اجرای برنامههای تحت سرور را دارند.
به عنوان مثال ترکیب Apache و PHP به عنوان وب سرور و زبان برنامهنویسی تحت سرور، ترکیبی بسیار معروف است که سایتهای بسیاری مانند Facebook از آن بهره میگیرند. در اجرای اینگونه برنامهها، وب سرور تنها یک درخواست را دریافت کرده، برنامه متناظر را اجرا کرده، پارامترهای درخواست را به آن تحویل داده و خروجی مقتضی را به مشتری میفرستد، لذا با نصب یک وب سرور ثابت با کد مشخص، تنها با تغییر برنامههای خود میتوانیم صفحات متفاوتی ایجاد نماییم.
HTTP Request
یک درخواست HTTP شامل پارامترهای مختلفیست که مهمترینهای آنها متد درخواست و آدرس آن است. به عنوان مثال هنگامی که آدرس
سرور وب با تفکیک بخشهای مختلف درخواست آنرا به برنامه مورد نظر ارسال میکند و برنامه با توجه به نوع درخواست پاسخ مقتضی را خروجی میدهد. پارامترهایی که در آدرس فوق وجود دارند عبارتند از :
-
HTTP Host:
www.abiusx.com
-
Request URI:
ta/sbunet90a/project/webserver
معمولا اینکه چه برنامهای بر روی سرور اجرا شود بر اساس این پارامتر مشخص میشود که آدرس برنامه را در بر دارد. -
Query Parameters:
parameter1=value2¶meter2=value2
این پارامترها به عنوان ورودی به برنامه ارسال میشوند تا بر اساس آنها خروجی دهد. -
Hash Label:
label
این قسمت مشخص میکند که کدام بخش یک صفحه بزرگ نمایش داده شود.
همانطور که دیدید بخشهای مختلف یک URL معانی مختلفی دارند و وب سرور این تفکیکها را انجام میدهد.
HTTP Response
یک پاسخ HTTP به مانند یک درخواست آن، متشکل از چند خط متن به همراه مقداری داده است. خطوط اولیه که Header هستند، مشخص میکنند که داده چه معنایی دارد و کاوشگر چگونه باید با آن برخورد کند. به عنوان مثال سرآیند Content-type مشخص میکند که یک داده ارسالی توسط سرور تصویر است، متن است، HTML است یا باید برای دانلود به کاربر ارائه شود.
مهمترین اطلاعات موجود در سرآیند پاسخ HTTP ، کد پاسخ است. کد پاسخ مشخص کننده وضعیت پاسخ است. به عنوان مثال کد ۲۰۰ یعنی صفحه یافت شد، پردازش شد و به درستی ارسال شد. کد ۵۰۰ یعنی سرور خطای داخلی دارد. کد ۳۰۱ یعنی صفحه به آدرس دیگری منتقل شده است. لیست کدها و معنی آنها را میتوانید در ویکپدیا بیابید.
وب سرور پس از دریافت درخواست مشتری، پردازش آن و تلاش برای اجرای آن تشخیص میدهد که وضعیت پاسخ چگونه بوده و کد مقتضی، سرآیندهای مورد نیاز و داده خروجی مطلوب را به مشتری ارسال میکند.
تعریف پروژه
در این پروژه یک وب سرور مینویسیم. وب سرور ما در سطح لایه Application شبکه کار میکند و به جزئیات شبکه کاری ندارد. همچنین وب سرور بر روی پورت دلخواه TCP کار میکند که معمولا ۸۰ است. همچنین ترجیح بر آنست که برای سادگی کار با استفاده از کتابخانه استاندارد Socket نوشته شود. این کتابخانه در تمامی زبانهای برنامهنویسی سطح بالا پیادهسازی شده و تقریبا کارکرد یکسانی دارد.
وب سرور ما باید امکانات زیر را داشته باشد :
- ۲۵ نمره پردازش همزمان هر تعداد درخواستی که امکانات سکو اجازه میدهند. سرور باید بتواند درخواستهای HTTP را دریافت کرده، پردازش کرده، پاسخ دهد و اتصال را قطع کند. سرور باید قابل تکیه باشد، بدین معنی که بعد از چندی که درخواستها را پردازش کرد، سیستم را دچار کمبود منابع نکند (تمام منابع استفاده شده را به سیستم پس دهد) و همچنین هنگ و کرش نکند.
- ۲۰ نمره داشتن یک پوشه به عنوان پوشه مبنای سرور، که تمام درخواستهای مشتری در آن جستجو و پاسخ داده شوند. به عنوان مثال اگر پوشه مبنای سرور پوشه /var/www انتخاب شد، درخواست http://localhost/folder1/folder2/file.html باید توسط وب سرور به ارائه فایلی در آدرس /var/www/folder1/folder2/file.html منجر شود.
- ۵ نمره تشخیص مناسب نوع فایل توسط وب سرور و ارائه سرآیند متناظر Content-type
- ۲۵ نمره امکان اجرای اسکریپتهای سمت سرور از نوع CGI با ارسال پارامترهای لازم به آنها
- ۱۰ نمره تشخیص وضعیتهای مختلف در سرور و ارائه کد وضعیت متناظر. همچنین سرور باید برای هر کد وضعیت، یک صفحه پیش فرض HTML مربوطه خروجی دهد.
- ۱۰ نمره تشخیص و پردازش کامل درخواستهای حاوی متدهای GET و POST به همراه پارامترهای آنها
- ۵ نمره نمایش کارکرد و اتفاقات روی داده در سرور (Logging)
و امکانات زیر دارای نمره اضافی هستند :
- ۱۵ نمره تشخیص و پردازش صحیح سرآیندهای مربوط به Caching و ارسال پاسخهای مقتضی
- ۱۰ نمره امکان ارائه فایلها در پروتکل HTTP_RANGE برای ادامه دانلود در زمان آتی ( Resume Download )
- ۱۰ نمره امکان اجرای اسکریپتهای سمت سرور PHP
- ۱۰ نمره امکان اجرای اسکریپتهای سمت سرور Javascript
- ۵ نمره HTTP Basic Authentication
- ۱۰ نمره Unicode Encoding Support
نحوه انجام پروژه
برای انجام پروژه، پس از اینکه برنامه سرور را در زبان مورد علاقه خود نوشتید و اجرا کردید، برای تست آن کافیست کاوشگر وب مورد علاقه خود را باز کنید و در آن آدرس مورد نظر را با هاست localhost وارد نمایید تا بر روی سیستم خودتان تست شود. همچنین در صورتی که سرور را بر روی پورتی به غیر از ۸۰ اجرا کردهاید، میبایست آدرس را http://localhost:port وارد نمایید
برای مشاهده ترافیک رد و بدل شده در شبکه میتوانید از نرمافزار شنودگری که در پروژه دیگر نوشتید استفاده کنید. همچنین اگر از کاوشگر Firefox استفاده میکنید، افزونهای مانند Live HTTP Headers که سرآیندهای پروتکل را نشان میدهد میتواند بینهایت سودمند باشد. توصیه میشود امکان نمایش وضعیت سرور (گزینه آخر ویژگیهای مورد نیاز) را ابتدا پیاده کنید تا بتوانید برنامه را دیباگ کنید.
حتما از سرور خود تست استرس بگیرید، بدین معنی که یک برنامه جانبی بنویسید که تا جایی که میشود اتصال به سرور برقرار کند (احتیاجی به ارسال داده نیست) و تست کنید سرور شما تا چه تعداد اتصال تحت شبکه را پوشش میدهد. این برنامه اجباریست و بخشی از نمره را داراست.
دقت کنید که اگر از Thread استفاده نکنید برنامه شما تنها یک درخواست همزمان را پاسخ میدهد. این مسئله هنگامی که بر روی سیستم خود آنرا تست میکنید مشکلی ایجاد نخواهد کرد زیرا سرعت اتصال شما بالاست ولی در عمل مشکلساز است، لذا برنامه تست استرس را حتما اجرا کنید.
اجازه استفاده از هیچگونه کد آمادهای برای این پروژه را ندارید. میتوانید از راهنماها و آموزشهای اینترنتی و غیره بهره بگیرید ولی هرگونه کپی کردن کد ممنوع است. تمام کد این برنامه باید توسط خود شما نوشته شده باشد.
هنگام مطالعه پروتکل و ویژگیهای آن، نکات را به دقت بررسی کنید. مرزهای شروع و پایان پروتکل، مشکلات احتمالی و غیره بسیار مهم هستند. افراد بسیاری هستند که مشابه این پروژه در دنیا را انجام دادهاند و هرگونه سوالی که به آن بر بخورید به راحتی در اینترنت پاسخ آنرا میتوانید بیابید.
تحویل
این پروژه باید تک نفری انجام پذیرد. راهنمایی و کمک گرفتن از دیگران مجاز است ولی تمام کد تمام برنامه باید توسط خود فرد نوشته شده باشد. در صورتی که اینگونه نباشد احتمال دریافت نمره صفر برای پروژه هست.
توصیه اکید میشود نسخه ابتدایی آنرا قبل از شروع امتحانات پایانی ترم تحویل دهید تا فرصت برای بهبود و اصلاح وجود داشته باشد. تحویل نهایی پروژه باید حداکثر ۱۰ روز پس از امتحان پایان ترم باشد. تحویل دادن پروژه وظیفه دانشجوست و تنها به صورت حضوری امکان پذیر است. در صورتی که تا مدت معین شده پروژه نهایی تحویل نشود نمرهای منظور نخواهد شد. تحویل گرفتن هر پروژه بین ۱۵ تا ۳۰ دقیقه زمان نیاز خواهد داشت لذا برنامهریزی کنید تا در زمان اوج تحویل پروژه زمان داشته باشید.
پیوندهای خارجی
Qt Network Programming HelpQt Network Tutorial
Socket Programming in Java: A tutorial
Learn C# Socket Programming
C# Tutorial - Simple Threaded TCP Server
بازگشت