محمد لینوکس

همه چیز به غیر از لینوکس!

محمد لینوکس

همه چیز به غیر از لینوکس!

قسمت 5 از سریال آبکی لینوکس بیاموز

-----------------------------------------------------------------------
در بخوش (بخش‌های) قبول (قبلی) دیدیم که لینوکس عجب چیزیه بابا
امروز در مورد شبکه، شبکه در لینوکس، مدیریت شبکه و کلیات سیستم عاملیش صحبت می‌کنیم.


قبل از اینکه شروع کنیم، کتابی هست به نام

Linux Network Administration Guide

برای کسانیه که می‌خوان Network رو به صورت کاربردی در لینوکس استفاده کنن، مثل DHCP، DNS، MAIL و ...

امروز زیاد سر این مسائل صحبت نمیشه، تنها در مورد مدیریت شبکه توضیح داده می‌شه، تا در مورد خود شبکه و کاربردش.
----------------------------------------------------------------------

شبکه چیست؟
ساده‌ترین تعریف شبکه، میشه ارسال اطلاعات بین کامپیوتر‌ها. کل کار شبکه اینه که یک سری بیت از کامپیوتر‌شما داخل سیم یا از طریق هوا برای یک کامپیوتر

دیگه ارسال کنه. تمامی علم شبکه که تو این چند سال تولید شده‏، صرفا برای مدیریت این داده‌های ارسالیه.

داده‌ها چیستند؟
امروزه داده‌هایی که ما از طریق شبکه ارسال می‌کنیم، با تعریف اولیش خیلی فرق داره. در ابتدا تفکر این بود که از شبکه قراره استفاده بشه که فایلهای کاربران و

داده‌هاشون رو منتقل کنه.
امروزه داده‌هایی که در شبکه منتقل می‌شن، فایلهای کاربران، تصویر، صوت، RPC، PPS و IM هست.

فایلهای‌کاربران: فایلهای کاربران شامل تمامی داده‌های Pack شده می‌باشد که به نام فایل شناخته می‌شوند. این داده می‌تونند دارای هر نوع کاراکتری باشند،

یکی از وظایف شبکه اینه که در لایه Presentation این داده‌ها رو آماده کنه تا از طریق راه ارتباطی یا Network Media منتقل شن.

تصویر: ای بابا. خوب تصویرم یه فایله دیگه. خیر. شاید این برای شما سوال باشه، که چرا می‌گن VOIP یعنی Voice Over IP یا صدا بر روی ‍IP. خوب تا حالا هم تو

Yahoo Messenger صدا رو منتقل می‌کردیم دلشون خوشه ها. ولی اینجا می‌گیم که تصویر با فایل تصویری فرق داره. در انتقال فایل تصویری مسئله مهم، رسیدن

صحیح فایل به طرف مقابل مثل یک فایل داده که محتوی خاصی نداره. اما در انتقال تصویر مسائل مهمی مثل عدم قطع تصویر، تغییر کیفیت، مسئله Load Over

Server، مسئله Video Proxy و خیلی مسائل دیگه مطرح میشه، که بحران رو در عدم پخش RealTime تصویر عنوان می‌کنه.

صدا: همینطور در صدا، مانند تصویر، مشکل فرستادن صدا نیست، مسئله تغییر BitRate صدا برای Stream کردن اون توی شبکس و مسئله رسیدن به موقع صدا به

طرف مقابل. مسئله محاسبه زمان بین شما و طرف مقابل و در اصل استفاده از الگوریتم Latency به منظور حساب کردن تاخیر در صدا و رفع این خطا با

الگوریتم‌های مشخص انتقال صدا یا VoIP رو تشکیل می‌دن.

PPS: یه زمانی هست شما روی سیستمتون، 2 یا چند CPU دارید. همسان سازی یا Synchronization که در بخش قبلی گفته شد، بین‌اونها از طریق Interruptها

صورت می‌گیره اما فرض کنید شما 4 تا کامپیوتر قدیمی دارید و می‌خواهید از اینها به صورت Parallel یا موازی استفاده کنید. همسان سازی پردازش موازی یا Parallel

Processing Synchronization(PPS( بین اونها از طریق شبکه‌های پر سرعت صورت می‌گیره.

RPC: یه زمانی بود هرکس برنامه‌ای می‌نوشت و در این برنامه برای خودش تعدادی تابع کاربردی فراهم می‌کرد که مرگ این توابع با Binary شدن برنامه بود و

شخص دیگه‌ای نمی‌تونست از این توابع استفاده کنه. بعد از اون کتابخانه‌ها اومدن، که به برنامه‌ها Link میشد، بعد از اون DLLها اومدن که به برنامه‌های درحال

اجرا Link می‌شد و در نسل جدید این DLLها، این Linkکردن ها می‌تونه از خارج کامپیوتر شما صورت بگیره. برای مثال شما یه برنامه نوشتید که از یک الگوریتم

محاسباتی خیلی پیچیده استفاده می‌کنه. شما به جای اینکه این الگوریتم رو خودتون پیاده سازی کنید، به عنوان یک سرویس از من قرض می‌گیرید. حالا زمانی که

من یه راه جدید تر برای الگوریتم پیاده کردم، میام و برنامه خودم رو روی کامپیوتر خودم تغییر می‌دم. این تغییر باعث افزایش سرعت برنامه‌شما هم می‌شه. حالا اینو

گسترش بدید تو اینترنت که یه شبکه درهم بسیار پیچیده از سرویس‌ها وجود داره که همه دارن استفاده می‌کنن. علم مربوط به این مسئله در SOA یا Service

Oriented Architecture بیان شده. پس یکی دیگه از استفاده‌های شبکه RPC یا Remote Procedure Call یا صدا زدن تابع از راه دور.

IM: این نوع از ارتباط شبکه‌ای، یک ارتباط همیشگی On-Demand است. یعنی اینکه قرار نیست داده‌ای‌ ارسال شه برای طرف مقابل و ارتباط قطع شه. این ارتباط

همیشگیه و در هر زمان بسته به درخواست کاربر یا Demand یه بسته کوچک اطلاعات که می‌تونه شامل متن و داده‌های کنترلی باشه برای طرف مقابل ارسال

می‌شه. روی بعضی از گوشی‌های موبایل مخصوصا Nokia سرویسی هست به نام Push To Talk!. حتما تا حالا باهاش برخورد کردید. این یک سرویس IM روی

شبکه GSM مخابراتیه. شما به یک نفر تماس می‌گیرید، و به جای اینکه قطع کنید، می‌رید رو سرویس Push To Talk. اونوقت مثل بیسیم، زمانی که شما دکمه

مربوط به Push To Talk رو فشار بدید، ارتباط در کمتر از 300ms یعنی 1/3 ثانبه بر قرار می‌شه و طرف مقابل شما، از این موضوع با یه Alarm مطلع میشه و به

صدای شما گوش می‌ده. هزینه‌ای که شما پرداخت می‌کنید فقط هزینه‌زمان‌هایی که دکمه Push To Talk رو نگه داشتید. این برای خیلی از جاها که ارتباطات

سریع و کوتاه دارن مثل خطوط تولید خیلی مفیده در مقابل تلفن زدن که حداقل 10 ثانیه Head داره. در کشور ما هم قول دادن در برنامه 4 ساله 18ام یعنی 72

سال دیگه این سرویس رو راه بندازن :P

----------------------------------------------------------------------
خوب پس این از شبکه، حالا ببینیم لینوکس با این موضوع چطور برخورد می‌کنه.

قبل از شروع، یه سری تعریفات هست که باید بدونیم:

Host: یه زمان بود، که فقط Computerها به شبکه وصل می‌شدن، مثل بالا که من از کلمه کامپیوتر استفاده کردم. امروزه یخچال‌ها، ماکروفر‌ها و کمد‌های شبکه‌ای

هم داریم. برای همین به هر Object که به شبکه وصل شه و توانایی ارسال و دریافت اطلاعات رو داشته باشه و بر روی Protocolهای مشخص اون شبکه فعالیت

کنه یه Host گفته می‌شه.

IP: هاست شما باید شناسه داشته باشه. باید با بقیه فرق داشته باشه. باید اسم داشته باشه. ‍اسم Host شما در شبکه IP شماست (اینجا قرار نیست در

مورد کلاسهاش و تعداد بایت‌هاش صحبت بشه. کتاب Network For Beginners، Network ، CCNA Volume 1، Network For Dummies رو مطالعه کنید)

NIC: شما برای ارتباط با شبکه، نیاز به یک Media، مثل کابل، فیبر نوری و موج‌های مغناطیسی دارید و برای ارسال اطلاعات بر روی این Mediaها نیاز به یک وسیله

سخت افزاری به نام کارت شبکه یا NIC دارید. کارت شبکه‌ها نوع‌های مختلف دارند و شرکت‌های تولید کننده مختلف. برای هر‌کدوم یک روش ارتباطی وجود داره که

این ارتباط در یک ماژول یه نام درایور کارت شبکه در اختیار سیستم عامل قرار می‌گیره.

MAC: هر کارت شبکه که تولید می‌شه باید شناسه داشته باشه. این شناسه باید واحد یا Unique باشه. از این شناسه برای ارتباطات شبکه ای هم استفاده

می‌شه.

Host Name: اسم در شبکه معنی نداره. اما Protocolهایی مثل NetBios و WINS در Microsoft Windows با اسم شما خیلی سر و کار دارن. اما به طور کلی اسم

یک HOST زیاد بحث شبکه‌ای نیست.

Socket: هر Host می‌تونه تنها یک خط از داده‌ها رو روی Media خودش منتقل کنه، اما سیستم‌عامل با اشتراک این خط بین چندین برنامه به اونها اجازه کار همزمان

و استفاده همزمان از شبکه رو میده. مثل زمانی که شما چت می‌کنید و فایل Download می‌کنید. از اداره برق برای شما یک کابل کشیده شده، اما شما در

خونتون سوکت Socket هایی رو در دیوار کار گذاشتید که اجازه کار همزمان یخچال و تلویزون رو فراهم کردید. اگر یخچال آمپر زیادی بکشه، تلوزیون نمی‌تونه کار کنه.

تنها فرق شبکه با برق اینه‌که در سوکت‌های برق مدیریتی اعمال نمی‌شه، چون این سوکت با اون سوکت تفاوتی نداره، اما در Hostها اطلاعات اضافی مربوط به

این که هر Socket برای چه برنامه‌ای باید ذخیره سازی شه و مدیریتی روی اون اعمال شه.

Packet: داده‌های منتقل شده در شبکه رشته‌ای از بیت‌ها هستند. برای کارت‌های شبکه، داده‌ها بیت‌ها هستند. اما برای سیستم‌های عامل و منابع مدیریتی

شبکه، به دلیل وجود Policyها و سیاست‌های خاص در انتقال اطلاعات، به دلیل چند کاربره بودن شبکه، درخواست‌ها باید منظم و بسته بندی شده باشند. فرض

کنید در یک اداره من برم و یه کاغذ بدم به کارمند اول (البته فرض کنید، مگه کارمندا تو ادارات کار می‌کنن آخه) و بگم اینو انجام بده رد کن بره به بعدی. درجا می‌گه

نه، میگه لطفا اینو بذار تو یه پرونده که در موقع انتقال بدونیم برای تو و برای برگشتش به تو بتونیم شناساییش کنیم. بتونیم تمامی اطلاعات مورد نیازمون رو از اون

دریافت کنیم و خیالمون راحت باشه که اطلاعات کامل (چون در مورد کاغذ‌های جدا، ممکن شما یکی از اسناد رو بدید و سند دوم رو ندید). پس دیدید این مسئله

مربوط به شبکه نیست، برای مثال در ارتباط Serial چیزی به نام Packet نداریم . بلکه داده‌ها ارسال می‌شن تا زمانی که تموم بشن و به همین منظور چیزی به نام

استفاده چند نفره از یک کابل سریال وجود نداره. در مقابل اون در USB ما بسته‌های اطلاعاتی داریم، به دلیل اینکه به هر USB HUB میتونه به طور همزمان 127

دستگاه وصل شه، و اینجا نظم باید وجود داشته باشه.

----------------------------------------------------------------------
خوب بریم سراغ لینوکس، ببینیم با اینها چیکار می‌کنه.

لینوکس و کارت شبکه
----------------------------------------------------------------------
در لینوکس بسیاری از کارت‌های شبکه General که امروزه در Hostهای شما نصب شده به طور صحیح شناسایی می‌شن. کارت‌های شبکه‌ای که در لینوکس شما

شناسایی نشه، یا کارت General نیست و یا اینکه مدل بسیار جدیدیه که هنوز در Kernel لینوکس شما وجود نداره و اگر لینوکس شما بسیار به روزه، هنوز برای

درایور نوشته نشده. چند سال پیش کسی لینوکس رو حساب نمی‌کرد، یعنی تولید کننده‌های NIC برای لینوکس درایور نمی‌نوشتن و تنها برای ویندوز می‌نوشتن و

برای همین Reverse Engineering اون بسیار طول می‌کشید و درایور های تولید شده کیفیت مناسبی نداشتند. اما امروزه، Intel، Marvel، Cisco و LinkSys و

بسیاری از تولید کنندگان بزرگ دیگه درایور‌های لینوکس را خودشون فراهم می‌کنن.

درایور در اصل یک Kernel Module که باید یک رابط خاص به نام رابط net_device رو پیاده سازی کنه. در پیاده سازی این رابط، یه درایور باید این اطلاعات رو برای کرنل

لینوکس مشخص کنه. قبل از اینکه بگم این اطلاعات چیه، بذارید یه کم در مورد لایه صحبت کنیم. که در بخش‌های قبلی هم خیلی صحبت شد.

ببینید، دقیقا مثل FileSystem که در بخش قبلی دیدید، شبکه‌هم لایه های مختلفی دارید (لطفا این رو با لایه‌های TCP/IP اشتباه نگیرید). لینوکس می‌تونست به

این صورت باشه، که داده‌های رو بگیره، بسته بندی کنه، نوع شبکه رو مشخص کنه و داده ها رو بریزه رو Media. اما در لینوکس، به این صورت:

- من نرم افزارم - شبکه برام مهم نیست - من داده دارم - این داده‌ها باید بره اینجا - اینهارو از من تحویل بگیر فایل Socket
- من فایل Socket هستم - شبکه برام مهم نیست - من یک فایلم - فابلیت نوشتن و خوندن دارم - داده‌هایی تحویل من شده و من اینها رو به شبکه لینوکس تحویل

می‌دم
- من شبکه لینوکسم - شبکه برای من مهم نیست - برای من داده‌ها مهم  هستند که کجا می‌خوان برن - اونها را بسته بندی می‌کنم و تحویل درایور شبکه

می‌دم
- من درایور شبکه هستم - من شبکه رو می‌شناسم!!!!! - داده‌ها برای من مهم نیست!!!! - من داده‌هایی رو گرفتم با فرمت مشخص در بسته بندی مشخص !!!  

تحویل کارت شبکه می‌دم
- من کارت شبکه هستم - شبکه ماله منه !!! - من داده نمی‌شناسم !!! - من بسته نمی‌شناسم !!! - من بیت‌هایی رو تحویل گرفتم و با استفاده از مدارات فیزیکی

اونها رو روی Media شبکه قرار می‌دم.

این لایه بندی‌ها در لینوکس که بسیار بیشتر و پیچیده تر از اینه باعث میشه که شما در هر بخشی که خواستید وارد شید و اون لایه رو برای خودتون شخصی

سازی کنید و در نهایت چیزی که کاربر می‌بینه، یک سیستم مدیریتی بسیار قوی، بدون خطا، بدون زمان‌های تلف شده زیاد در لینوکسه.

خوب برگردیم به بحث خودمون،
اولین داده اسم شماست. برای سیستم‌عامل اسم کارت شبکه خیلی مهمه. چون هر Host می‌تونه به تعداد نا محدود کارت شبکه داشته باشه و برای شناسایی

اینها در لایه Application باید یک شناسه وجود داشته باشه.

داده‌های دیگر، شامل، Routineهای مربوط به باز کردن و بستن کارت شبکه می‌باشد. درایور شبکه شما باید قابلیت فعال سازی و غیر فعال شدن داشته باشد.

داده‌های دیگر IOCTL و stat. اینها بازهم دو تابع یا Routine هستند. اولی یا IOCTL در تمامی درایورها وجود داره. چه ویندوز، چه لینوکس. سیستم عامل و

Applicationها برای ارتباط با درایور‌ها از IOCTL استفاده می‌کنند. یک سری کد برای درایور ارسال می‌کنند و در نتیجه درایور برای اونها، جوابی رو ارسال می‌کنه. این

کدها همگی عملیاتی نیستند، کد‌هایی وجود دارد برای دریافت وضعیت سیستم که در شبکه یک Routine خاص به نام Stat برای دریافت اطلاعات وضعیتی وجود

داره.
برای مثال درایور CDROM یه IOCTL داره به نام IOCTL_CDROM_EJECT که باعث میشه در CDROM شما باز بشه.

داده‌های بعدی، Featureها یا قابلیتها و Flagهاست. قابلیت‌ها به این صورت نیست که هر کارت شبکه برای خودش یک سری قابلیت جدید ایجاد کنه، بلکه در

لینوکس لیستی بزرگی از قابلیتها وجود داره که لینوکس قادره اونها رو استفاده کنه. برای مثال در لینوکس این قابلیت پیش بینی شده که کارت شبکه برای لحظه

ای در حالت کم قدرت کار کنه. حالا اگر کارت شبکه ای این قابلیت رو می‌تونه پیاده سازی کنه باید به لینوکس اطلاع بده. برای مثال کارت‌های شبکه Wireless این

قابلیت رو برای خودشون به صورت سخت افزاری پیاده کردن و زمانی که درایورشون در حال نصب شدن، این موضوع رو به لینوکس می‌گن:

- من می‌تونم، تو بخوا

زمانی که درایور نصب می‌شه این قابلیت در این بخشی از درایور ذخیره می‌شه و در زمان‌های خاص و توسط سیاست‌های تعریف شده در لینوکس از اونها استفاده

می‌شه، برای همین زمانی که Laptop شما به برق وصل نیست و روی باطری کار می‌کنه، اگر شبکه لینوس (که تو لایه‌ها بود) تشخیص بده یک کارت شبکه IDLE

یا بیکار و در ضمن گفته (من می‌تونم تو بخوا) از اون کارت شبکه می‌خواد (یک IOCTL) که در حالت کم قدرت کار کنه.

Flagها مثل Jumperها هستند. مثل Featureها که درایور می‌گفت من دارم تو بخوا، Flagها تنظیماتی هستند که لینوکس گفته

من دارم، تو کدوم‌ها رو می‌خوای

برای همین شما در نوشتن درایور، تعدادی از این Flagها رو می‌تونید انتخاب کنید، مثلا مشخص کنید، کارت شبکه من ARPنداره. از من ARP نخوا.

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

شما این حافظه رو از کجا میارید. بعضی از کارتهای شبکه بخشی به نام Buffer دارن که داده‌های رسیده در اون ذخیره میشه تا شما بگیرید. اگه بافر کارت شبکه

پر بشه، کارت شبکه به صورت فیزیکی به بقیه کارتهای شبکه اعلام می‌کنه که داده ارسال نکنن یا اگه داده‌ای بیاد اون رو Reject می‌کنه. بنابر این اگر NIC دارید

که Buffer داره، از اون استفاده کنید، اگر نداره، باید حافظه‌ای بسازید، و داده‌ها رو خودتون نگه دارید. در هر 2 صورت سیستم عامل دخالتی در کار شما نمی‌کنه. از

شما یه حافظه می‌خواد.

بعد از فراهم کردن این اطلاعات باید این اطلاعات در Stack شبکه لینوکس ثبت شن. اگر این ثبت انجام به درستی صورت بگیره، زمانی که شما دستوری مثل

ifconfig رو اجرا می‌کنید (همون Ipconfig در Windows) به صورت زیر نمایش داده می‌شه:

mni0 ETHERNET ... mac 00:00:00:00:00:00 ...

Mni رو من فرض کردم که شما به عنوان اسم دادید، My Network Interface.

حالا اگر کسی به لینوکس بگه

ifconfig mni0 192.168.0.1

لینوکس می‌گه به من چه!!!! - توسط یک IOCTL به اون Routine که شما مشخص کردید، میگه کاربر از من خواسته که برای شما IP قرار بدم. این اطلاعات رو به

من داده، من نمی‌دونم چی می‌گه ببین به درد تو می‌خوره

همینطور زمانی که کاربر دوباره ipconfig میگیره،
لینوکس می‌گه، کاربر از من اطلاعات می‌خواد در باره تو. من که نمی‌دونم چی بگم، با استفاده از تابع Stat شما یا IOCTLهای وضعیتی از شما اطلاعات لازم رو

می‌گیره و در اختیار کاربر قرار می‌ده.

در سناریو بالا یه مثالی از لایه بندی در لینوکسه.

----------------------------------------------------------------------
لینوکس و Socket
----------------------------------------------------------------------
خوب، حالا این از اون ور لینوکس، یعنی طرفی که داده‌هارو میده به کارت شبکه و درایورش. لینوکس باید این طرف رو هم پیاده سازی کنه، یعنی دریافت داده‌ها از

کاربران  وApplicationها .

- همه چیز در لینوکس فایل است

Socketها فایل هستند. شما ابتدا یک Socket باز می‌کنید.
موقع باز کردن Socketها شما Protocol انتقال و ارتباط رو مشخص می‌کنید. همونطور که گفتیم، بسته بندی توسط لایه شبکه لینوکس صورت می‌گیره و ربطی به

کارت شبکه نداره. برای همین لینوکس دیگه نمی‌تونه، به کارت شبکه بگه به من چه، بیا ببین این چی می‌گه :P. باید خودش جواب بده.

int fd = socket (AF_INET, SOCK_STREAM, 0);

این یک سوکت با انتقال IP و ارتباط TCP می‌سازه. اگه fd رو بخواهید باهاش کار کنید، دقیقا مثل فایلها:
write
read
close
ioctl
می تونید بهش بزنید:

write(fd,"mydata",6);//write 6 bytes to fd

زمانی که شما یک Socket باز می‌کنید مستقیما نمی‌تونید روش بنویسید، بلکه اول باید بقیه مسیر رو هم مشخص کنید.

یعنی باید بگید این سوکت چیه ؟‌ میزبانه (Listen) یا مهمان (Connect).

Listen: در این حالت شما آماده دریافت یک Connection از شبکه هستید، یعنی منتظر می‌شید تا یه نفر بیاد به شما بگه سلام، تا شما بگی علیک سلام، چطوری؟
Connect: در این حالت شما می‌خواهید به یه نفر که Listen می‌کنه در یک Host دیگه متصل شید.

نمونه:
Host www.yahoo.com
Listen On TCP Port 80

Host YOUR_HOME_COMPUTER
Connect to www.yahoo.com Port 80

یعنی yahoo رو Port شماره 80 داره گوش می‌ده - Port رابط خروجی Socketهاست. یعنی زمانی که شما یک Socket باز می‌کنید  و داده‌هارو از Host خودتون

می‌فرستید بیرون، اگه یادتون باشه گفتیم باید این پرونده که می‌دید به کارمند اول، اسمتون رو روش بنویسید که وقتی برگشت صداتون بزنه. شماره Port هم

همینه وقتی شما Socket باز می‌کنید دادتون میخواد بره بیرون، باید یه شماره به شما بده، که بهش می‌گن Port. وقتی بسته رفت و برگشت کارش انجام شد،

لینوکس می‌گه به به Port مثلا 32477. یه نگاه تو دفترچش می‌کنه می بینه مال Socket شماره 300e مثلا که این Socketهم ماله برنامه FireFoxe. سریعا Firefox

رو از خواب دریافت اطلاعات (در بخش قبلی در مورد SUSPENDها صحبت شد) بلند می‌کنه می‌گه بلند شه اطلاعات اومده رو Porti که مربوط به Socket شماست.

البته یادتون باشه، که Connect و Listen مربوط میشه به TCP که از سلام و علیک سلام پشتیبانی می‌کنه. اما پروتکل آب دوغ خیاری مثل UDP که یهو یکی شروع

می‌کنه به ارسال اطلاعات روی یک Port دارای Connect و Listen نیست.
برای همین شما در پروتکلی مثل UDP فقط باید Socket خودتون رو BIND کنید یا بچسبونید به یه UDP Port. بعدم دیگه، باید وایسید که یه چیزی بیاد، سلام علیک

و Connect دیگه نداره، یهو یه سری داده میاد باید دریافت کنید.

----------------------------------------------------------------------
لینوکس و Protocolها
----------------------------------------------------------------------
پروتکل ‌ها دو دسته هستند، پروتکل‌هایی که زن و بچه شبکن، مثل IP، TCP و ... . این پروتکل ها در بخش شبکه لینوکس تعبیه شده و توسط خودش کنترل

می‌شن. پروتکل‌هایی دیگه‌ای هستند که دایی و خاله شبکن مثل، Name Resolve، ARP و ... . اینها توسط Moduleهایی برای لینوکس مشخص می‌شن و توسط

همون ماژول‌ها کنترل می شن. دسته سوم پروتکل‌ها دسته‌ای هستند که پروتکل‌های نرم‌افزارین و می‌شن شوهر عمه زن دائی پسر خاله نامادری شبکه. این

پروتکل‌ها Application Level هستنند و روی خاله و دایی و زن و بچه شبکه کار می کنن. خداییش جایی اینجوری در مورد شبکه صحبت می‌کنن.

اینجا سوال پیش میاد، که تو گفتی 2 دسته هستند، اینا که شد 3 دسته. دلیلش اینه که 1- حال ندارم برم دو رو بکنم سه 2-دوست نداری نخون، من دوست دارم

سه رو بگم دو.
یه دلیل فرعی هم داره، اینه که دسته اول اگه نباشن، شبکه کار نمی‌کنه، ولی دسته دوم اگه نباشن، شبکه فعالیت داره ولی مدیریت اون ممکنه ممکنه ممکنه با

مشکل مواجه بشه.ژ

پروتکل‌های دسته سوم،
DNS
DHCP
Mail
Http
FTP
Goopher
Finger
Stream Media
و ... هستند.

----------------------------------------------------------------------
شبکه لینوکس
----------------------------------------------------------------------
خوب طرف چپ و راست رو گفتیم.

می مونه وسط.

یعنی خود شبکه لینوکس، که سخت ترین و پیچیده ترین بخش شبکه در لینوکسه.

در این بخش این مسائل وجود داره:
چند کارت شبکگی،
چند پردازشگری،
چند پردازه‌ای،
کنترل حافظه،
Session Tracking،
Packet Tracking،
Process Tracking،
Load Control،
Module Control،
و ...

چند کارت شبگی: زمانی که چند کارت شبکه وجود داره، مثل چند تا خیابون، پلیس می‌خواد، چراغ راهنمایی می‌خواد و از اون بدتر، زمانی که یه بسته میاد باید

توسط ProtocOl های Routing مشخص شه این قراره رو کدوم کارت شبکه بره. در این بخش این سوال پیش میاد که کجا بره؟ اصلا بره یا نره ؟ بحث Packet

Filtering یا Firewall . شاید اصلا Packet مربوط به Host ما نیست. فقط اومده تو تا بره تو یه کارت شبکه دیگه، یعنی Forward کردن، یا bridging یا NAT.
اصلا این بسته کامل ؟ یعنی داده‌های لازم رو داره؟ با برش گردونم. اگر قراره برش گردونم به کی بدم ؟

چند پردازشگری: این خودش 280 صفحه مقاله می‌شه فقط بدونید در کد‌های کرنلی بخش‌هایی هستند به نام Critical Section که هرگز وسط یکیشون یکی دیگه

نباید اجرا بشه. برا همین پیدا کردن و مشخص کردن این بخش‌ها بسیار مهم.

چند پردازه‌ای: زمانی که چند تا پردازه وجود داره، دریافت Packetها از اینها و قرار دادن در جاهای مشخص و Tag کردن اونها با اون Process خیلی مهم. باید کنترل

اونها به طور کامل در دست باشه.

کنترل حافظه: بخش شبکه لینوکس همیشه به عنوان یک Media سریع که داده‌های زیادی رو اینور اونور می‌کنه باید حواسش به حافظه باشه. یعنی اینجوری

نباشه که یه بسته بیاد و طرف مقابلش آماده دریافت نباشه و این بخش بسته رو نگه داره و بگه Process غصه نخور، من نگهش می‌دارم تا طرف مقابل بگیره. این

باعث Load بالای حافظه می‌شه و در اینجا بسته باید سریعا به صاحبش برگردونده بشه و گفته بشه:

نبود

Unable to connect
Firefox can't establish a connection to the server at 128.9.9.0.

دیدید لینوکس به FireFox گفت: نیست، نگرد. این هم کمک به FireFox و کاربر می‌کنه که تصمیم جدید بگیرند و هم کمک به خود شبکه لینوکس می‌کنه که این

بسته در حافظه نمونه.

Session Tracking: تو یه سرور شلوغ میلیون‌ها Packet در ثانیه میرن و میان، باید اینها سریعا شناسایی بشه که مربوط به کدوم Socket یا Port هستند و سریعا

تحویل داده بشن. بنباید بسته ای گم بشه. در شبکه گم شدن بسته یعنی مرگ کامل Protocol. هیچ بسته‌ای نباید گم بشه، ببینید، نرسیدن بسته به دلیل

شلوغی یه مسئله دیگس ولی اینطوری نباید باشه که لینوکس یه بسته رو بگیره و ندونه باهاش چیکار کنه.

Process Tracking: فرض کنید، الان یک بسته اومد از port شماره 200 که مربوط به Socket شماره فلان و Process شماره فلان. فرض کنید این Process از بین رفته

با Dead شده یا Zombie شده. حالا مسئلس که این بسته باید چیکار بشه. Port باید بسته شه. به طرف مقابل باید گفته شه دیگه نفرست (TCP) و ...

Load Control: اگر استفاده از شبکه خیلی بالا رفت، بالا تر از حدی که شبکه لینوکس نتونه کنترل کنه باید از هر 2 طرف سرعت رو بیاره پایین، طرف داخل میشه

Suspend کردن Processها و طرف خارج میشه زبون خوش ICMP برای پایین آوردن سرعت و یا زبون ناخوش Reject کردن Packet.

Module Control: ماژول‌های شبکه همیشه باید Live باشن و نگهداری از اونها دست بخش شبکه لینوکسه، نباید یه ماژول سرش انقد شلوغ که گیر کنه یا تو

Loopهای بی مصرف بیافته، برای همین، شبکه‌ی لینوکس از ماژول‌های شبکه استفاده‌های سرویسی می‌کنه. یه کاری مشخص ازشون می‌خواد و خروجی

مشخص می‌گیره و چک می‌کنه آیا اون ماژول می‌تونه اون‌کار رو انجام بده یا نه.

----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
خوب پس دیدید، شبکه در لینوکس خیلی پیچیدس. واقعا هم همینطوره ماژول‌های شبکه در لینوکس پیچیده‌ترین و سخت ترین ماژول‌ها هستند و کنترل اونها دقت

زیادی می‌خواد. بیشترین Patchهای لینوکسم برای بخش شبکش طراحی میشه و البته نباید این سختی رو اینطوری باهاش بر خورد کرد که لینوکس توش مونده.

خیر لینوکس با الگوریتم‌های فوق پیچیده و فوق ارتقاع یافته (طی 20 سال) الان شبکه‌ای بسیار پویا و پایدار Stable داره و در Hostهایی با Load خیلی بالا، معمولا

media ها هستن که قدرت انتقال ندارند و نه لینوکس. سربار لینوکس روی شبکه چه از حافظه و چه از پردازش بسیار بسیار ناچیزه و تنها داده‌های کنترلی هستند

که در کنار داده‌های اصلی قرار دارند. در شبکه لینوکس داده مرده اصلا وجود نداره، یعنی بخشی از حافظه شبکه لینوکس که کنترلش خارج شده باشه.

در بخش‌های بعدی در مورد بقیه اجزای کرنل لینوکس صحبت می‌کنیم.

موفق باشید
از طرفEmadCT

نظرات 2 + ارسال نظر
امیرمسعود چهارشنبه 28 شهریور‌ماه سال 1386 ساعت 13:36 http://freeexp.wordpress.com

خیلی خوب بود. استفاده کردیم. اصلاً فکر نمی‌کردم شبکه این قدر پیچیدگی داشته باشه! آقا راستی، این مطالبی که شما دربارهٔ هستهٔ لینوکس میگی توی هیچ کتابی به زبون فارسی هست؟

مریئ دوشنبه 30 اردیبهشت‌ماه سال 1387 ساعت 11:56

واقعا مطالب بسیار خوبی بود.اگر ممکنه در مورده شبکه کردن با لینوکس هم مطالبی بزارین.ممنون.

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد