مشاهده نسخه کامل
: Socket و HTTP
با سلام به همه ی دوستان.
یک سوال چند وقتی فکرم رو درگیر کرده یعنی دقیقا از بعد از ظهر تا حالا. :n02: .
سوال:
مثلا به مروگر، صفحه ی Google را درخواست می زنیم. مطمئنا یک TCP Connection بین سرور گوگل و ما ایجاد می شود. اونم روی پورت 80 .
این اتصال روی پورت 80 ممکن است توسط 200 میلیون کاربر یکجا ارسال شود. این ارتباط چگونه هندل می شود؟ اگر از سخت افزار سرور ها صرفه نظر کنیم، این همه ارتباط چگونه برنامه نویسی می شود؟ این همه در یک پورت؟ هم دنبال تئوری شبکه ی این مطلب هستم هم برنامه نویسی آن. ذهنم آنجایی درگیر است که ارتباط TCP/IP کاملا پوینت به پوینت با آدرس URI است. پس این همه Connection در یک پورت؟
امیدوارم منظور رو رسونده باشم.
ممنون.
سلام،
خب اول بد نیست بگم همونطور که خودت هم میدونی سایتی مثل گوگل خیلی بیشتر از یک سرور داره که همه 200 میلیون بخوان به اون وصل شند. حالا بزار ببینیم مثلا 1000 نفر چطور به یک پورت وصل میشند. برای شروع يه نگاه به کد زير بنداز
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در اين کد، اول برنامه server يک socket ميسازه (در صورت آزاد بودن پرت مربوطه) که آماده دريافت يک ارتباط TCP از طريق local_port هست.
خط دوم باعث ميشه server به پرت مربوطه گوش کنه و هروقت يک connection request دريافت کرد يک ارتباط با client مربوطه بر قرار کنه. تا وقتی که درخواستی دريافت نشده اجرا برنامه در در همين خط باقی ميمونه. در نتيجه اگه شما بخوای server بتونه 1000 تا client رو در آن واحد ساپرت کنه بايد 1000 تا thread ايجاد کنی که اين تابع رو فراخانی ميکنند. خط سوم هم که همون طور که معلوم هست يه استريم ميسازه برای ارسال data. خوب تا اينجا از نظر برنامه نويسی بود.
از نظر شبکه بايد بگم که نگاه شما به مفهوم پرت اشتباه هست. پرت همين طور که از اسمش پيداست يک درگاه هست که ميتونه تا حدی که نرم افزار و سخت افزار اجازه ميداند بستر connection های مختلف باشه. يک پرت مثل يک در از 65536 دری هست که هر چند packet که باشه ميتونه از اون عبور کنه. حالا اون طرف در کسی باشه که جواب گو باشه يا نه به پرت مربوط نميشه.اين packet ها چطوری از هم متمايز ميشند؟ از طريق sequence number در هدر TCP. يعنی اينکه هر کدوم از اين connection های مختلف از يک sequence number يکتا برای ارتباط استفاده ميکنند به اين معنی که در اول ارتباط يک عدد 32 بيتی به صورت random ايجاد ميشه که client و server از اون برای ارسال data استفاده ميکنند (به صورت sequential)
ويرايش: ارتباط های مختلف توسط 4 مشخصه (server ip, port & client ip, port) از هم متمايز ميشوند. sequence number فقط در حالت خاصی نقش تمايز دهنده رو داره
اميدوارم ذهنت رو يکم آزادتر کرده باشم :)
سلام
شما تحت یک جفت IP,PORT یکسان میتوانید تعداد نامحدودی ارتباط دوطرفه ایزوله شده را برقرار کنید.
حتی در سطح HTTP بد نیست بدانید که روی یک IP,PORT یکسان میتواند تعداد نامحدودی سایت را میزبانی کرد.
از لحاظ شهودی این مانند تماس با تلفن واحد 118 توسط چندین نفر در آن واحد است.
از لحاظ TCP/IP شما در سمت کلاینت یک IP,PORT را میدهید و به سرور متصل میشود، سرور درخواست شما را Accept میکند.
در این لحظه یک کانال دوطرفه منحصر بفرد ایجاد میشود، کانالی که فقط یک درخواست از یک کلاینت با یک ریسمان از سرور در حال تبادل اطلاعات هستند.
سپس طبق پروتکل HTTP کلاینت یک متنی مانند این را به سرور ارسال میکند.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این متن درخواست را سوکت سمت سرور که معمولا برنامه های پایه ای مانند IIS یا Apache هستند دریافت میکنند و پس از یک مسیریابی اولیه برنامه وب سایت مرتبط با این درخواست را پیدا میکنند،
در مثال ما باید برنامه ای باشد که در فهرست IIS یا Apache خود را برای پاسخ به درخواست های HTTP آدرس [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ثبت کرده باشد.
این برنامه میتواند بستر زیر ساخت پایه ASP.Net یا PHP و... باشد که درخواست را تحویل میگیرد.
این برنامه هم طبیعتاً مجدد درخواست را یک مسیر یابی میکند و کد aspx یا php مرتبط با درخواست را پیدا و اجرا میکند.
بعنوان نمونه ازجمله اقدامات دیگر پلتفرم پایه، میتوان به خواندن کوکی (یکی از هدرهای HTTP) و ردیابی کاربر و یافتن شی صحیح Session اوست.
(((
ترجمه شده و مدون شده اطلاعات اولیه این درخواست string که سوکت کلاینت ارسال کرده بوده، همان شی Request را شامل میشود که ما در ASP.Net به آن دسترسی داریم
)))
سپس اینجاست که کدهای برنامه نویسی ما اجرا میشود و در نهایت با کمک بستر زیر ساخت زبان، کل نتایج کد به یک متن صریح string با فرمت HTML تبدیل میشود.
این جوابیه همان مسیر را معکوس طی میکند تا در نهایت توسط IIS و Apache پاسخی این چنین برای کلاین ارسال میشود.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
(((
اطلاعات این پاسخ همان چیزی هستند که ما در برنامه نویسی ASP.Net آن ها را در شی Response تنظیم کرده ایم
)))
و معمولاً هر دو سوکت بسته خواهد شد.
(گاها شاید با تنظیم هدرهای خاصی بین سرور و مرورگر جهت افزایش سرعت سوکت باز شده بسته نشود که فقط در شرایط خاص رخ میدهد و ارتباطی با فهم فرآیند ندارد، در هرحال شما حتماً میتوانید فرض کنید همیشه هر دو سوکت کلاینت و سرور بسته میشود)
خلاصه:
مرورگر
بازکردن سوکت
ارسال درخواست HTTP
مسیر یابی در برنامه IIS و یافتن برنامه مرتبط
مسیر یابی درخواست درون خود برنامه
اجرای برنامه و گرفتن جوابیه HTML برای درخواست
ارسال جوابیه HTML در پوشش HTTP
بستن ارتباط
خوب حالا دقیقاً کجایش ابهام دارد؟!
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.