وبسایت شخصی حسن هاشمی

برنامه نویس. ایران. قم :))

نکاتی در مورد http

پروتکل یعنی قراردادی که طرف های درگیر یک موضوع ازون تبعیت می کنن. با این تعریف حتی فیلم هایی که روی کامپیوتر ما هستن هم با یه پروتکلی ذخیره سازی می شن اما از اونجایی که ما داریم در مورد http صحبت می کنیم هدف ما پروتکل های انتقال اطلاعات هست.

Http قراردادی هست که دوتا برنامه بین خودشون برقرار می کنن تا اینجوری با هم ارتباط بر قرار کنن و به طور کلی یه Resource ی رو رد و بدل کنن.

یعنی یک طرف با یک فرمت خاصی اطلاعات رو میفرسته و طرف دوم که از قبل استاندارد فرمت http رو میدونه میتونه درخواست رو تفسیر کنه و پاسخ مناسب بده.


از اونجایی که http بسیار وابسته به OSI Model هست از بالای مدل OSI شروع به تجز��ه و تحلیل می کنیم، امیدوارم که اطلاعات خوبی به دست بیارید. در این پست البته نمی خوام وارد جزئیات OSI Model بشم و تنها به توضیح بخش هایی که مربوط به http هست بسنده می کنم.

تصویر بالا رو به خاطر بسپارید.

در مدل معروف بالا  Http در بالاترین لایه یعنی Application Layer نشسته و برنامه هایی مثل مرورگر در نتیجه روی اون هستن.

وقتی به عنوان مثال من توی مرگرور تایپ می کنم afgdeveveloper.com/fa مراحل زیر به ترتیب اتفاق می افتن بالاخره درخواست من باید به صورت دنباله از بایت ها روی سیم منتقل بشه به طوری که در طرف دیگه ی ارتباط قابل بازیابی باشه و هدف من از درخواست رو مشخص کنه. 

هر لایه اطلاعات مربوط به خودش رو روی چند بایت اول می نویسه و وظیفه خودش هم هست که در طرف دیگه اون رو تفسیر کنه.

پس اینجوری تصور کنید که وقتی یه آدرس وبی رو مثل afgdeveloper.com درخواست می کنم:

1- پروتکل http که در بالاترین مرحله هست اطلاعات مربوط به خودش رو مثلاً توی چهار بایت اول دیتا می نویسه، مثل url، اطلاعات مرورگر کاربر

تمامی متدهای http مثل post, get و ... به صورت رشته توی هدر نوشته می شن.


تصویر بالا نشون دهنده یک HttpRequest هست. کوکی و اطلاعات کدگذاری و url که در اینجا فقط شامل host هست توی هدر request گذاشته شدن.

2- لایه های session و presentation رو از توضیحاتشون صرف نظر می کنیم به علت اهمیت کمتری.

3- درخواستی که اطلاعات http روش هست میرسه به لایه Transport که در واقع هدفش انتقال غیر فیزیکی اطلاعات هست.

پروتکل tcp در این لایه اطلاعات مربوط به خودش که شامل برقراری اتصال بین کلاینت و سرور هست (connection) و همچنین یه سری بایت های علامت برای اطمینان حاصل از انتقال درست دیتا.

tcp پروتکل بسیار مفصلی هست و برای درک صحیح این پروتکل قویا بهتون توصیه می کنم کتاب tcp/ip illustrated رو مطالعه کنید.

اما در بستر این بحث بیاید بگیم Tcp فقط پورت هدف روی سرور رو تعیین می کنه (البته بعدا با جزئیات بیشتری بحث خواهیم کرد).

4- همونجور که مستحضرید tcp هیچ مسئولیتی در قبال شناسایی ماشینی که قراره ارتباط باهاش قرار باشه نداره، یعنی چیزی که Tcp در این مورد اضافه کرده به request ی که ما در حال تدارک دیدن هستیم، فقط port هست (که 32بیت هم بیشتر نیست).

لایه Network جاییه که پروتکل ایتنرنت نشسته و کاری که میکنه این هست که IP هاست (ماشینی که قرار بهش متصل بشیم) رو به صورت یه هدر دیگه به HttpMessageاضافه می کنه.

پروتکل اینترنت IP هاست رو از طریق مکانیزمی بنام DNS پیدا می کنه که اصولاً تشکیل میشه از یه سری دیتابیس که دامنه ها و IP مربوط به اون دامنه رو نگه داری می کنن. و بعد از اینکه ip رو پیدا کرد به صورت یه هدر دیگه اضافه می کنه.

5- انتقال فیزیکی اطلاعات روی سیم.


از یه دید خیلی ساده خروجی مراحل بالا یه سری بایت هست که اینجوری منظم شده که در اون مربع داخلی نمایانگر خروجی لایه http، مربع میانی نماینگر مرحله Tcp و مربع بزرگ نماینگر لایه IP یا Internet protocol هست.


ساختار یک HttpMessage


اما از توضیحات که بگذریم فکر می کنم بهترین راه برای درک بهتر دیدن یه نمونه کدی هست که موارد بالا رو انجام میده، این تکه کد رو که من به صورت هارد کد شده نوشتم با توضیحاتش ببینید:


string url = "http://afgdeveloper.com/Something.aspx";

// پورت پیش فرض 80 هست
int port = 80;

Uri uri = new Uri(url);

//path = Something.aspx
// که بخش دوم آدرس که بهش 
// path
// گفته میشه
string path = uri.PathAndQuery;

// Get the ip address of host using the host portion 
// of Get the host portion of the url which is "afgdeveloper.com"
IPHostEntry hostEntry =  Dns.GetHostEntry(uri.Host);

// همونطور که گفتیم سوکت ما از پروتکل
// tcp
// استفاده می کنه
Socket tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

// اتصال به سرور
tcpSocket.Connect(new IPEndPoint(hostEntry.AddressList.First(), port));

// حالا باید 
// HttpMessage
// رو بسازیم
// اول از همه هدرها
string httpMessage = String.Format("GET {0} HTTP/1.1 \r \n HOST: {1} \r \n", path);

// ارسال درخواست
tcpSocket.Send(Encoding.UTF8.GetBytes(httpMessage));

در مورد کد بالا اضافه کنم که:

1- حتما به این عکس اینجا یه نگاهی بندازید تا قسمت های مختلف uri رو بیشتر متوجه بشید.

2- هدر GET که من اضافه کردم رو از این لینک برداشتم که مستندات http هست، میتونید بقیه مثال های این مورد رو هم اونجا ملاحظه کنید.

پروسه دریافت

درخواست از طریق شبکه جهانی اینترنت مسیرش رو به سمت ماشینی که ip اون در قسمت ip درخواست هست پیدا می کنه. حالا زمان باز کردن پیچ و مهره جعبه ای هست که بستیم موقع ارسال.

وقتی درخواست http به ماشین رسید برنامه خاصی که روی سرور و روی پورت 80 نصب شده هست (غالباً iis و apache) در خواست http رو می گیره و با توجه به اطلاعات مربوط به http که همون url و ... میشن به درخواست پاسخ میده.

در این میان فریمورک های توسعه وب اطلاعاتی که به صورت هدر در هر packet وجود داره رو استخراج می کنن و در قالب ساختارهای مختلف نشون میدن، مثلا در asp.net اطلاعات مربوط به هدرهای درخواست در کلاس HttpRequest.Current که یه نمونه Singleton هست مقداردهی میشن.

 که یعنی روی همون سوکتی که کلاینت بازکرده دوباره پاسخ رو می نویسه.

Loading