<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امیرحسین ناظوری</title>
        <link>https://virgool.io/feed/@mrNazouri13</link>
        <description>📕 عاشق یادگیری و به اشتراک‌گذاری دانش
--
آیدی من تو شبکه های اجتماعی :
mrNazouri13</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:28:35</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2980030/avatar/ppcu5e.jpg?height=120&amp;width=120</url>
            <title>امیرحسین ناظوری</title>
            <link>https://virgool.io/@mrNazouri13</link>
        </image>

                    <item>
                <title>شبکه های کامپیوتری (یکبار برای همیشه)</title>
                <link>https://virgool.io/@mrNazouri13/%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1%DB%8C-%DB%8C%DA%A9%D8%A8%D8%A7%D8%B1-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%87%D9%85%DB%8C%D8%B4%D9%87-upzv0g0wx8bx</link>
                <description>سلام. خیلی خوش اومدید به یکی از مقاله‌های سنگین من تو سایت ویرگول.من امیرحسین ناظوری هستم و مقالاتی در رابطه با برنامه‌ نویسی، بدافزار و سیستم عامل داخل سایت ویرگول قرار میدم.هدف از این مقاله، آموزش شبکه به زبان ساده و کاربردیه.در کنار مقاله، یک ویدیو یوتیوب هم آماده کردم که اگه شما از دسته افرادی هستین که با دیدن و شندین، یه موضوعی رو بهتر یاد میگیرید، پیشنهاد میکنم حتما با ویدیو جلو برید.آدرس کانال یوتیوبم: (کلیک کنید)شبکه های کامپیوتری چیه؟برای درک بهتر شبکه های کامپیوتری، لازمه در ابتدا با خود &lt;شبکه&gt; آشنا بشیم.شبکه یعنی یه مجموعه از چیزهای مختلف که به هم وصل شدن و با هم در ارتباطن. این چیزها میتونن افراد، دستگاه‌ها، سیستم‌ها یا حتی مفاهیم باشن. برای مثال، توی اخبار میشنویم که شبکه قاچاق مواد مخدر منحل شد. وقتی صحبت از شبکه میشه، یعنی حداقل 2 نفر وجود داشتن که کارای مختلف رو انجام بدن.مفهوم شبکه های کامپیوتری چیه؟شبکه های کامپیوتری به ارتباط بین حداقل دو تا دستگاه گفته میشه. این دو دستگاه میتونه کامپیوتر باشه، میتونه تلفن باشه و... درکل زمانی که من بیام دوتا کامپیوتر رو بهم متصل کنم، یک شبکه کامپیوتری ایجاد کردم.تو شبکه های کامپیوتری، موضوع Media یا بستر ارتباطی وجود داره. بزار با این مثال توضیح بدم. من که اصفهان هستم اگه بخوام برم تهران، کلا دوتا راه یا بستر ارتباطی برام وجود داره؟! یا زمینی برم، یا هوایی. هرکدوم هم حالت های مختلفی داره، مثلا تو حالت زمینی میتونم با ماشین شخصی برم، با اتوبوس برم و...کامپیوترها باید از طریق یک بستر ارتباطی بهم متصل بشن. این بستر ارتباطی یا بصورت سیمی وجود داره یا بصورت بیسیم (مثل Wifi و Bluetooth)یه سوال! هدف از ایجاد شبکه چیه؟ چرا باید کامپیوترها بهم متصل بشن؟به این دلایل:به اشتراک گذاشتن منابع: یکی از هدف‌های اصلی شبکه اینه که دستگاه‌ها بتونن چیزایی که دارن رو با هم شریک بشن. مثلا اگه یه پرینتر به شبکه وصل باشه، همه‌ی دستگاه‌ها می‌تونن ازش استفاده کنن، بدون اینکه هر کدوم جداگانه پرینتر داشته باشن.تبادل اطلاعات: هدف دیگه شبکه اینه که دستگاه‌ها بتونن با هم حرف بزنن و اطلاعات جابه‌جا کنن. مثلا وقتی برا دوستت تو واتس‌اپ پیام می‌فرستی، گوشیت از طریق شبکه اطلاعات رو می‌فرسته به سرور واتس‌اپ و بعد به گوشی دوستت می‌رسه. یا وقتی فیلمی رو از یه کامپیوتر به کامپیوتر دیگه انتقال میدی، این تبادل اطلاعاته.و...میرسیم به موضوع Network Components یا اجزای تشکیل دهنده شبکه.هر شبکه یکسری چیزهایی رو داره که اون شبکه رو ایجاد کردن.برای مثال، همون شبکه‌ مواد مخدر رو تصور کن. تو اون شبکه یه نفر بود که جنس رو تحویل بگیره، یه نفر بود که جنس رو تحویل بده، حتی ماشین‌ها یا ابزارهایی هم که استفاده میکردن، هرکدوم یه جزء از اون شبکه بودن.اجزای تشکیل دهنده شبکه مثل قطعات یه پازل هستن که وقتی کنار هم قرار میگیرن میتونن یک شبکه رو ایجاد کنن.با چندتا از اجزای تشکیل دهنده شبکه آشنا بشیم...Host: به تمام اجزای شبکه که میشه روشون IP و تنظیمات مربوط به TCP/IP رو اعمال کرد Host گفته میشه.Node: به هر دستگاهی که داخل شبکه قرار داره و به هر شکلی بخشی از مسیر عبور داده‌هاست می‌گیم Node. اینا ممکنه خودشون اطلاعات تولید نکنن، ولی باعث میشن اطلاعات از یه نقطه به نقطه دیگه برسه. مثال ها: سوئیچ، روتر، هاب، مودم، حتی Hostها. هر Host میتونه یک Node باشه ولی هر Nodeیی نمیتونه Host باشه (چون مثلا سوئیچ داده تولید نمی‌کنه، فقط انتقال میده).End Device: دستگاهیه که داده‌ها رو یا تولید می‌کنه یا مصرف می‌کنه. یعنی نقطه شروع یا پایان یه ارتباط توی شبکست. اینا معمولا چیزایی هستن که ما مستقیم باهاشون کار می‌کنیم و دستگاه هایی مثل سوئیچ که فقط داده رو انتقال میدن، به عنوان End Device شناخته نمیشن.End User: کاربر نهایی همون شخصیه که پشت دستگاه نشسته و از شبکه استفاده می‌کنه. برای مثال تو که داری با لپ‌تاپ کار می‌کنی، کاربر نهایی هستی. یا کسی که با گوشیش وارد یه وبسایت میشه کاربر نهایی به حساب میاد.Workstation: معمولا به کامپیوترهایی که توان سخت‌افزاری بالایی دارن و برای کار خاصی داخل شبکه قرار گرفتن، Workstation گفته میشه. اما گاها میبیند که به هر کامپیوتری که کاربر باهاش تعامل داره هم از این عبارت استفاده میکنن (زیاد سخت نگیرید).Client و Server: برای تعریف این دو مفهوم با یک مثال شروع میکنم. یه سوپرمارکت تو محل شما وجود داره. وقتی شما وارد سوپرمارکت میشی، درخواست یه چیزی رو میکنی! مثلا میگی من فلان محصول رو میخوام ازت. تو این مثال، شما نقش Client رو بازی میکنی. کلاینت به درخواست کننده گفته میشه. در طرف مقابل، یه کسی وجود داره داخل سوپرمارکت و کارش اینه که درخواست هارو بگیره، پردازش کنه و بهشون پاسخ بده. به اون شخص Server گفته میشه.درنتیجه، Client به دستگاه یا برنامه‌ایی گفته میشه که درخواست یه چیزی رو داخل شبکه ارسال میکنه. در طرف مقابل، Server وجود داره. Server به کامپیوتر همیشه روشن و قدرتمندی گفته میشه که مدام منتظره کسی بهش درخواست بزنه و به اون درخواست پاسخ بده. کلا بر مبنای خدمت رسانی ساخته و مدیریت شده.این نکته رو هم بدونید، Client همیشه شروع کننده‌ی ارتباطه.توی شبکه یکسری منابعی وجود داره. منابع شبکه (Network Resources) یعنی هر چیزی که داخل یه شبکه قابل استفاده، اشتراک‌گذاری یا دسترسی باشه. برای مثال فایل‌ها، فولدرها، پرینترها، دستگاه‌های ذخیره‌سازی، نرم‌افزارها، دیتابیس‌ها، خدمات شبکه‌ایی (مثل DHCP) و... به عنوان منبع در شبکه شناخته میشن.توی شبکه این منابع به دو روش بین کامپیوترها تقسیم و مدیریت میشه. کسی که شبکه رو میسازه، باید تصمیم بگیره کدوم مدل رو انتخاب کنه.1 - Peer-to-Peer (P2P)2 - Client ServerPeer to Peer: وقتی یه شبکه طبق مدل Peer to Peer ساخته میشه، به این معنیه که همه‌ی کامپیوترها تو یک سطح قرار دارن و کامپیوتر یا سروری وجود نداره که بخواد روی بقیه نظارت داشته باشه و اونارو کنترل کنه. تمام دستگاه‌ها تو این مدل میتونن هم نقش سرور رو بازی کنن و یه سرویسی رو ارائه بدن، هم نقش کلاینت رو بازی کنن. شبکه های گیم‌نت یه نمونه از این مدل شبکه ها هستن.Client Server: وقتی یه شبکه طبق مدل Client Server ساخته میشه، به این معنیه که کامپیوتر یا کامپیوترهایی وجود دارن تحت عنوان Server که میتونن روی دیگر سیستم ها نظارت داشته باشن، کنترلشون کنن. تو این مدل حداقل یک کامپیوتر به عنوان Server باید تعیین بشه، مابقی کامپیوترها نقش Client رو میگیرن و اگه به منبع یا دسترسی خاصی احتیاج داشته باشن، باید به این سرور متصل بشن و ازش درخواست کنن.سوالی که ممکنه برای شما به وجود بیاد اینه: از کدوم مدل استفاده کنم؟جوابش کلا به هدف شما از ساخت شبکه برمیگرده، اما یه توضیحات کوچیکی میدم تا سریع تر به این جواب برسید :)شبکه های Peer to Peer خیلی ساده راه‌اندازی میشن، چون به سرور و مدیریت های عجیب و غریب احتیاج ندارن، ارزون‌تر میشه کار رو جمع کرد. برای شبکه های کوچیک خیلی خوبه. از طرفی، اگه تعداد دستگاه ها بالا بره، مدیریت و امنیت خیلی افت پیدا میکنه.شبکه های Client Server برای سازمان ها و جاهایی که امنیت و مدیریت شبکه براشون مهمه خیلی میتونه مفید باشه. اما از نظر هزینه طبیعتا گرونتر درمیاد از P2P.(تو اکثر سازمان‌ها مدل Client Server کار میکنه)ممکنه اسم Workgroup و Domain هم به گوشتون خورده باشه. Workgroup همون شبکه های P2P هستن اما داخل ویندوز و Domain هم تقریبا همون شبکه های Client Server هست اما داخل ساختار و تعاریف ویندوز.شما یه انسان رو در نظر بگیر. این انسان از جهت های مختلفی میتونه به دسته های مختلفی تقسیم بشه.برای مثال یه انسان داریم به اسم A. این آدم از نظر جنسیت به دو دسته تقسیم میشه. از نظر رنگ مو به دسته های مختلفی تقسیم میشه، از نظر رنگ پوست، از نظر ملیت و...اون آدم تغییری نکرده! فقط از بُعد های مختلف اگه بهش نگاه کنیم، به دسته‌بندی های مختلفی تعلق میگیره.یک شبکه کامپیوتری هم میتونه از بُعد های مختلف، به دسته های مختلف تعلق بگیره.مثلا یک شبکه از نظر مدل مدیریت منابعش به دو دسته تقسیم میشه، یا Peer to Peer هست یا Client Server.یکی دیگه از دسته‌بندی های شبکه، تقسیم بندی از نظر وسعت جغرافیایی اون شبکست. یعنی اینکه یک شبکه چقدر وسعت داره (Network Geography). با کوچیک ترین شبکه شروع کنیم...کوچیک ترین شبکه (از نظر وسعت جفرافیایی) PAN یا Personal Area Networkعه. این شبکه، شخصی و خیلی کوچیکه، محدودش حدود 10 متره. فقط برای ارتباط بین وسایل شخصی خودت کاربرد داره.نکته. اگه قبل از اسم شبکه‌ها کلمه‌ی W قرار گرفت، یعنی اون شبکه بصورت کامل بدون سیم ساخته شده (Wireless هست) فرضا نقطه اتصال تلفنم رو روشن میکنم و لپتاپم بهش وصل میشه، اینجا من یه WPAN دارم.LAN یا Local Area Network: شبکه LAN به شبکه‌های محلی اشاره داره. شبکه‌هایی که تا چند صد متر میتونن وسعت داشته باشن. شما اگه تو خونت مودم داشته باشی و دستگاه ‌های مختلفی رو بهش وصل کرده باشی، یه LAN تشکیل دادی. همچنین، WLAN هم داریم.CAN یا Campus Area Network: این مدل یه چیزی بین LAN و MAN عه. یه دانشگاه بزرگ یا یه شهرک صنعتی رو در نظر بگیر که چند تا ساختمون مختلف داره. شبکه‌ایی که تمام این ساختمون‌ها و شبکه‌های LAN داخلشون رو به هم وصل میکنه، میشه یه CAN. این شبکه برا یه سازمان واحده و مدیریتش هم با همون سازمانه.MAN یا Metropolitan Area Network: این شبکه شهریه و یه شهر رو پوشش میده، محدودش تا چند کیلومتره.فرضا یه شرکت بزرگ که چند تا ساختمون تو یه شهر داره و همشون رو با شبکه به هم وصل کرده.WAN یا Wide Area Network: بزرگترین نوع شبکه از نظر جغرافیایه و کارش اینه که شبکه‌های کوچیکتر (مثل LANها و MANها) رو که در فاصله‌های خیلی دور از هم قرار دارن، به همدیگه وصل کنه. این فاصله میتونه بین دو تا شهر مختلف، دو تا کشور یا حتی دو تا قاره باشه.شبکه اینترنت یه نمونه از شبکه های WAN هست. وقتی من وارد سایت گوگل میشم، دارم به سروری متصل میشم که تو یه کشور دیگه قرار داره. پس اینجا اینترنت اومده شبکه من رو به یک شبکه دیگه، داخل یک کشور دیگه متصل کرده. سوالی که به وجود میاد اینه که این ارتباط ها چطوری کار میکنه؟ این شبکه چطور ساخته شده؟یکسری شرکت هایی وجود دارن که کف اقیانوس ها کابل کشی کردن، ارتباطات ماهواره‌ایی ساختن و مدیریت تمام اینها با اون شرکت ها هست. وقتی من یک بسته اینترنت میخرم، درواقع دارم یک IP میخرم و این IP مثل بلیط ورود من به این شبکه عمل میکنه.آیا به جز اینترنت، شبکه های دیگه‌ایی در سطح WAN میتونن وجود داشته باشن؟ بله.من فرضا یه شرکت دارم که تو کشورهای مختلف شعبه داره و میخوام اینارو بهم متصل کنم. کاری که انجام میدم اینه که میام خطوط ارتباطی که از قبل وجود داره رو اجاره میکنم، یعنی خودم نمیام بین این همه کشور کابل کشی کنم یا هرکار دیگه، بلکه یه مسیر رو اجاره میکنه تا ترافیک من بین شعبه ها جا به جا بشه بدون اینکه با اینترنت سروکار داشته باشن (این بحث ها برای الان لازم نیست بررسی بشه)توی شبکه شکل چیدمان دستگاه ها، تعیین کننده‌ی توپولوژی (Topology) اون شبکه هستن. به زبان ساده تر توپولوژی نشون دهنده اینه که دستگاه ها طبق چه نقشه و توسط چه تجهیزاتی بهم متصل شدن.Topology به دو حالت فیزیکی و منطقی وجود داره. توپولوژی فیزیکی یعنی دستگاه‌ها بصورت فیزیکی (سخت‌افزاری) چطور و به چه شکل متصل شدن، توپولوژی منطقی یعنی از دید نرم‌افزاری و نحوه‌ی ارتباط گیری، طبق چه نقشه‌ایی کار میکنن.فعلا تمرکزمون روی Physical Topologyعه و بعدها راجب Logical Topology هم صحبت میشه.بریم با انواع Topology ها آشنا بشیم...BUS Topology: توی این مدل یه کابل اصلی قرار میگیره و کامپیوترها یکی یکی به این کابل اصلی متصل میشن.یکی از قدیمی ترین توپولوژی های شبکست. وقتی یه کامپیوتر داده‌ایی رو ارسال کنه، اون داده روی کابل اصلی جریان پیدا میکنه و به تک تک سیستم‌ها ارسال میشه، تنها سیستمی که داده براش ارسال شده، اون بسته رو قبول میکنه. توپولوژی BUS منسوخ شده و لازم نیست وقت بیشتری براش بزاریم.STAR Topology: توی این مدل یک دستگاهی به عنوان دستگاه مرکزی قرار داره و تمام دیگر تجهیزات به این دستگاه متصل میشن.توی توپولوژی STAR کامپیوترها ارتباط مستقیم باهم ندارن و هرکی، هر داده‌ایی قراره ارسال کنه، باید از این دستگاه مرکزی عبورش بده. سال ها قبل یک دستگاهی وجود داشت به اسم HUB که از اون برای دستگاه مرکزی این توپولوژی استفاده میکردن، امروزه یک دستگاه هوشمند‌تری اومده به اسم Switch و سوئیچ تو شبکه های STAR امروزه استفاده میشه.RING Topology: توی این مدل کامپیوترها به دوتا کامپیوتر کناریشون متصل هستن و یک حلقه‌ایی رو ایجاد کردن.این توپولوژی هم منسوخ شده.MESH Topology: تو این مدل کامپیوتر‌ها ارتباط مستقیم با دیگر کامپیوتر‌ها دارن. یعنی خبری از دستگاه مرکزی یا کابل اصلی (مثال BUS) وجود نداره. توپولوژی MESH به دو نوع Full و Half تقسیم میشه.توی مدل Full Mesh هر کامپیوتر به تک‌تک کامپیوترهای دیگه مستقیم وصله. یه شبکه تار عنکبوتی کامل و پیچیده درست میشه که نهایت مقاوم بودن رو داره.توی مدل Half Mesh فقط کامپیوترها و Nodeهای مهم و حیاتی به چندتا دستگاه دیگه وصل میشن. لازم نیست همه به هم بصورت مستقیم اتصال داشته باشن.وقتی کامپیوتر A می‌خواد به کامپیوتر Z دیتا بفرسته، ده‌ها مسیر مختلف ممکنه وجود داشته باشه. شبکه می‌تونه بهترین مسیر (مثلا کوتاه‌ترین یا خلوت‌ترین) رو برای ارسال دیتا انتخاب کنه. جذاب‌ترین ویژگیش اینه که اگه یه کابل یا حتی یه کامپیوتر در یک مسیر خراب بشه، هیچ اتفاقی نمی‌افته! داده به صورت خودکار از یه مسیر دیگه فرستاده میشه.Hybrid Topology: من یه شرکت دارم با بخش های مختلف. هربخش یک شبکه داره با توپولوژی متفاوت. برای مثال بخش مالی شرکتم توپولوژی STAR داره و بخش مدیریت شرکتم توپولوژی MESH. اگه من این شبکه‌ها رو بهم متصل کنم، به شبکه یا توپولوژی که درنهایت ساخته میشه، Hybrid یا ترکیبی میگیم. یعنی یک شبکه که از چندین توپولوژی مختلف تشکیل شده.تقریبا تمام شبکه‌های بزرگ (مثل دانشگاه‌ها، بیمارستان‌ها و شرکت‌های بزرگ) از نوع Hybrid هستن، چون نیازهای بخش‌های مختلفشون با هم فرق داره و یک مدل ساده، جوابگوی کارشون نیست.Point to Point Topology یا P2P: توی این مدل دوتا دستگاه بصورت مستقیم و بدون هیچ چیز واسطی بهم متصل شدن. حالا این دو دستگاه میتونه دوتا کامپیوتر باشه، یه موبایل و کامپیوتر باشه، دوتا آنتن باشه یا...داستان OSI یا Open Systems Interconnection چیه؟هرارتباطی که قراره ایجاد بشه، باید طبق یک اصول و استاندارد جلو بره. تو سال های قبل هر شرکت که کامپیوتر و دستگاه‌های مربوط به شبکه هارو ایجاد میکرد، یک مدل خاص از ارتباط گرفتن رو داخل اون دستگاه‌ها اعمال میکرد. یعنی شرکت IBM کامپیوترهایی میساخت که فقط قادر بودن با کامپیوترهای ساخت همون شرکت ارتباط بگیرن.یا شرکت Apple کامپیوترهایی میساخت که فقط با کامپیوترهای خود شرکت Apple میتونستن ارتباط بگیرن.متخصصان اون زمان گفتن این چه وضعیه! باید یه مدل یا قانونی ساخته بشه تا همه ازش استفاده کنن و محدودیتی تو اتصال دستگاه‌های مختلف نداشته باشیم.یه سازمان وجود داره به اسم ISO که کارش استاندارد سازی موضوعات مختلف در سطح بین‌اللملیه. سازمان ISO دست به کار شد تا یه مدل واحد ایجاد کنه و همه طبق اون مدل رفتار کنن که در نتیجه هر دستگاهی فارغ از برند، سخت‌افزار و شرکت سازنده، بتونه با دیگر دستگاه‌ها ارتباط بگیره.سازمان ISO مدل ارتباطی رو ساخت و اسمش رو گذاشت OSI که مخفف Open Systems Interconnection هست.مدل OSI ارتباط بین کامپیوترهارو توی 7 لایه مشخص و تعریف کرده. چرا سازمان ISO این ارتباط رو لایه‌بندی کرد؟یادگیری راحت تر: به جای درگیر شدن با یک غول بزرگ، اون رو به 7 تا بخش کوچیک‌تر تقسیم می‌کنیم.توسعه راحت‌ تر میشه: شرکت‌ها می‌تونن برای یک لایه خاص یک تکنولوژی جدید بسازن، بدون اینکه نگران بقیه لایه‌ها باشن.عیب‌یابی راحت‌تر میشه: اگه ارتباط قطع بشه، متخصص شبکه به ترتیب لایه‌ها رو چک می‌کنه تا ببینه مشکل از کجاست.بریم با 7 لایه‌ی مدل OSI آشنا بشیم.لایه Application: زمانی که من کاربر داده‌ایی رو ایجاد میکنم تا توی شبکه ارسال بشه، این داده در اولین قدم تحویل لایه Application داده میشه. لایه Application تنها لایه‌ایی هست که با کاربر تعامل داره و به نسبت چیزی که کاربر میخواد ارسال کنه، داده رو ایجاد میکنه و به حالتی تبدیلش میکنه که توی لایه پایین‌تر درک بشه.برای مثال، وارد مرورگر میشم و سایت google رو باز میکنم، تا الان من به عنوان کاربر درخواستم رو تعریف کردم، این درخواست تحویل لایه Application داده میشه و این لایه بررسی میکنه و میفهمه که میخوام به یک وب سرویس درخواست بزنم، پس میاد پروتکل HTTP رو که تو همون لایه هست صدا میزنه و میگه HTTP یه پاکت نامه رو آماده کن با فلان مشخصات فرستنده و گیرنده که قراره بدمش به لایه پایین‌تر و اون هم دیگر تغییرات رو روی اون اعمال کنه تا در نهایت بسته برسه به سرور گوگل.حالا اگه بجای وب سرویس، میخواستم با FTP و فایل ها کار کنم، لایه Application پروتکل FTP رو صدا میزد تا بسته یا درخواست من رو سرهم و آماده کنه.تا الان بسته یا درخواست ساخته شده، توسط لایه Application مرتب و سرهم شده و اون بسته میرسه به لایه 6.لایه Presentation: این لایه بسته‌های داده رو فشرده‌سازی میکنه. در کنار اون، قالب بندی هم انجام میده و کاری میکنه که اطلاعات، تو مقصد به درستی خونده بشن. برای مثال، وقتی من از ویندوز خودم یک داده‌ایی رو ارسال میکنم به سمت موبایلم، یکی از وظایف لایه Presentation اینه که داده رو به شکلی قالب بندی کنه که تو موبایل من درک بشه. درکنار فشرده سازی و قالب بندی، عمل رمزنگاری هم تو این لایه انجام میشه.لایه Session: این لایه مسئول اینه که با کامپیوتر مقصد ارتباطی رو ایجاد کنه و این ارتباط رو مدیریت کنه تا داده‌ها ارسال/دریافت بشن. وقتی ارسال داده‌ها تموم شد این لایه باید ارتباط رو با کامپیوتر مقصد قطع کنه.وقتی شما همزمان به چندین مقصد متصل میشید و درخواست های مختلفی رو ارسال/دریافت میکنید، وظیفه این لایه هست که ارتباطات مختلف رو مدیریت کنه.توی شبکه به سه حالت داده‌ها میتونن ارسال و دریافت بشن.Simplex: تو این حالت فقط یک طرف از ارتباط میتونه ارسال داشته باشه و طرف دیگه فقط دریافت. به عنوان مثال تلوزیون ها دارن داده‌ایی رو از صدا و سیما دریافت میکنن ولی داده‌ایی نمیتونن بفرستن.Half-Duplex: تو این حالت دوتا دستگاه میتونن اطلاعات رو بفرستن و دریافت کنن، ولی نه همزمان! بصورت نوبتی. مثل بیسیم پلیس.Full-Duplex: تو این حالت هر دو طرف بصورت همزمان هم میتونن ارسال انجام بدن و هم دریافت.تعیین اینکه کدوم روش برای ارتباط بین دو کامپیوتر انتخاب بشه، توسط لایه Session انجام میشه.لایه Transport: وقتی داده به این لایه میرسه، بررسی میکنه که آیا لازم هست به قطعات کوچیک‌تری تقسیمش کنه تا بهتر و سریع‌تر منتقل بشن یا نه؟! درنتیجه، تقسیم کردن و قطعه‌قطعه کردن داده یکی از وظایف این لایه هست. به قطعه‌های کوچیک شده تو این لایه segment گفته میشه.همچنین، تو این لایه دوتا پروتکل وجود داره که باید از یکی از اینها برای ارسال اطلاعات استفاده کنیم. هرکدوم به یک روش اطلاعات رو ارسال/دریافت میکنن که الان خلاصه توضیح میدم و بعدا بیشتر بررسی میشه.TCP: مسئولیت‌پذیر. مطمئن میشه همه سگمنت‌ها سالم و به ترتیب به مقصد برسن. اگه یکی نرسه، دوباره می‌فرستتش.UDP: سریع و بی‌خیال. فقط دیتا رو میفرسته و براش مهم نیست حتما برسه یا نه.جمع‌بندی: این لایه داده‌ها رو در صورت لزوم قطعه قطعه میکنه و به هر قطعه Segment گفته میشه. دوتا پروتکل ‌TCP و UDP تو این لایه وجود دارن و هر ارتباطی، باید از یکی از این دو پروتکل استفاده کنه.لایه Network: مهم ترین کاری که این لایه انجام میده، کار با IP برای مسیریابی بسته‌ها و پیدا کردن کامپیوترهای مقصده. IP چیه؟ بعدا راجبش توضیح میدم ولی فعلا در این حد بدونید که IP یکی از دو آدرسی هست که به کامپیوترها تعلق میگیره تا بتونن داخل شبکه‌ها فعالیت داشته باشن. وقتی بسته‌ایی قراره ارسال بشه، این لایه آدرس IP فرستنده و آدرس IP گیرنده رو داخل اطلاعات بسته قرار میده، با اینکار اطلاعات میتونن مسیریابی بشن و به مقصد برسن.لایه Data Link: در کنار IP یک آدرس دیگه وجود داره به اسم MAC که هر کامپیوتر با این آدرس، میتونه تو شبکه‌های LAN فعالیت داشته باشه. در مورد MAC بعدا صحبت میشه. وقتی بسته‌ایی قراره ارسال بشه، هم به اطلاعات IP نیاز داره (فرستنده و گیرنده) و هم به اطلاعات MAC. یکی از وظایف این لایه مدیریت آدرس MAC و قرار دادن اونها داخل بسته هست.لایه Physical: به اون چیزی که کامپیوترهارو به هم متصل میکنه، Media یا بستر ارتباطی گفته میشه. این لایه ارتباط مستقیم با Media داره و کلا با Bit کار میکنه. این لایه داده‌ها رو به شکلی درمیاره که روی اون Media قابل ارسال/دریافت باشه. مثلا اگه کامپیوترها به واسطه کابل به هم متصل شده باشن، Bit ها تبدیل به سیگنال های الکتریکی میشن ولی اگه کامپیوترها به واسطه Wifi بهم متصل شده باشن، Bit ها تو یه حالت دیگه ارسال میشن.جمع‌بندی: مدل OSI توسط سازمان ISO معرفی شد تا همه طبق یک پروتکل واحد ارتباط برقرار کنن. سازمان ISO مدل OSI رو تو 7 لایه معرفی کرد. زمانی که شما داده‌ایی رو ایجاد میکنی، اون داده از لایه 7 شروع میشه میاد پایین و به این فرآیند Encapsulation گفته میشه. وقتی داده به مقصد میرسه، از لایه 1 وارد میشه و تا لایه 7 بالا میاد تا درنهایت شکل اصلی داده به کامپیوتر مقصد برسه و به این فرآیند Decapsulation گفته میشه.داخل شبکه، وقتی بسته‌ایی قراره ارسال بشه، سه حالت وجود داره.Unicast: اگه یک کامپیوتر بسته‌ایی رو فقط برای یک کامپیوتر دیگه ارسال کنه، اصطلاحا Unicast کرده.Multicast: اگه یکسری کامپیوتر عضو یک گروه باشن و من بسته رو فقط برای این کامپیوترها ارسال کنم، عمل Multicast رو انجام دادم.Broadcast: زمانی که من بسته‌ایی رو داخل شبکه پخش میکنم و برای همه ارسال میکنم، Broadcast انجام دادم.پروتکل TCP/IP چیه؟برای توضیح این پروتکل، لازم هست یسری موارد رو که داخل بخش OSI توضیح دادم مجدد بازگو کنم.OSI توسط سازمان ISO معرفی شد تا همه بتونن طبق یک مدل واحد ارتباط بگیرن. تو زمانی که OSI مطرح شد و بحث روی پروتکل‌های ارتباطی داغ بود، چندین ارگان یا سازمان دیگه هم نظرات خودشون رو داشتن.بیا کاری به این نداشته باشیم که توی چه سالی و توسط چه سازمان‌هایی چه اتفاقاتی افتاد، بیا به این کار داشته باشیم که تفاوت TCP/IP با OSI چیه و منطق کار رو درک کنیم :)همینطور که میدونید تا قبل از OSI شبکه‌ها وجود داشتن و کامپیوترها به هم متصل میشدن، منتهی پروتکل واحدی بین شبکه‌ها وجود نداشت. از یه طرف یسری ها داشتن کاری میکردن که این پروتکل ساخته بشه تا همه متصل بمونن و فعالیت های مختلفی هم انجام میدادن، از یه طرف سازمان ISO اومد و OSI رو معرفی کرد. تو یه بازه‌‌ی زمانی متخصص‌ها گفتن که چندین پروتکل الان وجود داره و کار میکنه، OSI هم که اومده، ما میایم فلان پروتکل رو که خیلی وقته داریم روش کار میکنیم و شبیه OSI هست رو یکم تغییر میدیم و بهترش میکنیم، و همون رو میزاریم به عنوان پروتکل اصلی ارتباطات. اسم اون پروتکل شد TCP/IP که خیلی شبیه به OSIعه.درواقع TCP/IP نسخه عملی و واقعی OSIعه، چون OSI روی کاغذ همه چیز رو با جزئیات و دقیق عنوان کرده بود اما TCP/IP گفت که توی عمل فلان چیزها استفاده میشه و من همون هارو نگه میدارم، دیگه به اون ریزه کاری‌ها احتیاجی نیست.فکر کنم متوجه شدید که چرا تو درس های شبکه، ابتدا OSI رو تدریس میکنن و بعدش TCP/IP رو، چون OSI رو اگه شما درک کنی، انگار TCP/IP رو درک کردی با این تفاوت که TCP/IP چندین کار OSI رو باهم ادغام کرده. چرا؟ چون گفت من میخوام تو عمل استفاده بشم، اون همه جزئیات باعث میشه مثلا سرعت ارتباطات کاهش پیدا کنه.مدل OSI ارتباط هارو به 7 لایه تقسیم کرده بود اما TCP/IP گفت من توی عمل میخوام یجور دیگه رفتار کنم و اومد 3 تا لایه‌ی بالای OSI رو داخل یک لایه قرار داد به اسم Application.پروتکل TCP/IP بیشتر بصورت 4 لایه معرفی میشه که داخل عکس مشخصه اما گاها ممکنه 5 لایه هم ببینیم که تفاوت خاصی با 4 لایه نداره، فقط دوتا لایه پایینی رو از هم جدا کردن. یجورایی مدل 5 لایه نسخه‌ی جدیدتر TCP/IPعه.PDU یا Protocol Data Unit چیه؟ PDU همون بسته یا چیزیه که توی هر لایه‌ دست‌ به‌ دست میشه. شبکه مثل یه خط تولیده، داده از Application شروع میشه و میره پایین، لایه به لایه بهش چیز اضافه میشه. درنتیجه PDU اسمیه که به داده‌ها در هر لایه گفته میشه.Ethernet چیه؟ برای توضیح اترنت دوباره باید برگردیم به گذشته، همون مواقعی که ارتباطات کامپیوتری تو در و دیوار بود و هنوز به پروتکل واحد و استاندارد نرسیده بودن.اون زمان کامپیوترها فقط بصورت Point to Point میتونستن ارتباط بگیرن، یعنی یه کامپیوتر فقط به یه کامپیوتر دیگه. تو این حالت یکی از سیستم‌ها داده‌ایی رو ارسال میکرد، اون یکی دریافت میکرد.بعد یه مدت گفتن این مدلی فایده نداره. باید کاری کنیم که کامپیوترهای بیشتری بتونن بهم متصل بشن.بعد کلی فکر کردن به این نتیجه رسیدن که هرکامپیوتر باید یه شناسه یا آدرس یکتا داشته باشه. اومدنMAC Address رو ساختن که تو بخش بعدی خیلی کامل بررسیش میکنیم.مک آدرس یکی از آدرس‌هایی هست که کامپیوترها برای ارتباطات شبکه‌ایی بهش احتیاج دارن و این آدرس، بصورت سخت‌افزاری (فیزیکی) روی هر کارت شبکه تنظیم میشه.حالا که هر کامپیوتر شناسه‌ی خاص خودشو داره، پس میتونیم چندین سیستم رو بهم متصل کنیم و هر سیستم، میتونه دیگر سیستم‌هارو به واسطه‌ی آدرس مکشون، متمایز کنه.حالا اومدن گفتن که وقتی یک کامپیوتر میخواد بسته‌ایی رو ارسال کنه، اون بسته باید چه مواردی داخلش قرار بگیره و کلا به چه شکلی باید سرهم بشه تا بتونه بصورت صحیح به مقصد درستش برسه.اومدن بحث frame رو مطرح کردن. وقتی یک بسته میخواد از کامپیوتر مثلا A ارسال بشه، یک frame براش ایجاد میکنن و داخل اون frame نوشته میشه که این بسته از کامپیوتری با MAC فلان میخواد ارسال بشه به کامپیوتری با MAC فلان.این کل داستان اترنت بود.اترنت یک فناوری یا تکنیکیه که بسته‌هارو سرهم میکنه تا درنهایت ارسال بشه (فقط به همین مورد ختم نمیشه).درکنار اترنت موارد دیگه‌ایی هم داریم که اوناهم به شکل خاص خودشون بسته‌هارو سرهم میکنن و ارسال میکنن! مثل WiFi.پس اترنت، یکی از روش‌ها یا تکنیک‌هایی هست که کمک میکنه بسته‌ها داخل شبکه ارسال/دریافت بشن.همه چیز راجب MAC Address.MAC مخفف Media Access Controlعه. یه آدرس 48 بیتی (یعنی 6 بایت) که به هر کارت شبکه داده میشه.مک بصورت سخت افزاری روی کارت های شبکه حک میشه و تو حالت معمول قابل تغییر نیست.MAC Address به شکل 12 رقم هگزادسیمال نمایش داده میشه. مثلا: 00:1A:2B:3C:4D:5Eهر قسمت شامل 2 کاراکتر Hexa هست و با : از هم جدا شده و همچنین هر قسمت 1 بایته (هر کاراکتر هگزا 4 بیته)مک آدرس به دو بخش تقسیم میشه.بخش اول (3 بایت یا 24 بیت اول): مربوط به شرکت سازنده کارت شبکست. به بخش اول میگن OUI یا Organizationally Unique Identifier.بخش دوم (3 بایت یا 24 بیت دوم): شماره‌ی سریال یکتای اون کارت شبکه، که توسط همون شرکت انتخاب میشه.اگه ویندوز دارید، cmd رو باز کنید و دستور ipconfig /all رو بنویسید، تو خروجی، آدرس MAC کارت شبکه رو نوشته.مک آدرس تو لایه دوم مدل OSI یعنی Data Link وجود داره.Hub چیه؟ به توپولوژی Star دقت کن:دستگاه Hub برای این ساخته شد که کامپیوترها متصل بشن به یک دستگاه مرکزی و بتونن تبادل داده داشته باشن.Hub تو لایه اول OSI کار میکنه که یعنی فقط بیت هارو میفهمه و باهاشون کار میکنه. درکی از MAC که تو لایه دوم هست نداره. زمانی که کامپیوتر A میخواست به کامپیوتر B داده ایی رو ارسال کنه، اون داده میرسید به HUB و HUB میومد اون frame هارو به تمام دیگر دستگاه ها ارسال میکرد، تمام کامپیوتر ها بسته رو دریافت میکردن ولی فقط اون کامپیوتری بسته رو برای خودش نگه میداشت که آدرس مک خودش تو اطلاعات گیرنده بسته وجود داشت.وقتی کامپیوترها رشد کردن و تعداد دستگاه ها بیشتر شد یواش یواش ضعف های Hub خودشو نشون داد و به همین دلیل رفتن برای ساخت یه دستگاه پیشرفته تر که درنهایت ساختن و اسمش شد Switch.(یه نکته. شما زمانی که از توپولوژی Star استفاده میکنی و دستگاه Hub رو قرار میدی، بصورت فیزیکی داری از همون توپولوژی Star کمک میگیری اما بصورت منطقی توپولوژی BUS رو داری)Switch چیه؟Switch علاوه بر لایه اول OSI، لایه دومش هم داره و درکش میکنه، به این معنی که دستگاه Switch میتونه مک آدرس هارو بفهمه. سوئیچ یه داخل حافظش یه جدول داره به اسم MAC Table یا CAM Table.وقتی سوئیچ برای اولین بار داخل شبکه قرار میگیره و روشن میشه، اون جدول خالیه. به مرور که کامپیوتر ها باهم اطلاعات رد و بدل میکنن، سوئیچ میفهمه که به کدوم پورتش، چه مک آدرسی وصله. مثلا کامپیوتر A که به پورت 1 وصله، بسته ایی رو ارسال میکنه، سوئیچ بسته رو میگیره، بازش میکنه و به مک آدرس فرستنده نگاه میکنه، میاد تو جدولش مینویسه که پورت 1 من مک آدرسش برابره با فلان مورد.همین روند تکرار میشه تا تمام مک آدرس هارو بفهمه و یادداشت کنه.همه چیز راجب IP یا Internet Protocol.همینطور که قبلا گفته شد، MAC Address به این دلیل به وجود اومد که داخل یک شبکه LAN کامپیوترها بتونن هم دیگه رو بشناسن و داده ارسال/دریافت کنن.وقتی شبکه ها بزرگ شدن و خواستن LAN های مختلف رو بهم متصل کنن، یسری مشکلات به وجود اومد. اصلی ترین مشکل این بود که MAC آدرسی نبود برای مسیریابی بسته ها بین LAN های مختلف. MAC به این دلیل به وجود اومد که داخل یک LAN عمل مسیریابی انجام بشه، خب الان که میخوایم عمل مسیریابی رو بین شبکه های مختلف انجام بدیم، نیاز هست که یه آدرس دیگه داشته باشیم و طبق همین دلایل IP به وجود اومد.IP و MAC باهم کار میکنن. طبق قوانین و استانداردهایی که داخل هردوی اینها وجود داره، نمیتونیم بصورت جدا از هرکدومشون استفاده کنیم.نتیجه گیری:MAC Address برای مسیریابی در بیرون از شبکه های LAN مناسب نیست. MAC Addressها بر اساس سازنده مرتب شدن، نه موقعیت جغرافیایی. دستگاه‌های یه شرکت می‌تونن در سراسر جهان پخش باشن.اگه روترهای اینترنت بخوان بر اساس MAC Address مسیریابی کنن، باید جدولی از میلیاردها MAC Address داشته باشن که عملا غیرممکنه. پس نیاز به یک آدرس‌دهی جدید بود. یک آدرس منطقی (نه فیزیکی). یک آدرس سلسله‌مراتبی (مثل سیستم کدپستی) تا بتونه مسیریابی رو ساده کنه. یک آدرس که قابل تغییر باشه (برخلاف MAC Address). این نیاز، منجر به ایجاد Internet Protocol (IP) شد.از پروتکل IP دو نسخه وجود داره. اول IPv4 ساخته شد که از 32 بیت تشکیل شده. برای نمایشش از decimal استفاده میشه. این 32 بیت رو به 4 بخش 8 بیتی تقسیم کردن و به هر بخش Octet گفته میشه و همچنین، هر Octet با . از Octet کناری جدا میشه. یک نمونه مثال: 192.168.1.1 (هر Octet میتونه بین 0 تا 255 باشه)به مرور که تعداد دستگاه های متصل به اینترنت زیاد شدن، برای اینکه آدرس IP کم نیاد یسری حرکت هایی زدن مثل اینکه IP های Public و Private رو مطرح کردن! اما این هم نتونست خیلی مقاومت کنه در برابر تعداد دستگاه ها که هر روز بیشتر میشد. در آخر اومدن IPv6 رو ساختن که این نسخه از 128 بیت تشکیل شده. تعداد آدرس هایی که با این نسخه میتونیم داشته باشیم تقریبا بینهایته و حالا حالا کم نمیاد. یک نمونه مثال:2001:0db8:85a3:0000:0000:8a2e:0370:7334(تو این آموزش تمرکز روی IPv4 هست)IP طبق معیار های مختلف، به دسته های مختلف تقسیم میشه. برای مثال، IP های Private و Public رو داریم.همینطور که بالاتر گفته شد، وقتی دیدن آدرس های IP داره کم میاد، اولین کاری که کردن تقسیم IP ها به دو دسته Public و Private بود. شما وقتی وارد یه کوچه میشی، پلاک خونه ها از 1 شروع میشه تااا آخر. اگه وارد کوچه بعدی بشید، بازم پلاک کوچه ها از 1 شروع میشه تااا آخر. اون دوتا خونه که پلاکشون 1 هست هیچ ربطی بهم ندارن چون داخل کوچه یا محدوده خاص خودشون قرار دارن.IP های Public آدرسی هستن که تو کل اینترنت منحصر بفردن و دستگاه های دیگه میتونن با این آدرس با کامپیوتر هدف ارتباط برقرار کنن. برای مثال، ایران هیچ استانیش با استان دیگش اسم یکسانی نداره، مثلا استان اصفهان رو داریم، یا مازندران یا... اما، تو هر استان ممکنه محله هایی باشه با اسم یکسان. مثل محله همت‌ خان تو اصفهان و محله همت‌ خان تو مازندران. Public IP مثل اسم استانه که همیشه منحصر بفرده و اسم‌ محله ها Private IP میشن، یعنی آدرس هایی که بعد از یک آدرس عمومی قرار دارن.IP های Public توسط IANA (یه سازمان جهانی که مدیریت آدرس‌های IP رو بر عهده داره) و از طریق ارائه‌ دهنده‌ های اینترنت مثل ایرانسل یا مخابرات به دستگاه‌ها یا شبکه‌ها اختصاص داده میشه.IPv4 حدود 4 میلیارد آدرس منحصربه‌فرد داره. حالا تصور کن یه شرکت بزرگ با 1000 کارمند، اگه بخواد به هر کامپیوتر یه آدرس IP عمومی اختصاص بده، باید 1000 آدرس IP از ISP بگیره. این کار هم بسیار گرون تموم میشه، هم غیر عملی بود.Public IP ها تو سطح اینترنت یکتا هستن. مثلا سرور گوگل یه آدرس Public داره که هرکسی میتونه بهش درخواست بزنه، حالا تصور کن یه سرور دیگه هم همین آدرس IP رو داشته باشه، اینجا به خطا میخوریم.Private IPها آدرس هایی هستن که تو سطح شبکه های محلی وجود دارن و تو سطح اینترنت شناخته شده نیستن.چطور تشخیص بدیم یک IP از نوع Public هست یا Private؟IPv4 حدود 4 میلیارد آدرس منحصر به فرد داره. از دل این 4 میلیارد، اومدن چندتا رنج رو جدا کردن و اون چندتا رنج رو گفتن تو شبکه های LAN به عنوان Private IP استفاده کنید. به اون رنج ها کلاس گفته میشه.کلاس های IP:10.0.0.0 تا 10.255.255.255 (کلاس A) ( با این کلاس/رنج یک شبکه‌ی خیلی بزرگ دارم با 16 میلیون آدرس)172.16.0.0 تا 172.31.255.255 (کلاس B) (با این کلاس 16 تا شبکه‌ متوسط میتونم بسازم)192.168.0.0 تا 192.168.255.255 (کلاس C) (با این کلاس میتونم 256 شبکه‌‌ کوچیک بسازم)جمع بندی: تا الان با IP و نسخه های IP آشنا شدیم. فهمیدیم که IP و MAC در کنار هم کار میکنن و دلیل وجود IP چیه. همینطور با IP های Public و Private هم آشنا شدیم و بریم سراغ ادامه ماجرا...فرض کن 3 تا دستگاه مثل لپ‌تاپ، موبایل و تلوزیون دارم که همشون وصلن به مودم اینترنتم. وقتی تو شرکت مخابرات ثبت نام میکنم و اینترنت میخرم، اونها یک IP Public رو دراختیارم قرار میدن تا از طریقش بتونم وارد شبکه اینترنت بشم. تا اینجا من یک عدد IP Public دارم و 3 تا دستگاه داخل LAN خودم. مودم میاد IP Public رو از مخابرات تحویل میگیره و پیش خودش نگه میداره. از طرفی میاد به 3 تا دستگاهی که بهش وصلن، IP Private میده. حالا هر موقع، هر کدوم از دستگاه‌ها بخوان به اینترنت متصل بشن و چیزی رو ارسال/دریافت کنن، مودم میاد IP خصوصی رو از دستگاه میگیره، موقتا بهش IP عمومی میده تا بره تو اینترنت و برگرده و در آخر دوباره IP عمومی رو ازش میگیره.با این ترفند میشه یک IP Public رو در اختیار چندین دستگاه قرار بدیم که نخوایم هزینه کنیم و بریم برای هرکدوم یک Public IP تهیه کنیم.NAT چیه؟با تعاریف بالا یکم باهاش آشنا شدیم ولی بریم اصولی تر یادش بگیریم...NAT مخفف Network Address Translationـه، یعنی ترجمه کردن آدرس شبکه. کارش اینه که آدرس‌های Private داخل شبکه LAN رو به یه آدرس Public تبدیل کنه تا بتونن تو اینترنت دیده بشن.چطوری کار می‌کنه؟ فرضا یه شبکه دارم با مشخصات زیر:کامپیوتر اول: 192.168.1.10 (آدرس خصوصی)کامپیوتر دوم: 192.168.1.20 (آدرس خصوصی)مودم/روتر: 203.0.113.5 (آدرس عمومی که روی اینترنت دیده میشه)سرور گوگل: 142.250.190.78 (آدرس عمومی)مرحله 1: ایجاد درخواست از کامپیوتر اولکامپیوتر اول میخواد صفحه‌ گوگل رو باز کنه. یعنی یه درخواست TCP به سمت 142.250.190.78:443 (پورت HTTPS) می‌فرسته. این درخواست با مشخصات زیر ساخته میشه:Source IP: 192.168.1.10
Source Port: 50000   (یه پورت موقتی که سیستم ساخته)
Destination IP: 142.250.190.78
Destination Port: 443مرحله 2: رسیدن بسته/درخواست به مودموقتی این بسته به مودم می‌رسه، مودم میگه صبر کن. آدرس 192.168.1.10 خصوصیه، روی اینترنت شناخته‌ شده نیست. من باید NAT کنم. مودم میاد Source IP رو تغییر میده و آدرس Public خودش (203.0.113.5) رو جایگزین می‌کنه. ولی یه مشکل داریم! اگه کامپیوتر دوم هم همزمان درخواست بده، از کجا بفهمه کدوم جواب برای کیه؟اینجاست که مودم از Port Address Translation (PAT) استفاده می‌کنه. یعنی پورت مبدا رو هم تغییر میده.مثال بعد از تغییر:Source IP: 203.0.113.5
Source Port: 40001   (مودم ساخته)
Destination IP: 142.250.190.78
Destination Port: 443مودم میاد تو جدول NAT خودش تمام این تغییرات رو ذخیره میکنه.192.168.1.10:50000  &lt;-&gt;  203.0.113.5:40001تو جدول NAT گفته شده که تو شبکه LAN یک درخواست ساخته شده از مبدا 192.168.1.10 روی پورت 50000. من همین درخواست رو به 203.0.113.5 روی پورت 40001 تغییر دادم. یعنی هرموقع سمت من، بسته ایی اومد که مقصدش 203.0.113.5:40001 بود باید به 192.168.1.10:50000 تحویلش بدم.مرحله 3: رسیدن بسته به گوگلبسته‌ایی که ساختم میرسه به گوگل. گوگل بسته رو باز میکنه و محتوای زیر داخلش قرار داره:درخواست از
203.0.113.5:40001
به
142.250.190.78:443گوگل هیچ خبری از IP خصوصی (192.168.1.10) نداره. برای گوگل فقط Public IP وجود داره.مرحله 4: پاسخ گوگلگوگل جواب رو به همون آدرسی که درخواست رو فرستاده برمیگردونه.Source IP: 142.250.190.78
Source Port: 443
Destination IP: 203.0.113.5
Destination Port: 40001مرحله 5: رسیدن بسته به مودممودم جواب رو می‌گیره و یه نگاه به جدول NAT خودش میندازه.203.0.113.5:40001 == 192.168.1.10:50000میفهمه که بسته‌ی دریافتی برای یک سیستم محلی با آدرس 192.168.1.10 هست که روی پورت 50000 منتظره که پاسخ دریافت بشه. پس میاد اطلاعات مقصد بسته رو به حالت زیر تغییر میده و ارسال میکنه برای کامپیوتر اول:Source IP: 142.250.190.78
Source Port: 443
Destination IP: 192.168.1.10
Destination Port: 50000درنتیجه، زمانی که Public IP و Private IP مطرح شد، استاندارد NAT هم بکار گرفته شد تا عمل ترجمه آدرس Private به Public رو انجام بده.Network ID و Host ID چیه؟تمام آدرس های IP از دو بخش Network ID و Host ID تشکیل شدن. Network ID نشون میده این دستگاه تو کدوم شبکست و Host ID نشون میده کدوم دستگاهِ داخلِ اون شبکست.تلفن های اصفهان همیشه با 0313 شروع میشن. برای مثال شماره تلفن خونه من 0313456789 هست، شماره تلفن خونه دوستم 0313555555 هست. تو این شماره تلفن ها 0313 مثل همون Net ID تو IP هاست و مابقی شماره مربوط میشه به شماره اختصاصی من که تو مخابرات ثبت شده و مثل Host ID تو IP هاست.پس تا زمانی که Net ID ها مثل هم باشه، ما داخل یک LAN قرار داریم.به این آدرس دقت کن:اصفهان. فلکه احمدآباد. خیابان احمدآباد. کوچه شهید محمودی. پلاک 8.این آدرس رو میتونیم به 2 بخش تقسیم کنیم. بخش اول مشخص میکنه که من دارم به کدوم شبکه/محله اشاره میکنم. بخش اول میشه: اصفهان. فلکه احمدآباد. خیابان احمدآباد. کوچه شهید محمودی.بخش اول مثل Network IDعه، یعنی مشخص میکنه دارم به کدوم شبکه اشاره میکنم (شناسه شبکه رو نشون میده)بخش دوم مشخص میکنه تو اون شبکه که Network ID مشخص کرده، میخوام به کدوم دستگاهش اشاره کنم. بخش دوم میشه: پلاک 8.به این IP دقت کن: 192.168.1.1چطوری میشه تشخیص داد که چندتا Octet از این IP برای Net IDعه و چندتاش برای Host ID؟تو پروتکل IP یه چیز دیگه داریم به اسم Subnet Mask که همیشه و همه جا همراه با IP وجود داره. یعنی امکان نداره جایی صحبت از IP بشه و Subnet Mask حضور نداشته باشه.Subnet Mask مثل یک خط کش تعیین میکنه که تا کجای IP مال شبکست و از کجا به بعدش مال Host.ساختار Subnet Mask دقیقا مثل IPعه. یعنی از 4 Octet تشکیل شده که هرکدوم میتونه مقداری بین 0 تا 255 داشته باشه. مثال: 255.255.255.0255 یعنی این بخش ثابت و مربوط به شبکست.0 یعنی این بخش متغیر و مربوط به میزبان‌ هاست.فرضا روی کامپیوتر من، IP و Subnet Mask زیر تنظیم شده:192.168.1.10
255.255.255.0هر Octet از IP با Octet مجاورش در Subnet Mask بررسی میشه. Octet اول Subnet Mask عدد 255 هست که یعنی Octet اول IP مربوط به Network ID میشه. از آیپی 192.168.1.10 بخش 192.168.1 مربوط به Network IDعه و مابقی آدرس، یعنی 10 اشاره میکنه به یک دستگاه داخل شبکه (Host ID).اگه من قراره چندتا کامپیوتر رو بهم متصل کنم و یک LAN تشکیل بدم، باید Net ID همشون مثل هم باشه و اینکارو با کمک Subnet Mask انجام میدم. یه مثال دیگه، فرضا روی کامپیوترم IP و Subnet Mask زیر تنظیم شده:IP: 10.0.5.25
Subnet Mask: 255.255.0.0قسمت 10.0 مربوط میشه به Network ID و قسمت 5.25 مربوط میشه به Host ID. تو این حالت دستگاه های بیشتری رو میتونم داخل شبکم آدرس دهی کنم.هرکلاس آیپی، Subnet Mask مختص به خودش رو داره:Class A: 255.0.0.0
Class B: 255.255.0.0
Class C: 255.255.255.0همچنین، گاهی به جای نوشتن کامل Subnet Mask، به شکل خلاصه میگن:192.168.1.10/24اون 24/ یعنی 24 بیت اول مال شبکست. هر 255 در Subnet Mask یعنی 8 بیت.درنتیجه 24/ یعنی 24 بیت اول که میشه 255.255.255.0.جمع بندی: IP ها به دو بخش Network ID و Host ID تقسیم میشن. Network ID تعیین میکنه که این IP متعلق به کدوم شبکست و Host ID تعیین میکنه که به کدوم دستگاه داخل شبکه ایی که مشخص شده اشاره میشه. حالا این تفکیک و تقسیم بندی IP توسط Subnet Mask انجام میشه که همیشه و همه جا همراه IP وجود داره.مودم هایی که تو خونه استفاده میشه چون از کلاس C بصورت پیشفرض استفاده میکنه، Subnet Mask پیش‌فرضش هم 255.255.255.0 هست. یعنی میگه فقط آخرین octet برای میزبان‌هاست. پس توی خونه می‌تونی از IPهای زیر استفاده کنی:192.168.1.1
192.168.1.2
192.168.1.3
...
192.168.1.254چرا نمیتونم از 192.168.1.0 و 192.168.1.255 استفاده کنم؟ تو هر شبکه دوتا آدرس هست که نمیشه به دستگاه ها اختصاص داد و اون دوتا آدرس رزرو شدن. اولین آدرس IP داخل یک شبکه اختصاص داده میشه به خود شبکه. یعنی اون آدرس فقط و فقط به کلیت شبکه اشاره میکنه و از اون آدرس به بعد، میشه دستگاه هارو آدرس دهی کرد. درنتیجه: 192.168.1.0 متعلق به خود شکبست.درکنار اولین آدرس شبکه که رزرو شده، آخرین آدرس شبکه هم به همین شکله و نمیتونیم به دستگاهی اختصاصش بدیم. به آخرین آدرس شبکه که رزرو شده Broadcast Address گفته میشه. تو مثال بالا آیپی 192.168.1.255 آدرس Broadcast شبکست.وقتی یه بسته می‌خواد تو شبکه جا به‌ جا بشه، سیستم در ابتدا نگاه میکنه ببینه مقصدش تو همون Network ID هست یا نه. اگه Network ID یکی باشه یعنی مقصد تو همون شبکه محلیه، مستقیم میره براش. اگه Network ID فرق داشته باشه یعنی مقصد تو یه شبکه دیگست، باید بسته رو بده به روتر/مودم تا مسیرش رو پیدا کنه.بحث Subnet Mask خیلی گسترده تر از این حرفاست و ادمین های شبکه برای اینکه بتونن مدیریت بهتری داشته باشن، Subnet Mask پیشفرض رو تغییر میدن تا بتونن شبکه هارو کوچیک تر یا بزرگ تر کنن. تا همین حد که الان درک کردید کافیه.Default Gateway چیه؟همینطور که بالاتر گفته شد، وقتی بسته ایی میخواد ارسال بشه، کامپیوتر مبدا به IP و Subnet Mask طرف گیرنده نگاه میکنه، میاد Net ID خودش و گیرنده رو مقایسه میکنه و اگه یکی بودن، یعنی با کامپیوتر هدف داخل یک LAN قرار دارن و خیلی راحت IP و MAC اون کامپیوتر رو تو اطلاعات گیرنده قرار میده و بسته رو میفرسته.اگه Net ID ها متفاوت بود چه اتفاقی میوفته؟تو تمام کامپیوترها و دستگاه ها میتونیم آدرس Default Gateway رو تنظیم کنیم. وقتی بسته ایی قرار باشه از LAN خارج بشه، اون بسته رو باید تحویل Default Gateway بدیم تا بیاد عمل مسیریابی بین شبکه های مختلف رو انجام بده و بسته رو به شبکه هدف برسونه. Default Gateway یه مفهومه و دستگاهی که تو نقش Default Gateway قرار میگیره Router هست. Router مثل هر دستگاه دیگه ایی وصل میشه مثلا به Switch و یک IP و MAC رو برای خودش داره. من میام IP روتر رو داخل تمام کامپیوترهای شبکم به عنوان Default Gateway تنظیم میکنم، حالا کامپیوترها وقتی بخوان بسته ایی به بیرون از LAN ارسال کنن، باید اون بسته رو تحویل Router بدن که نقش Default Gateway رو بازی میکنه. این کار چطوری انجام میشه؟من میخوام به سایت گوگل وصل بشم و طبیعتا IP گوگل با IP من Net ID مشابهی نداره که در نتیجه کامپیوتر میفهمه باید این بسته به بیرون از LAN هدایت بشه. کامپیوتر من که نقش فرستنده رو داره میاد IP گوگل رو داخل اطلاعات گیرنده در بسته قرار میده، از طرفی برای آدرس مک گیرنده، میاد MAC Address روتر رو مینویسه.وقتی بسته به سوئیچ میرسه، اون میاد بسته رو به واسطه MAC Address به روتر میرسونه و حالا روتر بسته رو باز میکنه، به IP مقصد نگاه میکنه و طبق قوانین و استاندارد های خودش بسته رو به روتر بعدی (که مثلا مخابرات باشه) و... ارسال میکنه تا برسه به سرور گوگل.پروتکل ARP چیه؟ARP مخفف Address Resolution Protocolعه به معنی پروتکل پیدا کردن آدرس.وقتی دستگاهی IP یه دستگاه دیگه رو داره اما نمی‌دونه MAC اون دستگاه چیه، از ARP استفاده میکنه و با کمکش MAC دستگاه هدف رو پیدا میکنه. ARP چطوری کار میکنه؟شبکه فرضی ما:PC1: 192.168.1.10, MAC 00:11:22:33:44:55
PC2: 192.168.1.20, MAC 00:11:22:33:44:66
Gateway: 192.168.1.1, MAC AA:BB:CC:DD:EE:FFPC1 می‌خواد به PC2 پینگ بزنه. PC1 یه نگاه به جدول ARP cashe خودش میندازه تا ببینه MAC Address مربوط به 192.168.1.20 رو داره یا نه. اگه MAC Address مقصد وجود داشت که بسته ارسال میشه. اگه وجود نداشت PC1 یه ARP Request رو بصورت Broadcast توی شبکه ارسال میکنه. ARP Request برای همه ارسال میشه و داخلش نوشته شده که ایا آیپی شما برابر با فلان هست یا نه؟! اگه برابر بود، MAC Address خودتون رو به کسی که این بسته رو فرستاده، ارسال کنید. یه سوال! ARP Request چطوری برای همه ارسال میشه؟اگه توی بسته، مک آدرس گیرنده رو برابر کنیم با FF:FF:FF:FF:FF:FF سوئیچ میاد بسته رو برای تمام پورت هاش ارسال میکنه. ARP Request میرسه به PC2 و میبینه که بسته برای خودش ارسال شده (چون آیپی مقصد با آیپی خودش یکیه) تو قدم بعد میاد یک بسته‌ی ARP Reply ایجاد میکنه و آدرس مک خودش رو داخلش قرار میده.بسته‌ی ARP Reply بصورت Unicast به PC1 فرستاده میشه و وقتی جواب رو دریافت کرد، ARP Cashe خودش رو آپدیت میکنه تا هربار نخواد این درخواست رو ارسال کنه. وقتی مقصد بیرون LAN باشه (مثلا گوگل)، PC1 همین کارو برای Default Gateway انجام میده تا مک آدرس Gateway رو بگیره و بسته رو بهش بده.اگه ویندوز دارید توی cmd دستور arp -a رو وارد کنید تا جدول ARP رو ببینید.بررسی بیشتر پروتکل UDP و TCP.اون اوایل که داشتن روی ارتباطات کامپیوتری کار میکردن، پروتکل TCP رو ساختن تا یه روش مطمئن برای انتقال داده باشه. پروتکل TCP داده هارو به شکل درست و با دقت بالا به سمت مقصد ارسال میکرد و تضمین میده که تمام داده ها به درست ترین روش ممکن ارسال بشن. TCP به واسطه بررسی هایی که انجام میده حین انتقال داده، یکم سنگین و کند عمل میکنه و برای سرویس هایی مثل پخش زنده که سرعت خیلی مهه تر از دقته مناسب نبود. به همین دلیل پروتکل UDP معرفی شد که مثل TCP یه نوع از انتقال دادست اما تضمین کمتری میده، از طرفی سرعت بالاتری داره. درنتیجه UDP برای کارایی که سرعت مهم تر از دقت بود مثل پخش زنده یا بازی های آنلاین خیلی بهتره ولی اگه دقت برای ما ملاک باشه قطعا باید از TCP استفاده کنیم.این دو پروتکل داخل لایه Transport قرار دارن.TCP مخفف Transmission Control Protocolعه یعنی پروتکل کنترل انتقال. ویژگی‌ هاش:Reliability (قابل اعتماد بودن): هر segment شماره‌گذاری میشه. گیرنده وقتی دریافت کرد، پیام تایید (ACK) می‌فرسته. اگه تایید نرسید، دوباره از سمت فرستننده ارسال میشه.Error checking (کنترل خطا): اگه بسته خراب شد، TCP می‌فهمه و دوباره از فرستنده درخواست می‌کنه.Flow Control (کنترل جریان): اگه گیرنده سرعت کمتری داشته باشه، TCP خودش سرعت رو تنظیم می‌کنه تا گیرنده هنگ نکنه.پروتکل TCP قبل از اینکه بخواد داده هارو به سمت مقصد ارسال کنه، یک ارتباطی رو با مقصد برقرار میکنه و باهاش صحبت میکنه که بفهمه آماده دریافت داده هست یا نه. به این ویژگی پروتکل TCP میگن Connection Oriented و بریم بیشتر باهاش آشنا بشیم...Connection-Oriented تو 3 مرحله انجام میشه. چرا سه مرحله؟فرض کن میخوای به دوستت زنگ بزنی و باهاش حرف بزنی. قبل از اینکه شروع کنی، یه سری مقدمات لازمه!گوشی رو برمیداری و شمارش رو می‌گیری (یعنی میگی من میخوام وصل بشم).اون گوشی رو جواب میده و میگه: الو! صدات میاد، منم آماده‌ام. (یعنی هم جواب تو رو میده هم خودش اعلام میکنه آمادست).تو میگی: صدای تو هم بهم رسید. حالا می‌تونیم حرف بزنیم. (یعنی تایید نهایی)بعدش تازه مکالمه شروع میشه.تصور کن این ارتباط سه مرحله‌ایی نبود. اگه فقط یه طرف می‌گفت آمادم (مثلا تو فقط بگی الو من هستم) ولی طرف مقابل هیچوقت جواب نده، عملا هیچ ارتباطی شکل نمی‌گیره. اگه دو مرحله‌ ایی باشه (تو بگی الو، اون بگه منم هستم) ولی تو هیچوقت تایید نکنی، طرف مقابل مطمئن نیست که واقعا صدای اون بهت رسیده یا نه.سه مرحله باعث میشه هر دو طرف 100٪ مطمئن بشن که:طرف مقابل واقعا زنده و در دسترسه،شماره‌ ها و اطلاعات اولیه رد و بدل شده،میشه شروع به فرستادن داده کرد.اگه بخوام دقیق تر بگم، ارتباط 3 مرحله رو Three-Way Handshake مینامیم.قبل از بررسی Three-Way Handshake لازمه با این اصطلاحات آشنا باشیم...SYN: یعنی می‌خوام اتصال رو شروع کنم.ACK: یعنی گرفتم و تایید می‌کنم.ISN (Initial Sequence Number): شماره شروعی که هر طرف برای شمارش بایت‌ ها انتخاب می‌کنه.ISN در واقع یک عدد بزرگ و ظاهرا تصادفیه. ما مثال های ساده می‌زنیم تا فهمش آسون باشه، ولی در عمل، عددها بزرگ و تصادفین برای جلوگیری از تداخل با اتصال‌ های قدیمی.فرض کنیم:کلاینت ISN عدد 1000 رو انتخاب کرده.سرور ISN عدد 5000 رو انتخاب کرده.قدم اول از Three-Way Handshake: کلاینت یک بسته SYN با Sequence Number عدد 1000 میفرسته. تو میگی می‌خوام وصل شم، شماره‌ شروع من 1000عه. این بسته فقط پرچم SYN داره و Sequence = 1000.قدم دوم: سرور یک بسته SYN+ACK با Sequence Number عدد 5000 و Ack عدد 1001 ارسال میکنه.سرور میگه من دریافت کردم SYN تو رو، این شماره‌ شروع منه (5000)، و من ACK میکنم (جواب میدم) SYN تو رو با مقدار 1001. چرا 1001 انتخاب کرد؟ سرور میگه من شماره 1000 رو دیدم و من یک واحد جلوتر رو باید تایید کنم. اینطوری ACK برابر میشه با مقدار عدد Sequence Number از سمت کلاینت + 1.قدم سوم: کلایت بسته SYN+ACK رو دریافت و تایید میکنه.کلاینت میگه: هی سرور، ISN تو رو دریافت کردم، الان ACK با عدد 5001 میزنم برات. بعد از ارسال این بسته به سمت سرور، هردو وارد یک حالت پایدار میشن و میتونن داده جا به جا کنن.این بود از TCP و Three-Way Handshake که باعث میشه TCP یک پروتکل Connection Oriented باشه.بریم با UDP بیشتر آشنا بشیم...UDP مخفف User Datagram Protocol یعنی پروتکل دیتاگرام کاربره. UDP میگه من فقط بسته رو می‌فرستم، دیگه به من ربطی نداره رسید یا نه. ویژگی‌ هاش:Connectionless (بدون ارتباط): هیچ Handshake و مقدمه‌ ایی در کار نیست. همون اول انتقال داده ها انجام میشه.No reliability (غیر قابل اطمینان): نه شماره‌ گذاری داره، نه ACK.No ordering (بدون ترتیب): بسته‌ها ممکنه به ترتیب اشتباه برسن. UDP اهمیتی نمیده.خیلی سریع: چون به اندازه TCP چک و بررسی انجام نمیده.هرکدوم کجا استفاده میشن؟TCP:وب‌گردی (HTTP/HTTPS): نمیخوای نصف صفحه بیاد.ایمیل (SMTP, IMAP, POP3): باید کامل برسه.انتقال فایل (FTP, SFTP): نباید فایل خراب بشه و دقیقا همون چیزی که روی سرور هست، روی کلاینت هم بیاد.ریموت دسکتاپ (SSH, RDP): باید قابل اعتماد باشه.UDP:پخش آنلاین ویدیو/موزیک (Streaming): اگه یک فریم جا بیفته مهم نیست، مهم سرعته.بازی‌های آنلاین: نمیخوای حرکتت با تاخیر برسه، حتی اگه یک بسته گم بشه.تماس صوتی و تصویری (VoIP): کیفیت زنده مهم‌ تر از رسیدن 100% بسته‌ هاست.پورت (Port) چیه؟یه شرکت وجود داره به اسم مثلا X و این شرکت یه شماره تماس هم داره. من با این شماره تماس میگیرم.تماس رو یک سیستم خودکار پاسخ میده و شروع میکنه قسمت های مختلف شرکت رو معرفی میکنه. برای مثال میگه جهت ارتباط با واحد فروش عدد 1 رو وارد کنید، برای ارتباط با واحد فنی عدد 2 رو وارد کنید و...هر قسمت از شرکت، به شکل خاصی مدیریت شده و برای یک هدف خاص فعالیت میکنه. اپراتوری که برای قسمت فروش در نظر گرفته شده، نمیتونه پاسخ دهنده‌ سوالات فنی باشه چراکه اون اپراتور، فقط برای معرفی محصولات شرکت و فروش اونها مدیریت شده، اطلاعاتش تا حد محصولات شرکته. اگه درخواست فنی بهش بدم، پاسخ درستی دریافت نمیکنم.در نتیجه شرکت ها میان قسمت‌ یا سرویس‌های مختلف رو ایجاد میکنن، تا هر قسمت، پاسخ‌ گوی یک نیاز خاص از سمت مشتری ها (سرویس گیرنده‌ها) باشه.تو دنیای شبکه هم سمت کلاینت port هارو داریم و هم سمت سرور.مدیران شبکه اومدن به هر سرویس یک شماره یا Port اختصاص دادن، به این صورت که من باید به سرور متصل بشم و همزمان با این اتصال بگم که از کدوم سرویس روی سرور میخوام استفاده کنم. اینکارو با شماره port تعیین میکنم.همینطور که میدونید، شبکه و اینترنت تشکیل شده از یک عالمه قانون، پروتکل و استاندارد. این قوانین و پروتکل‌ها، تو تک تک دستگاه‌ ها وجود دارن.اگه یه نفر بخواد روی سرور، وبسایت بالا بیاره، باید یه Web Server نصب کنه، کدهای مربوط به سایت رو داخلش قرار بده تا هرکس که بهش درخواست زد، اون کد هارو براش بفرسته و مرورگر کاربر هم کد هارو بهش نمایش بده.حالا کسایی که قوانین اینترنت و شبکه هارو ساختن، گفتن که وب سرور‌ها باید روی پورت 80 کار کنن. یعنی شمایی که میخوای روی سرورت سایت بالا بیاری، باید این سایت روی پورت 80 سرورت فعال باشه. یعنی سرور همیشه باید درحال گوش دادن باشه که اگه، یه نفر بهش درخواست زد و توی درخواستش گفته بود که میخوام به پورت 80 وصل بشم، بیاد وصلش کنه به Web Server و مابقی کارهارو انجام بده. حالا همین قانون تو سمت Client هم وجود داره، یعنی برای مرورگر من تعیین شده که اگه بخواد وصل بشه به یک سایت، باید درخواستش رو به پورت 80 اون سرور ارسال کنه. درنتیجه این قوانین به هر دو طرف ارتباط کمک میکنن تا بتونن درخواست هارو به سرویس های درست ارسال/دریافت کنن.شماره پورت ها از 0 شروع میشه تا 65535.صد در صد مثل هرچیز دیگه داخل شبکه، برای Port ها هم قانون وجود داره.پورت شماره 0 تا 1023 به عنوان پورت های معروف و رزرو شده شناخته میشن. اکثر سرویس‌ های معروف روی یکی از این پورت‌ها وجود دارن. برای مثال پروتکل HTTP با پورت 80 کار میکنه. یا پروتکل HTTPS با پورت 443.پورت شماره 1024 تا 49151 به عنوان پورت های ثبت شده شناخته میشه. فرضا یه شرکت میاد نرم‌ افزاری رو ایجاد میکنه و میره به شرکت IANA میگه من میخوام نرم‌ افزارم روی پورت 3306 شناخته بشه. وقتی یه شرکت میاد پورتش رو ثبت میکنه، به این معنیه که من روی سرورم، با این پورت فلان سرویس رو ارائه میدم! حالا این ثبت کردنه به این معنی نیست که اون پورت کلا مسدود میشه و کس دیگه‌ ایی نتونه استفادش کنه.پورت شماره 49152 تا 65535 به عنوان پورت های موقتی کلاینت شناخته میشن. بزار بیشتر توضیح بدم...کالینت وقتی میخواد به یه کامپیوتری متصل بشه، میاد یک Port تصادفی ایجاد میکنه و ارتباطش رو به این پورت گره میزنه. چرا اینکارو میکنه؟شما در آن واحد با چندین سرور و کامپیوتر دیگه ارتباط دارید. برای مثال داخل مرورگر کروم تب های مختلفی بازه که هرکدوم سایت خاصی رو بالا اوردن، از طرفی ممکنه نرم افزارهایی مثل تلگرام هم روی سیستمتون باز باشه که اون هم اتصالات خاص خودشو داره. کامپیوترها این Port های تصادفی رو ایجاد میکنن که وقتی بسته ایی رو ارسال میکنن به مقصد و جوابش برمیگرده، بدونن این جوابی که اومده مربوط به کدوم سرویس یا نرم افزار میشه.سیستم عامل از رنج شماره 49151 تا 65553 یک عددی رو انتخاب میکنه و اختصاص میده به یک سرویس موقت.توی cmd با دستور netstat -n میتونید درخواست هایی که ارسال و دریافت شدن رو به همراه پورت هاشون ببینید.یکم بالاتر گفتم پورت های 0 تا 1023 برای سرویس های معروف درنظر گرفته شده. چندتا از این پورت‌ها و سرویس‌ ها رو معرفی کنم...در کنار پورت های نرم افزاری که تا الان باهاشون آشنا شدیم، پورت های سخت‌ افزاری هم داریم که USB یه نمونه از این پورت هاست. به اون درگاهی که من یه کابل یا چیزی رو بصورت سخت‌ افزاری وارد میکنم، پورت سخت‌ افزاری گفته میشه.رسیدیم به آخر مقاله. خسته نباشید.امیدوارم راضی بوده باشید و تونسته باشم مفاهیم رو به خوبی بهتون انتقال بدم.اگه از این آموزش خوشتون اومد و به موضوع بدافزار، سیستم عامل و برنامه نویسی علاقه مندید، حتما با من همراه باشید تا از دیگر آموزش ها و نکات تجربی که در اختیار عموم قرار میدم، استفاده کنید.</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Tue, 09 Dec 2025 01:23:41 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش جامع سوکت نویسی با پایتون</title>
                <link>https://virgool.io/codenevis/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AC%D8%A7%D9%85%D8%B9-%D8%B3%D9%88%DA%A9%D8%AA-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-ywuyz0kukmgm</link>
                <description>سلام وقت همگی بخیر.امیرحسین ناظوری هستم و خیلی خوش اومدید به یکی از مقالات سنگین و حجیم و عجیبم داخل ویرگول 😉تو این مقاله قصد دارم در مورد سوکت نویسی یا برنامه نویسی شبکه با زبان پایتون، یسری مطالب رو آموزش بدم.اگه به موضوعات مربوط به برنامه نویسی، بدافزار و سیستم عامل علاقه مندید، سایت و شبکه های اجتماعیم رو دنبال کنید 👍برای درک این آموزش، شما باید با زبان Python و مقدمات شبکه آشنا باشید.من یه ویدیو طولانی داخل کانال یوتیوبم قرار دادم و مقدمات شبکه رو به ساده ترین روش ممکن که در توانم بود، توضیح دادم. در صورت لزوم از اون ویدیو شروع کنید. (مشاهده ویدیو)در ابتدا لازمه بررسی کنیم که برنامه نویسی شبکه چیه و کجاها کاربرد داره.برنامه نویسی شبکه یعنی نوشتن برنامه هایی که بتونن با برنامه های دیگه، داخل کامپیوترهای دیگه ارتباط بگیرن. به زبان ساده تر یعنی برنامت فقط روی کامپیوتر خودت کار نمیکنه، بلکه میتونه با کامپیوترهای دیگه ارتباط بگیره و داده ارسال و دریافت کنه.وقتی شما وارد مرورگر میشی و سایت google رو باز میکنی، مرورگرت یه برنامه ایی هست که تحت شبکه نوشته شده و میره متصل میشه به سرور گوگل.برنامه نویسی شبکه کجاها کاربرد داره؟ تقریبا همه جا. چندتا از مهمترین کاربردهاش:وب و اینترنت: برنامه هایی مثل مرورگر، نرم افزارهای چت محور (مثل تلگرام)، بازی های آنلاین، وب سرویس ها و...ابزارهای مدیریت شبکه: برنامه هایی که کمک میکنن شبکه رو مدیریت کنیم، از برنامه نویسی شبکه استفاده میکنن تا ارتباط بین کامپیوترها و شبکه ها رو فراهم کنن.هک و امنیت: ابزارها یا برنامه هایی که این امکان رو میدن تا بتونیم ترافیک های مختلف رو شنود کنیم، دارن از برنامه نویسی شبکه استفاده میکنن. یا بدافزاری که روی کامپیوتر هدف اجرا میشه و وصل میشه به سرور کنترلش، داره از مدل برنامه نویسی شبکه استفاده میکنه.تو اندروید، نرم افزارهایی مثل SHAREit یا Zapya تحت شبکه برنامه نویسی شدن تا شما اون هارو نصب کنید و از طریقشون، فایل هایی رو داخل یک شبکه ردوبدل کنید.Socket چیه و چه ارتباطی با برنامه نویسی شبکه داره؟یه رستوران رو تصور کن. این رستوران یه آشپزخونه داره که پخت و پز داخلش انجام میشه، آشپزخونه ساختار و پیچیدگی خودشو داره و اصولا کسی از بیرون واردش نمیشه تا سفارش ثبت کنه. وقتی شما میری رستوران، باید به پیشخدمت سفارشت رو ثبت کنی. پیشخدمت رابط بین تو و آشپزخونه ایی میشه که قراره درخواستت رو آماده کنه و اینم در نظر بگیر که آشپزخونه داره چندین غذارو باهم آماده میکنه و کلا یه پیچیدگی و شلوغی خاصی اونجا حکم فرماست.طبق این مثال، پیشخدمت نقش Socket رو بازی میکنه.وقتی یک نرم افزار قراره ارتباط شبکه ایی با یک نرم افزار دیگه برقرار کنه، باید بتونه با لایه های مختلف OSI صحبت کنه، سخت افزار و کارت شبکه رو مدیریت کنه، پورت هارو مدیریت کنه و... سیستم عامل نمیزاره هرکسی که از راه رسید بیاد و این بخش هارو به روش خودش مدیریت کنه و ازشون استفاده کنه، سیستم عامل میاد Socket رو ارائه میده، تا من بتونم به روش امن تر و کنترل شده تر از شبکه و برنامه نویسی شبکه استفاده کنم.درنتیجه، برای برقراری ارتباط بین دو کامپیوتر، باید درون هرکدوم یک سوکت ساخته بشه و به واسطه این سوکت ها، ارتباط رو برقرار میکنیم.سوکت به زبان ساده ترکیبی از IP و Portعه که در ادامه بیشتر باهاش آشنا میشیم.شروع سوکت نویسی با پایتون.نکته. برنامه نویسی شبکه (سوکت نویسی) فقط مختص به پایتون نمیشه و با زبان های مختلف میتونیم تحت شبکه برنامه نویسی کنیم.برای برنامه نویسی شبکه در پایتون، کتابخونه های مختلفی وجود داره که تو این آموزش قراره با کتابخونه socket کار کنیم.همینطور که بالاتر گفته شد، باید هم سمت Server یک سوکت ایجاد کنیم و هم سمت Client و در نتیجه از طریق این سوکت ها ارتباط رو برقرار کنیم. کد زیر مربوط میشه به ساخت Socket سمت سرور:import socket # بصورت پیشفرض داخل پایتون وجود داره

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# AF_INET = IPv4
# SOCK_STREAM = TCP (Connection Oriented)یه متغیر ساختم به اسم s و برای مقدارش از کلاس socket که داخل ماژول socket وجود داره استفاده کردم. تو ورودی کلاس socket دوتا آرگومان رو نوشتم. با آرگومان اول مشخص کردم، Socketیی که میخوام بسازم، باید از IPv4 استفاده کنه. با آرگومان دوم مشخص کردم که باید از پروتکل TCP برای ساخت Socket استفاده کنه.حالت های دیگش:s2 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
# AF_INET6 = IPv6
# SOCK_DGRAM = UDP (Connection Less)
# ترکیبی هم میشه استفاده کردیه فایل داریم به اسم server.py و کدهای زیر داخلش قرار داره:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)این کد تا به الان فقط قالب اون سوکت رو آماده کرده. به این صورت قالب بندی کرده که سوکت باید از IPv4 و TCP استفاده کنه.تو قدم بعدی باید تعریف کنم که سوکت، روی چه آیپی و پورتی باید سوار بشه. کد:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;127.0.0.1&quot;, 50111))متد bind به سوکت میگه IP و پورتی که به عنوان ورودی گرفتم رو، رزرو کن. تا قبل از bind سوکت فقط یه در ارتباطی خالیه. بعد از bind یه آدرس داره که سیستم عامل میدونه باید روی اون آدرس، بسته های مربوط به سوکت رو ارسال/دریافت کنه.متد bind یک ورودی Tuple میگیره. داخل Tuple باید ابتدا آدرس IP که میخوام سوکت روی اون فعال بشه رو وارد کنم. برای این آدرس مقادیر مختلفی میتونم بنویسم.localhost: اگه این کلمه رو بنویسم یعنی سوکت فقط روی کامپیوتر خودم ساخته بشه و کسی نمیتونه بهش متصل بشه (حتی اگه داخل یک LAN باشیم)127.0.0.1: اگه این IP رو قرار بدم فرقی با localhost نداره (برای زمان هایی که بخوام سرور و کلاینت رو روی یک کامپیوتر اجرا کنم)192.168.1.100: میتونم IP محلی خودم رو قرار بدم و بگم درخواست ها باید سمت این IP ارسال بشه که با این حرکت دیگر کامیپوترهای موجود در LAN میتونن وصل بشن.ورودی دوم Tuple مربوط میشه به شماره پورتی که سوکت باید روی اون فعال بشه. پیشنهاد میکنم از پورت 1024 تا 65535 یه عددی رو انتخاب کنید.تا الان سوکت رو ساختیم و با متد bind یک IP و Port رو براش مشخص کردیم.تو قدم بعد باید سوکت رو ببرم تو حالت انتظار یا گوش دادن. با این حرکت به سیستم عامل میگم اون سوکتی که ساختم رو بزارش روی حالت گوش دادن تا اگه درخواستی از سمت Client اومد متوجه بشه.import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;127.0.0.1&quot;, 50111))

s.listen(1)وقتی چند Client همزمان میخوان وصل بشن، سیستم باید یک صف از درخواست های درحال انتظار درست کنه.ورودی که متد listen دریافت میکنه تعداد حداکثر اتصالاتی هست که میتونن توی اون صف، منتظر بمونن. مثال:s.listen(5)تو کد بالا گفتم اگه 5 تا Client همزمان درخواست بدن و Server هنوز هیچکدوم رو accept نکرده باشه، درخواست ششم رو رد کن. این حرکت باعث نمیشه که سرور بیشتر از 5 تا Client رو قبول نکنه، فقط گفته که 5 تا بیشتر تو صف نمونن. (توی فایل server.py همون کد s.listen(1) رو نوشتم)برای درک بهتر مراحل، فرض کن یه مغازه باز کردی!socket: ساختن یا اجاره مغازه.bind: نصب تابلو با آدرس و شماره تماس.listen: باز کردن در مغازه و گذاشتن صف برای مشتری ها.accept: پذیرش هر مشتری و شروع گفتگو.درنتیجه، بعد از اینکه socket رفت روی حالت listen، باید درخواست هایی که ارسال میشه رو accept کنیم.import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;127.0.0.1&quot;, 50111))

s.listen(1)

client, address = s.accept()وقتی متد accept میاد یک درخواست رو قبول میکنه یا به عبارتی، میاد یک ارتباطی رو ایجاد میکنه، دوتا مقدار رو برمیگردونه و من این مقادیر رو داخل client و address ذخیره کردم.client: زمانی که accept اجرا میشه، یه سوکت جدید ساخته میشه که این سوکت فقط مختص به همون کلاینتیه که درخواستش قبول شده. این سوکت جدید با سوکت اصلی که تو متغیر s ذخیره کردم متفاوته و کتابخونه سوکت اینکارو انجام میده تا سوکت/ارتباط هر کلاینت مجزا باشه و از طرفی، سوکت اصلی، رو همون حالت و آدرس ها درحال listen بمونه تا بتونه به دیگر درخواست ها واکنش نشون بده. پس تو متغیر client سوکت جدید قرار میگیره و از این لحظه به بعد هرکاری با اون کلاینت داشته باشم رو باید با این متغیر انجام بدم.address: تو این متغیر IP و Port کلاینت در قالب Tuple ذخیره میشه.عکس پایین مراحل ارتباط دوتا socket رو نشون میده.همینطور که قبلا گفتیم، سوکت باید هم سمت Server ساخته بشه هم سمت Client. طبق عکس، تو سمت Server اول از همه باید یک socket تعریف بشه. اینکارو با کد زیر انجام دادیم:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)بعدش باید سوکت رو روی یک آدرسی bind کنیم و با کد زیر اینکارو انجام دادیم:s.bind((&quot;127.0.0.1&quot;, 50111))تو قدم بعدی، سوکت باید روی حالت listen بره و منتظر بمونه تا درخواست ها سمتش ارسال بشن.s.listen(1)تو قدم بعدی باید متد accept رو تعریف کنیم تا درخواست هایی که از سمت Client ها ارسال میشه رو قبول کنیم.client, address = s.accept()حالا به سمت Client دقت کن.تو سمت کلاینت هم اولین قدم، ساخت socket هست. (دارم فایل client.py رو مینویسم)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)قدم بعدی ارسال درخواست به سمت Serverعه.s.connect((&quot;127.0.0.1&quot;, 50111))فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;127.0.0.1&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection:\nclient: {client}\naddress: {address}&quot;)

client.send(b&quot;Hello Client&quot;)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;127.0.0.1&quot;, 50111))

print(&quot;Ok&quot;)

print(s.recv(1024))من میام server.py رو اجرا میکنم و برنامه میره رو حالت listen.بعدش میام client.py رو اجرا میکنم. به محض اجرا شدن، هر دو فایل خروجی هایی رو برمیگردونن.خروجی server.py:New Connection:
client: &lt;socket.socket fd=180, family=2, type=1, proto=0, laddr=(&#039;127.0.0.1&#039;, 50111), raddr=(&#039;127.0.0.1&#039;, 63716)&gt;
address: (&#039;127.0.0.1&#039;, 63716)خروجی client.py:Ok
b&#039;Hello Client&#039;تو فایل server.py گفتم هرموقع درخواستی رو accept کردی بیا مقدار متغیر client و server رو نمایش بده.بعدش متغیر client رو صدا زدم، این متغیر اختصاص داره به همون کلاینتی که از طریق سوکت بهم متصل شده و، متد send رو فراخانی کردم، یعنی میخوام یه داده ایی رو برای اون کلاینت بفرستم. توی ورودی متد متن Hello Client رو بصورت byte ارسال کردم (راجب این متد بعدا توضیح میدم)توی فایل client.py متد connect رو نوشتم و آدرس سروری که میخوام بهش وصل بشم رو در قالب Tuple وارد کردم. بعدش print رو قرار دادم که اگه تونست به سرور متصل بشه، متن OK رو print کنه. در آخر متغیر s رو که مربوط میشه به ارتباط من با سوکت هدف رو صدا زدم و متد recv رو فراخانی کردم. این متد منتظر میمونه تا داده ایی از طرف مقابل ارسال بشه و دریافت کنه، حالا من چیزی که تو سمت سرور ارسال کردم رو اینجا دریافت و print میکنم که خروجی همون Hello Client هست.به مقدار متغیر address که موقع accept کردن ارتباط ساخته شده دقت کن:address: (&#039;127.0.0.1&#039;, 63716)اینجا IP و Port کلاینت رو میبینم. کلاینت وقتی میخواد به یک کامپیوتری متصل بشه، میاد یک Port تصادفی ایجاد میکنه و ارتباطش رو به این پورت گره میزنه. چرا اینکارو میکنه؟ شما در آن واحد با چندین سرور و کامپیوتر دیگه ارتباط دارید، برای مثال داخل مرورگر تب های مختلفی بازه که هرکدوم سایت خاصی رو بالا اوردن، از طرفی ممکنه نرم افزارهایی مثل تلگرام هم روی سیستمتون باز باشه که اون هم اتصالات خاص خودشو داره. کامپیوترها این Port های تصادفی رو ایجاد میکنن که وقتی بسته ایی رو ارسال میکنن به مقصد و جوابش برمیگرده، بدونن این جوابی که اومده مربوط به کدوم سرویس یا نرم افزار میشه.یه دستور وجود داره به اسم netstat -n که میتونم درخواست های ارسال/دریافت شده رو به همراه Portشون ببینم.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

input(&quot;Accept?&quot;)

client, address = s.accept()

print(f&quot;New Connection:\nclient: {client}\naddress: {address}&quot;)

client.send(b&quot;Hello Client&quot;)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Ok&quot;)

print(s.recv(1024))یه ترمینال باز کردم و فایل server.py رو اجرا کردم. به محض اجرا شدن عبارت ?Accept رو چاپ کرد که یعنی سوکت ساخته شد، bind شد و رفت روی حالت listen با تعداد 1 کاربر ولی تا زمانی که من Enter نزنم، دستور بعدی که accept هست اجرا نمیشه. میزارم روی همین input بمونه.سه تا ترمینال دیگه باز میکنم و داخل هرکدوم، فایل client.py رو فراخانی میکنم.ترمینال اول که فایل رو داخلش اجرا کردم مقدار OK رو برگردوند. یعنی تونست به سرور connect بشه.داخل ترمینال دوم هم فایل رو اجرا میکنم و مجدد مقدار OK چاپ میشه.داخل ترمینال سوم هم فایل رو اجرا میکنم ولی خروجی برنمیگرده، بعد از مدتی خطای Connection timed out میده.سوال! من تو سمت Server متد accept رو نزاشتم فراخانی بشه، پس چرا خروجی client.py مقدار OK بود و خطا نداد؟ متد connect که تو سمت Client وجود داره میاد یک Three-Way Handshake رو با Server انجام میده و وقتی این Three-Way Handshake کامل بشه، میره سراغ خط بعد که در نتیجه OK چاپ میشه. connect ارتباطی با accept نداره چون اون سمت Server هست و connect فقط وظیفش اینه که یک Connection-Oriented با سرور برقرار کنه، حالا اینکه سرور اون درخواست رو accept کنه یا نه به خودش مربوطه ولی تا اینجای داستان connect تو وظیفه ی خودش موفق بوده و خطا نداد.سوال بعدی! من برای listen تعیین کردم که فقط 1 نفر بتونه تو صف انتظار بمونه. چرا وقتی ترمینال اول هنوز accept نشده، ترمینال دوم تونسته یک Three-Way Handshake انجام بده و همراه با ترمینال اول بره داخل صف انتظار؟ بزار خیلی ساده بگم! عددی که من به listen ورودی میدم، میتونه تو سیستم عامل های مختلف یکم بزرگتر در نظر گرفته بشه، هر سیستم عامل ممکنه رفتار متفاوتی نسبت به این عدد نشون بده که دلایل فنی داره و من نمیخوام بیام ریز بشم که چرا و چطور! فقط این رو بدونید که برمیگرده به کرنل سیستم عامل.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection: {address}&quot;)

client.send(b&quot;Hello Client&quot;)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(s.recv(1024))وقتی Server تو حالت listen باشه و یک Client بهش درخواست بزنه، اون رو accept میکنه، پیام Hello Client رو براش ارسال میکنه و برنامه یا سوکت بسته میشه. من میخوام Server همیشه تو حالت listen بمونه. برای اینکار میتونم کدم رو بدین شکل تغییر بدم:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

while True:
    client, address = s.accept()

    print(f&quot;New Connection: {address}&quot;)

    client.send(b&quot;Hello Client&quot;)داخل حلقه while متد accept رو فراخانی کردم، برنامه روی اون متد منتظر میمونه تا درخواستی بیاد و قبولش کنه. وقتی درخواستی رو قبول کرد، print اجرا میشه و بعد از اون هم یک پیغامی به سمت Client فرستاده میشه. بعد از این موارد، مجدد حلقه تکرار میشه و برنامه روی accept منتظر میمونه تا درخواست دیگه ایی بیاد و قبولش کنه.اگه بخوام ارتباطم رو یکبار accept کنم و دستورات مربوط به ارسال پیام مدام اجرا بشه:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection: {address}&quot;)

while True:
    msg = input(&quot;Enter message: &quot;).encode()

    client.send(msg)وقتی این کد رو برای Server نوشتم باید سمت Client هم به شکلی کد رو بنویسم که مدام بیاد داده ایی رو دریافت و نمایش بده:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connect Successfully&quot;)

while True:
    print(s.recv(1024).decode())فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

while True:
    client, address = s.accept()

    print(f&quot;New Connection: {address}&quot;)

    msg = input(&quot;Enter Message: &quot;).encode()
    client.send(msg)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connect Successfully&quot;)

print(s.recv(1024))یه ترمینال باز میکنم و فایل server.py رو اجرا میکنم که روی accept منتظر میمونه.یه ترمینال دیگه باز میکنم و client.py رو اجرا میکنم. به محض اجرا شدن عبارت Connect Successfully رو چاپ میکنه و روی متد recv منتظر میمونه تا داده ایی از سمت سرور ارسال بشه. همچنین تو ترمینال Server عبارت New Connection به همراه اطلاعات Client چاپ میشه.توی ترمینال مربوط به Server پیام Hi رو مینویسم و Enter میزنم که این پیام سمت کلاینت ارسال میشه و نمایش میده.بعد این مراحل سوکت کلاینت بسته میشه اما سوکت سرور همچنان باز و روی حالت listen قرار داره (چون داخل حلقه نوشتم)یبار دیگه client.py رو اجرا میکنم ولی تو سمت سرور پیامی رو ارسال نمیکنم، یعنی رو همون recv منتظر میمونه.یه ترمینال دیگه هم باز میکنم و client.py رو اجرا میکنم، به محض اجرا شدن عبارت Connect Successfully رو نمایش میده که یعنی Three-Way Handshake رو تونسته با سرور انجام بده اما تو ترمینال مربوط به Server عبارت New Connection چاپ نمیشه چون درخواست هنوز accept نشده و توی صف قرار گرفته.اگه من توی ترمینال سرور عبارت Hello رو بنویسم و Enter بزنم، پیغام برای ترمینال اول ارسال میشه و سوکت بسته میشه، بعدش درخواست ترمینال دوم که داخل صف قرار داشت، accept میشه و حالا میتونم به اون یک پیغامی رو ارسال کنم.سوالی که به وجود میاد اینه که هر سوکت یا Client رو چطور جداگانه ذخیره کنم تا بصورت همزمان بتونم با چندین Client ارتباطم رو داشته باشم؟! برای این مورد باید از برنامه نویسی چندنخی کمک بگیریم و هر Client رو به یک thread اختصاص بدیم. شاید بعدها این مورد رو توضیح دادم.یه سوال دیگه. چطور با Client (فرضا یه دونه کلاینت) ارتباط Full-Duplex داشته باشم؟ ارتباط Full-Duplex یعنی بصورت همزمان هم بتونم ارسال انجام بدم و هم دریافت داشته باشم. خود پروتکل TCP بصورت Full-Duplex کار میکنه اما متدهایی مثل recv توی socket باعث میشن برنامه بلاک بشه تا زمانی که داده ایی دریافت کنه. برای حل این مشکل میتونیم send و recv رو داخل thread های جدا تعریف کنیم.سوکت نویسی با UDP به چه شکله؟UDP چون Connectionlessعه به متدهایی مثل listen و accept تو سمت سرور و به متد connect تو سمت کلاینت احتیاجی نداره.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.bind((&quot;localhost&quot;, 50111))

data, client = s.recvfrom(1024)
print(f&quot;from: \&quot;{client}\&quot; data: \&quot;{data}\&quot;&quot;)

s.sendto(b&quot;Hi Client&quot;, client)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.sendto(b&quot;Hi&quot;, (&quot;localhost&quot;, 50111))

data, server = s.recvfrom(1024)

print(f&quot;from \&quot;{server}\&quot; data: \&quot;{data}\&quot;&quot;)متد send و recv متدهایی هستن که داخل Object مربوط به Client در TCP وجود دارن. چون از UDP استفاده کردم، سوکت خاصی رو نساختم و بنابراین باید از متدهای sendto و recvfrom که داخل خود s یا Object اصلی socket وجود دارن استفاده کنم.متد recvfrom تا زمانی که بسته ایی براش ارسال نشه بلاک میمونه و وقتی چیزی ارسال بشه، اون رو دریافت میکنه و داده رو داخل data ذخیره میکنه. همچنین اطلاعات کسی که داده رو ارسال کرده بصورت Tuple درون server قرار میده. متد sendto داده و مشخصات کسی که داده رو باید براش ارسال کنه رو میگیره.بررسی متد send و recv در TCP Connection.زمانی که ارتباط بین دو سوکت برقرار میشه، باید با متدهای send و recv بسته هایی رو ارسال و دریافت کنیم و بعد از اتمام کار، با متد close سوکت رو ببندیم.متد send یک ورودی رو بصورت byte دریافت میکنه و به سمت مقصد ارسال میکنه. این متد، هم برای Client وجود داره و هم برای Server.زمانی که داده ایی به سمت مقصد ارسال میشه، اون داده وارد بافر سیستم عامل میشه. متد recv میاد از بافر، اطلاعاتی که به سمت سوکت اومده رو دریافت و برمیگردونه. تو ورودی این متد باید حداکثر تعداد بایتی که میخوام از بافر بیرون بکشه رو مشخص کنم. برای مثال:s.recv(1024)اینجا گفتم 1024 بایت رو برام بیرون بکش. اگه متد recv صدا زده بشه ولی چیزی توی بافر نباشه (یعنی send تو طرف مقابل انجام نشده باشه) برنامه بلاک میشه و منتظر میمونه داده ایی داخل بافر قرار بگیره و بعد بیرون بکشه.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

client.send(b&quot;Hello&quot;)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(s.recv(1))خروجی فایل client.py:b&#039;H&#039;ورودی متد recv رو 1 قرار دادم که یعنی فقط 1 بایت از بافر بیرون بکشه و فقط کاراکتر اول عبارت Hello رو برگردوند. فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

while True:
    msg = s.recv(1).decode()

    if msg == &quot;&quot;:
        break

    print(msg)خروجی:H
e
l
l
oاز سمت سرور یکبار send انجام شد و اون مقادیر داخل بافر مقصد قرار گرفتن، حالا client.py هربار میره 1 بایت از بافر بیرون میکشه، بررسی میکنه که آیا چیزی که بیرون کشیده با یک رشته خالی برابر هست یا نه، اگه برابر نبود همون رو چاپ میکنه و اگه برابر بود حلقه شکسته میشه.متد recv محدودیتی برای تعیین حداکثر بایت نداره ولی باید به منابع سیستم نگاه کنیم و یه عدد معقول رو قرار بدیم.یه متد دیگه وجود داره به اسم sendall که اگه بخوام خلاصه بگم، نسخه بهتر و قابل اطمینان تر متد sendعه و پیشنهاد میکنم از این متد استفاده کنید.یه توضیح راجب non-blocking بدم. متد recv همینطور که گفته شد وقتی داده ایی داخل بافر نباشه میره روی حالت بلاک. به دو روش میتونیم این رفتار رو تغییر بدیم. روش اول:s.setblocking(False)
# معادل
s.settimeout&#40;0.0&#41;تو این حالت، recv اصلا منتظر نمیمونه، به محض اجرا شدن و نبودن داده داخل بافر، خطای BlockingIOError رو اجرا میکنه. روش دوم:s.settimeout&#40;3&#41;تو این روش، recv سه ثانیه منتظر میمونه و بعد خطای BlockingIOError رو اجرا میکنه :)چطوری فایل ارسال/دریافت کنم؟فرقی نداره حجم فایل چقدره، همیشه باید فایل رو با یک اندازه مشخص به قطعه های کوچیک تقسیم و ارسال کنیم. فرضا یه فایل دارم با حجم 50MB و میخوام ارسالش کنم. میام هربار 64KB از فایلم رو میخونم و ارسال میکنم و تو مقصد هربار 64KB دریافت میشه و داخل فایل، write میکنه.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(&quot;Connection OK&quot;)

input(&quot;Send?&quot;)
with open(&quot;send.mp4&quot;, &quot;rb&quot;) as mp4:
    chunk = mp4.read(65536) # 64KB

    while chunk:
        client.sendall(chunk)
        chunk = mp4.read(65536)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connec with Server is OK&quot;)

with open(&quot;recv.mp4&quot;, &quot;wb&quot;) as mp4:
    data = s.recv(65536) # 64KB

    while data:
        mp4.write(data)
        data = s.recv(65536)تو سمت Server وقتی فایل به انتها میرسه و متد recv فراخانی میشه، چون چیزی برای خوندن نمونده مقدارb&#039;&#039;داخل متغیر chunk قرار میگیره. میدونید که این مقدار حالت False داره و وقتی برای شرط مربوط به حلقه while ازش استفاده کردم، یعنی تا زمانی حلقه اجرا بشه و عمل خوندن/ارسال انجام بشه که، چیزی داخل chunk قرار گرفته باشه. با این کار هم تو سمت Client و هم تو سمت Server حلقه رو تا زمانی جلو میبرم که مقادیری برای خوندن و ارسال وجود داشته باشه و حلقه همیشه اجرا نمونه.متد close و بستن سوکت.بعد از ساخت سوکت، برقراری ارتباط و تبادل داده ها، نوبت به پایان ارتباط و بستن سوکت میرسه.متد close زمانی که صدا زده میشه، سوکت ساخته شده رو نابود و منابع مربوط به اون هم آزاد میکنه، همچنین مقدار زیر هم به سمت طرف مقابل ارسال میکنه تا طرف مقابل متوجه بشه که سوکت بسته شده:b&#039;&#039;فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection: {address}&quot;)

while True:
    msg = input(&quot;Message for send to client: &quot;)

    if msg != &quot;exit&quot;:
        client.send(msg.encode())
    else:
        client.close()
        breakفایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connect Successfully&quot;)

while True:
    msg = s.recv(1024)

    if msg:
        print(f&quot;from server: {msg.decode()}&quot;)
    else:
        s.close()
        breakاگه ارتباط از یک سمت بصورت ناگهانی قطع بشه (یعنی بدون close)، بسته ایی برای طرف مقابل ارسال نمیشه و ما باید با مدیریت خطاها یا موارد مربوط به timeout این موضوع رو مدیریت کنیم.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection: {address}&quot;)

while True:
    msg = input(&quot;Message for send to client: &quot;)

    if msg != &quot;exit&quot;:
        client.send(msg.encode())
    else:
        client.close()
        breakفایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connect Successfully&quot;)

while True:
    msg = s.recv(1024)

    if msg:
        print(f&quot;from server: {msg.decode()}&quot;)
    else:
        s.close()
        breakفایل server و client رو اجرا میکنم و برنامه تو سمت سرور روی input بلاک میشه و تو سمت client هم روی recv بلاک میشه. تو سمت سرور داده ایی رو مینویسم و enter میزنم، این داده به سمت client ارسال میشه و client از حالت بلاک خارج، و داده رو نمایش میده. چون از while استفاده کردم، کلاینت تو recv دوباره بلاک میشه و server هم تو input.میام فایل client رو میبندم، تو سمت سرور داده ایی رو مینویسم و enter میزنم، سرور اون داده رو با متد send ارسال میکنه و خطایی برنمیگرده (در صورتی که من فایل client رو بستم و اون سوکت وجود نداره)مجدد روی input قفل میشه که من چیزی مینویسم و enter میزنم، الان دوباره متد send میخواد اجرا بشه ولی خطای BrokenPipeError میده.چرا بار اول که متد send اجرا شد و سوکت کلاینت بسته شده بود خطا دریافت نکردم و بار دوم خطا داد؟حقیقتا دلیل فنیش خیلی پیچیده و تخصصیه ولی اگه بخوام ساده توضیح بدم، باید بگم که...ارسال (send) اولی موفق بود چون داده رو تو بافر خروجیِ، کرنل گذاشت! یعنی هنوز کرنل خبر نداشت یا FIN/RST از طرف مقابل پردازش نشده بود که ارتباط قطع شده. بین send اول و دوم، کرنل فهمید که طرف مقابل ارتباط رو بسته، پس وقتی دوباره send کردم، خطای EPIPE تولید شد که پایتون تبدیلش میکنه به BrokenPipeError.خطای BrokenPipeError یعنی میخوام با سوکتی ارتباط بگیرم یا به سوکتی ارسال و دریافت داشته باشم که بسته شده.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection: {address}&quot;)

while True:
    try:
        msg = input(&quot;Message for send to client: &quot;)

        if msg != &quot;exit&quot;:
            client.send(msg.encode())
        else:
            client.close()
            break

    except BrokenPipeError:
        print(&quot;Connection Closed&quot;)
        client.close()
        breakفایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connect Successfully&quot;)

while True:
    msg = s.recv(1024)

    if msg:
        print(f&quot;from server: {msg.decode()}&quot;)
    else:
        s.close()
        breakتو کدهای بالا من سوکت اصلی که تو متغیر s ذخیره شده رو نبستم. دقت کنید هرجا که ارتباط قراره کلا قطع بشه، باید سوکت اصلی رو هم close کنیم.ساخت یک Port Scan با کمک socket.پورت اسکن یعنی بررسی کنیم چه پورت هایی روی یک سیستم باز هستن و گوش میدن.موقع اتصال به یک پورت، سه حالت ممکنه رخ بده:Open: سوکت به مقصد وصل میشه. یعنی روی اون پورت یه سرویس در حال گوش دادن وجود داره.Closed: مقصد بلافاصله میگه این پورت و سرویس، فعال نیست (به شکل RST برمیگرده).Filtered: مثلا فایروال وسطه و اجازه نمیده بفهمی پورت بازه یا بسته. معمولا نتیجشش میشه timeout یا reset مبهم.متدی وجود داره به اسم connect_ex که بعد از درخواست به پورت، عددی رو برمیگردونه، اگه اون عدد 0 باشه یعنی پورت بازه و اگه هرچیز دیگه ایی باشه یعنی پورت بستس.import socket

for port in range(1, 65536):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout&#40;1&#41;

    result = s.connect_ex((&quot;localhost&quot;, port))

    if result == 0:
        print(f&quot;port [{port}] is open&quot;)

    s.close()با timeout زمان انتظار رو تنظیم میکنم و اگه نزارم، connect_ex ممکنه 30 ثانیه برای هر پورت منتظر بمونه.کتابخونه socket تو کد بالا سعی میکنه یک Three-Way Handshake کامل با هر پورت انجام بده.شما بجای localhost میتونید IP یکی دیگه از دستگاه های LAN رو وارد کنید.برای مرور و درک بهتر سعی کنید کدهای زیر رو خودتون بنویسید و نتیجش رو ببینید.فایل server.py:import socket

main_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
main_socket.bind((&quot;localhost&quot;, 50111))
main_socket.listen(1)
print(f&quot;Server on \&quot;localhost\&quot; and port \&quot;50111\&quot;&quot;)
client, address = main_socket.accept()
print(f&quot;\nConnect Successfully. Client IP: {address[0]} Client Port: {address[1]}\n\n&quot;)

while True:
    from_client = client.recv(1024)
    if not from_client:
        client.close()
        break

    print(f&quot;from client: {from_client.decode()}&quot;)

    to_client = input(&quot;Enter message for send: &quot;)
    if to_client.lower() == &quot;exit&quot;:
        client.close()
        break

    client.sendall(to_client.encode())فایل client.py:import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.connect((&quot;localhost&quot;, 50111))
print(&quot;Connect with \&quot;localhost:50111\&quot; Successfully\n\n&quot;)

while True:
    to_server = input(&quot;Enter message for send: &quot;)
    if to_server.lower() == &quot;exit&quot;:
        server.close()
        break
    
    server.sendall(to_server.encode())

    from_server = server.recv(1024)
    if not from_server:
        server.close()
        break
    
    print(f&quot;from server: {from_server.decode()}&quot;)داخل کتابخونه socket یسری متدهایی وجود داره که من اسمشون رو میزارم متدهای کمکی، بریم با چندتا از این متدها آشنا بشیم.socket.gethostbyname(&quot;google.com&quot;) # 142.250.151.100
# این متد یه دامنه رو میگیره و آیپی مربوط بهش رو برمیگردونه

socket.gethostbyaddr(&quot;8.8.8.8&quot;) # &#039;dns.google&#039;, [], [&#039;8.8.8.8&#039;])
# این متد یه آیپی رو میگیره و نام هاست یا دامنه رو برمیگردونه

print(socket.gethostname())
# این متد اسم کامپیوتر فعلی رو برمیگردونه

print(socket.gethostbyname_ex())
# این متد نسخه پیشرفته تر متد بالاست و یک اسم رو میگیره، اسم اصلی، لیست اسم های مستعار و لیست آیپی هارو برمیگردونه.

print(socket.getservbyname(&quot;http&quot;)) # 80
# این متد اسم یک سرویس رو میگیره و پورت مربوط بهش رو برمیگردونه

print(socket.getservbyport(80)) # http
# این متد یک پورت رو میگیره و سرویس مربوط بهش رو برمیگردونهبه آخر مقاله رسیدیم :)خسته نباشید و امیدوارم که براتون مفید بوده باشه.من که انرژی زیادی ازم رفت بخوام این مقاله رو بنویسم و لطف کنید با نظرات ارزشمندتون، انرژی از دست رفته من رو برگردونید ❤</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Wed, 03 Dec 2025 15:34:29 +0330</pubDate>
            </item>
                    <item>
                <title>صفر تا صد پورت های نرم‌افزاری در شبکه (پورت چیه؟)</title>
                <link>https://virgool.io/@mrNazouri13/%D8%B5%D9%81%D8%B1-%D8%AA%D8%A7-%D8%B5%D8%AF-%D9%BE%D9%88%D8%B1%D8%AA-%D9%87%D8%A7%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1%DB%8C-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%BE%D9%88%D8%B1%D8%AA-%DA%86%DB%8C%D9%87-yiuidm3zcydj</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)یه شرکت رو در نظر بگیر. این شرکت یک شماره تماس داره. من با این شماره تماس میگیرم و ارتباط میگیرم با شرکت.تماس رو یک سیستم خودکار پاسخ میده و شروع میکنه قسمت های مختلف شرکت رو معرفی میکنه! برای مثال میگه جهت ارتباط با واحد فروش عدد 1 رو وارد کنید، برای ارتباط با واحد فنی عدد 2 رو وارد کنید، جهت ارتباط با واحد مالی عدد 3 رو وارد کنید و...هر قسمت از شرکت، به شکل خاصی مدیریت شده و برای یک هدف خاص فعالیت میکنه. اپراتوری که برای قسمت فروش در نظر گرفته شده، نمیتونه پاسخ دهنده‌ی سوالات فنی من باشه. چرا؟ چون اون اپراتور، فقط برای معرفی محصولات شرکت و فروش اونها مدیریت شده، اطلاعاتش تا حد محصولات شرکته. اگه من درخواست فنی بهش بدم، پاسخ درستی دریافت نمیکنم! برای همین، شرکت ها میان قسمت‌ها یا سرویس‌های مختلف رو ایجاد میکنن، تا هر قسمت، پاسخ‌گوی یک نیاز خاص از سمت مشتری ها (سرویس گیرنده‌ها) باشه.تو دنیای شبکه هم، این مورد وجود داره.هم سمت کلاینت، port هارو داریم و هم سمت سرور.یک سرور ممکنه چندین سرویس رو همزمان ارائه بده (مثل شرکت که چندین سرویس رو ارائه میده) مدیران شبکه اومدن به هر سرویس یک شماره یا port اختصاص دادن، به این صورت که من باید به سرور متصل بشم، و همزمان با این اتصال باید بگم که از کدوم سرویس روی سرور میخوام استفاده کنم! اینکارو هم با شماره port تعیین میکنم.همینطور که میدونید، شبکه و اینترنت تشکیل شده از یک عالمه قانون، پروتکل و استاندارد.این قوانین و پروتکل‌ها، تو تک تک دستگاه‌ ها وجود دارن.هر سرویس، یک شماره پورت مشخص داره. برای مثال، اگه یک نفر بخواد روی سرورش، وبسایت بالا بیاره، باید یک Web Server نصب کنه، کدهای مربوط به سایت رو داخلش قرار بده تا هرکس که بهش درخواست زد، اون کدهارو براش بفرسته و مرورگر کاربر هم کدهارو بهش نمایش بده.حالا کسایی که قوانین اینترنت و شبکه هارو ساختن، گفتن که وب سرور‌ها باید روی پورت 80 کار کنن. یعنی شمایی که میخوای روی سرورت سایت بالا بیاری، باید این سایت روی پورت 80 سرورت فعال باشه. یعنی سرور همیشه باید درحال گوش دادن باشه که اگه، یه نفر بهش درخواست زد و توی درخواستش گفته بود که میخوام به پورت 80 وصل بشم، بیاد وصلش کنه به Web Server و مابقی کارهارو انجام بده. حالا همین قانون تو سمت Client هم وجود داره، یعنی برای مرورگر من تعیین شده که اگه بخواد وصل بشه به یک سایت، باید درخواستش رو به پورت 80 اون سرور ارسال کنه.درنتیجه این قوانین به هر دو طرف ارتباط کمک میکنن تا بتونن درخواست هارو به مقصد های درست ارسال/دریافت کنن.شماره پورت ها از 0 شروع میشه تا 65535.صد در صد مثل هرچیز دیگه داخل شبکه، برای این port ها هم قانون وجود داره.پورت شماره 0 تا 1023 به عنوان پورت های معروف و رزرو شده شناخته میشن. اکثر سرویس‌ها روی یکی از این پورت‌ها وجود دارن. برای مثال پروتکل HTTP که برای سرویس وب استفاده میشه، با پورت 80 کار میکنه. یا پروتکل HTTPS که اینم برای سرویس وب هست، روی پورت 443 کار میکنه. بیا فرض کنیم که IP سرور گوگل 10.20.30.40 هست. من اگه بخوام سایت گوگل رو ببینم، توی مرورگر فقط آدرس سایت رو مینویسم، کامپیوتر خودش میره آدرس گوگل رو پیدا میکنه، و به پورت 443 اون درخواستم رو میفرسته. این درخواست به شکل 10.20.30.40:443 شناخته میشه.پورت شماره 1024 تا 49151 به عنوان پورت های ثبت شده شناخته میشه. بطور مثال یه شرکت میاد نرم‌افزاری رو ایجاد میکنه و میره به شرکت IANA میگه من میخوام نرم‌افزارم روی پورت 3306 شناخته بشه. وقتی یه شرکت میاد پورتش رو ثبت میکنه، به این معنیه که من روی سرورم، با این پورت فلان سرویس رو ارائه میدم! حالا این ثبت کردنه به این معنی نیست که اون پورت کلا مسدود میشه و کس دیگه‌ایی نتونه استفادش کنه.پورت شماره 49152 تا 65535 به عنوان پورت های موقتی کلاینت شناخته میشن. بزار بیشتر توضیح بدم...شما در آن واحد چندین درخواست رو از سیستم خودتون ارسال و دریافت میکنید، بطور مثال داخل مرورگرم تب های مختلف بازه که یکیش سایت Youtube رو بالا اورده و دارم فیلم میبینم، یکی دیگش سایت ویرگول رو باز کرده، یکی دیگش Instagram و... به غیر از مرورگر، ممکنه تلگرام هم روی سیستم باز باشه و اون هم اتصال با سرورهای تلگرام رو برقرار کرده، به غیر از این موارد ممکنه خود ویندوز هم اون پس زمینه آپدیتی انجام بده و...درکل، وقتی درخواستی از سمت کامپیوتر من ارسال میشه به سمت مثلا گوگل، و گوگل هم پاسخ میده، این پاسخ وقتی میرسه به سیستم من، باید بدونه که به کدوم بخش ارسال بشه.مثلا من یه تب جدید توی مرورگرم باز میکنم و سایت دیوار رو بالا میارم، مرورگر میاد به سرور دیوار روی پورت 443 وصل میشه و محتوای سایت رو دریافت میکنه، حالا پاسخ دیوار رسید به کامپیوتر من، این پاسخی که الان رسیده، مربوط به کدوم نرم‌افزار یا سرویس میشه؟ چون چندین سرویس روی کامپیوتر من داره کار میکنه و مدام بسته‌های مختلفی رو ارسال/دریافت میکنن. اینجا بحث پورت های موقتی کلاینت مطرح میشه.سیستم عامل از رنج شماره 49151 تا 65553 یک عددی رو انتخاب میکنه و اختصاص میده به یک سرویس موقت. همینطور که روی سرور، پورت ها تو حالت گوش دادن هستن، تو سمت کلاینت هم پورت های مختلف تو حالت گوش دادن هستن. من وقتی میام توی تب جدید مرورگرم سایت دیوار رو باز میکنم، سیستم عامل یک پورتی رو بین بازه 49151 تا 65535 انتخاب میکنه و اختصاص میده به اتصالم با سایت دیوار، حالا این بسته وقتی میره سمت سایت دیوار و برمیگرده، کامپیوتر میفهمه که این بسته باید به کدوم نرم‌افزار/سرویس تحویل داده بشه، چون توی مقصد بسته، پورتی که خود سیستم عامل قبلا مشخص کرده نوشته شده.توی cmd با دستور netstat -n میتونید درخواست هایی که ارسال و دریافت شدن رو به همراه پورت هاشون ببینید.یکم بالاتر گفتم پورت های 0 تا 1023 برای سرویس های معروف درنظر گرفته شده. چندتا از این پورت‌ها و سرویس‌هایی که مربوط به اونها میشه رو معرفی کنم...تا الان با مفهوم Port های نرم‌افزاری آشنا شدیم. یه موضوع دیگه وجود داره به اسم پورت های سخت‌افزاری که USB یه نمونه از این پورت هاست. درکل به اون درگاهی که من یک کابل یا چیزی رو بصورت سخت‌افزاری وارد میکنم، پورت سخت‌افزاری گفته میشه.</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Wed, 12 Nov 2025 15:37:16 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی Literal و Constant در زبان C</title>
                <link>https://virgool.io/codenevis/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-literal-%D9%88-constant-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-c-yfoabqfac9uz</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)Literal یعنی یه مقدار ثابت که مستقیم توی کد نوشته شده. یعنی مقداری که خودش همون چیزیه که هست. نه متغیره، نه تابعیه، نه چیزی که از جای دیگه بیاد. مثال:int i = 10;
i = 15;
printf(&quot;%d - %c - %d&quot;, i, &#039;A&#039;, 10);طبق کد بالا، &#039;A&#039; یک literal هست! عدد 10 یک literal هست. چون اینا مستقیم و بدون متغیر نوشته شدن.به خط اول کد دقت کن، اونجا مقدار 10 یک literal هست چون داره مستقیما به i نسبت داده میشه.Constant یعنی یه متغیر که مقدارش دیگه تغییر نمیکنه. یعنی یه چیزی که فقط یه بار مقدار می‌گیره و بعدش دیگه قفل میشه. مثال:const int maxUsers = 100;یه عدد داریم به اسم maxUsers که همیشه 100 میمونه. هیچ‌کس حق نداره تغییرش بده.define# چیه؟ یه دستور پیش‌پردازندست که میگه هر جا این اسم رو دیدی، جاش این مقدار رو بذار. مثال:#define PI 3.14159هر جا تو کد نوشتی PI، کامپایلر قبل از اجرا، اون رو با 3.14159 جایگزین میکنه.مقایسه define# با const:define#:زمان پردازش: قبل از کامپایلمحدوده: از لحظه تعریف تا آخر فایلاشکال‌زدایی: اسمش در دیباگر دیده نمیشهحافظه: مقدارش مستقیما جایگزین میشهconst:زمان پردازش: هنگام کامپایلمحدوده: مثل متغیرهای عادی (block scope)اشکال‌زدایی: در دیباگر قابل مشاهدستحافظه: در حافظه ذخیره میشه</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Sat, 25 Oct 2025 13:43:17 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی تابع scanf در زبان C</title>
                <link>https://virgool.io/codenevis/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%AA%D8%A7%D8%A8%D8%B9-scanf-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-c-anjypcc1zzap</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)تو مقاله قبلی با stdio و تابع printf آشنا شدیم. تابع printf برای نمایش مقداره و تابع scanf برای گرفتن مقدار.چطوری از scanf استفاده کنم؟scanf(&quot;فرمت_ورودی&quot;, &amp;variable);فرمت ورودی: نوع داده‌ای که می‌خوای دریافت کنی (مثلا d% برای عدد صحیح)variable&amp;: آدرس متغیر رو میدی تا scanf بتونه مقدار رو داخلش ذخیره کنه (&amp; یعنی آدرس این متغیر رو بده) مثال:int age;
printf(&quot;Enter Your age: &quot;);
scanf(&quot;%d&quot;, &amp;age); // دریافت عدد و ذخیره در متغیر age
printf(&quot;Your age: %d&quot;, age);تو خط اول یه متغیر ساختم ولی مقداری بهش ندادم.تو خط دوم از printf استفاده کردم و متنی رو چاپ کردم.تو خط سوم از scanf (که داخل همون stdio.h هست) استفاده کردم و تو ورودی اول نوع مقداری که کاربر باید وارد کنه رو نوشتم (d% یعنی باید int بزنه) تو ورودی دوم علامت &amp; گذاشتم و اسم متغیر رو قرار دادم تا آدرس اون متغیر بدست بیاد و مقداری که کاربر وارد کرده داخلش قرار بگیره.تو خط آخر از printf استفاده کردم، متنی رو چاپ کردم و در آخرش d% گذاشتم یعنی میخوام بجای d% یک عدد چاپ بشه، و بیرون string یه ویرگول گذاشتم و اسم متغیری که عدد داخلش هست و باید همراه رشته چاپ بشه رو دادم.(من میتونم چندین تا % داخل یک رشته قرار بدم)برنامه رو اجرا میکنم، تو ورودی بهش عدد میدم و بدون مشکل اجرا میشه. اما اگه کاراکتر یا رشته وارد کنم چه اتفاقی میوفته؟ خطا بهم نمیده و یه عدد تصادفی برام برمیگردونه! یعنی یه عدد تصادفی داخل age قرار میگیره. دلیلش چیه؟ به کد زیر که قبلا بررسی کردیم دقت کن:int age;این خط فقط یه متغیر تعریف می‌کنه، ولی هیچ مقداری بهش اختصاص نمیده. یعنی مقدارش از قبل ممکنه هر چیزی باشه. پس وقتی scanf نتونه مقدار تعیین شده رو بخونه، همون عدد قبلی داخل age باقی می‌مونه، و توی printf هم چاپ میشه.نکته. علامت &amp; یه اپراتور خیلی مهم تو زبان Cعه و استفادش فقط به scanf ختم نمیشه.به کد زیر دقت کن:char name[]; // Error
char ch; // no Errorخط دوم مشکلی نداره چون گفتم یه متغیر ساده به اسم ch از نوع char بساز. کامپایلر چون دقیقا می‌دونه باید برای ch فقط 1 بایت حافظه کنار بذاره خطا نمیده (هیچ چیزی مبهم نیست)اما خط اول خطا میده چون گفتم یه آرایه‌ایی از نوع char به اسم name بساز و تعیین نکردم که این آرایه چندتا خونه و چقدر حافظه داشته باشه! به همین دلیل کامپایلر نمیتونه حدس بزنه که این آرایه چندتا عضو داره، چون نه اندازش رو گفتم نه مقدار اولیه دادم و درنتیجه:‌ Error 🤔توی C اگه قرار باشه آرایه تعریف کنم و مقدار اولیه بهش ندم باید بدین شکل عمل کنم:char name[10];تو کد بالا تعیین کردم که آرایه name باید 10 تا خونه داشته باشه. اما تعداد خونه دقیقا یعنی چه؟تو کد بالا گفتم یه آرایه بساز با 10 خونه از نوع char، یعنی 10 بایت حافظه پشت‌سرهم. هر خونه میتونه یه کاراکتر نگه‌ داره.حالا یه سوال! آیا من میتونم رشته Amirhosein رو داخل name قرار بدم؟ عبارت Amirhosein تعداد 10 تا کاراکتر داره ولی نمیتونم داخل name قرارش بدم. چرا؟تو زبان C رشته‌ها همیشه با کاراکتر 0\ تموم می‌شن. یعنی وقتی می‌خوای Amirhosein رو توی آرایه بریزی، واقعا داری اینو میریزی:&#039;A&#039; &#039;m&#039; &#039;i&#039; &#039;r&#039; &#039;h&#039; &#039;o&#039; &#039;s&#039; &#039;e&#039; &#039;i&#039; &#039;n&#039; &#039;\0&#039;یعنی 11 تا خونه لازم داری نه 10 تا (البته ممکنه خطا نده ولی هزاران دلیل به وجود میاد که برنامه به شکل های نادرست رفتار کنه)</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Sat, 25 Oct 2025 13:26:31 +0330</pubDate>
            </item>
                    <item>
                <title>همه چیز راجب Package Manager در لینوکس</title>
                <link>https://virgool.io/@mrNazouri13/%D9%87%D9%85%D9%87-%DA%86%DB%8C%D8%B2-%D8%B1%D8%A7%D8%AC%D8%A8-package-manager-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-twuknrws08u3</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)تو ویندوز وقتی میخوای یه نرم‌افزار نصب کنی، معمولا میری یه فایل با پسوند exe یا msi دانلود می‌کنی. دابل کلیک می‌کنی، نصاب باز میشه، Next Next Finish، و برنامه آماده‌ست.ولی لینوکس اینجوری نیست. هر توزیع، ساختار مخصوص خودش برای بسته‌بندی و نصب برنامه‌ها داره.در واقع توی لینوکس نرم‌افزارها معمولا به صورت Package (بسته) وجود دارن، نه یه فایل اجرایی تنها.یه package یه جور جعبست که داخلش همه‌چیز برای نصب آمادست. مثال:کد اجرایی، فایل‌های تنظیمات، آیکن‌ها، و توضیحاتی که سیستم بدونه چطوری باید نصبش کنه.ریپوزیتوری (Repository) چیه؟یه زمانی، وقتی تازه سیستم‌عامل‌های شبه‌یونیکس (مثل لینوکس) شکل گرفته بودن، هرکی می‌خواست یه برنامه نصب کنه، باید می‌رفت سورس‌کدش رو از سایت سازنده دانلود می‌کرد، بعد دستی کامپایلش می‌کرد.اینجا بود که لینوکس فهمید باید یه سیستم متمرکز برای مدیریت نرم‌افزارها بسازه. جایی که بشه گفت:برو آخرین نسخه‌ی فلان برنامه رو نصب کن و سیستم خودش همه‌چی رو از یه منبع امن و منظم بگیره.اون منبع شد Repository.درنهایت: ریپوزیتوری یا مخزن نرم‌افزار، یه جاییه که کلی برنامه و ابزار لینوکسی داخلش ذخیره شده. مثل یه فروشگاه آنلاینه، ولی به‌جای لباس و خوراکی، توش نرم‌افزار هست. وقتی تو لینوکس میخوای یه برنامه نصب کنی، سیستم عامل میره سراغ ریپوزیتوری، بسته‌ی موردنظر رو پیدا میکنه، دانلود میکنه و نصبش میکنه.چرا ریپوزیتوری وجود داره؟ به چند دلیل مهم:امنیت: فقط نرم‌افزارهای تاییدشده داخلش هستنراحتی: نصب با یه دستور ساده انجام میشهآپدیت سریع: همه برنامه‌ها از یه جا آپدیت میشنمدیریت وابستگی‌ها: اگه یه برنامه نیاز به کتابخونه خاصی داشته باشه، خودش میره و نصبش میکنهآیا همه توزیع‌ها از یه Repository استفاده میکنن؟هر خانواده از توزیع ها، ریپوزیتوری‌های مخصوص خودش رو داره.دلیلش هم اینه که هر توزیع ساختار بسته‌ها، نسخه‌ی هسته و حتی کتابخونه‌هاش فرق داره.بیا چندتا از معروف‌ها رو بررسی کنیم:Debian و خانواده‌اش (Ubuntu، Linux Mint و غیره):بسته‌هاشون با پسوند .deb هست.از سیستم APT (Advanced Package Tool) استفاده می‌کنن.ریپوزیتوری‌هاشون معمولا توی /etc/apt/sources.list تعریف میشن.Fedora، Red Hat و CentOS:اینا از فرمت .rpm استفاده میکنن و ابزار DNF یا YUM رو دارن.فایل‌های ریپوزیتوری‌شون معمولا تو /etc/yum.repos.d/ هست.ریپوزیتوری ها بصورت کلی به چند دسته تقسیم میشن:Official repositories: توسط شرکت/تیم اصلی مدیریت می‌شن (امن‌ترین)Community repositories: ساخته‌شده توسط کاربرانThird-party repositories: برای نرم‌افزارهای خاص، مثل Google Chrome یا VSCodeLocal repositories: شرکت‌ها برای شبکه داخلی خودشون می‌سازن تا بدون اینترنت بسته نصب کننفرضا شرکت google اومده Google Chrome رو ساخته، در کنار بسته این نرم‌افزار، یک مخزن (Repository) هم ایجاد کرده و Google Chrome رو داخلش قرار داده. حالا آدرس این مخزن رو منتشر کرده تا هر کاربری که میخواد کروم رو روی لینوکسش نصب کنه، بیاد اون Repository رو به سیستمش اضافه کنه تا بتونه به واسطه اون، دانلود و نصب کنه! حالا این مدل Repository چون توسط تیم سازنده اون توزیع لینوکسی ساخته نشده، تو دسته Third-party repository قرار داره. یعنی یه شرکت دیگه برای نرم‌افزار خودش اومده اون رو ایجاد کرده.و همچنین، به ریپوزیتوری هایی که خود تیم سازنده اون توزیع ساختن، Official repository گفته میشه.خود Official repositories به چندتا دسته تقسیم میشه: (بیشتر تو Ubuntu)main: نرم‌افزارهای رسمی و آزاد که مستقیما پشتیبانی میشنrestricted: نرم‌افزارهایی که آزاد نیستن ولی ضروری‌ان (مثل درایور GPU)universe: نرم‌افزارهای آزاد اما پشتیبانی‌شده توسط جامعهmultiverse: نرم‌افزارهای غیرآزاد که پشتیبانی رسمی ندارن (مثل کدک‌ها)مثلا مرورگر Firefox از main میاد، ولی VLC معمولا از universe.همینطور که قبل‌تر گفته شد، توزیع debian و خانوادش از APT استفاده میکنن تا وصل بشن به Repository و کارهای مختلفی رو انجام بدن! از طرفی توزیع های Red Hat یا Fedora یا CentOS از DNF یا YUM استفاده میکنن.اول با APT شروع کنیم...APT یه مجموعه ابزار و دستور برای مدیریت بسته‌ها تو Debian و خانوادشه. کارش اینه که:به ریپوزیتوری‌ها وصل بشهبسته‌ها رو دانلود کنهوابستگی‌ها (dependencies) رو به صورت خودکار پیدا و نصب کنهآپدیت‌ها رو مدیریت کنهدر واقع، APT یه مغز هوشمند برای سیستم بسته‌بندی .debـه.برای نصب یک بسته (نرم‌افزار) هم میتونم مستقیما وصل بشم به ریپوزیتوری و دانلود/نصب کنم (حالت آنلاین) هم میتونم فایل نصبیش (package) رو دانلود کنم و بصورت محلی نصب کنم (حالت آفلاین)برای کار با سیستم APT باید از دستور apt استفاده کنم. وقتی از دستور apt استفاده میکنم، سیستم عامل میره سراغ ریپوزیتوری‌هایی که توی فایل /etc/apt/sources.list تعریف شدن. اونجا دنبال بسته‌ی موردنظر میگرده، وابستگی‌هاش رو بررسی میکنه، و همه رو نصب میکنه.به این دستور دقت کن:sudo apt updateAPT اول از همه میره سراغ فایل‌های /etc/apt/sources.list و /etc/apt/sources.list.d/تو این فایل‌ها آدرس همه ریپوزیتوری‌هایی که سیستم بهشون وصله نوشته شده.APT یکی‌یکی به همه‌ی این repoها وصل میشه. فهرست کامل بسته‌های موجود تو تمام این repoها رو دانلود میکنه. مثلا اگه 5000 بسته توی repo باشه، APT میاد اسم، نسخه، توضیح و مسیر تمام این 5000 بسته رو میگیره و توی کش خودش ذخیره میکنه.بعد از اینکه دستور sudo apt update رو وارد کردم و لیست پکیج ها بروزرسانی شد، میتونم بسته/نرم‌افزار مدنظرم رو نصب کنم. مثال:sudo apt install vlcبعد از وارد کردن این دستور، APT دیگه نمیره دنبال VLC بگرده! بلکه از کش مربوط به خودش میفهمه که VLC تو کدوم repo قرار داره، نسخش چیه، چه بسته‌هایی نیاز داره و... درنهایت میره سراغ همون repo و فایل deb. رو دانلود و نصب میکنه.پس همیشه یادتون باشه، قبل از نصب یک پکیج حتما دستور sudo apt update رو وارد کنید.معرفی دیگر دستورات aptapt full-upgrade یا apt dist-upgrade: این دستور میاد بسته‌های جدید که داخل repository هستن رو دانلود میکنه، و جایگزین نسخه قبلی داخل سیستم میکنه. این دستور میتونه بسته‌هایی رو اضافه یا حذف کنه تا سیستم بصورت کامل آپدیت بشه.apt remove package-name: حذف یه package از سیستم (فقط فایل‌های اجراییش، نه تنظیماتش)apt purge package-name: حذف کامل یه package به همراه تنظیمات و فایل های پیکربندیش.apt autoremove: پاک کردن بسته های اضافی که خودشون نصب شدن ولی الان دیگه استفاده نمیشن.apt search package-name: جستوجو بین package های موجود در repository های ثبت شده.apt show package-name: نمایش اطلاعات کامل یه بسته (نسخه، توضیح، وابستگی‌ها و...).apt list --installed: نمایش بسته‌های نصب شده روی سیستم.apt list --upgradable: بسته‌هایی که آپدیت دارن.apt edit-sources: بازکردن فایل sources.list توی ویرایشگر برای ویرایش مستقیم repoها.apt download package-name: فقط فایل deb. اون بسته رو دانلود میکنه (بدون نصب).حالا چطوری با فایل یک بسته رو نصب کنم؟فرضا فایل زیر رو دارم:code_1.84.2-1708327883_amd64.debبرای نصب این بسته دو تا روش وجود داره. روش اول استفاده از apt عه:sudo apt install ./code_1.84.2-1708327883_amd64.debتو این دستور apt وقتی فایل محلی رو بهش میدم، خودش میفهمه که کدوم بسته‌ها رو باید از repo دانلود کنه تا وابستگی‌ها کامل بشن.روش دوم استفاده از dpkg عه:sudo dpkg -i ./code_1.84.2-1708327883_amd64.debدستور dpkg وابستگی‌ها رو بررسی نمیکنه.با APT آشنا شدیم! بریم سراغ DNF و YUM...سال 1993، یه شرکت به اسم Red Hat Software تأسیس شد. Red Hat تصمیم گرفت یه توزیع لینوکس بسازه که برای شرکت‌ها و سرورها قابل اعتماد باشه. اسم اون شد Red Hat Linuxتا حدود سال 2003، این توزیع خیلی معروف شد، مخصوصا بین مدیران شبکه و شرکت‌ها، ولی یه مشکل پیش اومد!کاربران خونگی می‌خواستن با نسخه‌ی رایگانش کار کنن، در حالی که شرکت‌ها پشتیبانی حرفه‌ای می‌خواستن (با قرارداد و پشتیبانی فنی و طول عمر بالا).در سال 2003، Red Hat تصمیم گرفت پروژش رو به دو شاخه تقسیم کنه:Red Hat Enterprise Linux (RHEL): نسخه‌ی تجاری (Enterprise) برای شرکت‌ها، با پشتیبانی رسمی، تست‌های سنگین و آپدیت‌های کنترل‌شده. این نسخه پولیه و تمرکزش روی پایداریه، نه جدید بودن.Fedora Project: یه نسخه‌ی رایگان، باز و سریع‌الانتشار برای توسعه‌دهنده‌ها و جامعه‌ی کاربری. هدفش آزمایش فناوری‌های جدید قبل از اینکه وارد RHEL بشن. به‌زبان ساده‌تر: Fedora شد آزمایشگاه Red Hat و RHEL شد محصول نهایی و پایدارِ اون آزمایش‌ها.درنهایت: Fedora همیشه از نظر تکنولوژی جلوتر از RHEL هست.چون RHEL پولیه، بعضی گروه‌ها اومدن نسخه‌های رایگان و بازسازی‌شده‌ی RHEL رو ساختن:CentOS (قدیمی‌ترین، الان تبدیل شده به CentOS Stream)Rocky LinuxAlmaLinuxاینا دقیقا از سورس‌کد RHEL ساخته شدن اما رایگان و بدون پشتیبانی.جمع بندی: اول Red Hat Linux بود. از دلش Fedora و RHEL متولد شدن. و از دل RHEL هم CentOS و Rocky و Alma اومدن.و اما...سال‌های اول لینوکس، هر توزیع خودش یه جور بسته‌بندی داشت. Red Hat اومد و یه فرمت استاندارد ساخت به اسم: RPM یا Red Hat Package ManagerRPM چی بود؟ یه فایل بسته‌بندی‌شده rpm. بود، شبیه فایل exe در ویندوز. داخلش فقط برنامه نبود، بلکه مسیر نصب، نسخه، توضیحات و وابستگی‌ها (dependencies) هم تعریف شده بود.RPM خودش نمی‌تونست وابستگی‌ها رو حل کنه. مثلا اگه می‌خواستی Firefox نصب کنی و اون به libX11 نیاز داشت، RPM خطا میداد و باید دستی میرفتی اون بسته رو پیدا میکردی و نصبش میکردی.یه دانشگاهی پیشنهاد داد که: بیاید یه مغز هوشمند برای RPM بسازیم که خودش وابستگی‌ها رو پیدا و نصب کنه! نتیجش شد YUM یا Yellowdog Updater, Modified.YUM چی کار میکرد؟ می‌رفت ریپوزیتوری‌ها (repositories) رو چک می‌کرد.متادیتای بسته‌ها رو دانلود می‌کرد (لیست همه بسته‌ها، نسخه‌ها، وابستگی‌ها).وقتی یه برنامه می‌خواستی نصب کنی، خودش تمام وابستگی‌ها رو پیدا و نصب میکرد.برنامه نصب می‌شد، اطلاعاتش تو دیتابیس سیستم ثبت می‌شد.با بزرگ‌تر شدن Fedora و RHEL، مشکلات YUM خودش رو نشون دادن:سرعت پایینمصرف زیاد رممشکلات در حل وابستگی‌های پیچیدهکدنویسی قدیمی با Python 2Fedora گفت بیاید یه YUM جدید بسازیم، سریع‌تر و دقیق‌تر و مدرن‌تر. نتیجه شد DNF یا Dandified YUMتفاوت‌ها و مزیت‌ها:سرعت خیلی بهترکش بهینه‌ترRollback بهتر (می‌تونه بسته‌ها رو به حالت قبل برگردونه)استفاده از Python 3API برای برنامه‌نویس‌هامعرفی دستورات کاربردی DNFdnf install firefox: نصب برنامه مدنظر.dnf remove firefox: حذف برنامه مدنظر.dnf check-update: بررسی آپدیت ها.dnf upgrade یا dnf update: آپدیت کل سیستم.dnf search vlc: جستوجوی بسته‌ها.dnf list installed: لیست بسته‌های نصب شده.dnf autoremove: حذف بسته‌های اضافی و بلا‌استفاده.dnf clean all: پاک کردن کش.dnf history: سابقه نصب و حذف‌ها.dnf download firefox: دانلود بدون نصب.من فرضا فایل rpm. یک برنامه‌ایی رو دارم! چطور بصورت محلی نصبش کنم؟ روش اول:sudo rpm -i firefox-115.0-1.x86_64.rpmسوئیچ i یعنی install. این دستور package رو نصب میکنه اما وابستگی‌ها رو خودش حل نمیکنه. روش دوم:sudo dnf install ./firefox-115.0-1.x86_64.rpmتو این روش وابستگی‌ها هم دانلود و نصب میشه.</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Mon, 20 Oct 2025 17:48:28 +0330</pubDate>
            </item>
                    <item>
                <title>رزبری پای (Raspberry Pi) چیه؟</title>
                <link>https://virgool.io/@mrNazouri13/%D8%B1%D8%B2%D8%A8%D8%B1%DB%8C-%D9%BE%D8%A7%DB%8C-raspberry-pi-%DA%86%DB%8C%D9%87-f7zfjhuprcqm</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)سال 2008، یه گروه از مهندس‌های دانشگاه کمبریج دیدن که دانشجوها دیگه مثل قبل علاقه‌ای به برنامه‌نویسی ندارن. اونا گفتن: اگه یه کامپیوتر ارزون، کوچیک و قابل حمل بسازیم، شاید بچه‌ها دوباره عاشق کدنویسی بشن. و اینطوری بود که پروژه Raspberry Pi شکل گرفت. اولین مدل رزبری پای تو سال 2012 منتشر شد، و خیلی زود محبوب شد.Raspberry Pi دقیقا چیه؟ یه کامپیوتر کامل و واقعی، فقط در ابعاد یه کارت بانکی.یه برد کوچیک که روش یه پردازنده (CPU)، رم (RAM)، درگاه USB، HDMI، کارت شبکه، و پین‌های سخت‌افزاری وجود داره. یعنی هرچیزی که یه کامپیوتر بزرگ داره، اینم داره، فقط خیلی فشرده‌تر و با مصرف برق خیلی پایین‌تر.میتونی بهش:موس، کیبورد و مانیتور وصل کنیروش سیستم‌عامل نصب کنیبرنامه‌نویسی کنیپروژه‌های سخت‌افزاری درست کنییا حتی ازش یه سرور واقعی بسازیاجزای سخت‌افزاری رزبری پای:CPU (پردازنده): چیپ اصلیه که همه‌ی محاسبات رو انجام میده. معمولا از نوع ARM هست.RAM: حافظه موقتیه برای اجرای برنامه‌ها. بسته به مدل از 512 مگابایت تا 8 گیگابایت متفاوته.Storage (ذخیره‌سازی): دیسک نداره! سیستم‌عامل و داده‌ها روی کارت microSD ذخیره میشه.USB Ports: برای اتصال موس، کیبورد، فلش و وسایل جانبی.HDMI Port: خروجی تصویر برای مانیتور یا تلویزیون.Ethernet/Wi-Fi: برای اتصال به شبکه و اینترنت.GPIO Pins (پین‌های ورودی/خروجی): این پین‌ها بهت اجازه میدن با دنیای واقعی ارتباط بگیری: چراغ LED روشن کنی، دما بخونی، موتور کنترل کنی، سنسور وصل کنی... هرچیزی.Power Input (درگاه برق): معمولا با کابل microUSB یا USB-C برق می‌گیره و حدود 5 ولت مصرف داره.سیستم عامل در رزبری پای:رزبری پای خودش سیستم‌عامل نداره، باید نصب کنی.رایج‌ترین سیستم‌عامل مخصوصش اسمش هست Raspberry Pi OS یا Raspbian.این سیستم‌عامل در واقع یه نسخه از لینوکس Debianعه که برای سخت‌افزار رزبری پای بهینه شده (Embedded Linux) رابط گرافیکی داره، مرورگر داره، ترمینال داره، حتی می‌تونی باهاش کدنویسی پایتون یاد بگیری.علاوه بر اون، می‌تونی هر سیستم‌عامل دیگه‌ای هم نصب کنی مثل Ubuntu یا Kali Linux.همه‌ی اینا روی یه کارت SD میرن و با یه کلیک بوت میشن.با رزبری پای چیکار میتونم بکنم؟یادگیری برنامه‌نویسیسرور خانگی: میتونی تبدیلش کنی به سرور وب، فایل سرور، VPNرباتیک و الکترونیک: با پین‌های GPIO میتونی موتور، سنسور، LED کنترل کنیاینترنت اشیا: ساخت سیستم‌های هوشمند برای خانهو...رزبری پای (Raspberry Pi) مدل های مختلفی داره:Model A/B: نسل اولZero: کوچیک‌تر و ارزون‌ترModel 3/4: قدرتمندتر شدنPico: مخصوص الکترونیک</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Wed, 15 Oct 2025 15:42:41 +0330</pubDate>
            </item>
                    <item>
                <title>همه چیز راجب لینوکس</title>
                <link>https://virgool.io/@mrNazouri13/%D9%87%D9%85%D9%87-%DA%86%DB%8C%D8%B2-%D8%B1%D8%A7%D8%AC%D8%A8-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-o4cejcw90uf2</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)لینوکس یه سیستم عامله.اما صبر کن! سیستم عامل چیه؟سیستم عامل، نرم‌افزاری هست که روی کامپیوتر نصب میشه تا بتونیم با کامپیوتر کار کنیم.خب، کامپیوتر چیه؟ 🤨خوش اومدید به مقاله‌ایی که قراره لینوکس رو از پایه ترین حالت ممکن بهتون آموزش بده.کامپیوتر (Computer) چیه؟کامپیوتر در ساده‌ترین حالت ممکن یه دستگاه الکترونیکیه که فقط یه کار بلده:اطلاعات رو بگیره، روشون یه کاری انجام بده، و نتیجه رو بهت نشون بده.کامپیوتر یه موجود عجیب و غریبه که خودش هیچ چیزی نمیفهمه، ولی اگه بهش بگی دقیقا چیکار کنه، با سرعت زیاد انجامش میده.اگه بخوای دقیق‌تر بشی، کامپیوتر از چند بخش اصلی درست شده:ورودی (Input): جایی که اطلاعات وارد کامپیوتر میشه، مثل کیبورد، ماوس، میکروفون، دوربین و...پردازنده (CPU): مغز کامپیوتره. همه دستورها و محاسبات اینجا انجام میشه. CPU در واقع یه چیپ الکترونیکیه که میلیاردها ترانزیستور داره (ترانزیستور یعنی یه کلید کوچیک که میتونه خاموش یا روشن باشه).حافظه (Memory): تو کامپیوتر دو نوع حافظه داریم...RAM: حافظه موقته. وقتی سیستم خاموش بشه، همه چیزش پاک میشه.Storage (مثل SSD یا HDD): حافظه دائمیه، فایل هات همیشه اونجا میمونن.خروجی (Output): جاییه که نتیجه‌ی کار بهت نشون داده میشه، مثل مانیتور، اسپیکر یا چاپگر.سیستم عامل چیه؟سیستم عامل مثل مترجم بین انسان و سخت افزاره. چون کامپیوتر زبان ما رو نمیفهمه، سیستم عامل میاد وسط و ارتباط بین ما و اون سخت افزارها رو برقرار میکنه.درنتیجه، سیستم عامل کار اصلیش اینه که بهت اجازه بده بدون اینکه لازم باشه با قطعات سخت افزاری مستقیم حرف بزنی، ازشون استفاده کنی. یعنی چی؟یعنی تو وقتی کلیک میکنی روی یه فایل تا باز بشه، در واقع داری به سیستم عامل میگی:این فایل رو از حافظه بخون و بیارش رو صفحه.سیستم عامل اون دستور رو میگیره، میفرسته به حافظه، با CPU هماهنگ میشه، داده ها رو میخونه و در نهایت نتیجه رو روی مانیتور نشونت میده.تو از این همه اتفاق فقط یه کلیک دیدی.سیستم عامل چطور ساخته میشه؟سیستم عامل از ترکیب چند بخش مهم ساخته میشه و هرکدوم یه وظیفه خاص دارن:Kernel (هسته): این مغز سیستم عامله. مستقیم با سخت‌افزار کار میکنه و کنترل RAM، CPU، حافظه و... رو به عهده داره. مثلا تصمیم میگیره کدوم برنامه چقدر RAM استفاده کنه.User Interface (رابط کاربری): چیزی که میبینی و باهاش کار میکنی. مثل دسکتاپ، آیکن ها، منوها و پنجره ها.Shell (پوسته): رابط بین کاربر و Kernelعه. همون جاییه که تو باهاش دستور میدی (مثل ترمینال در لینوکس یا Command Prompt در ویندوز).File System: مسئول ذخیره و نظم دادن به داده هاست. مثلا توی ویندوز درایو C و D داری ولی تو لینوکس ساختارش فرق داره.این اجزا چطوری ساخته میشن؟برنامه نویس ها سیستم عامل رو با زبانهای سطح پایین (مثل C و Assembly) مینویسن تا بتونه مستقیم با سختافزار حرف بزنه. چون سیستم عامل باید خیلی سریع، دقیق و نزدیک به قطعات کار کنه، به همین خاطر از زبان های سطح بالا استفاده نمیشه.سیستم عامل ها انواع مختلفی دارن:سیستم عامل دسکتاپ (Desktop OS): برای کامپیوترهای شخصی. مثل:WindowsmacOSLinuxسیستم عامل موبایل (Mobile OS): برای گوشی ها و تبلت ها. مثل:AndroidiOSسیستم عامل سرور (Server OS): برای مدیریت سرورها، شبکه ها و سرویس ها. مثل:Linux (مثل Ubuntu Server, CentOS, Debian)Windows Serverسیستم عامل تعبیه شده (Embedded OS): داخل دستگاه هایی مثل مودم، تلویزیون هوشمند، خودپرداز و... نصب میشه. مثال:Embedded LinuxFreeRTOSسیستم عامل های مخصوص ابر (Cloud OS) یا مجازیسازی: برای کنترل ماشین های مجازی و زیرساخت های ابری، مثل VMware ESXi یا Proxmox.حالا برسیم به قهرمان ما: لینوکس (Linux)بریم به دهه‌ی 1960 میلادی. اون زمان کامپیوترها به بزرگی اتاق بودن و فقط شرکتهای بزرگ و دانشگاه‌ها داشتنشون. کار کردن باهاشون خیلی سخت بود، هر سیستم برای خودش یه نرم افزار خاص داشت، و هیچ استانداردی وجود نداشت.یه تیم از برنامه نویس ها تو شرکت AT&amp;T تصمیم گرفتن یه سیستم عامل بسازن که هم ساده باشه و هم بتونه روی هر نوع کامپیوتری اجرا بشه. اون سیستم عامل شد: UNIX.یونیکس خیلی باهوش طراحی شده بود! یه هسته داشت برای کنترل سخت افزار، ابزارهای کوچیک و کاربردی برای انجام کارهای مختلف، و یه رابط متنی ساده (خط فرمان).اما یه مشکل بزرگ وجود داشت...UNIX رایگان نبود...یه محصول تجاری بود که فقط شرکت ها و دانشگاه‌ها میتونستن بخرنش.اینجا بود که جرقه‌ی آزادی نرم‌افزار تو ذهن یه نفر زده شد. اوایل دههی 1980، یه نفر به اسم Richard Stallman (ریچارد استالمن) توی MIT کار میکرد.اون از وضعیت نرم‌افزارها خسته شده بود. اون زمان شرکت‌ها سورس‌کد نرمافزارها رو قفل کرده بودن و کسی اجازه نداشت تغییرشون بده. استالمن باور داشت که نرم‌افزار باید آزاد باشه. آزاد نه به معنی رایگان، بلکه به معنی آزادی استفاده، تغییر و به اشتراک گذاری.برای همین در سال 1983 پروژه‌ایی به اسم GNU رو شروع کرد. هدفش چی بود؟ساخت یه نسخه‌ی آزاد از یونیکس.ابزارهای لازم مثل کامپایلر، شل، و کلی برنامه‌ی پایه رو ساخت. اما یه چیز حیاتی کم بود! Kernel.پروژه‌ی GNU تقریبا کامل بود، اما بدون مغز اصلیش، هسته‌ای که کل سیستم رو مدیریت کنه، ناقص مونده بود.سال 1991، یه نفر به اسم Linus Torvalds (لینوس توروالدز) توی دانشگاه هلسینکی فنلاند داشت با سیستم عامل کوچیکی به نام Minix کار میکرد. Minix یه نسخه‌ی آموزشی از یونیکس بود که برای درس خوندن ساخته شده بود، نه استفاده واقعی. محدودیت زیاد داشت و لینوس اعصابش خورد شده بود. پس تصمیم گرفت یه پروژه‌ی شخصی راه بندازه. یه روز نشست پشت کامپیوترش و گفت: میخوام یه سیستم عامل مخصوص خودم بسازم، فقط برای سرگرمی.شروع کرد به نوشتن یه Kernel با زبان C و اسمبلی.اولش فقط برای خودش بود. اما بعد، تصمیم گرفت اونو با بقیه به اشتراک بذاره.یه ایمیل نوشت توی یه گروه برنامه‌نویسی و گفت: سلام! من یه سیستم عامل آزاد نوشتم، فقط برای سرگرمی. فعلا بزرگ نیست، ولی شاید به دردتون بخوره.اون سیستم عامل کوچیک، هسته لینوکس بود.یادت هست پروژه‌ی GNU یه عالمه ابزار داشت ولی هسته نداشت؟و لینوس یه هسته ساخته بود ولی ابزار نداشت؟جامعه‌ی برنامه‌نویسا اومدن ابزارهای GNU رو با هسته‌ی لینوس ترکیب کردن.نتیجه شد یه سیستم عامل کامل، آزاد و قدرتمند.و اینجوری GNU/Linux متولد شد.بعضیا فقط میگن Linux، ولی واقعیت اینه که بخش بزرگی ازش از GNU میاد.چون لینوکس Open Source بود، هرکسی میتونست سورس کدش رو ببینه، تغییر بده و نسخه خودش رو بسازه.همین باعث شد هزاران نفر از سراسر دنیا بهش کمک کنن.کم کم توزیع‌های مختلفی (بهشون میگن Distro) ساخته شد:DebianUbuntuFedora:Kali Linuxامروز، لینوکس روی همه‌چیز هست:از گوشیهای اندرویدی گرفته تا سرورهای گوگل، فیسبوک، آمازون، و حتی ابرکامپیوترهای ناسا.تقریبا هر جایی که قدرت و امنیت مهمه، لینوکس پادشاهه.درنهایت، کلمه Linux به Kernel اشاره میکنه. به سیستم عاملی که هدف ماست گفته میشه GNU/Linux ولی خب عموم مردم همون کلمه Linux رو براش استفاده میکنن.تو مقاله های بعدی در مورد این سیستم عامل جذاب بیشتر مینویسم 👍</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Tue, 14 Oct 2025 18:52:35 +0330</pubDate>
            </item>
                    <item>
                <title>زبان انگلیسی از صفر - Pronouns</title>
                <link>https://virgool.io/@mrNazouri13/%D8%B2%D8%A8%D8%A7%D9%86-%D8%A7%D9%86%DA%AF%D9%84%DB%8C%D8%B3%DB%8C-%D8%A7%D8%B2-%D8%B5%D9%81%D8%B1-pronouns-blx3r2lgzpvh</link>
                <description>زبان‌ها از دو بخش اصلی واژگان و گرامر تشکیل شده‌اند. این دو بخش در تعامل با یکدیگر، امکان ایجاد جملات صحیح و معنادار رو فراهم می‌کنند. به همین دلیل، برای تسلط بر یک زبان، نیاز به یادگیری هر دو بخش به طور همزمان وجود داره.با pronouns یا ضمایر آشنا بشیم.ضمیرها کلماتی هستن که جای اسم‌ها قرار میگیرن و از تکرار زیاد اسم جلوگیری میکنن. مثال:آرتا به فروشگاه رفت. آرتا یک کتاب خرید. آرتا به خانه برگشت.با استفاده از pronoun این جمله‌ها خیلی روان‌تر میشه:آرتا به فروشگاه رفت. او یک کتاب خرید. او به خانه برگشت.عکس زیر دسته‌بندی ضمیرها رو نشون میده:زبان انگلیسی ضمیرهای مختلفی داره که هرکدوم وظیفه خاصی دارن.Personal Pronouns (ضمایر شخصی) یکی از دسته‌بندی ضمیرهاست و برای اشاره به افراد استفاده میشه. ستون اول و دوم داخل عکس بالا مربوط به Personal Pronouns هست که برای درک کردنش، لازمه با دیگر مفاهیم آشنا بشیم.به این دو جمله دقت کن:من او را دیدم.او من را دید.داخل جمله اول &lt;من&gt; یه کاری رو انجام دادم (دیدن او) و داخل جمله دوم &lt;او&gt; یه کاری رو انجام داد (دیدن من)Subject (فاعل): کسی که کاری رو انجام میده. تو جمله‌ اول، فاعل &lt;من&gt; هست چرا که جمله باهاش شروع شده و همینطور یک کاری رو انجام داده.Object (مفعول): کسی که کاری روی اون انجام میشه. در همون جمله، &lt;او&gt; Objectعه، چون دیده شده.ضمیرهای ستون اول برای شروع جمله و مشخص کردن Subject استفاده میشن. معرفی ضمیرهای ستون اول:I : منYou : تو، شما، شماهاHe : او برای مردShe : او برای زنIt : آن، برای اشیا و حیواناتWe : ماThey : آنهامجدد به این جمله‌ها دقت کن:من او را دیدم.او من را دید.تو جمله اول &lt;من&gt; شروع کننده جمله بود ولی تو جمله دوم شروع کننده یا انجام دهنده یک کاری نبود ولی بازم از &lt;من&gt; استفاده شد (همین مورد برای &lt;او&gt; هم وجود داره) داخل فارسی و مثال دو جمله بالا، هم فاعل میتونه &lt;من&gt; باشه و هم مفعول. آیا انگلیسی هم به همین شکله؟ یعنی ضمیر &lt; I &gt; هم بجای فاعل میتونه استفاده بشه و هم مفعول؟ نه. به ستون دوم ضمیر ها دقت کن :)me : من، معادل I در ستون اولYou : تو، معادل همون Youhim : او برای مرد، معادل Heher : او برای زن، معادل Sheit : آن، معادل Itus : ما، معادل Wethem : آنها، معادل Theyضمیرهای ستون اول برای شروع جمله و مشخص کردن Subject استفاده میشن، از طرفی ضمیرهای ستون دوم برای نقش Object تعیین شدن و هر کجای جمله به غیر از اول جمله میتونن استفاده بشن. مثال:فعل دیدن، See هست که گذشتش میشه saw. من میخوام بگم &lt;او زن&gt; دید &lt;او مرد&gt; را (دقت کن او زن چون Subjectعه باید از ستون اول برداشته بشه و او مرد چون Objectعه باید از ستون دوم برداشته بشه) جمله نهایی: She saw himحالا اگه &lt;او مرد&gt; بخواد &lt;او زن&gt; رو ببینه جلمه بدین شکل میشه: He saw herدر نتیجه، Personal Pronouns به دو دسته تقسیم میشه:Subject Pronouns: اینها ضمیرهایی هستن که به جای Subject میان و ستون اول ضمیرها داخل عکس مربوط به Subject Pronouns میشه. مثال‌ها:I am a student (من دانشجو هستم)They are going to the park (آنها به پارک می‌روند)They play football (آنها فوتبال بازی می‌کنند)Object Pronouns: اینها ضمیرهایی هستن که جای Object میان و ستون دوم ضمیرها مربوط به Objec Pronouns میشه. مثال‌ها:He called me (او من را صدا زد)I will help you (من به تو کمک خواهم کرد)My sister saw them (خواهرم آنها را دید)(تو جمله آخر مجدد از فعل گذشته دیدن، یعنی saw استفاده شد)آیا ضمیرها به همین جا ختم میشه؟ البته که نه.قبل از بررسی دیگر ضمیرها بپردازیم به موضوع Nouns یا اسم‌ها (اگه یادتون باشه برای تعریف ضمیرها گفتم که به جای noun یا اسم قرار میگیره)Noun چیه؟ اسم کلمه‌ایی هست که برای نام بردن از افراد، جاها، اشیا، حیوانات یا ایده‌ها استفاده میشه. به عبارتی، اسم‌ها به ما کمک میکنن که بتونیم چیزها و مفاهیم رو مشخص کنیم و برای اونها اسمی بزاریم. مثال:افراد: David – Saraجاها: Park – Schoolاشیاء: Book – Chairحیوانات: Dog – Catایده‌ها: Love – Freedomبه این جمله دقت کن:The cat is in the garden (گربه تو باغ هست)تو این جمله cat و garden اسم (noun) هستن. درواقع من انسان برای اونها اسم گذاشتم. اما دیگر کلمات مثل The یا is یا in اسم نیستن، بلکه کلماتی هستن که کمک میکنن جمله ایجاد بشه.تا الان چه مواردی رو یادگرفتم؟- اهمیت یادگیری همزمان واژگان و گرامر رو درک کردم.- با مفهوم ضمیر یا Pronoun آشنا شدم و فهمیدم که ضمیرهای مختلفی در زبان انگلیسی وجود داره و با Subject Pronouns و Object Pronouns آشنا شدم (این دو مورد داخل Personal Pronouns وجود دارن)- در آخر با مفهوم اسم یا noun آشنا شدم و فهمیدم داخل جمله چطور Subject و Object و noun رو پیدا کنم.مجدد عکس رو قرار میدم چون میخوام برم سراغ ستون سوم و چهارم ضمیرها.همینطور که قبلا گفته شد، تو زبان انگلیسی، ضمیرها (Pronouns) به چند دسته تقسیم می‌شن، فعلا با سه دسته اصلی سروکار داریم:Personal Pronouns: ضمایر شخصی (که باهاش آشنا شدیم)Possessive Adjectives: صفت‌های ملکی (ستون سوم)Possessive Pronouns: ضمایر ملکی (ستون چهارم)ستون سوم و چهارم، دو دسته‌ی مستقل هستن، نه اینکه یکی زیرمجموعه‌ی اون یکی باشه.تا الان با فاعل و مفعول آشنا شدیم، الان می‌خوایم بگیم یه چیزی مال کیه. مثلا «کتابِ من»، «ماشینِ او»، «خونه اونا». برای نشون دادن این مالکیت، دو نوع ضمیر داریم که تو ستون سوم و چهارم عکس هستن. شاید اسم‌هاشون یکم سخت به نظر بیاد، ولی کارشون خیلی سادس. بیا با هم بازشون کنیم...Possessive Adjectives یا صفت‌های ملکی (ستون سوم): این ضمیرها مثل یه برچسب مالکیت عمل می‌کنن که حتما باید قبل از یک اسم (Noun) بیان. به تنهایی معنای کاملی ندارن و همیشه به یه چیزی می‌چسبن تا بگن اون چیز یا اون اسم مال کیه.فکر کن می‌خوای بگی «کتاب من». نمی‌تونی فقط بگی my. جمله ناقصه. my چی؟ my book! پس قانون اصلی اینه:Possessive Adjective + Nounمعرفی ضمیرهای ستون سوم (Possessive Adjectives):My: مالِ منMy car is new (ماشینِ من جدیده)My book (کتاب من) (my به خودم یعنی &lt;من&gt; اشاره داره و برای همین تو ردیف I و me هست) (اسم داخل این جمله book هست که بعد از ضمیر مربوط به Possessive Adjectives اومده)Your: مالِ تو / شماyour sister (خواهرت) (اینجا من اومدم &lt;تو&gt; رو مالک یک چیزی کردم)I like your idea (از ایده‌یِ تو خوشم میاد)His: مالِ او (مرد)His name is Ali (اسمِ او علی است)Her: مالِ او (زن)Her job is interesting (شغلِ او جالبه)her problem (مشکل او) (صفت ملکی &lt;او زن&gt; مثل Object Pronounsعه، یعنی her استفاده میشه. تو این جلمه &lt;او زن&gt; رو مالک مشکل کردم)Its: مالِ آن (برای اشیاء، حیوانات یا ایده‌ها)The cat drank its milk (گربه شیرش رو خورد)Our: مالِ ماThis is our house (این خونه‌یِ ما است)our class (کلاس ما) (اینجا &lt;ما&gt; مالک کلاس شدیم)Their: مالِ آن‌هاTheir car is blue (ماشینِ آن‌ها آبیه)Their team (تیم آنها) (آنها مالک تیم هستن)دیدی؟ همشون قبل از یه اسم (noun) اومدن.Possessive Pronouns یا ضمیرهای ملکی (ستون چهارم): این کلمه‌ها قوی‌ترن! خودشون به تنهایی معنی میدن و نیازی ندارن که بعدشون اسم قرار بگیره (بدون اسم هم میتونن مالکیت رو مشخص کنن) در واقع، اینا میان جایPossessive Adjective + Nounمی‌شینن تا از تکرار، جلوگیری کنن. مثال:شخص اول: this is my car (این ماشین منه)شخص دوم: no. its mine (نه. مال منه)فرض کن یکی می‌پرسه: این ماشین کیه؟ (?Whose car is this)تو به جای اینکه جواب بدی: This is my car (این ماشین من است)میتونی کوتاه و خلاصه‌تر بگی: It&#039;s mine (مالِ منه)اینجا mine خودش به معنی my car هست.قانون اصلی: این ضمیرها به تنهایی میان و بعدشون اسم نمیاد.معرفی ضمیرهای ستون چهارم (Possessive Pronouns):Mine: مالِ منThis is my car (تو این مثال از اسم استفاده کردم و ضمیر مربوط به Possessive Adjectives رو قرار دادم)This is mine (تو این مثال از اسم استفاده نکردم و ضمیر مربوط به Possessive Pronouns رو قرار دادم)This book is mine (این کتاب مالِ من است)سوال: ?Whose jacket جواب: This is Mine (مال منه)Yours: مالِ تو / شماThe mistake was yours (اشتباه مالِ تو بود)سوال: ?Whose jacket جواب: This is yours (مال تو است)His: مالِ او (مرد)The blue car is his (ماشین آبیه مالِ او است)سوال: ?Whose jacket جواب: This is his (مال او &lt;مرد&gt; است)نکته: His هم برای ستون سوم استفاده میشه هم چهارم. از کجای جمله بفهمیم کدومه؟ اگه بعدش اسم بیاد، صفت ملکیه (His car). اگه تنها بیاد، ضمیر ملکیه (The car is his).Hers: مالِ او (زن)The new office is hers (دفتر جدیده مالِ او است)سوال: ?Whose jacket جواب: This is hers (مال او &lt;زن&gt; است)Its: (این حالت خیلی خیلی نادره و تقریبا استفاده نمیشه، پس فعلا نادیدش میگیرم تا گیج نشم)Ours: مالِ ماThat house is ours (آن خانه مالِ ما است)سوال: ?Whose jacket جواب: This is ours (مال ما است)Theirs: مالِ آن‌هاThe decision was theirs (تصمیم مالِ آن‌ها بود)سوال: ?Whose jacket جواب: This is therisجمع‌بندی نهایی و مقایسهبیا یه بار دیگه این دو تا رو کنار هم ببینیم تا فرقشون کامل مشخص بشه:</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Mon, 06 Oct 2025 16:22:40 +0330</pubDate>
            </item>
                    <item>
                <title>TCP vs UDP</title>
                <link>https://virgool.io/@mrNazouri13/tcp-vs-udp-p9ycyaspkiim-p9ycyaspkiim</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)TCP و UDP چی هستن؟تو دنیای شبکه، داده‌ها به شکل بسته‌های کوچیک (Packet) جابه‌جا می‌شن. حالا TCP و UDP مثل دو روش مختلف برای فرستادن این بسته‌ها هستن:TCP مثل پست سفارشی با رسید تحویله! مطمئن می‌شه بسته‌ها درست، کامل و به ترتیب به مقصد برسن.UDP مثل پرت کردن یه نامه تو صندوق پستی بدون چک کردن! سریع ارسال میشه، ولی تضمین نمی‌کنه که حتما برسه یا به ترتیب باشه.هر دوی اینا تو لایه Transport کار می‌کنن، یعنی یه لایه بالاتر از IP که قبلا باهاش آشنا شدیم. کارشون اینه که داده‌ها رو از یه برنامه (مثل مرورگرت) به برنامه دیگه (مثل سرور گوگل) برسونن.درنهایت:TCP: مثل پست پیشتاز با امضای تحویل (خیلی دقیق، همه‌چی حساب‌شده)UDP: مثل فرستادن نامه با کبوتر یا فریاد زدن وسط خیابون (سریع، بی‌تشریفات)هر کدوم کاربرد خودشون رو دارن، بستگی داره بخوای دقت داشته باشی یا سرعت.تاریخچه و دلیل به وجود اومدن TCP و UDPبرگردیم به دهه 1970، وقتی اینترنت تازه داشت شکل می‌گرفت. اون موقع دانشمندهایی مثل وینت سرف و رابرت کان داشتن TCP/IP رو طراحی می‌کردن تا شبکه‌های مختلف بتونن با هم حرف بزنن. TCP طراحی شد تا یه روش مطمئن برای انتقال داده باشه، چون تو شبکه‌های اولیه داده‌ها ممکن بود گم بشن، خراب بشن یا به ترتیب اشتباه برسن. اما بعدا، وقتی برنامه‌هایی مثل پخش ویدیو یا تماس صوتی اومدن، مهندس‌ها دیدن که TCP زیادی کند و سنگین عمل می‌کنه، چون کلی چک و بررسی داره. برای همین UDP رو ساختن که سریع‌تر باشه، ولی به قیمت اینکه تضمین کمتری بده. UDP برای کارایی که سرعت مهم‌تر از دقت بود (مثل استریم یا بازی آنلاین) عالیه.بررسی دقیق تر TCPاسم کاملش: Transmission Control Protocol یعنی پروتکل کنترل انتقال.ویژگی‌ها:Reliability (قابل اعتماد بودن): هر segment شماره‌گذاری میشه. گیرنده وقتی دریافت کرد، پیام تایید (ACK) می‌فرسته. اگه تایید نرسید، دوباره ارسال میشه.Error checking (کنترل خطا): اگه بسته خراب شد، TCP می‌فهمه و دوباره از فرستنده درخواست می‌کنه.Flow Control (کنترل جریان): اگه گیرنده سرعت کمتری داشته باشه، TCP خودش سرعت رو تنظیم می‌کنه تا گیرنده هنگ نکنه.یکی از ویژگی های مهم TCP اتصال محور بودنش یا Connection-Oriented بودنشه. چی هست؟وقتی میگیم TCP یک پروتکل connection-orientedعه یعنی قبل از اینکه دو تا دستگاه شروع کنن با هم حرف بزنن یا داده جا‌به‌جا کنن، اول میشینن یه جورایی قول و قرار میذارن و مطمئن میشن که:هر دو آمادن.شماره‌گذاری پیام‌هاشون یکیه.هیچکدوم وسط حرف هم نمی‌پرن.درکل، مثل تلفن زدن می‌مونه: اول زنگ می‌زنی، طرف گوشی رو برمی‌داره، میگه الو، تو هم میگی الو، بعد تازه حرف اصلی شروع میشه. این شد connection-oriented.ارتباط اولیه یا Connection-Oriented بین دو کامپیوتر، تو 3 مرحله انجام میشه! چرا سه مرحله؟فرض کن میخوای به دوستت زنگ بزنی و باهاش حرف بزنی. قبل از اینکه شروع کنی حرف بزنی، یه سری مقدمات لازمه:گوشی رو برمیداری و شماره‌اش رو می‌گیری (یعنی میگی من میخوام وصل بشم).اون گوشی رو جواب میده و میگه: الو! صدات میاد، منم آماده‌ام. (یعنی هم جواب تو رو میده هم خودش اعلام میکنه آماده‌ست).تو میگی: صدای تو هم بهم رسید. حالا می‌تونیم حرف بزنیم. (یعنی تایید نهایی)بعدش تازه مکالمه شروع میشه.تصور کن این ارتباط سه مرحله‌ایی نبود!اگه فقط یه طرف می‌گفت آمادم (مثلا تو فقط بگی الو من هستم) ولی طرف مقابل هیچوقت جواب نده، عملا هیچ ارتباطی شکل نمی‌گیره.اگه دو مرحله‌ای باشه (تو بگی الو، اون بگه منم هستم) ولی تو هیچوقت تایید نکنی، طرف مقابل مطمئن نیست که واقعا صدای اون بهت رسیده یا نه.سه مرحله باعث میشه هر دو طرف 100٪ مطمئن شن که:طرف مقابل واقعا زنده و در دسترسه،شماره‌ها و اطلاعات اولیه رد و بدل شده،میشه شروع به فرستادن داده کرد.اگه بخوام دقیق تر بگم، ارتباط 3 مرحله رو Three-Way Handshake مینامیم.Three-Way Handshake چطور انجام میشه؟فرض کن می‌خوای با یه نفر شروع کنی به صحبت کردن. ولی قبل از حرف زدن باید مطمئن بشی هر دو طرف آماده‌این و یه زبان مشترک دارین. TCP هم همین کارو می‌کنه! قبل از فرستادن داده‌ها یه دست‌دادن رسمی انجام میده تا هر دو طرف مطمئن باشن چی و چطوری قرارِ رد و بدل بشه. این دست‌دادن سه مرحله داره:SYN =&gt; SYN-ACK =&gt; ACK.تصور کن می‌خوای تلفنی صحبت کنی:تو زنگ می‌زنی و میگی می‌خوام باهات حرف بزنم (این همون SYN هست).اون طرف جواب میده من شنیدم و آمادم، من هم می‌خوام باهات حرف بزنم (این SYN+ACK هست).تو می‌گی: آها گرفتم، حالا بزن بریم (این ACK هست).بعد از این سه مرحله تازه حرف‌هاتون رو می‌زنید. دقیقا همین سه تا مرحله در Three-Way Handshake اتفاق میفته.اصطلاحات که باید بلد باشیم:SYN: یعنی می‌خوام اتصال رو شروع کنم.ACK: یعنی گرفتم و تایید می‌کنم.ISN (Initial Sequence Number): شمارهٔ شروعی که هر طرف برای شمارش بایت‌ها انتخاب می‌کنه.ISN در واقع یک عدد بزرگ و ظاهرا تصادفیه. ما نمونه‌های ساده می‌زنیم تا فهمش آسون باشه، ولی در عمل عددها معمولا بزرگ و تصادفین برای جلوگیری از تداخل با اتصال‌های قدیمی.فرض کنیم:کلاینت یک ISN انتخاب کرده: 1000سرور یک ISN انتخاب کرده: 5000قدم اول: کلاینت یک بسته SYN با Sequence Number عدد 1000 میفرسته. تو می‌گی می‌خوام وصل شم، شماره‌ی شروع من 1000 هست. این بسته فقط پرچم SYN داره و Sequence = 1000.قدم دوم: سرور یک بسته SYN+ACK با Sequence Number عدد 5000 و Ack عدد 1001 ارسال میکنه. سرور میگه من دریافت کردم SYN تو رو، این شماره‌ی شروع منه (5000)، و من ACK میکنم (جواب میدم) SYN تو رو با مقدار 1001.چرا 1001 انتخاب کرد؟ سرور میگه من شماره 1000 رو دیدم و تو یک واحد جلوتر رو باید تأیید کنی. اینطوری ACK برابر میشه با مقدار عدد Sequence Number از سمت کلاینت + 1.قدم سوم: کلایت بسته SYN+ACK رو دریافت و تایید میکنه. کلاینت میگه: ای سرور، ISN تو رو دریافت کردم، الان ACK با عدد 5001 میزنم برات.بعد از ارسال این بسته به سمت سرور، هردو وارد یک حالت پایدار میشن و میتونن داده جا به جا کنن.بررسی دقیق تر UDPاسم کاملش: User Datagram Protocol یعنی پروتکل دیتاگرام کاربر.UDP میگه من فقط بسته رو می‌فرستم، دیگه به من ربطی نداره رسید یا نه.ویژگی‌ها:Connectionless (بدون ارتباط): هیچ Handshake و مقدمه‌ای در کار نیست. همون اول بسته میره.No reliability (غیر قابل اطمینان): نه شماره‌گذاری داره، نه ACK.No ordering (بدون ترتیب): بسته‌ها ممکنه به ترتیب اشتباه برسن. UDP اهمیتی نمیده.خیلی سریع: چون به اندازه TCP چک و بررسی انجام نمیده.خلاصه: UDP سریع و سبک، ولی بی‌خیالِ نظم و اطمینان.کاربردها (کجا TCP خوبه، کجا UDP)TCP (دقت مهمه):وب‌گردی (HTTP/HTTPS): نمیخوای نصف صفحه بیاد.ایمیل (SMTP, IMAP, POP3): باید کامل برسه.انتقال فایل (FTP, SFTP): نباید فایل خراب بشه.ریموت دسکتاپ (SSH, RDP): باید قابل اعتماد باشه.UDP (سرعت مهمه)پخش آنلاین ویدیو/موزیک (Streaming): اگه یک فریم جا بیفته مهم نیست، مهم سرعت هست.بازی‌های آنلاین: نمیخوای حرکتت با تاخیر برسه، حتی اگه یک بسته گم بشه.تماس صوتی و تصویری (VoIP): کیفیت زنده مهم‌تر از رسیدن 100% بسته‌هاست.پروتکل‌های سبک مثل DNS: جواب رو خیلی سریع میخوای، لازم نیست تضمین پیچیده باشه.</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Tue, 30 Sep 2025 16:12:20 +0330</pubDate>
            </item>
                    <item>
                <title>سیر تا پیاز IP یا Internet Protoco</title>
                <link>https://virgool.io/@mrNazouri13/%D8%B3%DB%8C%D8%B1-%D8%AA%D8%A7-%D9%BE%DB%8C%D8%A7%D8%B2-ip-%DB%8C%D8%A7-internet-protoco-zpz3henur16b</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)قبل اینکه اینترنت شکل بگیره، کامپیوترها فقط توی شبکه‌های LAN بودن. مثلا چند تا کامپیوتر با کابل به هم وصل می‌شدن و داده جابه‌جا می‌کردن (به واسطه MAC Address).وقتی خواستیم شبکه‌ها رو بهم وصل کنیم (یعنی LANهای مختلف به هم وصل بشن و شبکه بزرگ بشه) یه مشکل بزرگ پیش اومد؟!توی هر شبکه محلی، دستگاه‌ها با MAC Address همدیگه رو میشناسن. ولی MAC فقط تو همون شبکه جواب میده. چون MAC یه آدرس سخت‌افزاریه و ساختارش برای مسیر‌یابی بین شبکه‌های مختلف طراحی نشده.اینجا بود که گفتن ما نیاز به یه آدرس منطقی داریم، نه فقط سخت‌افزاری. آدرسی که بشه باهاش مسیر داده رو از شبکه‌ای به شبکه دیگه مشخص کرد.نتیجه چی شد؟ ساخت پروتکل IP یا Internet Protocol.قبلا راجب TCP/IP صحبت کردیم. گفتیم TCP/IP یه مجموعه پروتکله. TCP/IP دو بخش داره:TCP (Transmission Control Protocol): مسئول اینه که مطمئن بشه داده‌ها درست و به ترتیب به مقصد می‌رسن.IP (Internet Protocol): مسئول آدرس‌دهی و فرستادن بسته‌های داده (Packet) به مقصد درست.IP مثل پستچی اینترنت شد که می‌دونه هر بسته باید به کدوم آدرس بره. بدون IP، داده‌ها تو شبکه گم می‌شدن، چون هیچ راهی برای پیدا کردن مقصد نبود.IP تو لایه Internet از TCP/IP قرار داره.نتیجه گیری (تا الان):MAC Address برای مسیریابی در بیرون از شبکه های LAN مناسب نیست. دلیلش:MAC Addressها بر اساس سازنده مرتب شدن، نه موقعیت جغرافیایی. دستگاه‌های یه شرکت می‌تونن در سراسر جهان پخش باشن.اگه روترهای اینترنت بخوان بر اساس MAC Address مسیریابی کنن، باید جدولی از میلیاردها MAC Address داشته باشن که عملا غیرممکنه.پس نیاز به یک آدرس‌دهی جدید بود! یک آدرس منطقی (نه فیزیکی).یک آدرس سلسله‌مراتبی (مثل سیستم کدپستی) تا بتونه مسیریابی رو ساده کنه.یک آدرس که قابل تغییر باشه (برخلاف MAC Address).این نیاز، منجر به ایجاد Internet Protocol (IP) شد.نسخه های مختلف IP:پروتکل IP دو نسخه داره: IPv4 و IPv6IPv4:قدیمی‌ترین و پرکاربردترین نسخه.آدرس‌هاش 32 بیتیه. چیزی مثل: 192.168.1.1.تقریبا 4 میلیارد آدرس میده.مشکل: کمبود آدرس (چون دستگاه‌ها زیاد شدن).این نسخه به 4 قسمت 8 بیتی تقسیم میشه که به هر قسمت Octet گفته میشه (قسمت ها با . از هم جدا میشن)هر Octet میتونه عددی بین 0 تا 255 باشه.IPv6:ساخته شد که مشکل کمبود آدرس حل بشه.128 بیتیه. چیزی مثل:2001:0db8:85a3:0000:0000:8a2e:0370:7334تعداد آدرس‌هاش تقریبا بی‌نهایت.هنوز بصورت کامل جایگزین IPv4 نشده، ولی داره کم‌کم بیشتر میشه.(تو این آموزش روی IPv4 وقت میزاریم)ساختار IP به چه شکله؟هر بسته IP یه هدر (Header) داره که این اطلاعات مهم رو نگه می‌داره:آدرس IP مبدا (Source IP)آدرس IP مقصد (Destination IP)ورژن IP (IPv4 یا IPv6)TTL (Time To Live - تا چند تا روتر می‌تونه عبور کنه)نوع Protocol (مثلا TCP یا UDP یا ICMP)(من از این مقاله یک ویدیو داخل یوتیوبم قرار دادم، حتما اون ویدیو رو مشاهده کنید چون بصورت خیلی کامل‌تر تمام این مفاهیم بررسی میشه)برای درک بهتر مفاهیم بعدی، نیاز هست با مثال های متنوع جلو بریم.پلاک خونه‌ی من 13 عه. به دوستم زنگ میزنم، آدرس خونش رو میپرسم، آدرس رو بهم میده و در آخر میگه پلاک خونش 13 هست!! چطور ممکنه؟ یعنی هم پلاک خونه من 13عه و هم خونه دوستم؟ خب چرا شهرداری نمیاد پلاک تمام خونه هارو یکتا کنه؟شما تصور کن شهرداری میخواست پلاک تمام خونه ها یکتا باشه، یعنی از خونه 1 شروع میکرد و هیچ خونه‌ی دیگه‌ایی تو اصفهان حق نداشت پلاک 1 داشته باشه! همینطور که متوجه شدید این مورد اصلا امکان پذیر نیست.چیکار کردن؟ گفتن هر کوچه یک رنج از پلاک هارو داره که فقط مختص همون کوچست! یعنی چی؟تو اصفهان یه خیابون هست به اسم احمدآباد. تو این خیابون یه کوچه هست به اسم طاهری، تو کوچه طاهری خونه اول پلاک 1 رو داره، خونه دوم پلاک 2 رو داره تاااا آخر.حالا از کوچه طاهری بیرون میایم و میریم کوچه بعدی که تو خیابون احمدآباده و اسمش شهید محمدیه.تو این کوچه هم شماره پلاک ها دوباره از 1 شروع میشن تاااا آخر.شما هیچوقت نمیتونی دوتا خونه با پلاک مشابه رو تو یک کوچه پیدا کنی. هر کوچه محدوده خاص خودش رو داره و پلاک خونه های اون کوچه ها، فقط تو همون کوچه معتبره. مثال میزنم!فرض کن بخوام آدرس خونم رو بدم! میگم: اصفهان. پلاک 5این آدرس کلا نامعتبره. البته درست نوشتم، خونه من پلاکش 5عه ولی پلاک خونم، فقط تو کوچه معتبره. پس من باید آدرس کامل رو تا کوچه بنویسم، و بگم توی فلان کوچه، پلاک 5 هستم. اینجا پلاک معنی پیدا میکنه چون مشخص شده تو کدوم محدوده/کوچه قرار داره. درنتیجه: اصفهان، خیابون احمدآباد، کوچه شهید محمدی، پلاک 5.تمام این موارد گفته شد، تا موضوع Public IP و Private IP رو درک کنید.Public IP: آدرسی که تو کل اینترنت منحصر به فرده و دستگاه های دیگه میتونن با این آدرس با کامپیوتر هدف ارتباط برقرار کنن. برای مثال، ایران هیچ استانیش با استان دیگش اسم یکسانی نداره، مثلا استان اصفهان رو داریم، یا مازندران یا... اما، تو هر استان ممکنه محله هایی باشه با اسم یکسان! مثل محله همت‌خان تو اصفهان و محله همت‌خان تو مازندران (مثال زدم) Public IP مثل اسم استانه که همیشه منحصر به فرده و اسم‌ محله ها Private IP میشن، یعنی آدرس هایی که بعد از یک آدرس عمومی قرار دارن.Public IP توسط IANA (یه سازمان جهانی که مدیریت آدرس‌های IP رو بر عهده داره) و از طریق ارائه‌دهنده‌های اینترنت (ISP) مثل ایرانسل یا مخابرات به دستگاه‌ها یا شبکه‌ها اختصاص داده میشه.قبلا گفته شد، IPv4 فقط حدود 4.3 میلیارد آدرس منحصربه‌فرد داره. حالا تصور کن:یه شرکت بزرگ با 1000 کارمند، اگه بخواد به هر کامپیوتر یه آدرس IP عمومی اختصاص بده، باید 1000 آدرس IP از ISP بگیره. این کار هم بسیار گرون تموم میشه، هم غیرعملی بود.همینطور برای خونه‌ها، اگه چند تا دستگاه (لپ‌تاپ، موبایل، کنسول بازی و...) داشته باشی، نیاز به چند تا آدرس IP عمومی داشتی که در نتیجه خیلی سریع آدرس‌ها تموم می‌شد.درنهایت مشکل، کمبود آدرس IP عمومی (IPv4) بود.چطوری مشکل رو برطرف کردن؟ با Private IP.با Public IP ها آشنا شدید، آدرس های عمومی از IP ها که تو سطح اینترنت یکتا هستن! مثلا سرور گوگل یک آدرس Public داره که هرکسی میتونه بهش درخواست بزنه، حالا تصور کن یه سرور دیگه هم همین آدرس IP رو داشته باشه، اینجا به خطا میخوریم.Private IPها آدرس هایی هستن که تو سطح شبکه های محلی وجود دارن و تو سطح اینترنت شناخته شده نیستن.فرض کن من 3 تا دستگاه مثل لپ‌تاپ، موبایل و تلوزیون دارم که همشون وصلن به مودم اینترنتم. وقتی من تو شرکت مخابرات ثبت نام میکنم و اینترنت میخرم، اونها یک آدرس IP Public رو دراختیارم قرار میدن تا از طریقش بتونم وارد شبکه اینترنت بشم. تا اینجا من یک عدد IP Public دارم و 3 تا دستگاه.مودم میاد IP Public رو از مخابرات تحویل میگیره و پیش خودش نگه میداره. از طرفی میاد به 3 تا دستگاهی که بهش وصلن، IP خصوصی (Private) میده. حالا هر موقع، هر کدوم از دستگاه‌ها بخوان به اینترنت متصل بشن و چیزی رو ارسال/دریافت کنن، مودم میاد IP خصوصی رو از دستگاه میگیره، موقتا بهش IP عمومی رو میده تا بره تو اینترنت و برگرده و در آخر دوباره IP عمومی رو ازش میگیره. با این ترفند میشه یک IP Public رو در اختیار چندین دستگاه قرار بدیم که نخوایم هزینه کنیم و بریم برای هرکدوم یک Public IP تهیه کنیم.یکم بالاتر گفته شد که مودم، آدرس های IP خصوصی رو بین دستگاه های متصل بهش (داخل LAN) پخش میکنه! سوالی که به وجود میاد اینه که مودم چطور IP های Private رو تشخیص میده؟همون اوایل که استاندارد یا پروتکل IP ساخته شد، اومدن چند تا رنج از IP رو مشخص کردن و گفتن این رنج ها تو دنیای اینترنت (Public) هیچ وقت استفاده نخواهد شد، درنتیجه این رنج هارو برای شبکه های محلی میتونید تنظیم کنید.یه سوال! رنج یعنی چه؟ فرضا میگم رنج 5 تا 25 رو میخوام، خروجی:5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25حالا وقتی میگم از رنج آیپی 10.0.0.0 تا مثلا 10.255.255.255 یعنی:10.0.0.1
10.0.0.2
10.0.0.3
10.0.0.4
تااااا
10.0.0.255
10.0.1.0
10.0.1.1
تاااااااااا آخر
10.255.255.254رنج های Private IP:10.0.0.0 تا 10.255.255.255 (کلاس A) ( با این کلاس/رنج یک شبکه‌ی خیلی بزرگ دارم با 16 میلیون آدرس)172.16.0.0 تا 172.31.255.255 (کلاس B) (با این کلاس 16 تا شبکه‌ی متوسط میتونم بسازم)192.168.0.0 تا 192.168.255.255 (کلاس C) (با این کلاس میتونم 256 شبکه‌‌ی کوچیک بسازم)جمع بندی کوتاه:IP به دو حالت Public و Private تقسیم میشه. آدرس های Public فقط در سطح اینترنت معتبر هستن. آدرس های Private محدوده هایی هستن که توسط خود پروتکل IP مشخص شدن برای آدرس دهی تو شبکه های محلی و این آیپی های Private به هیچ عنوان تو سطح اینترنت به هیچ دستگاهی اختصاص داده نمیشن.Public IP توسط ISP (شرکت اینترنت) به مودم داده میشه.این آدرس در اینترنت شناخته‌شدس و هر سرور یا کلاینتی در اینترنت می‌تونه بهش وصل بشه (اگه فایروال و روتر اجازه بدن).Public IP می‌تونه Static (ثابت) باشه یا Dynamic (هر بار ممکنه عوض شه. از طریق DHCP از ISP).مثال:مودم خونه: 203.0.113.5 (مثال فرضی public)سایت گوگل مثلا 8.8.8.8 (public DNS) هرکی توی اینترنت می‌تونه به این آدرس بسته بفرسته.NAT چیه؟ NAT مخفف Network Address Translationـه، یعنی ترجمه کردن آدرس شبکه. کارش اینه که آدرس‌های خصوصی (Private IP) داخل شبکه LAN رو به یه آدرس عمومی (Public IP) تبدیل کنه تا بتونن تو اینترنت دیده بشن.ما فقط یه تعداد محدود IP Public داریم (IPv4 حدود 4 میلیارد تا).اما دستگاه‌ها (موبایل، لپ‌تاپ، تلویزیون هوشمند، دوربین ...) میلیاردها شدن.راه‌حل: همه تو خونه یا شرکت Private IP داشته باشن و وقتی می‌خوان برن اینترنت، مودم/روتر با NAT کاری کنه که همشون از یک IP Public استفاده کنن.NAT چطوری کار می‌کنه؟ اطلاعات شبکه:کامپیوتر اول: 192.168.1.10 (آدرس خصوصی)کامپیوتر دوم: 192.168.1.20 (آدرس خصوصی)مودم/روتر: 203.0.113.5 (آدرس عمومی که روی اینترنت دیده میشه)سرور گوگل: 142.250.190.78 (آدرس عمومی)مرحله 1: ایجاد درخواست از PC1 (کامپیوتر اول)PC1 میخواد صفحه‌ی گوگل رو باز کنه. یعنی یه درخواست TCP به سمت 142.250.190.78:443 (پورت HTTPS) می‌فرسته. این درخواست با مشخصات زیر ساخته میشه:Source IP: 192.168.1.10
Source Port: 50000   (یه پورت موقتی که سیستم ساخته)
Destination IP: 142.250.190.78
Destination Port: 443مرحله 2: رسیدن بسته/درخواست به مودموقتی این بسته به مودم می‌رسه، مودم میگه:صبر کن! آدرس 192.168.1.10 خصوصیه، روی اینترنت شناخته‌شده نیست. من باید NAT کنم.مودم میاد Source IP رو تغییر میده و آدرس عمومی خودش (203.0.113.5) رو جایگزین می‌کنه.ولی یه مشکل: اگه PC2 هم همزمان درخواست بده، از کجا بفهمه کدوم جواب برای کیه؟اینجاست که مودم از Port Address Translation (PAT) استفاده می‌کنه. یعنی پورت مبدا رو هم تغییر میده.مثال بعد از تغییر:Source IP: 203.0.113.5
Source Port: 40001   (مودم ساخته)
Destination IP: 142.250.190.78
Destination Port: 443مودم میاد تو جدول NAT خودش تمام این تغییرات رو ذخیره میکنه. نمونش:192.168.1.10:50000  &lt;-&gt; 203.0.113.5:40001تو جدول NAT گفته شده که تو شبکه محلی یک درخواست ساخته شده از مبدا 192.168.1.10 روی پورت 50000. من همین درخواست رو به 203.0.113.5 روی پورت 40001 تغییر دادم. یعنی هرموقع سمت من، بسته ایی اومد که مقصدش 203.0.113.5:40001 بود باید به 192.168.1.10:50000 تحویلش بدم.مرحله 3: رسیدن بسته به گوگلبسته‌ایی که ساختم میرسه به گوگل. گوگل بسته رو باز میکنه و محتوای زیر داخلش قرار داره:درخواست از
203.0.113.5:40001
به
142.250.190.78:443گوگل هیچ خبری از IP خصوصی (192.168.1.10) نداره. برای گوگل فقط مودم شما وجود داره.مرحله 4: پاسخ گوگلگوگل جواب رو به همون آدرسی که درخواست رو فرستاده برمیگردونه:Source IP: 142.250.190.78
Source Port: 443
Destination IP: 203.0.113.5
Destination Port: 40001مرحله 5: رسیدن بسته به مودممودم جواب رو می‌گیره و یه نگاه به جدول NAT خودش میندازه:203.0.113.5:40001 == 192.168.1.10:50000میفهمه که بسته‌ی دریافتی برای یک سیستم محلی با آدرس 192.168.1.10 هست که روی پورت 50000 منتظره که پاسخ دریافت بشه. پس میاد اطلاعات مقصد بسته رو به حالت زیر تغییر میده و ارسال میکنه برای PC1:Source IP: 142.250.190.78
Source Port: 443
Destination IP: 192.168.1.10
Destination Port: 50000اگه همزمان PC2 هم به گوگل وصل بشه چی میشه؟PC2 هم یه بسته میفرسته با Source IP 192.168.1.20 و مثلا پورت 50001.مودم اون رو هم تغییر میده به مثلا 203.0.113.5:40002 و یه رکورد جدید تو جدول NAT ذخیره می‌کنه.به این شکل، مودم میتونه تشخیص بده هر جوابی که برمیگرده برای کدوم دستگاهه.جمع بندی:IP خصوصی فقط تو شبکه داخلی معنا داره.مودم NAT رو اجرا میکنه تا اون رو به IP عمومی خودش ترجمه کنه.با استفاده از پورت‌ها، میفهمه کدوم بسته مال کدوم کامپیوتره.برای گوگل، فقط یه دستگاه (مودم) وجود داره. ولی در اصل پشتش چندین کامپیوتر هست.Subnet Mask چیه؟یه آدرس IP دارم. مثلا 192.168.1.10این IP از دو بخش تشکیل شده:Network ID (آدرس شبکه): نشون میده این دستگاه تو کدوم شبکست.Host ID (آدرس میزبان): نشون میده کدوم دستگاهِ داخلِ اون شبکست.IP به تنهایی نمیتونه مشخص کنه کدوم بخش برای شبکه و کدوم بخش برای میزبانه. اینجاست که Subnet Mask وارد میشه.قبل از بررسی دقیق Subnet Mask یه مثال بزنم تا بهتر درک بشه. به این آدرس دقت کن:اصفهان. فلکه احمدآباد. خیابان احمدآباد. کوچه شهید محمودی. پلاک 8این آدرس رو میتونیم به 2 بخش تقسیم کنیم! بخش اول مشخص میکنه که من دارم به کدوم شبکه/محله اشاره میکنم. بخش اول میشه: اصفهان. فلکه احمدآباد. خیابان احمدآباد. کوچه شهید محمودی.بخش اول مثل Network IDعه، یعنی مشخص میکنه دارم به کدوم شبکه اشاره میکنم (شناسه شبکه رو نشون میده)بخش دوم مشخص میکنه تو اون شبکه که Network ID مشخص کرده، میخوام به کدوم دستگاهش اشاره کنم. بخش دوم میشه: پلاک 8.تو پروتکل IP یک استاندارد به اسم Subnet Mask مثل یک خط کش تعیین میکنه که تا کجای IP مال شبکست و از کجا به بعدش مال Host.شکل و ساختار Subnet Mask:ساختار Subnet Mask دقیقا مثل IPعه. یعنی از 4 Octet تشکیل شده که هرکدوم میتونه مقداری بین 0 تا 255 داشته باشه. مثال: 255.255.255.0255 یعنی این بخش ثابت و مربوط به شبکه هست.0 یعنی این بخش متغیر و مربوط به میزبان‌ها هست.فرضا روی کامپیوتر من، IP و Subnet Mask زیر تنظیم شده:192.168.1.10
255.255.255.0از 192.168.1.10 بخش 192.168.1 مربوط به شناسه شبکست (Network ID)مابقی آدرس، یعنی 10 اشاره میکنه به یک دستگاه داخل شبکه (Host ID)درنتیجه، اگه بخوام یک شبکه LAN بسازم، باید IP تمام دستگاه‌ها رو 192.168.1.x قرار بدم و سابنت مسک 255.255.255.0 رو برای همشون تنظیم کنم. چرا؟ چون همشون داخل یک شبکه باشن.یه مثال دیگه! فرضا روی کامپیوترم IP و Subnet Mask زیر تنظیم شده:IP: 10.0.5.25
Subnet Mask: 255.255.0.0قسمت 10.0 مربوط میشه به Network ID و قسمت 5.25 مربوط میشه به Host ID.تو این حالت دستگاه های بیشتری رو میتونم داخل شبکم آدرس دهی کنم.قبل تر راجب کلاس های IP صحبت شد. هرکلاس Subnet Mask مختص به خودش رو داره:Class A: 255.0.0.0
Class B: 255.255.0.0
Class C: 255.255.255.0گاهی به جای نوشتن کامل Subnet Mask، به شکل خلاصه میگن:192.168.1.10/24اون 24/ یعنی 24 بیت اول مال شبکست. هر 255 در Subnet Mask یعنی 8 بیت.درنتیجه 24/ یعنی 24 بیت اول که میشه 255.255.255.0.مودم خونه شما Subnet Mask پیش‌فرضش 255.255.255.0 هست. یعنی میگه فقط آخرین octet برای میزبان‌هاست. پس توی خونه می‌تونی از IPهای زیر استفاده کنی:192.168.1.1
192.168.1.2
192.168.1.3
...
192.168.1.254یه سوال! چرا نمیتونم از 192.168.1.0 و 192.168.1.255 استفاده کنم؟تو هر شبکه دوتا آدرس هست که نمیشه به دستگاه ها اختصاص داد و اون دوتا آدرس رزرو شدن.اولین آدرس IP داخل یک شبکه اختصاص داده میشه به خود شبکه. یعنی اون آدرس فقط و فقط به کلیت شبکه اشاره میکنه و از اون آدرس به بعد، میشه دستگاه هارو آدرس دهی کرد. درنتیجه:192.168.1.0: آدرس شبکه (Network ID)در کنار Network ID یک آدرس رزرو شده دیگه داریم به اسم Broadcast Address و آخرین آدرس آیپی یک شبکه اختصاص داره بهش. یعنی:192.168.1.255: آدرس پخش همگانی (Broadcast Address)چرا Network ID مهمه؟وقتی یه بسته می‌خواد تو شبکه جابه‌جا بشه، سیستم درابتدا نگاه می‌کنه ببینه مقصدش تو همون Network ID هست یا نه.اگه Network ID یکی باشه یعنی مقصد تو همون شبکه محلیه، مستقیم میره براش.اگه Network ID فرق داشته باشه یعنی مقصد تو یه شبکه دیگست، باید بسته رو بده به روتر/مودم تا مسیرش رو پیدا کنه.Default Gateway چیه؟تو هر شبکه‌ی LAN، دستگاه‌ها می‌تونن با هم حرف بزنن. ولی اگه بخوای از این شبکه بری بیرون (یعنی بری اینترنت یا یه شبکه دیگه)، باید یه دروازه خروجی داشته باشی. اون دروازه Default Gateway هست.تو تمام دستگاه‌هایی که به شبکه وصل میشن، یه قسمتی وجود داره به اسم Default Gateway. اصولا آیپی مودم یا روتر تو این بخش قرار میگیره و دستگاه ها میدونن که اگه بسته‌ایی باید از شبکه خارج بشه، باید برای Default Gateway (که آیپیش رو دارن) ارسال کنن. درنتیجه: مودم شما همیشه نقش Default Gateway رو بازی می‌کنه. مثلا:لپ‌تاپ: 192.168.1.10گوشی: 192.168.1.20مودم: 192.168.1.1آی‌پی مودم (192.168.1.1) میشه Default Gateway.پروتکل ARP چیه؟ARP یا Address Resolution Protocol یعنی پروتکل پیدا کردن آدرس.وقتی دستگاهی آدرس IP یه دستگاه دیگه رو داره اما نمی‌دونه MAC اون دستگاه چیه، از ARP استفاده میکنه و با کمکش MAC دستگاه هدف رو پیدا میکنه.ARP چطور کار میکنه؟شبکه فرضی ما:PC1: 192.168.1.10, MAC 00:11:22:33:44:55
PC2: 192.168.1.20, MAC 00:11:22:33:44:66
Gateway: 192.168.1.1, MAC AA:BB:CC:DD:EE:FFPC1 می‌خواد به PC2 پینگ بزنه.PC1 یه نگاه به جدول ARP cashe خودش میندازه تا ببینه MAC Address مربوط به 192.168.1.20 رو داره یا نه.اگه MAC Address مقصد وجود داشت که بسته ساخته و ارسال میشه. اگه وجود نداشت PC1 یه ARP Request رو بصورت Broadcast توی شبکه ارسال میکنه.ARP Request بسته‌ایی هست که برای همه ارسال میشه و داخلش نوشته شده که ایا آیپی شما برابر با فلان هست یا نه؟! اگه برابر بود MAC Address خودتون رو به کسی که این بسته رو فرستاده، ارسال کنید.یه سوال! ARP Request چطوری برای همه ارسال میشه؟ اگه توی بسته، مک آدرس گیرنده رو برابر کنیم با FF:FF:FF:FF:FF:FF سوئیچ میاد بسته رو برای تمام پورت هاش ارسال میکنه.بسته ARP Request میرسه به PC2 و میبینه که بسته برای خودش ارسال شده (چون آیپی مقصد با آیپی خودش یکیه) تو قدم بعد میاد یک بسته‌ی ARP Reply ایجاد میکنه و آدرس مک خودش رو داخلش قرار میده.بسته‌ی ARP Reply بصورت Unicast یا مستقیم به PC1 فرستاده میشه و وقتی جواب رو دریافت کرد، ARP Cashe خودش رو آپدیت میکنه تا هربار نخواد این درخواست رو ارسال کنه.وقتی مقصد بیرون LAN باشه (مثلا گوگل)، PC1 همین کارو برای Default Gateway انجام میده تا مک آدرس Gateway رو بگیره و بسته رو بهش بده.اگه ویندوز دارید توی cmd دستور arp -a رو وارد کنید تا جدول ARP رو ببینید.وقتی یه دستگاه می‌خواد داده بفرسته، سه جور می‌تونه این کارو بکنه:Unicast: فرستادن به یه دستگاه مشخص.استفاده: بیشتر ارتباط‌های روزمره مثل باز کردن سایت، چت، ایمیل.Broadcast: فرستادن به همه دستگاه‌های داخل یک شبکه محلی (LAN).استفاده: وقتی یه دستگاه نمی‌دونه کی باید جواب بده، مثل ARP Request یا DHCP Discover.Multicast: فرستادن به یه گروه خاص از دستگاه‌ها که عضو شدن.فرق اصلی:Unicast = یک نفرBroadcast = همهMulticast = فقط گروه خاصDHCP چیه؟فرض کن تو یه اتاق خالی هستی و 4 تا کامپیوتر کاملا نو و خاموش جلوته. یه دستگاه Switch هم داری. هدف اینه که این کامپیوترها بتونن با هم حرف بزنن.مرحله 1: ساختن LANاولین کاری که می‌کنی، وصل کردن کامپیوترهاست.یه کابل شبکه از کامپیوتر اول (PC1) برمیداری و به یکی از پورت‌های سوئیچ وصل می‌کنی.همین کار رو برای PC2 و PC3 و PC4 هم انجام میدی.الان چی داریم؟ ما الان یه LAN ساختیم. کامپیوترها مثل 4 تا خونه هستن که تو یه کوچه کنار هم قرار گرفتن و سوئیچ هم مثل مرکز پست محلی یا همون چهارراه اصلی محله است. این مرکز پست میدونه که هر کابل به کدوم خونه وصله، ولی هنوز هیچ کدوم از خونه‌ها آدرس یا پلاک ندارن.حالا کامپیوترها رو روشن می‌کنی. اونا از نظر فیزیکی به هم وصلن، ولی نمی‌تونن با هم حرف بزنن.چرا؟ چون هویت ندارن. PC1 نمی‌دونه چجوری باید PC2 رو صدا بزنه.مرحله 2: نیاز به آدرسبرای اینکه کامپیوترها بتونن با هم حرف بزنن، هر کدوم نیاز به یه آدرس IP منحصر به فرد دارن. IP مثل همون کد پستی یا پلاک خونه است.اینجا دو تا راه داریم:راه سخت (آدرس‌دهی دستی یا Static): خودت بری پای هر کامپیوتر و دستی بهش یه آدرس بدی. مثلا به PC1 بگی: آدرس تو از این به بعد 192.168.1.10 عه. به PC2 بگی: آدرس تو 192.168.1.11 هست و... این کار برای 4 تا کامپیوتر شدنیه، ولی تصور کن تو یه شرکت با 200 تا کامپیوتر هستی! خیلی سخت و وقت‌گیره و احتمال اشتباه هم زیاده (مثلا به دو تا کامپیوتر یه آدرس یکسان بدی و کل شبکه به هم بریزه).راه هوشمند (آدرس‌دهی خودکار یا Dynamic): اینجا قهرمان داستان ما، یعنی DHCP وارد میشه!مرحله 3: ورود قهرمان (DHCP Server)DHCP مخفف Dynamic Host Configuration Protocol عه. اسمش سخته ولی کارش خیلی سادست. DHCP مثل یه اداره ثبت احوال یا شهرداری خودکار برای شبکه ماست که مسئولیت دادن آدرس IP به کامپیوترها رو بر عهده داره.DHCP کجا و تو کدوم قسمت از شبکه قرار داره؟ تو اکثر شبکه‌های خونگی و کوچیک، این قابلیت روی روتر/مودم فعاله.این سرور (یعنی DHCP Server) یه لیست از آدرس‌های IP آماده و خالی داره (بهش میگن IP Pool). مثلا لیستی از آدرس‌های 192.168.1.100 تا 192.168.1.200 رو آماده کرده تا به هر کی درخواست داد، یکی رو اجاره بده.مرحله 4: گفتگو برای گرفتن آدرس (فرایند DORA)حالا که کامپیوترها روشن شدن و DHCP Server هم تو شبکه حاضره، یه مکالمه خیلی سریع و جالب بینشون اتفاق میوفته. این مکالمه 4 قدم داره که بهش میگن DORA:قدم اول: Discover (کشف یا فریاد کمک): PC1 که تازه روشن شده و هیچ آدرسی نداره، گیج و سردرگمه. اولین کاری که میکنه اینه که تو کل شبکه داد میزنه: آهای اهالی شبکه! من یه کامپیوتر جدیدم! هیچ آدرس IP ندارم! کسی اینجا هست که بتونه بهم یه آدرس بده؟این داد زدن در واقع یه بسته (Packet) به اسم DHCP Discover هست که به صورت Broadcast (یعنی برای همه) تو شبکه پخش میشه. سوئیچ این بسته رو به تمام پورت‌هاش (یعنی برای PC2, PC3, PC4 و روتر) میفرسته.قدم دوم: Offer (پیشنهاد یا پاسخ شهرداری):PC2, PC3, PC4 این بسته رو میگیرن ولی چون DHCP سرور نیستن، کاری باهاش ندارن و نادیدش میگیرن.اما روتر (یا DHCP Server) این فریاد رو میشنوه! به لیست آدرس‌های خالیش نگاه میکنه و میگه: آهان! آدرس 192.168.1.100 خالیه. بعد یه بسته به اسم DHCP Offer آماده میکنه و فقط برای PC1 میفرسته و میگه:سلام کامپیوتر جدید! من DHCP سرورم. چطوره آدرس 192.168.1.100 رو برای 24 ساعت بهت اجاره بدم؟ به همراه این آدرس، آدرس دروازه خروج از شبکه (Gateway) و آدرس سرور DNS رو هم بهت میدم.قدم سوم: Request (درخواست یا قبول پیشنهاد):PC1 این پیشنهاد سخاوتمندانه رو دریافت میکنه و خوشحال میشه.برای اینکه کار رو رسمی کنه، دوباره یه بسته Broadcast (برای همه) به اسم DHCP Request میفرسته و میگه:خیلی ممنون از پیشنهادتون! من، PC1، پیشنهاد آدرس 192.168.1.100 رو از اون سرور DHCP قبول می‌کنم!چرا این رو به همه میگه؟ چون ممکنه تو شبکه چندتا DHCP سرور باشه و چندتا پیشنهاد دریافت کرده باشه. با این کار به همه اعلام میکنه که کدوم پیشنهاد رو انتخاب کرده.قدم چهارم: Acknowledge (تایید - معامله تمام شد):DHCP Server این پیام تشکر و قبول کردن رو میگیره. حالا معامله رو نهایی میکنه.تو دفتر خودش یادداشت میکنه: آدرس 192.168.1.100 تا 24 ساعت آینده در اختیار PC1 است.آخرین بسته رو به اسم DHCP Acknowledge برای PC1 میفرسته و میگه:عالیه! این آدرس رسما برای تو شد. اینم مُهر تایید! خوش اومدی به شبکه!تمام! الان PC1 یه هویت و آدرس مشخص داره.همین فرایند DORA برای PC2 و PC3 و PC4 هم تکرار میشه.</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Tue, 30 Sep 2025 13:18:09 +0330</pubDate>
            </item>
                    <item>
                <title>همه چیز راجب MAC Address و Switch</title>
                <link>https://virgool.io/@mrNazouri13/%D9%87%D9%85%D9%87-%DA%86%DB%8C%D8%B2-%D8%B1%D8%A7%D8%AC%D8%A8-mac-address-%D9%88-switch-b3pp3gltnb7o</link>
                <description>(برای درک بهتر این مقاله، پیشنهاد میکنم چند مقاله قبلی رو مطالعه کنید)ویدیو مربوط به این مقاله: (کلیک کن)وقتی Ethernet تازه ساخته شده بود (دهه 1970) ایده این بود که چندین کامپیوتر بتونن همزمان روی یه کابل مشترک داده بفرستن. اما مشکل وجود داشت...هر دستگاه چطوری بفهمه داده‌ای که اومده برای خودش هست یا برای یکی دیگه؟مثل اینه که توی خیابون یکی داد بزنه بیا این بسته رو بگیر، خب همه می‌شنون. کی باید جواب بده؟اینجا نیاز شد به یه چیزی مثل شماره‌ی یکتا برای هر دستگاه، همون چیزی که بعدا اسمش شد MAC Address.درنهایت، MAC Address ساخته شد چون توی شبکه محلی (LAN) همه دستگاه‌ها روی یه محیط مشترک بودن (اون موقع کابل کواکسیال).پس باید یه راهی باشه که هر دستگاه یه هویت منحصربه‌فرد داشته باشه. این هویت باید:سخت‌افزاری باشه (یعنی روی کارت شبکه حک بشه).تغییر نکنه.هیچ دو دستگاهی توی دنیا آدرس یکسان نداشته باشن.برای همین شرکت‌های سازنده‌ی کارت شبکه شروع کردن به اختصاص دادن یه شماره یکتا به هر کارت شبکه.MAC Address دقیقا چیه؟MAC Address مخفف Media Access Control Address هست.یه شماره‌ی 48 بیتی (یعنی 6 بایت) که به هر کارت شبکه داده میشه.معمولا به شکل 12 رقم هگزادسیمال نمایش داده میشه. مثلا: 00:1A:2B:3C:4D:5Eهر قسمت با : از هم جدا شده و همچنین هر قسمت 1 بایته.ساختار MAC Address به چه شکله؟نصف اول (3 بایت اول = 24 بیت): مربوط به شرکت سازنده کارت شبکست. به این میگن OUI یاOrganizationally Unique Identifier.نصف دوم (3 بایت آخر = 24 بیت): شماره‌ی سریال یکتای اون کارت شبکه، که توسط همون شرکت انتخاب میشه.پس ترکیب این دوتا = یه شماره‌ی یکتا توی دنیا.MAC Address چطوری استفاده میشه؟وقتی یه دستگاه میخواد داده بفرسته روی شبکه:داده‌اش رو توی یه فریم (Frame) میذاره.توی Header اون فریم، دوتا چیز مهم مینویسه:MAC Address فرستندهMAC Address گیرندههمه‌ی دستگاه‌های شبکه اون فریم رو می‌بینن. فقط اون دستگاهی که MAC Addressش با گیرنده مطابقت داشته باشه، جواب میده.اینطوری دقیقا مثل این میشه که رو هر بسته‌ی پستی اسم فرستنده و گیرنده نوشته بشه.آیا MAC Address همیشه ثابت میمونه؟به طور پیش‌فرض بله، چون توی کارت شبکه حک میشه. ولی بعضی سیستم‌عامل‌ها و ابزارها اجازه میدنMAC Address رو Spoof کنی یا تغییر بدی (مثلا برای تست امنیت یا مخفی‌کاری).چرا هنوز MAC Address مهمه؟تو لایه‌ی Link (اترنت، وای‌فای و …)، همه‌ی دستگاه‌ها برای ارتباط به MAC Address نیاز دارن.بدون MAC، دستگاه‌ها توی شبکه محلی نمیتونن تشخیص بدن کدوم بسته برای کیه.حتی TCP/IP هم برای کار کردن روی شبکه محلی نیاز داره که اول با MAC کار کنه.چطوری آدرس مک خودم رو ببینم؟فقط کافیه وارد CMD بشید و دستور ipconfig /all رو وارد کنید.شاید پیش خودتون بگید اگه MAC Address وجود داره، پس لزوم استفاده از IP چیه؟ یا اگه IP وجود داره چرا MAC Address رو کنار نمیزارن؟! مقاله بعدی رو حتما مطالعه کنید که در این مورد توضیح داده شده 👍کاربرد MAC در Hub و Switch چیه؟فرض کن یه عالمه دستگاه (مثل کامپیوتر، پرینتر، یا گوشی) تو یه شبکه محلی (LAN) داری که می‌خوان با هم حرف بزنن. حالا این دستگاه‌ها نیاز به یه چیزی دارن که مثل یه میدان یا چهارراه عمل کنه و داده‌هاشون رو بینشون جابه‌جا کنه. اینجا هاب و سوئیچ وارد بازی می‌شن. هر دوی اینا دستگاه‌های شبکه‌ان که تو لایه دوم مدل OSI (لایه Data Link) کار می‌کنن، یعنی همون لایه‌ای که MAC Address توش نقش داره.تاریخچه Hub و Switch:برگردیم به دهه‌های 1980 و 1990، وقتی شبکه‌های محلی (مثل Ethernet) تازه داشتن همه‌گیر می‌شدن. اون موقع کامپیوترها باید به هم وصل می‌شدن تا بتونن اطلاعات به اشتراک بذارن. اما یه مشکل وجود داشت؟! نمی‌تونستی همه دستگاه‌ها رو با یه کابل مستقیم به هم وصل کنی، چون این کار خیلی شلوغ و غیرعملی بود.برای حل این مشکل، دستگاه‌هایی مثل هاب ساخته شدن تا یه نقطه مرکزی برای اتصال دستگاه‌ها باشن.اما Hub یه سری محدودیت داشت، برای همین سوئیچ‌ها اومدن که نسخه پیشرفته‌تر و باهوش‌تر هاب‌ها باشن.ساختار Hub به چه شکله؟دستگاه Hub چندین تا پورت داره و کامپیوترها یکی یکی به پورت های این دستگاه متصل میشن.دستگاه Hub هیچ قانون یا الگوریتمی نداره که کامپیوترها رو از هم جدا کنه، در نتیجه، وقتی کامپیوتر فرضا A داده‌ایی رو برای کامپیوتر B بفرسته، اون داده توسط Hub به تمام پورت ها (به غیر از پورت فرستنده) ارسال میشه! حالا تمام دیگر کامپیوترها اون داده رو دریافت میکنن ولی تنها کامپیوتری که اون داده رو ذخیره میکنه و دور نمیندازه، کامپیوتر B هست! چرا؟ چون تو آدرس مقصد بسته، آدرس MAC سیستم B قرار داره و سیستم B میبینه بسته برای خودش اومده پس نگهش میداره.بزرگترین مشکل Hub همین بود! اینکه نمیتونست کامپیوترهارو از هم جدا کنه و تمام داده هارو، برای همه ارسال میکرد، درنتیجه، امینت صفر، سرعت پایین، ترافیک زیاد. چندتا کامپیوتر همزمان نمیتونستن داده ارسال کنن و درنهایت، تمام این مشکلات باعث شد که دستگاه پیشرفته تری به اسم Switch (سوئیچ) ساخته بشه.ساختار Switch به چه شکله؟سوئیچ مثل یه منشی باهوشه که می‌دونه هر بسته داده باید دقیقا به کدوم دستگاه بره، نه اینکه به همه پخشش کنه.چطور کار می‌کنه؟سوئیچ یه جدول تو حافظش داره به اسم MAC Address Table. این جدول نشون می‌ده کدوم MAC Address به کدوم پورت سوئیچ وصله.وقتی یه دستگاه داده‌ای می‌فرسته، سوئیچ نگاه می‌کنه به MAC Address مقصد تو بسته‌ی داده و فقط به همون پورت خاص می‌فرستتش.این روش باعث می‌شه شبکه خیلی کارآمدتر باشه، چون داده فقط به مقصد درست میره.سوئیچ وقتی برای اولین بار روشن میشه، MAC Address Tableش خالیه، هیچی داخلش نیست.وقتی کامپیوتر ها شروع میکنن داده جا به جا میکنن، به مرور جدول MAC سوئیچ هم کامل میشه و تمام دستگاه‌هایی که به پورت هاش وصل هستن رو شناسایی میکنه. مثلا میدونه که به پورت سومش چه آدرس مکی متصله.ارتباط Hub و Switch با MAC AddressHub: اصلا کاری به MAC نداره. فقط همه‌چیز رو کپی می‌کنه و می‌فرسته.Switch: دقیقا با MAC کار می‌کنه. یه جدول درست می‌کنه به اسم MAC Table یا CAM Table. حالا هر بار از یه پورت یه فریم بیاد، Switch یاد می‌گیره که اون MAC پشت اون پورت هست. وقتی فریم جدید رسید، مقصد رو نگاه می‌کنه و فقط می‌فرسته به همون پورت.جمع‌بندیهر دو توی لایه‌ی دوم کار می‌کنن.Hub همه‌چی رو پخش می‌کنه (بدون توجه به MAC).Switch هوشمنده، با MAC کار می‌کنه و فقط می‌فرسته برای مقصد درست.Hub دیگه قدیمیه، Switch الان همه‌جا استفاده میشه.</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Mon, 22 Sep 2025 17:01:54 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی اترنت (Ethernet) به زبان ساده</title>
                <link>https://virgool.io/@mrNazouri13/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A7%D8%AA%D8%B1%D9%86%D8%AA-ethernet-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-jmmu2tsb2wlg</link>
                <description>تو مقاله قبلی در مورد TCP/IP صحبت شد. برای درک بهتر Ethernet لازمه یه مروری نسبت به TCP/IP داشته باشیم.ویدیو مربوط به این مقاله: (کلیک کن)TCP/IP: یه مجموعه پروتکل برای اینکه دستگاه‌ها بتونن با هم توی سطح جهانی (مثلا اینترنت) داده رد و بدل کنن.Ethernet: یه روش فیزیکی برای وصل کردن دستگاه‌ها به هم تو یه محیط محلی (LAN). کارش اینه که سیم و جاده بده تا TCP/IP روی اون حرکت کنه.چرا هم TCP/IP داریم و هم Ethernet؟تصور کن میخوای برای دوستت یه نامه بفرستی.TCP/IP: قوانین نوشتن نامه و آدرس‌گذاری. (چی تو پاکت بذاری، آدرس فرستنده و گیرنده کجا باشه، چه زبانی بنویسی…)Ethernet: پستچی و جاده‌ای که نامه رو از خونه‌ی تو تا خونه‌ی دوستت می‌بره.بدون TCP/IP نامه اصلا درست نوشته نمیشه.بدون Ethernet نامه نوشته میشه ولی راهی برای رسوندنش وجود نداره.مدل TCP/IP خودش چند لایه داره...Application (برنامه‌ها مثل مرورگر، ایمیل و …)Transport (TCP یا UDP - مسئول بسته‌بندی و ترتیب داده‌ها)Internet (IP - مسئول آدرس‌دهی و مسیریابی)Link / Network Access (اینجا میگه داده‌ها چطور روی شبکه‌ی واقعی جابجا بشن)Ethernet کجا قرار میگیره؟اترنت تو لایه‌ی چهارم TCP/IP یعنی لایه‌ی Link یا Network Access قرار می‌گیره.اترنت یکی از پیاده‌سازی‌ها یا روش‌های عملی برای لایه‌ی Link توی TCP/IP هست.یه مثال جالب:فرض کن TCP/IP میگه باید غذا رو برسونی به مشتری ولی نگفته چطوری.Ethernet میگه: باشه، من با موتور می‌برم.Wi-Fi میگه: من با پهپاد می‌برم.قانون TCP/IP ثابت می‌مونه، ولی روش‌های حمل‌ونقل میتونن متفاوت باشن.درنهایت:TCP/IP: مدل و پروتکل‌های اصلی اینترنت.Ethernet: یکی از روش‌های لایه‌ی Link برای اجرای TCP/IPEthernet بخشی از TCP/IP نیست، ولی زیر همون چتر و در خدمت TCP/IP کار میکنه.حالا بریم سراغ توضیح اصلی Ethernet 😊اترنت یه تکنولوژیه که میگه چطور دستگاه‌ها با سیم/فیبر به هم وصل شن و داده‌ها رو به شکل فریم (Frame) جابجا کنن. داخل هر فریم اترنت نوشته میشه:فرستنده کیه (MAC Address)گیرنده کیه (MAC Address)داده‌ای که باید منتقل بشه (که همون بسته‌های TCP/IP می‌تونن باشن)یعنی اترنت مثل وانت باریه که بسته‌های TCP/IP رو روی جاده می‌بره.قبل از اینکه Ethernet بیاد اگه می‌خواستی بین دو کامپیوتر داده جابجا کنی، باید با چیزایی مثل کابل سریال (Serial) یا کابل موازی (Parallel) بصورت مستقیم وصلشون می‌کردی. این یعنی هر ارتباط فقط بین دو تا کامپیوتر برقرار می‌شد (Point to Point).مشکلش چی بود؟اگه 10 تا کامپیوتر داشتی، باید برای هرکدوم کابل جدا بزنی! خیلی سخت و غیرعملی.سرعت و مدیریت هم افتضاح بود.وقتی شرکت‌ها و دانشگاه‌ها شروع کردن چندین کامپیوتر رو کنار هم قرار دادن، نیاز شد که:همه بتونن با همدیگه توی یه شبکه محلی (LAN) ارتباط بگیرن.نیاز به یه سیستم سریع، ارزان و قابل توسعه بود.اینجا بود که یه مهندس به اسم رابرت متکالف (Robert Metcalfe) ایده‌ی Ethernet رو معرفی کرد.متکالف گفت:به جای اینکه هر کامپیوتر با کابل جدا به همه وصل بشه، همه رو به یه کابل مشترک (bus) وصل می‌کنیم.هر دستگاه یه آدرس منحصربه‌فرد داشته باشه (که شد MAC Address).وقتی یه دستگاه می‌خواد داده بفرسته، داده‌اش رو تو یه بسته به اسم Frame (فریم) میذاره و می‌فرسته روی کابل.همه‌ی دستگاه‌ها اون فریم رو می‌بینن، ولی فقط اون دستگاهی که آدرسش توی فریم هست، جواب میده.این شد اترنت! یه روش برای اینکه چندین دستگاه بتونن روی یه رسانه مشترک با هم حرف بزنن.چطوری توسعه پیدا کرد؟اول اترنت روی یه کابل ضخیم کواکسیال بود. سرعت 10 مگابیت بر ثانیه.بعد شد کابل Thin Ethernet.بعدش فیبر و کابل شبکه (Twisted Pair).الان سرعت‌ها رسیدن به صدها مگابیت و حتی چندین گیگابیت.ولی اصول همونه! یعنی MAC Address + Frame + یک رسانه مشترک.برای بار چندم، TCP/IP بدون اترنت (یا روش مشابه مثل WiFi) نمی‌تونه کار کنه، چون راه انتقال نداره.جمع بندی نهایی:قبل اترنت: فقط ارتباط‌های دوتایی مستقیم.با اترنت: همه‌ی دستگاه‌ها توی یه شبکه محلی می‌تونن راحت با هم داده جابجا کنن.سازنده: رابرت متکالف.کارکرد: داده‌ها رو به شکل فریم روی یه رسانه مشترک می‌فرسته.ارتباط با TCP/IP: اترنت مثل جادست، TCP/IP مثل قوانین رانندگی و آدرس‌گذاری.</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Mon, 22 Sep 2025 14:17:46 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش TCP/IP به زبان ساده</title>
                <link>https://virgool.io/@mrNazouri13/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-tcpip-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-sbi2kposm5tf</link>
                <description>TCP/IP یه خانواده‌ایی از پروتکل هاست (یعنی یه مجموعه قوانین) که اینترنت و شبکه‌های امروزی رو هدایت میکنه. فرض کن شبکه، یه اداره‌ی بزرگه! هر پروتکل یه نقش داره، بعضیا بسته‌ها رو میفرستن، بعضیا مسئول پیدا کردن آدرس‌ها هستن، بعضیا هم مسئول اینن که اطلاعات درست و کامل برسن. TCP/IP همون دفترچه قوانین عملیاتیه که برای هماهنگ کردن این نقش‌ها استفاده میشه.ویدیو مربوط به این مقاله: (کلیک کن)تاریخچه مختصر:سال 1969 بخش تحقیقاتی وزارت دفاع آمریکا شبکه‌ای ساخت به اسم ARPANET تا چند دانشگاه و مرکز تحقیقاتی بتونن با هم حرف بزنن.ARPANET در ابتدا با یک پروتکل قدیمی‌تر به اسم NCP کار می‌کرد. اما با بزرگ‌تر شدن شبکه، نیاز به پروتکلی که بتونه بین شبکه‌های مختلف کار کنه پیش اومد.Vint Cerf و Bob Kahn طرح اینترنت بین‌شبکه‌ای رو ارائه دادن. کم‌کم TCP/IP شکل گرفت و در 1 ژانویه 1983 شبکه‌ها مهاجرت کردن به TCP/IP.TCP/IP پروتکل‌هایی هستن که از دلِ تحقیق روی ARPANET اومدن و اینترنت واقعی رو ساختن! یعنی TCP/IP قبل و هم‌زمان با تلاش‌های استانداردسازی OSI بود و در عمل استفاده شد.به این عکس دقت کنید:OSI یک مدل آموزشی و مفهومی بود (7 لایه) طوری طراحی شد که خیلی دقیق و جزئی همه چیز رو جدا کنه. زیادی ریزریز کرده بود.TCP/IP از دل عمل اومد (پروتکل‌های واقعی اینترنت) برای همین چندتا از لایه‌های OSI رو با هم ادغام کرد.دقیقا چیا ادغام‌ شد؟سه تا لایه بالایی تو OSI یعنی Application و Presentation و Session داخل TCP/IP همه شدن یک لایه: Application.دو تا لایه پایین تو OSI یعنی Data Link و Physical داخل TCP/IP با هم شدن یک لایه: Link یا Network Accessپس 7 لایه OSI تبدیل شد به 4.درنهایت، OSI برای آموزش و تئوری طراحی شد، خواست همه چیز دقیق و جدا باشه. از طرفی TCP/IP برای اجرا و پیاده‌سازی ساخته شد. پس TCP/IP کوچیک‌تر شد چون از دل نیاز واقعی اومد و فقط همون بخش‌هایی که واقعا کاربرد داشتن رو نگه داشت.چرا دو تا شکل برای TCP/IP هست؟بعضیا TCP/IP رو 4 لایه نشون میدن چون راحت و خلاصت.بعضیا هم 5 لایه نشون میدن.فرق اصلی اینه که در 5 لایه، Link به دو بخش Physical و Data Link تقسیم شده تا واضح‌تر باشه که چی تو سخت‌افزاره و چی تو نرم‌افزار.درنهایت هر دو دسته درستن فقط بعضی مواقع برای تحلیل بسته ها یا از 4 لایه استفاده میکنن یا از 5 لایه.PDU یا Protocol Data Unit چیه؟ PDU همون بسته یا چیزی هست که توی هر لایه‌ی شبکه دست‌ به‌ دست میشه. شبکه مثل یه خط تولیده. داده از Application شروع میشه و میره پایین، لایه به لایه بهش چیز اضافه میشه. هر لایه بسته‌ی خودش رو می‌سازه و اسمش عوض میشه. برای همین گفتن PDU تا بگن اون چیزی که لایه داره باهاش کار می‌کنه.PDU تو هر لایه چه اسمی داره؟Physical (فیزیکی): بیت.Data Link: فریم (Frame).Network: پکت (Packet).Transport (TCP/UDP): سگمنت (Segment) برای TCP و Datagram برای UDP.Application: دیتا (Data).هدر (Header) چیه؟ هدر مثل همون برچسب یا پاکت نامه هست.خود نامه (داده اصلی) داخلشه، ولی برای اینکه نامه برسه دست دوستت باید روی پاکت بنویسی فرستنده کیه، گیرنده کیه، شماره بسته چندمه و …در شبکه هم همینطوره. هر لایه میگه: من یه سری اطلاعات اضافه لازم دارم تا کارم رو درست انجام بدم. اون اطلاعات رو جلوی داده میچسبونه. به این اطلاعات اضافه میگیم Header.داده‌ی خام از لایه Application شروع میشه. هر لایه این داده رو میگیره، هدر خودش رو میچسبونه، بعد میده به لایه پایین‌تر. این فرایند رو میگن Encapsulation (کپسوله کردن).درنهایت، هر وقت یه لایه هدر خودش رو اضافه کرد، اون چیزی که ساخته میشه PDU مخصوص همون لایه‌ست.وقتی بسته رسید مقصد چی میشه؟هر لایه Header مربوطه رو از بسته اصلی جدا میکنه تا درنهایت به داده خام برسه. به این کار میگن Decapsulation.نکته. تمام لایه ها Header رو به بسته اضافه میکنن و فقط لایه Data Link هست که علاوه بر Header یک قسمت دیگه به اسم Trailer هم به انتهای بسته اضافه میکنه.</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Sun, 21 Sep 2025 12:36:57 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت و مدیریت Database با پایتون</title>
                <link>https://virgool.io/@mrNazouri13/%D8%B3%D8%A7%D8%AE%D8%AA-%D9%88-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-database-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-utzaasutl7ur</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)دیتابیس (Database) چیه؟ دیتابیس یه مجموعه‌ایی از اطلاعاته که به صورت منظم ذخیره و مدیریت میشن.Database دو نوع اصلی داره:1 - دیتابیس‌های رابطه‌ای (Relational Database): این نوع دیتابیس‌ها معمولا از جدول‌ها استفاده می‌کنن. مهم‌ترین ویژگی این نوع دیتابیس‌ها اینه که میتونی داده‌ها رو با استفاده از SQL جستجو کنی و تغییر بدی.2 - دیتابیس‌های غیر رابطه‌ای: این نوع دیتابیس‌ها برای ذخیره داده‌هایی که مرتب و سازماندهی شده نیستن، خیلی مفیدن. معمولا از داده‌های Key-Value استفاده می‌کنن.تو این مقاله قراره با دیتابیس SQLite که یه دیتابیس رابطه‌ای هست آشنا بشیم.برای کار با SQLite باید از کتابخانه sqlite3 استفاده کنیم که بطور پیشفرض داخل پایتون وجود داره. قدم اول:import sqlite3import sqlite3

# اتصال به دیتابیس مشخص شده (اگه دیتابیس وجود نداشته باشه، خودش می‌سازه)
conn = sqlite3.connect(&quot;mydatabase.db&quot;)
# این متغیر نماینده دیتابیسه

cursor = conn.cursor()

# کدهای مربوط به دیتابیس

conn.close()از خط 6 به بعد متغیر cursor واسط من و دیتابیسه و دستوراتم رو با کمک این متغیر به دیتابیس ارسال میکنم.نکته. همیشه باید در انتهای کارمون، ارتباطمون رو با دیتابیس ببندیم تا منابع سیستم آزاد بشن (به خط آخر دقت کنید)تا الان صرفا دیتابیس ساخته شده و بهش وصلم! قدم بعدی ساخت جدوله. به این عکس دقت کن:این جدول دیتابیسه. کلماتی که داخل کادر آبی رنگ قرار دارن ستون های جدول هستن.وقتی شما قراره جدولی ایجاد کنی، مثل عکس میای ستون های مختلفی رو مینویسی و بعدش میای پایین ستون ها، توی هر ردیف مقادیر رو مینویسی. برای درک بهتر:این عکس مربوط به یه فاکتور فروشه و کلمات داخل کادر سبز رنگ، ستون هستن و همیشه ثابت. هر ستون براش تعیین میشه که چه مقداری باید نگه داره، مثلا ستون &lt;نام کالا&gt; متن نگه میداره ولی ستون &lt;تعداد&gt; عدد نگه میداره.درنهایت، ستون ها داخل جدول تعریف شدن، حالا باید هر محصولی رو داخل یه ردیف قرار بدم! مثلا ردیف اول مربوط به شیر هست که تعداد 15 تا فروخته شده و مابقی اطلاعاتش هم تو ستون مربوطش قرار داره.از طرفی ردیف دوم برای یه محصول دیگس تااا آخر.چطور با پایتون جدول و ستون‌ها رو بسازم؟import sqlite3

conn = sqlite3.connect(&quot;mydatabase.db&quot;)
cursor = conn.cursor()

cursor.execute(&#039;&#039;&#039;
CREATE TABLE IF NOT EXISTS students (
    id INTEGER,
    name TEXT,
    age INTEGER
)
&#039;&#039;&#039;)

# تغییرات رو ذخیره میکنیم
conn.commit()متد execute دستور sql رو میگیره و به database تحویل میده تا اجراش کنه.وقتی من با متد execute تغییری داخل دیتابیس اعمال میکنم، اون تغییر تا زمانی که متد commit صدا زده نشه بصورت واقعی اعمال نمیشه. درنتیجه، بعد از هر تغییری داخل دیتابیس این متد باید صدا زده بشه.کد sql داخل متد execute چیه؟در ابتدا این نکته رو بگم که دستورات SQL با حروف بزرگ نوشته میشن و هرچیز دیگه‌ایی با حروف کوچیک.ابتدای کار نوشتم CREATE TABLE IF NOT EXISTS students که یعنی یه جدول به اسم students ایجاد کن مگر اینکه از قبل وجود داشته باشه. بعد از این عبارت پرانتز باز-بسته قرار دادم و داخلش باید ستون های دیتابیسم رو مشخص کنم.در ابتدا نوشتم id که اسم ستونه و بعدش با حرف بزرگ نوشتم INTEGER که یعنی این ستون باید مقدار int بگیره. در آخر , قرار دادم و ستون بعدی (با مقداری که باید بگیره) رو مشخص کردم.اضافه کردن داده به جدول:import sqlite3

conn = sqlite3.connect(&quot;mydatabase.db&quot;)
cursor = conn.cursor()

cursor.execute(&#039;&#039;&#039;
CREATE TABLE IF NOT EXISTS students (
    id INTEGER,
    name TEXT,
    age INTEGER
)
&#039;&#039;&#039;)

conn.commit()

cursor.execute(&quot;INSERT INTO students (id, name, age) VALUES (1, &#039;Amirhosein&#039;, 21)&quot;)
# or
new_student = (2, &quot;Mehdi&quot;, 35)
cursor.execute(&quot;INSERT INTO students (id, name, age) VALUES (?, ?, ?)&quot;, new_student)

conn.commit()

conn.close()تو خط 16 مجدد execute رو صدا زدم و یه دستور sql بهش دادم. تو این دستور نوشتم INSERT INTO studnets یعنی میخوام یه ردیف داخل جدول students مقداردهی کنم. بعدش پرانتز قرار دادم و ستون هایی که باید مقدار بگیرن رو مشخص کردم (اسم ستون ها با , از هم جدا میشه) در آخر نوشتم VALUES که یعنی مقادیر ستون ها بعد از این کلمست و مجدد پرانتز قرار دادم و داخلش مقادیر رو با همون ترتیب پرانتز اول وارد میکنم.به خط پایین ترش دقت کنید. اونجا مقدار رو مستقیم داخل دستور sql قرار ندادم و از ? استفاده کردم تا مقدار رو جدا بهش بدم.به این صورت هم میشه عمل کرد:cursor.execute(&quot;INSERT INTO students VALUES (1, &#039;Amirhosein&#039;, 21)&quot;)اینجا خود sql بصورت پیشفرض میاد مقادیر رو با همون ترتیب به ستون ها پاس میده.میتونم مقدار برخی از ستون هارو ندم. مثال:cursor.execute(&quot;INSERT INTO students (id, age) VALUES (4, 25)&quot;)خوندن داده از جدول:cursor.execute(&quot;SELECT * FROM students&quot;)تو کد بالا گفتم تمام ردیف های موجود داخل جدول students رو برام برگردون (چون این دستور تغییری ایجاد نکرده به commit احتیاجی نیست) بعد از اجرای دستور بالا، داده هایی که برگشت خوردن در اختیار cursor قرار میگیرن و بدین شکل میتونم خروجی رو نمایش بدم:cursor.execute(&quot;SELECT * FROM students&quot;)

print(cursor.fetchall())

conn.close()خروجی:[(1, &#039;Amirhosein&#039;, 21), (2, &#039;Mehdi&#039;, 35)]متد fetchall همه سطرها رو به صورت یه لیست از تاپل‌ها برمی‌گردونه. در کنار fetchall دو متد دیگه هم وجود داره:fetchone:‌ وقتی فقط به اولین نتیجه نیاز داری یا مطمئنی فقط یه نتیجه وجود داره.fetchmany(size): وقتی می‌خوای تعداد محدودی نتیجه بگیری (مخصوصا برای داده‌های حجیم).برای مثال فرض کن سطر های زیر داخل جدول students وجود داره:(1, &quot;Amirhosein&quot;, 21)
(2, &quot;Mehdi&quot;, 35) 
(3, &quot;Sara&quot;, 19)
(4, &quot;Ali&quot;, 22)
(5, &quot;Fatemeh&quot;, 20)کد:cursor.execute(&quot;SELECT * FROM students&quot;)

print(cursor.fetchone())  # (1, &#039;Amirhosein&#039;, 21)

print(&quot;fetchmany(2):&quot;)
print(cursor.fetchmany(2))  # [(2, &#039;Mehdi&#039;, 35), (3, &#039;Sara&#039;, 19)]

print(&quot;fetchall():&quot;)
print(cursor.fetchall())  # [(4, &#039;Ali&#039;, 22), (5, &#039;Fatemeh&#039;, 20)]نکته. cursor مثل یه pointer عمل می‌کنه! بعد از هر fetch، متد cursor به سمت نتایج بعدی حرکت می‌کنه. درنهایت:cursor.execute(&quot;SELECT * FROM students&quot;)

first = cursor.fetchone()  # اولین نتیجه
next_two = cursor.fetchmany(2)  # دو نتیجه بعدی
rest = cursor.fetchall()  # بقیه نتایجیکم بیشتر با حالت های مختلف SELECT کردن آشنا بشیم...cursor.execute(&quot;SELECT name, age FROM students&quot;)اینجا گفتم مقادیر مربوط به ستون name و age رو از تمام ردیف ها استخراج کن.cursor.execute(&quot;SELECT * FROM students WHERE age &gt; 20&quot;)

cursor.execute(&quot;SELECT * FROM students WHERE name = &#039;Amirhosein&#039;&quot;)

cursor.execute(&quot;SELECT * FROM students WHERE age &gt; 20 AND name = &#039;Mehdi&#039;&quot;)دستور WHERE برای فیلتر کردن داده‌ها استفاده میشه. یعنی فقط رکوردهایی رو نشون بده که شرایط خاصی رو دارن.تو خط اول گفتم تمام ردیف هایی رو برگردون که مقدار ستون age آنها بزرگ تر از 20 باشه.تو خط سوم گفتم تمام ردیف هایی رو برگردون که مقدار age آنها بزرگ تر از 20 و مقدار name آنها برابر با Mehdi باشه.عملگرهای پرکاربرد:= (مساوی)&gt; (بزرگتر از)&lt; (کوچکتر از)=&lt; (بزرگتر یا مساوی)=&gt; (کوچکتر یا مساوی)=! یا &lt;&gt; (مخالف)AND (و)OR (یا)BETWEEN (بین دو مقدار): مثل این میمونه که بگی همه دانشجوهای بین 20 تا 30 سال رو بهم نشون بده. مثال:cursor.execute(&quot;SELECT * FROM students WHERE age BETWEEN 20 AND 30&quot;)
# or
cursor.execute(&quot;SELECT * FROM students WHERE name BETWEEN &#039;A&#039; AND &#039;M&#039;&quot;)

# دستور &quot;بیت ون&quot; رو بدین شکل هم میتونم بنویسم
cursor.execute(&quot;SELECT * FROM students WHERE age &gt;= 20 AND age &lt;= 30&quot;)

# میتونم با عملگر &quot;نات&quot; حالت معکوسش رو بنویسم
# دانشجوهای خارج از بازه 20 تا 30 سال
cursor.execute(&quot;SELECT * FROM students WHERE age NOT BETWEEN 20 AND 30&quot;)
# معادل: cursor.execute(&quot;SELECT * FROM students WHERE age &lt; 20 OR age &gt; 30&quot;)

# یه مثال دیگه
# دانشجوهای بین 20 تا 30 سال با اسم امیرحسین
cursor.execute(&quot;&quot;&quot;
SELECT * FROM students 
WHERE age BETWEEN 20 AND 30 
AND name = &#039;Amirhosein&#039;
&quot;&quot;&quot;)

# یه مثال دیگه
min_age = 20
max_age = 30
cursor.execute(&quot;SELECT * FROM students WHERE age BETWEEN ? AND ?&quot;, (min_age, max_age))LIKE (جستجوی الگویی): برای پیدا کردن مقادیری که با یه الگوی خاص مطابقت دارن استفاده میشه. مثال:%: جایگزین صفر یا چند کاراکتر
_ : جایگزین دقیقا یک کاراکتر


# اسم‌هایی که با &quot;A&quot; شروع میشن
cursor.execute(&quot;SELECT * FROM students WHERE name LIKE &#039;A%&#039;&quot;)

# اسم‌هایی که با &quot;n&quot; تموم میشن  
cursor.execute(&quot;SELECT * FROM students WHERE name LIKE &#039;%n&#039;&quot;)

# اسم‌هایی که &quot;mi&quot; دارن (در هر جاییش)
cursor.execute(&quot;SELECT * FROM students WHERE name LIKE &#039;%mi%&#039;&quot;)

# اسم‌هایی که حرف دومشون &quot;a&quot; هست
cursor.execute(&quot;SELECT * FROM students WHERE name LIKE &#039;_a%&#039;&quot;)

# اسم‌هایی که دقیقا 4 حرفی و با &quot;A&quot; شروع میشن
cursor.execute(&quot;SELECT * FROM students WHERE name LIKE &#039;A___&#039;&quot;)IN: برای پیدا کردن مقادیری که در لیست مشخصی وجود دارن. مثال:# دانشجوهای با سن 20، 25 یا 30 سال
cursor.execute(&quot;SELECT * FROM students WHERE age IN (20, 25, 30)&quot;)

# دانشجوهایی با اسم‌های مشخص
cursor.execute(&quot;SELECT * FROM students WHERE name IN (&#039;Amirhosein&#039;, &#039;Sara&#039;, &#039;Ali&#039;)&quot;)IS NULL (بررسی مقادیر خالی): برای پیدا کردن رکوردهایی که مقدار خالی (NULL) دارن. مثال:# دانشجوهایی که ایمیل ندارن
cursor.execute(&quot;SELECT * FROM students WHERE email IS NULL&quot;)

# دانشجوهایی که ایمیل دارن ! چون از &quot;نات&quot; استفاده کردم
cursor.execute(&quot;SELECT * FROM students WHERE email IS NOT NULL&quot;)(NULL یعنی ناشناخته یا تعریف نشده، نه خالی یا صفر)LIMIT (محدود کردن تعداد نتایج): دستور LIMIT برای محدود کردن تعداد نتایج برگشتی از کوئری استفاده میشه. مثل این میمونه که بگی فقط 5 مورد اول رو بهم نشون بده. مثال:# فرض کن این سطر ها داخل دیتابیس وجود داره
(1, &#039;Amirhosein&#039;, 21)
(2, &#039;Mehdi&#039;, 35)
(3, &#039;Sara&#039;, 19) 
(4, &#039;Ali&#039;, 22)
(5, &#039;Fatemeh&#039;, 20)

cursor.execute(&quot;SELECT * FROM students LIMIT 2&quot;)
# [(1, &#039;Amirhosein&#039;, 21), (2, &#039;Mehdi&#039;, 35)] # فقط 2 نتیجه اول

cursor.execute(&quot;SELECT * FROM students LIMIT 2 OFFSET 2&quot;)
# [(3, &#039;Sara&#039;, 19), (4, &#039;Ali&#039;, 22)]
(ردیف‌ها از 0 شمارش میشن)انواع داده‌های مهم (Data Types) برای تعریف ستون جدول:INTEGER یا اعداد صحیح:# اعداد مثبت و منفی
cursor.execute(&#039;&#039;&#039;
CREATE TABLE examples (
    id INTEGER,           # شماره دانشجو
    age INTEGER,          # سن
    temperature INTEGER   # دما (مثبت و منفی)
)
&#039;&#039;&#039;)REAL یا اعداد اعشاری:cursor.execute(&#039;&#039;&#039;
CREATE TABLE products (
    price REAL,        # قیمت کالا
    rating REAL        # امتیاز
)
&#039;&#039;&#039;)NUMERIC یا اعداد (اعم از صحیح و اعشاری):cursor.execute(&#039;&#039;&#039;
CREATE TABLE financial (
    salary NUMERIC,    # حقوق
    bonus NUMERIC     # پاداش
)
&#039;&#039;&#039;)TEXT یا رشته‌های متنی:cursor.execute(&#039;&#039;&#039;
CREATE TABLE users (
    username TEXT,      # نام کاربری
    email TEXT         # ایمیل
)
&#039;&#039;&#039;)BLOB یا داده‌های باینری:cursor.execute(&#039;&#039;&#039;
CREATE TABLE files (
    file_data BLOB,        # محتوای فایل
    image_data BLOB       # داده تصویر
)
&#039;&#039;&#039;)

# کاربرد: ذخیره فایل‌ها، تصاویر، داده‌های رمزنگاری شدهDATETIME یا تاریخ و زمان:cursor.execute(&#039;&#039;&#039;
CREATE TABLE logs (
    login_time DATETIME,    # زمان ورود
    access_time DATETIME   # زمان دسترسی
)
&#039;&#039;&#039;)

# فرمت: YYYY-MM-DD HH:MM:SS مثال
# 2024-01-15 14:30:00نوع داده BOOLEAN یا true/false:cursor.execute(&#039;&#039;&#039;
CREATE TABLE settings (
    is_active BOOLEAN,        # فعال/غیرفعال
    is_admin BOOLEAN          # مدیر/کاربر عادی
)
&#039;&#039;&#039;)Constraints: قوانینی که برای ستون‌های جدول تعریف میکنی تا از درست بودن داده‌ها مطمئن بشی. مثل نگهبانِ دیتابیس که مراقبه داده‌های غلط وارد نشن. انواع Constraints:NOT NULL یا اجبار به پر بودن: نمیذاره ستون خالی بمونه. مثال:cursor.execute(&#039;&#039;&#039;
CREATE TABLE users (
    id INTEGER,
    name TEXT NOT NULL,        # حتما باید پر بشه
    age INTEGER NOT NULL,      # حتما باید پر بشه
    email TEXT                 # میتونه خالی باشه
)
&#039;&#039;&#039;)اگه موقع مقدار دادن این رو بنویسم: INSERT INTO users (id, age) VALUES (1, 20) خطا دریافت میکنم چون name مقدار دهی نشده.UNIQUE یا منحصر به فرد بودن: یعنی فقط یکی باشه. مثل اینکه بگی تو این کلاس، هر دانش‌آموز فقط می‌تونه یه شماره دانش‌آموزی منحصر به فرد داشته باشه. مثال:cursor.execute(&#039;&#039;&#039;
CREATE TABLE students (
    student_id INTEGER UNIQUE,   # شماره دانش‌آموز تکراری نباید باشه
    name TEXT,
    phone TEXT UNIQUE            # شماره تلفن تکراری نباید باشه
)
&#039;&#039;&#039;)مقدار دهی:# ✅ درست
cursor.execute(&quot;INSERT INTO students (student_id, name, phone) VALUES (1, &#039;Amir&#039;, &#039;0912&#039;)&quot;)
cursor.execute(&quot;INSERT INTO students (student_id, name, phone) VALUES (2, &#039;Ali&#039;, &#039;0913&#039;)&quot;)

# ❌ خطا - شماره دانش‌آموز تکراری
cursor.execute(&quot;INSERT INTO students (student_id, name, phone) VALUES (1, &#039;Sara&#039;, &#039;0914&#039;)&quot;)

# ❌ خطا - شماره تلفن تکراری  
cursor.execute(&quot;INSERT INTO students (student_id, name, phone) VALUES (3, &#039;Maryam&#039;, &#039;0912&#039;)&quot;)PRIMARY KEY یا شناسه اصلی: PRIMARY KEY ترکیب NOT NULL و UNIQUE هست. مثال:cursor.execute(&#039;&#039;&#039;
CREATE TABLE users (
    id INTEGER PRIMARY KEY,    # همیشه پر باشه، همیشه منحصر به فرد باشه
    name TEXT,
    age INTEGER
)
&#039;&#039;&#039;)مقدار دهی:# ✅ درست
cursor.execute(&quot;INSERT INTO users (id, name, age) VALUES (1, &#039;Amir&#039;, 20)&quot;)
cursor.execute(&quot;INSERT INTO users (id, name, age) VALUES (2, &#039;Ali&#039;, 22)&quot;)

# ❌ خطا - id تکراری
cursor.execute(&quot;INSERT INTO users (id, name, age) VALUES (1, &#039;Sara&#039;, 19)&quot;)

# ❌ خطا - id خالی
cursor.execute(&quot;INSERT INTO users (name, age) VALUES (&#039;Maryam&#039;, 21)&quot;)CHECK یا بررسی شرط: فقط مقادیری رو قبول میکنه که شرط تو پرانتز رو رعایت کنن. مثال:cursor.execute(&#039;&#039;&#039;
CREATE TABLE students (
    age INTEGER CHECK (age &gt;= 18),          # سن باید حداقل 18 باشه
    grade TEXT CHECK (grade IN (&#039;A&#039;, &#039;B&#039;, &#039;C&#039;)),  # فقط A, B یا C مجازه
    score INTEGER CHECK (score &gt;= 0 AND score &lt;= 20)  # نمره بین 0 تا 20
)
&#039;&#039;&#039;)اگه اینطوری مقدار دهی کنم: INSERT INTO students (age) VALUES (17) خطا دریافت میکنم.DEFAULT یا مقدار پیش‌فرض: اگه مقداری نذاری، خودش یه مقدار استاندارد میذاره. مثال:cursor.execute(&#039;&#039;&#039;
CREATE TABLE logs (
    status INTEGER DEFAULT 1,                       # پیش‌فرض 1 میذاره
    attempts INTEGER DEFAULT 0                      # پیش‌فرض 0 میذاره
)
&#039;&#039;&#039;)</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Sun, 24 Aug 2025 20:56:51 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی مدل OSI به زبان ساده</title>
                <link>https://virgool.io/@mrNazouri13/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%85%D8%AF%D9%84-osi-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-xpv5ebqt84wz</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)قدیما، مثلا دهه 1970، هر شرکت کامپیوتری برای خودش خدایی می‌کرد. شرکت IBM دستگاه‌هایی می‌ساخت که فقط با دستگاه‌های IBM دیگه حرف میزدن. شرکت Apple هم همینطور، و بقیه شرکت‌ها هم هرکدوم ساز خودشون رو میزدن. شبکه‌هاشون مثل آدم‌هایی بود که به زبان‌های مختلف حرف میزدن و هیچ‌کدوم حاضر نبودن زبان اون یکی رو یاد بگیرن. یه آشوب کامل بود.اگه یه شرکت می‌خواست کامپیوترهاش رو از چند برند مختلف بخره، اتصال اون‌ها به هم یه کابوس بود. متخصص‌ها به این نتیجه رسیدن که این وضع خیلی شخمیه. ما به یه استاندارد و یک زبان مشترک نیاز داریم.اینجا بود که یه سازمان به‌نام ISO (سازمان بین‌المللی استانداردسازی) تصمیم گرفت یه مدل واحد و استاندارد برای ارتباط بین سیستم‌ها درست کنه تا:همه بتونن بر اساس اون مدل سیستم بسازنو همه‌ی سیستم‌ها با هم قابل اتصال باشن، فارغ از برند، زبان برنامه‌نویسی یا سخت‌افزاربه این مدل گفتن OSI یا Open Systems Interconnection یعنی اتصال سیستم‌های باز(منظورش از باز این بود که دیگه بسته به یک برند خاص نباشه، همه بتونن وصل بشن)مدل OSI یک مفهومه، نه یک تکنولوژی. یعنی شما نمی‌تونید برید از بازار مدل OSI بخرید! این مدل فقط یک چارچوب و دستورالعمل تئوری هست که میگه فرآیند پیچیده ارسال اطلاعات بین دو کامپیوتر باید به هفت تا مرحله یا لایه (Layer) تقسیم بشه.فایده این کار چیه؟یادگیری راحت‌تر میشه: به جای درگیر شدن با یک غول بزرگ، اون رو به 7 تا بخش کوچیک‌تر تقسیم می‌کنیم.توسعه راحت‌تر میشه: شرکت‌ها می‌تونن برای یک لایه خاص (مثلا لایه کابل‌ها) یک تکنولوژی جدید بسازن، بدون اینکه نگران بقیه لایه‌ها باشن.عیب‌یابی راحت‌تر میشه: اگه اینترنت قطع بشه، متخصص شبکه به ترتیب لایه‌ها رو چک می‌کنه تا ببینه مشکل از کجاست. مثلا اول چک می‌کنه کابل‌ها (لایه 1) وصل باشن، بعد میره سراغ لایه‌های بالاتر.برای اینکه این 7 لایه رو بفهمیم، از مثال ارسال نامه استفاده می‌کنیم. فرض کن تو توی تهران میخوای یه نامه برای دوستت تو پاریس بفرستی که فقط فرانسوی بلده. بیا ببینیم چه اتفاقی میفته.(از بالا به پایین شروع می‌کنیم (از لایه‌ایی که به تو نزدیک‌تره))لایه 7 یا Application Layer:این لایه‌ایه که تو به عنوان کاربر باهاش سروکار داری. نرم‌افزاری که به شبکه دسترسی داره.کارش چیه؟ فراهم کردن یک رابط برای نرم‌افزارها تا بتونن از شبکه استفاده کنن. پروتکل‌های معروفی مثل HTTP (برای وب‌گردی)، FTP (برای انتقال فایل) و SMTP (برای ارسال ایمیل) در این لایه کار می‌کنن.توی مثال نامه: مغز تو تصمیم می‌گیره یک نامه بنویسه و دستت شروع به نوشتن متن نامه روی کاغذ می‌کنه. خودِ مرورگر کروم یا برنامه تلگرام تو، در این لایه قرار دارن.لایه 6 یا Presentation Layer:این لایه مثل یه مترجم همگانیه و مسئول فرمت‌بندی دیتاست.کارش چیه؟ مطمئن میشه که دیتا در فرمتی ارسال بشه که کامپیوتر مقصد بتونه اون رو بفهمه. کارهایی مثل ترجمه (Translation)، رمزنگاری (Encryption) و فشرده‌سازی (Compression) اینجا انجام میشه.توی مثال نامه: تو یادت میفته که دوستت فارسی بلد نیست. پس متن نامه رو به زبان فرانسوی ترجمه می‌کنی. اگه نامه محرمانه باشه، اون رو با یک کد رمز می‌نویسی (رمزنگاری) تا اگه دست کس دیگه‌ای افتاد، نتونه بخونتش.لایه 5 یا Session Layer:این لایه مسئول مدیریت گفتگو یا جلسه بین دو کامپیوتره.کارش چیه؟ یک ارتباط (جلسه) رو بین دو دستگاه شروع می‌کنه، مدیریتش می‌کنه و در پایان خاتمه میده. مثل یه منشی تلفن که تماس رو وصل و مدیریت می‌کنه.توی مثال نامه: تو قبل از ارسال نامه به دوستت زنگ میزنی و میگی: الو، من دارم برات یه نامه می‌فرستم، حواست باشه. اینطوری یک جلسه برای این کار باز کردی.لایه 4 یا Transport Layer:قلب تپنده ارتباطات. مسئولیت اصلیش، انتقال مطمئن و کنترل جریان دیتاست.کارش چیه؟ دیتا رو به تیکه‌های کوچیک‌تر و قابل مدیریت به اسم سگمنت (Segment) تقسیم می‌کنه. اینجا دو تا پروتکل اصلی و بسیار مهم داریم:TCP یا Transmission Control Protocol: مسئولیت‌پذیر. مطمئن میشه همه سگمنت‌ها سالم و به ترتیب به مقصد برسن. اگه یکی نرسه، دوباره می‌فرستتش.UDP یا User Datagram Protocol: سریع و بی‌خیال. فقط دیتا رو میفرسته و براش مهم نیست حتما برسه یا نه. مثل پخش زنده تلویزیونی یا تماس تصویری که یه لحظه تصویر شطرنجی میشه ولی ادامه پیدا می‌کنه.توی مثال نامه: متن نامت خیلی طولانی شده و در چند صفحه جا شده. میای بالای هر صفحه شماره صفحه میزنی (مثلا صفحه 1 از 3، 2 از 3، 3 از 3). این کار باعث میشه دوستت در پاریس بفهمه که نامه کامله و اگه صفحه‌ای گم شده بود، بهت خبر بده. انتخاب بین TCP و UDP مثل انتخاب بین پست پیشتاز و پست عادیه.لایه 3 یا Network Layer:لایه آدرس‌دهی و مسیریابی در مقیاس جهانی.کارش چیه؟ تیکه‌های دیتا رو که حالا بهشون پکت (Packet) میگیم، می‌گیره و بهترین مسیر رو برای رسوندن اون‌ها به کامپیوتر مقصد در یک شبکه بزرگ (مثل اینترنت) پیدا می‌کنه. آدرس IP و دستگاهی به اسم روتر (Router) متعلق به این لایه هستن.توی مثال نامه: تو نامه‌های شماره‌گذاری شده رو داخل یک پاکت بزرگ می‌ذاری و آدرس پستی فرستنده (خودت در تهران) و گیرنده (دوستت در پاریس) رو روش می‌نویسی. اداره پست با دیدن این آدرس‌ها، بهترین مسیر هوایی برای رسیدن نامه به پاریس رو پیدا می‌کنه.لایه 2 یا Data Link Layer:این لایه روی ارتباطات محلی و در یک شبکه داخلی تمرکز داره.کارش چیه؟ پکت‌ها رو می‌گیره و برای ارسال روی یک محیط فیزیکی مشترک (مثلا یک شبکه محلی LAN) آماده می‌کنه. به دیتا در این لایه Frame میگن. آدرس فیزیکی کارت شبکه یا MAC Address و دستگاهی به اسم سوئیچ (Switch) در این لایه کار می‌کنن.توی مثال نامه: پاکت نامه شما به اداره پست محلتون میرسه. کارمند پست اون رو داخل یک کیسه پستی مخصوص میذاره که روش نوشته شده: از اداره پست A به فرودگاه B. این یک آدرس‌دهی محلی برای رسوندن بسته به نقطه بعدی مسیره.لایه 1 یا Physical Layer:پایین‌ترین سطح. هر چیزی که فیزیکی و قابل لمس باشه.کارش چیه؟ دیتا رو که حالا به شکل بیت (0 و 1) در اومده، تبدیل به سیگنال‌های فیزیکی می‌کنه تا روی یک رسانه منتقل بشه. این سیگنال می‌تونه الکتریکی (برای کابل شبکه)، نوری (برای فیبر نوری) یا رادیویی (برای وای‌فای) باشه. خودِ کابل شبکه، فیبر نوری، و امواج رادیویی در این لایه قرار دارن.توی مثال نامه: کیسه پستی تو در نهایت سوار یک کامیون، قطار یا هواپیما میشه. خودِ جاده، ریل قطار و مسیر هوایی که نامه به صورت فیزیکی روشون حرکت می‌کنه، این لایه هستن.وقتی کامپیوتر دوستت در پاریس نامه رو دریافت می‌کنه، دقیقا برعکس این مراحل طی میشه. یعنی از لایه 1 شروع می‌کنه و لایه به لایه بالا میاد تا در نهایت در لایه 7، متن نامه رو بخونه.یه چیز جالب! مدل OSI هیچوقت تو دنیای واقعی استفاده نشد! بلکه چیزی که الان داره استفاده میشه TCP/IP هست. TCP/IP چیه؟ تو مقاله بعدی توضیح میدم.</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Mon, 28 Jul 2025 16:54:04 +0330</pubDate>
            </item>
                    <item>
                <title>توپولوژی های شبکه (Network Topologies)</title>
                <link>https://virgool.io/@mrNazouri13/%D8%AA%D9%88%D9%BE%D9%88%D9%84%D9%88%DA%98%DB%8C-%D9%87%D8%A7%DB%8C-%D8%B4%D8%A8%DA%A9%D9%87-network-topologies-pglqyh9iynln</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)فکر کن چند تا کامپیوتر داری و می‌خوای اونا رو با کابل به هم وصل کنی. توپولوژی (Topology) در واقع همون نقشه یا شکلِ چیدمان این اتصالاته. یعنی به ما میگه کامپیوترها و دستگاه‌ها به چه شکلی و با چه مدلی به هم وصل شدن.مثل اینه که بخوای چند تا نقطه رو روی کاغذ به هم وصل کنی. می‌تونی همه رو توی یه خط به هم وصل کنی، یا یه دایره باهاشون درست کنی، یا از یه نقطه مرکزی به همشون خط بکشی. هر کدوم از این مدل‌ها یه Topology حساب میشه.توپولوژی می‌تونه دو مدل باشه:فیزیکی: یعنی کابل‌ها و دستگاه‌ها چطور به هم وصل شدن.منطقی: یعنی از دید نرم‌افزاری و نحوه‌ی انتقال دیتا چه اتفاقی می‌افته (حتی اگه از نظر فیزیکی فرق داشته باشه).انواع توپولوژی ها:توپولوژی Bus (خطی)توپولوژی Star (ستاره‌ای)توپولوژی Ring (حلقه‌ای)توپولوژی Mesh (توری)توپولوژی Tree (درختی)توپولوژی Hybrid (ترکیبی)توپولوژی Point-to-Point (نقطه به نقطه)توپولوژی خطی (Bus Topology): این یکی از قدیمی‌ترین و ساده‌ترین مدل‌هاست.تو این مدل، همه‌ی دستگاه‌ها به یه کابل اصلی (مثل یه خط مستقیم) وصل میشن. مثل اینکه یه طناب دراز رو زمین پهن کنی و چندتا کامپیوتر رو با کابل به این طناب وصل کنی.چطوری کار میکنه؟وقتی یه دستگاه می‌خواد داده‌ای بفرسته، اون داده رو روی کابل میفرسته.همه‌ی دستگاه‌ها اون داده رو می‌بینن، ولی فقط دستگاهی که مقصدشه، قبولش میکنه. بقیه نادیده می‌گیرن.برای اینکه سیگنال‌ها وقتی به انتهای کابل میرسن، برنگردن و اختلال ایجاد نکنن، در دو سر کابل دو تا قطعه کوچیک به اسم Terminator (پایان‌دهنده) نصب میشه. (این توپولوژی منسوخ شده)توپولوژی Star (ستاره‌ای): تو این مدل، همه‌ی دستگاه‌ها به یه دستگاه مرکزی وصل میشن. اون دستگاه مرکزی می‌تونه یه سوئیچ یا هاب باشه. کامپیوترها هیچ ارتباط مستقیمی با هم ندارن و تمام ارتباطاتشون باید از طریق این مرکز انجام بشه. چطور کار میکنه؟وقتی کامپیوتر A می‌خواد به کامپیوتر B داده بفرسته، پیامش رو به دستگاه مرکزی میفرسته. اینجا دو حالت پیش میاد:اگه دستگاه مرکزی هاب (Hub) باشه: هاب پیام رو می‌گیره و اون رو برای تمام کامپیوترهای دیگه هم میفرسته (Broadcast می‌کنه). فقط کامپیوتر B که مقصد اصلیه پیام رو قبول می‌کنه. این روش شبیه توپولوژی Bus عمل می‌کنه و ترافیک شبکه رو بالا می‌بره.اگر دستگاه مرکزی سوئیچ (Switch) باشه: سوئیچ میدونه که هر کامپیوتر به کدوم پورتش وصله. پس وقتی پیام رو از کامپیوتر A می‌گیره، اون رو مستقیم و فقط برای کامپیوتر B میفرسته. این کار باعث میشه ترافیک بیخودی در شبکه ایجاد نشه، امنیت بالاتر بره و سرعت هم خیلی بهتر باشه.مزایا:اگه یه کابل یا یه سیستم خراب بشه، بقیه کار میکنن.عیب‌یابی آسونه.اضافه کردن دستگاه جدیده خیلی سادست.معایب:اگه دستگاه مرکزی خراب بشه، کل شبکه می‌خوابه.کِی استفاده میشه؟الان بیشتر شبکه‌ خونه‌ها و اداره‌ها با این مدل کار میکنن. چون ساده و قابل اعتماده و میشه راحت روش مدیریت کرد.توپولوژی Ring (حلقه‌ای): تو این مدل همه‌ی دستگاه‌ها بصورت دایره‌ای یا حلقه به هم وصلن. یعنی هر دستگاه فقط به دو دستگاه دیگه وصل شده. یکی در سمت راستش، یکی در سمت چپش. اطلاعات توی این حلقه دست‌به‌دست می‌چرخه. چطور کار میکنه؟اطلاعات تو یک جهت حرکت میکنن (یا ساعتگرد یا پادساعتگرد).مثلا اگه PC1 بخواد برای PC3 پیامی بفرسته، اول میره به PC2، بعد به PC3.هر دستگاه پیام رو می‌گیره، نگاه میکنه ببینه واسه خودش هست یا نه. اگه نه، میفرسته برای بعدی.بعضی نسخه‌های Ring دوطرفه هستن (بهشون می‌گن Dual Ring) که اطلاعات می‌تونن در دو جهت حرکت کنن.(این توپولوژی منسوخ شده)توپولوژی Mesh (توری): تو این مدل هر دستگاه به یک یا چند دستگاه دیگه مستقیما وصله. یعنی ارتباط مستقیم بین دستگاه‌ها وجود داره. دو نوع Mesh داریم:1- Full Mesh: این حالت نهایت مقاوم بودنه. هر کامپیوتر به تک‌تک کامپیوترهای دیگه مستقیم وصله. یه شبکه تار عنکبوتی کامل و پیچیده درست میشه.2- Parial Mesh: این حالت یه کم اقتصادی‌ تره. فقط کامپیوترها و نودهای مهم و حیاتی به چندتا دستگاه دیگه وصل میشن، ولی لازم نیست حتما به همه وصل باشن.چطوری کار میکنه؟وقتی کامپیوتر A می‌خواد به کامپیوتر Z دیتا بفرسته، ده‌ها مسیر مختلف ممکنه وجود داشته باشه. شبکه می‌تونه بهترین مسیر (مثلا کوتاه‌ترین یا خلوت‌ترین) رو برای ارسال دیتا انتخاب کنه. جذاب‌ترین ویژگیش اینه که اگه یه کابل یا حتی یه کامپیوتر در یک مسیر خراب بشه، هیچ اتفاقی نمی‌افته! داده به صورت خودکار از یه مسیر دیگه فرستاده میشه.مزایا:اگه یه کابل یا دستگاه خراب بشه، شبکه از کار نمیفته.سرعت بالاتر، چون مسیر مستقیم برای ارتباط داریم.معایب:هزینه کابل‌کشی خیلی زیاده (مخصوصا تو Full Mesh).طراحی و پیکربندی سخت‌تره.نیاز به تعداد زیادی پورت توی دستگاه‌ها هست.کی استفاده میشه؟بیشتر تو جاهایی که نیاز به ارتباط دائمی و قابل‌اعتماد دارن مثل:مراکز داده (Data Center)زیرساخت‌های نظامیسیستم‌های مالی حساستوپولوژی Tree (درختی): توپولوژی Tree یه ترکیب از توپولوژی‌های Star و Bus هست. به زبان ساده، مثل یه درخته که تنه‌ش یه کابل اصلیه (مثل توپولوژی Bus) و شاخه‌هاش همون ارتباط‌های ستاره‌ای هستن (بیشتر از این لازم نیست روی این توپولوژی زمان بزاریم)توپولوژی Hybrid (ترکیبی): این توپولوژی ترکیب دو یا چند مدل توپولوژی مختلف تو یه شبکست. یعنی تو شبکه ممکنه یه قسمت ستاره‌ای باشه، یه قسمت حلقه‌ای، یه قسمت توری و... هدف اینه که از مزایای چند مدل مختلف به‌صورت همزمان استفاده کنیم. چطور کار میکنه؟هر بخش از شبکه به‌شکل خاصی چیده شده و ممکنه وظیفه متفاوتی داشته باشه. مثلا تو یه شرکت:بخش مدیریت از توپولوژی Mesh استفاده میکنه (برای اطمینان بالا)بخش منابع انسانی با توپولوژی Star کار میکنهو بخش مالی با توپولوژی Ring طراحی شده چون تو یه مسیر خاص دیتا رد و بدل میشههمه اینا درنهایت به یه ساختار کلی متصل میشن و یه شبکه واحد رو میسازن.کجا استفاده میشه؟تقریبا تمام شبکه‌های بزرگ در دنیای واقعی (مثل دانشگاه‌ها، بیمارستان‌ها و شرکت‌های بزرگ) از نوع ترکیبی هستن، چون نیازهای بخش‌های مختلفشون با هم فرق داره و یک مدل ساده جوابگوی کارشون نیست.توپولوژی Point-to-Point (نقطه به نقطه): تو این مدل فقط دو دستگاه بصورت مستقیم به هم وصل میشن. یعنی هیچ دستگاه واسط، هاب، سوئیچ یا کابل اضافه‌ای بینشون نیست. فقط یه کابل مستقیم بینشون وجود داره.چطور کار میکنه؟هر اطلاعاتی که از یکی از دستگاه‌ها ارسال میشه، مستقیم میره به اون یکی دستگاه.دیگه نیازی نیست دیتا از یه مسیر شلوغ عبور کنه یا از یه واسط رد بشه.مثلا:دو کامپیوتر رو با یه کابل LAN مستقیما به هم وصل کنی.یا دو روتر رو با کابل بهم وصل کنی.مزایا:خیلی ساده و بدون دردسر.سرعت بالا چون ترافیک فقط بین دو دستگاهه.امنیت بهتر (چون هیچ دستگاه دیگه‌ای تو مسیر نیست که شنود کنه).معایب:فقط برای ارتباط بین دو دستگاه به درد میخوره.اگه بخوای دستگاه سومی اضافه کنی، دیگه این مدل جواب نمیده.نکته مهم:توپولوژی Point-to-Point بیشتر به عنوان یه نوع اتصال مطرحه تا یه شبکه بزرگ.یعنی اینطوری نیست که بیای با Point-to-Point یه شبکه 10-20 تایی درست کنی.اما چون پایه‌ی خیلی از ارتباط‌ها رو همین مدل میسازه (مثلا تو VPNها، یا بین دو روتر یا مودم) خیلی مهمه که بشناسیمش.</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Sun, 27 Jul 2025 17:24:07 +0330</pubDate>
            </item>
                    <item>
                <title>مهم‌ترین توابع &lt;string.h&gt; در زبان C</title>
                <link>https://virgool.io/@mrNazouri13/%D9%85%D9%87%D9%85-%D8%AA%D8%B1%DB%8C%D9%86-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-stringh-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-c-aaaehvao4v07</link>
                <description>آشنایی با توابعی که برای کار با رشته‌ها و حافظه استفاده میشن.یسری تابع آماده توی یه کتابخونه به اسم string.h هست که برای کار با رشته‌ها و حافظه استفاده میشن. برای استفاده از این توابع، باید اول این خط رو بالای برنامت بذاری:#include &lt;string.h&gt;توابع موجود تو این فایل/کتابخونه معولا روی char* یا همون آرایه‌ای از char کار میکنن.معرفی برخی از توابع موجود:تابع memset: اسم این تابع مخفف Memory Set هست و برای پر کردن یه بخش از حافظه با یه مقدار مشخص استفاده میشه. فرض کن یه جعبه داری با 10 تا خونه. حالا می‌خوای همه خونه‌هاش رو با حرف A پر کنی. این کار رو با memset می‌تونی انجام بدی. چرا به همچین چیزی نیاز داریم؟وقتی یه آرایه تعریف می‌کنی، ممکنه توش مقدارهای تصادفی باشه (چون حافظه قبلا استفاده شده بوده).پس قبل از استفاده، باید اون آرایه رو پاک یا مقداردهی اولیه کنی.اینجاست که memset به‌درد می‌خوره.شکل کلی تابع memset (به عنوان ورودی ها دقت کنید) :memset(Koja Berizam، Chi Berizam، Chand bar Berizam);مثال واقعی:#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main() {
    char myArray[10];

    memset(myArray, &#039;A&#039;, 9); // 9 تا خونه اول رو با A پر میکنه
    myArray[9] = &#039;\0&#039;; // آرایه آخر رو 0\ میزاریم که رشته تموم بشه

    printf(&quot;myArray = %s\n&quot;, myArray);
    return 0;
}تحلیل:یه آرایه ساختیم به اسم myArray با 10 خونه.با memset، خونه‌های 0 تا 8 رو با &#039;A&#039; پر کردیم.آخرش (خونه شماره 9) رو گذاشتیم \0 که یعنی اینجا رشته تموم میشه.printf چاپش میکنه.خروجی:myArray = AAAAAAAAAچند نکته مهم:- مقدار &#039;A&#039; در واقع عدد 65عه. ولی مهم نیست، چون حافظه فقط با عدد 1 بایتی پر میشه. یعنی فقط یه عدد بین 0 تا 255 رو قبول میکنه.- اگه به جای &#039;A&#039; عدد بدی، مثلا:memset(myArray, 0, 10);این یعنی کل آرایه رو با صفر پر کن که معمولا برای پاک کردن اطلاعات استفاده میشه.- این تابع رشته درست نمی‌کنه، فقط حافظه رو پر می‌کنه. اگه بخوای نتیجه‌ش به‌عنوان رشته خونده بشه، باید آخرش 0\ رو دستی بذاری.جمع بندی! به کد زیر دقت کن:#include &lt;stdio.h&gt;

int main()
{
    char myArray[100];
    printf(&quot;%s&quot;, myArray);
}خروجی:`0∟▲☺هربار که برنامه رو اجرا کنم، یه مقدار تصادفی بهم نمایش میده! چرا؟ توی کد من اومدم 100 بایت از ram حافظه گرفتم، ممکنه تو حافظه‌ایی که از ram گرفتم، از قبل داده وجود داشته باشه! برای حل این مشکل باید از memset استفاده کنم تا اون حافظه رو تمیز/خالی کنم. مثال:#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main()
{
    char myArray[100];

    memset(myArray, &#039;\0&#039;, sizeof(myArray));
}تابع sizeof تعداد بایت هایی که از حافظه گرفته شده رو برمیگردونه، حالا چون دارم از array استفاده میکنم و گفتم 100 تا خونه یا 100 تا بایت داشته باشه، همون عدد 100 رو برمیگردونه.تو ورودی اول آرایه رو به memset دادم. تو ورودی دوم کارکتری که میخوام تو تک تک خونه‌ها/بایت‌ها قرار بگیره رو دادم. تو ورودی سوم باید بهش بگم تا کدوم بایت یا خونه رو مقدار دهی کنه که از تابع sizeof استفاده کردم، تعداد بایت‌ها یا همون تعداد خونه‌ها رو به دست میاره و میزاره همونجا و درنتیجه، تمام 100 خونه مقدار 0\ میگیره.به این کد دقت کن:char myArray[100] = {0};تو این مثال هم اومدم تمام خونه های آرایه رو 0\ قرار دادم (کد عددی 0\ میشه 0) ولی اگه بخوام بعدا تابع رو تمیز کنم، از همون memset کمک میگیرم (رایج‌ترین استفاده از memset صفر کردن یک بلوک از حافظه قبل از استفاده از اونه. این کار تضمین می‌کنه که هیچ داده تصادفی در اون حافظه وجود نداره).تابع strcpy: این تابع یه string رو از یه جا کپی میکنه به یه جای دیگه. یعنی مقدار رشته‌ی دوم رو می‌ریزه داخل اولی. ساختار کلی:strcpy(Jaii ke gharare string dakhelesh rikhte beshe, string asli);مثال:#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main()
{
    char src[] = &quot;Hello&quot;;
    char dest[20];  // مقصد باید فضای کافی داشته باشه
    memset(dest, &#039;\0&#039;, sizeof(dest));

    strcpy(dest, src);  // string az src copy mishe be dest

    printf(&quot;Source: %s\n&quot;, src);
    printf(&quot;Destination: %s\n&quot;, dest);
}خروجی:Source: Hello
Destination: Helloچطوری کار میکنه؟کاراکتر به کاراکتر، محتویات src رو به dest منتقل میکنه.وقتی به 0\ میرسه (علامت پایان رشته) کپی رو تموم میکنه.حتی 0\ هم کپی میشه.(اگه مقداری از قبل داخل dest وجود داشته باشه، پاک میشه)یه نکته. من میتونم رشته رو با strcpy هم تعریف کنم که در یکسری مواقع بهتر از روش قبلی هست. اگه رشتت ثابته و فقط همون لحظه لازمش داری این روش بهتره:char text[] = &quot;Amirhosein&quot;;

strcpy(text, &quot;Amirhosein Nazouri&quot;); // خطا میده چون آرایه دیگه جا ندارهاما اگه رشتت قراره بعدا تغییر کنه، بزرگ‌تر بشه، یا بهش چیزی اضافه کنی این روش بهتره:#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main()
{
    char text[100] = {0};

    strcpy(text, &quot;Amirhoein&quot;);
    printf(&quot;%s&quot;, text);

    strcpy(text, &quot;Amirhosein Nazouri&quot;); // این خطا نمیده چون آرایه به اندازه 100 بایت جا داره
}تابع strcat: این تابع برای چسبوندن یه رشته به آخر رشته‌ی دیگه استفاده میشه. یعنی رشته دوم رو به ته رشته اول اضافه میکنه. strcat مثل + توی پایتونه. ساختار تابع:strcat(dest, src (stringi ke gharare be dest chasbide beshe));مثال:#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main()
{
    char text[50] = &quot;Amir&quot;;
    strcat(text, &quot;hosein&quot;);

    printf(&quot;%s&quot;, text);
}خروجی:Amirhoseinچطوری کار میکنه؟از destination شروع میکنه، تا جایی که به 0\ برسه.از همونجا، رشته‌ی source رو کاراکتر به کاراکتر اضافه میکنه.تهش دوباره 0\ میزنه که رشتت تموم شه.نکات مهم و حساس:1 - فضای کافی خیلی مهمه:char name[4] = &quot;Amir&quot;;
strcat(name, &quot;hosein&quot;);  // اینجا مشکل پیش میاد!2 - آخر رشته اول باید از قبل 0\ داشته باشه. چون strcat از آخر رشته اول شروع به چسبوندن میکنه. اگه 0\ نباشه، نمی‌دونه از کجا شروع کنه. مثال اشتباه:char name[20];
strcat(name, &quot;arta&quot;);  // چون ای مقدار اولیه نداره و ممکنه کثیف باشهمثال درست:char name[20] = &quot;&quot;;
strcat(name, &quot;arta&quot;);  // چون ای مقدار اولیه نداره و ممکنه کثیف باشه

// یا

char name[20];
memset(name, 0, sizeof(name));
strcat(name, &quot;arta&quot;);  // چون ای مقدار اولیه نداره و ممکنه کثیف باشهنکته. تفاوت دو کد زیر چیه؟char name[20];
char name[20] = &quot;&quot;;تو حالت اول فقط یه آرایه 20تایی از char تعریف کردی، ولی هیچ مقدار اولیه‌ ندادی. یعنی محتوای این آرایه ممکنه:مقدارهای تصادفی (garbage value) باشه.تهش 0\ نباشه.اصلا هیچ معنایی به‌عنوان رشته نداشته باشه.اما، تو حالت دوم به آرایه گفتم مقدار اولیت یه رشته خالی (&quot;&quot;) باشه.رشته‌ی خالی یعنی فقط یه 0\ آخرش هست و بقیه خونه‌ها صفر نیستن، ولی اون یه 0\ کافیه برای اینکه رشته درستی باشه.تابع strlen: این تابع تعداد کاراکترهای رشته رو حساب میکنه. البته فقط تعداد کاراکترها قبل از 0\ رو می‌شمره، نه خود 0\ رو و نه اندازه کل آرایه رو (یعنی طول واقعی رشته رو برمیگردونه). مثال:char name[] = &quot;Amirhosein&quot;;
int len = strlen(name);
printf(&quot;%d\n&quot;, len); // 10

// یا

char name2[100] = {0};
strcpy(name2, &quot;Amirhosein&quot;);
printf(&quot;%d\n&quot;, strlen(name2)); // 10

strcat(name2, &quot; Nazouri&quot;);
printf(&quot;%d\n&quot;, strlen(name2)); // 18تابع strncpy: تابع strncpy مثل strcpyعه ولی با یه فرق مهم! می‌تونی بگی فقط تا یه تعداد مشخصی از کاراکترها رو کپی کنه. مثال:#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main() {
    char source[] = &quot;Amirhossein&quot;;
    char target[20] = {0};

    strncpy(target, source, 5);

    printf(&quot;Result: %s\n&quot;, target);
}خروجی:Result: Amirhنکته. اگه src کوتاه‌تر از n باشه، بقیه‌ی dest رو با 0\ پر می‌کنه. مثال:char a[10];
strncpy(a, &quot;Hi&quot;, 5);
// a = {&#039;H&#039;, &#039;i&#039;, &#039;\0&#039;, &#039;\0&#039;, &#039;\0&#039;, ...}به این قسمت از کد دقت کن:char target[20] = {0};اگه به‌جای {0} = از یه تعریف ساده استفاده می‌کردی:char target[20];اون وقت محتوای حافظه ممکن بود هرچی باشه (garbage memory) و اگه strncpy تهش 0\ نزنه، رشته درست چاپ نمیشه یا حتی برنامه کرش میکنه (پس لازمه چنین مواقعی خودمون دستی 0\ رو قرار بدیم روی کاراکتر آخر)تابع strncat: تابع strncat برای چسبوندن (append کردن) یه رشته به انتهای یه رشته دیگه استفاده میشه ولی با مشخص کردن تعداد کاراکتری که مجاز هست برای چسبیدن. مثال:int main() {
    char name[30] = &quot;Amir&quot;;
    char name2[] = &quot;hosein Nazouri 21 sale&quot;;

    strncat(name, name2, 14);
    printf(&quot;%s&quot;, name);
}خروجی:Amirhosein Nazouriتابع strstr: این تابع میاد توی یه رشته (مثلا یه جمله) دنبال یه کلمه خاص یا تیکه‌ایی از متن می‌گرده. ساختار تابع:strstr(Koja Begardam، Donbal chi Begardam);مثلا:strstr(&quot;salam bar to&quot;, &quot;bar&quot;);یعنی بیا توی salam bar to بگرد ببین کلمه‌ی bar هست یا نه. اگه پیدا کنه، اونجایی که پیدا شده رو بهت نشون میده. یه مثال دیگه:#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main() {
    char text[] = &quot;salam bar to&quot;;
    char *natije = strstr(text, &quot;bar&quot;);

    printf(&quot;Natije: %s\n&quot;, natije);
}خروجی:Natije: bar toاگه بدین شکل بنویسم:char *natije = strstr(text, &quot;Z&quot;);چون چنین کاراکتر یا جمله‌ایی وجود نداره خروجی زیر برمیگرده:Natije: (null)به کد دقت کن، معنی char *netije چیه؟توی C اشاره‌گرها (pointers) متغیرهایی هستن که آدرس حافظه یه داده دیگه رو ذخیره می‌کنن. مثلا:اگه یه متغیر int x = 10 داشته باشی، x یه عدد ذخیره می‌کنه.اما یه اشاره‌گر مثل int *p = &amp;x آدرس حافظه x رو ذخیره می‌کنه.عملگرهای مهم اشاره‌گرها:* (ستاره):تو تعریف متغیر یا تابع: یعنی این متغیر/تابع با اشاره‌گر کار می‌کنه.تو کد: یعنی «محتوای آدرس ذخیره‌شده تو اشاره‌گر».&amp; (آدرس‌دهی): آدرس یه متغیر رو می‌گیره. مثلا x&amp; آدرس x رو میده.سوال اصلی! چرا تو strstr از * استفاده شده؟این تابع دنبال زیررشته (bar) تو رشته اصلی می‌گرده. اگه پیداش کنه، به جای اینکه کل زیررشته رو کپی کنه (که زمان می‌بره) فقط یه اشاره‌گر به جایی تو رشته اصلی که زیررشته شروع میشه برمی‌گردونه. تو C رشته‌ها، آرایه‌های char هستن و راحت‌ترین راه برای اشاره به یه قسمت از آرایه، استفاده از اشاره‌گره. این باعث میشه هم سریع باشه، هم حافظه کمتری مصرف کنه. به این کد دقت کن:int main() {
    char text[] = &quot;salam bar to&quot;;
    char *natije = strstr(text, &quot;bar&quot;);
    if (natije != NULL) {
        printf(&quot;Natije: %s\n&quot;, natije);
    } else {
        printf(&quot;Zirreshte peyda nashod!\n&quot;);
    } 
}text حالا salam bar to هست. strstr(text, &quot;bar&quot;) دنبال bar میگرده و یه اشاره‌گر به bar برمی‌گردونه.natije حالا به bar to اشاره می‌کنه، چون از bar تا آخر رشته رو نشون میده. خروجی:Natije: bar toخروجی strstr معمولا با if بررسی میشه. چرا؟ تابع strstr وقتی زیررشته رو تو رشته اصلی پیدا نمی‌کنه، یه اشاره‌گر NULL برمی‌گردونه. اگه مستقیم این اشاره‌گر NULL رو به printf با فرمت s% (که انتظار یه رشته معتبر داره) بدی، برنامت ممکنه کرش کنه یا رفتار ناشناخته نشون بده. برای همین، باید همیشه خروجی strstr رو با یه شرط if چک کنی که مطمئن شی NULL نیست. کد:int main() {
    char text[] = &quot;salam bar to&quot;;
    if (strstr(text, &quot;bar&quot;) != NULL) {
        printf(&quot;Peyda shod&quot;);
    } else {
        printf(&quot;Zirreshte peyda nashod!\n&quot;);
    } 
}اینجا چون از strstr مستقیم استفاده کردم و داخل متغیری قرارش ندادم، از pointer استفاده نکردم.تابع strchr: این تابع مثل تابع قبلی یعنی strstr هست ولی با این تفاوت که فقط دنبال کاراکتر میگرده نه یک رشته کامل. کد:#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main() {
    char text[] = &quot;hello amirhossein&quot;;

    if (strchr(text, &#039;a&#039;) != NULL)
        printf(&quot;Peyda shod\n&quot;);
    else
        printf(&quot;Peyda nashod.\n&quot;);
}میتونم بدین شکل هم عمل کنم:#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main() {
    char text[] = &quot;hello amirhossein&quot;;
    char *ptr = strchr(text, &#039;a&#039;);

    if (ptr != NULL)
        printf(&quot;Peyda shod: %s\n&quot;, ptr);
    else
        printf(&quot;Peyda nashod.\n&quot;);
}خروجی:Peyda shod: amirhosseinچون اولین کاراکتر a تو رشته hello amirhossein از حرف هشتم شروع میشه و printf از اونجایی که آدرس داده رو نشون میده، از a به بعد رو چاپ میکنه.نکته. تابع strrchr هم داریم که از سمت راست دنبال رشته میگرده (مثل متد rfind داخل پایتون) کد:int main() {
    char text[] = &quot;hello amirhossein nazouri&quot;;
    char *ptr = strrchr(text, &#039;a&#039;);

    if (ptr != NULL)
        printf(&quot;Peyda shod: %s\n&quot;, ptr);
    else
        printf(&quot;Peyda nashod.\n&quot;);
}خروجی:Peyda shod: azouriتابع strcmp: این تابع دو رشته رو با هم مقایسه میکنه. خروجی int هست که میگه این دو رشته چطور نسبت به هم قرار می‌گیرن. چی برمی‌گردونه؟0: یعنی دو رشته دقیقا برابر هستن (همه حروف یکی هست).عدد منفی: یعنی رشته‌ی اول (str1) از رشته‌ی دوم (str2) کوچکتره (از نظر ترتیب حرف‌ها)عدد مثبت: یعنی رشته‌ی اول بزرگتر از رشته‌ی دوم هست.این تابع به ترتیب هر حرف دو رشته رو با هم مقایسه میکنه تا جایی که یا یک حرف متفاوت پیدا کنه یا به انتهای رشته‌ها برسه. یعنی:strcmp(&quot;apple&quot;, &quot;apple&quot;) == 0
strcmp(&quot;apple&quot;, &quot;apricot&quot;) &lt; 0
strcmp(&quot;banana&quot;, &quot;apple&quot;) &gt; 0مثال:#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main() {
    char a[] = &quot;amir&quot;;
    char b[] = &quot;amir&quot;;

    if (strcmp(a, b) == 0)
        printf(&quot;Strings are equal\n&quot;);
    else
        printf(&quot;Strings are different\n&quot;);
}خروجی:Strings are equalیه مثال دیگه:char a[] = &quot;Amir&quot;;
char b[] = &quot;amir&quot;;

int result = strcmp(a, b);
printf(&quot;%d&quot;, result);خروجی:-1تابع strncmp: این تابع دقیقا مثل strcmp هست ولی با یه تفاوت مهم! فقط تا n تا کاراکتر اول از هر رشته رو مقایسه می‌کنه. چی برمی‌گردونه؟0: اگه n کاراکتر اول دو رشته مثل هم باشن.عدد منفی: اگه تو این n کاراکتر، str1 کوچکتر از str2 باشه.عدد مثبت: اگه تو این n کاراکتر، str1 بزرگتر از str2 باشه.چرا ازش استفاده کنیم؟ مثلا وقتی فقط می‌خوای بررسی کنی که دو رشته تا یه جای خاص شبیه هم هستن. مثلا فقط 3 حرف اول. مثال:#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

int main() {
    char a[] = &quot;Amirhossein&quot;;
    char b[] = &quot;Amirali&quot;;

    if (strncmp(a, b, 4) == 0)
        printf(&quot;The first 4 characters are the same!\n&quot;);
    else
        printf(&quot;The first 4 characters are different!\n&quot;);
}خروجی:The first 4 characters are the same!اگه مقدار متغیر b رو به arta تغییر بدم خروجی میشه:The first 4 characters are different!</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Sat, 26 Jul 2025 11:26:54 +0330</pubDate>
            </item>
                    <item>
                <title>کار با Registry ویندوز با Python</title>
                <link>https://virgool.io/@mrNazouri13/%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-registry-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-%D8%A8%D8%A7-python-zs9bgg2kjgth</link>
                <description>تو این مقاله ابتدا بررسی میشه که Registry چیه و سپس نحوه کار با Registry با پایتون بررسی میشه.رجیستری (Registry) یه Database (پایگاه داده) غول‌پیکر و مرکزی برای سیستم‌عامل ویندوزه. فکر کن ویندوز یه آدمه، رجیستری مغز و سیستم عصبیشه. تمام تنظیمات، گزینه‌ها، اطلاعات مربوط به سخت‌افزار، نرم‌افزار، تنظیمات کاربرها و خلاصه هرچیزی که ویندوز برای درست کار کردن بهش احتیاج داره، به صورت خیلی مرتب و دسته‌بندی شده توی رجیستری ذخیره شده. مثلا:اینکه پس‌زمینه دسکتاپت چه عکسی باشه.وقتی روی یه فایل txt. دوبار کلیک میکنی، با چه نرم‌افزاری باز بشه (مثلا Notepad).کدوم برنامه‌ها اجازه دارن موقع روشن شدن کامپیوتر خود به خود اجرا بشن.اطلاعات لایسنس نرم‌افزارهات.تنظیمات درایورهای سخت‌افزاری مثل کارت گرافیک و صدا.همه‌ی اینا و هزاران هزار تنظیم دیگه، توی رجیستری نوشته شدن.چرا اصلا ویندوز به رجیستری نیاز داره؟شاید بپرسی چرا همه‌ی این تنظیمات توی یه فایل متنی ساده ذخیره نمیشن؟قدیما همینطور بود. هر برنامه‌ایی تنظیمات خودشو توی فایل‌های جداگونه‌ای به اسم INI ذخیره میکرد. این کار چندتا مشکل بزرگ داشت:شلوغی و بی‌نظمی: ده‌ها و صدها فایل تنظیمات مختلف در سراسر هارد دیسک پخش میشدن.کند بودن: پیدا کردن و خوندن این همه فایل پراکنده زمان‌بر بود.عدم استاندارد: هر برنامه‌ایی ساز خودشو میزد و فرمت فایل تنظیماتش فرق داشت.رجیستری اومد تا این مشکلات رو حل کنه. با داشتن یه پایگاه داده مرکزی و یکپارچه، همه‌چی منظم و استاندارد شد و دسترسی به اطلاعات با سرعت خیلی خیلی بالاتری انجام میشه.ساختار رجیستری:رجیستری یه ساختار درختی و سلسله مراتبی داره. برای اینکه راحت درکش کنی، رجیستری رو مثل یه کمد بایگانی غول‌پیکر با ۵ تا کشوی اصلی تصور کن.این ساختار از چند بخش اصلی تشکیل شده:1 - کَندوها (Hives): اینا همون 5 تا کشوی اصلی کمد ما هستن. هر کدوم از این کندوها، مسئول نگهداری یه بخش بزرگ از تنظیمات سیستم هستن. اسم همشون با HKEY شروع میشه.HKEY_CLASSES_ROOT (HKCR): اطلاعات مربوط به فایل‌ها. مثلا اینکه فایل mp3. با چه برنامه‌ای باز بشه یا آیکونش چه شکلی باشه.HKEY_CURRENT_USER (HKCU): مهم‌ترین بخش برای کاربر عادی. تمام تنظیمات مربوط به همین کاربری که الان باهاش وارد ویندوز شدی اینجا ذخیره میشه. مثل عکس دسکتاپ، تنظیمات نرم‌افزارهات و...HKEY_LOCAL_MACHINE (HKLM): تنظیمات کلی و سراسری سیستم که به کاربر خاصی ربط نداره. مثل تنظیمات سخت‌افزارها، درایورها و خود ویندوز. این بخش برای همه‌ی Userهای روی سیستم یکسانه.HKEY_USERS (HKU): اطلاعات پروفایل تمام کاربرهایی که روی این کامپیوتر اکانت دارن اینجا ذخیره میشه. در واقع، HKEY_CURRENT_USER یه جورایی لینک یا میان‌بُر به یکی از زیرمجموعه‌های همین کندو هست.HKEY_CURRENT_CONFIG (HKCC): اطلاعات مربوط به پروفایل سخت‌افزاری فعلی. معمولا کمتر باهاش کار داریم.2 - کلیدها (Keys): اگه کندوها کشوهای اصلی باشن، کلیدها مثل پوشه‌ داخل اون کشوها هستن. کارشون دسته‌بندی کردن اطلاعاته. مثلا داخل کندوی HKEY_CURRENT_USER یه کلید به اسم Software وجود داره که تنظیمات نرم‌افزارها داخل اون قرار میگیره. این کلیدها میتونن داخل همدیگه هم باشن که بهشون میگیم زیرکلید (Subkey).3 - مقدارها (Values): اینا دیگه اصل مطلب هستن. مقدارها اطلاعات و تنظیمات نهایی هستن که مثل برگه‌های کاغذ داخل اون پوشه‌ها قرار دارن. هر مقدار (Value) از سه بخش تشکیل شده:نام (Name): یه اسم برای اون تنظیم.نوع (Type): نوع داده‌ای که ذخیره میشه. مثلا متنه، عدده یا چیز دیگه.داده (Data): مقدار واقعی اون تنظیم.معروف‌ترین انواع داده (Type) اینا هستن:REG_SZ: برای ذخیره کردن یه متن ساده (String). مثلا آدرس یه فایل.REG_BINARY: برای ذخیره داده‌های خام و باینری (0 و 1).REG_DWORD: برای ذخیره کردن یه عدد (معمولا برای تنظیماتی که حالت خاموش/روشن یا 0/1 دارن).چجوری رجیستری رو ببینیم؟ویندوز یه ابزار داخلی به اسم Registry Editor یا regedit.exe داره که بهت اجازه میده این ساختار درختی رو ببینی و ویرایش کنی. چجوری بازش کنم؟دکمه‌های Win + R رو روی کیبورد بزن تا پنجره Run باز بشه.توی کادرش تایپ کن regedit و Enter رو بزن.یه پنجره کنترل دسترسی کاربر (UAC) باز میشه که باید Yes رو بزنی.حالا پنجره رجیستری ادیتور رو میبینی. سمت چپ، ساختار درختی کلیدها (همون پوشه‌ها) و سمت راست، مقدارهای (Value) داخل اون کلید رو نشون میده.دقت کن:رجیستری قلب ویندوزه. هرگز چیزی رو که نمیدونی چیه، الکی تغییر نده یا حذف نکن. یه تغییر اشتباه میتونه باعث از کار افتادن یه نرم‌افزار یا حتی خود ویندوز بشه و دیگه سیستم بالا نیاد! فعلا فقط برای نگاه کردن و یادگیری ازش استفاده کن.یه مثال کاربردی. یکی از اولین کارهایی که بدافزارها میکنن اینه که خودشون رو ماندگار (Persistent) کنن. یعنی کاری کنن که بعد از هر بار روشن شدن کامپیوتر، دوباره اجرا بشن. یکی از معروف‌ترین راه‌ها برای این کار، استفاده از رجیستریه. بدافزار میاد و یه Value از خودش توی این آدرس میسازه:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Runهر برنامه‌ایی که آدرس فایل اجراییش توی این مسیر از رجیستری ثبت بشه، ویندوز موقع بالا اومدن به صورت خودکار اجراش میکنه.چجوری توی رجیستری یه مسیر خاص رو پیدا کنیم؟کار با Registry Editor (regedit) خیلی شبیه کار با همون File Explorer خودمونه که باهاش فایل‌ها و پوشه‌ها رو میبینی.وقتی regedit رو باز میکنی، دو تا بخش اصلی میبینی:پنل سمت چپ (همون ساختار درختی): در بالاترین سطح، کندوها (Hives) قرار دارن. کنار هر کندو یه علامت فلش (&gt;) هست. با کلیک روی این فلش، اون کندو باز میشه و کلیدهای (Keys) داخلش رو میبینی. خود این کلیدها هم میتونن زیرکلید (Subkey) داشته باشن که با کلیک روی فلش کنارشون، نمایش داده میشن.پنل سمت راست: وقتی روی هر کلید یا زیرکلیدی در پنل سمت چپ کلیک کنی، محتویاتش، یعنی مقدارها (Values) توی پنل سمت راست نمایش داده میشه.چندتا مسیر مهم و کاربردی در رجیستری:مسیرهای مربوط به استارت‌آپ و ماندگاری (نقاط داغ برای بدافزارها).HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Runکاربرد: لیست برنامه‌هایی که برای کاربر فعلی موقع بالا اومدن ویندوز اجرا میشن. این معروف‌ترین مکان برای ماندگاریه.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Runکاربرد: مثل بالایی، ولی برنامه‌های این لیست برای همه کاربرهای سیستم موقع استارت‌آپ اجرا میشن. چون روی کل سیستم تاثیر داره، دستکاریش معمولا به دسترسی ادمین نیاز داره.HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnceکاربرد: برنامه‌هایی که فقط یک بار موقع استارت‌آپ بعدی اجرا میشن و بعد از اجرا، کلیدشون از اینجا پاک میشه.مسیرهای مربوط به تنظیمات ظاهری و کاربر! اینا برای شخصی‌سازی ویندوز استفاده میشن.HKEY_CURRENT_USER\Control Panel\Desktopکاربرد: تنظیمات دسکتاپ اینجا ذخیره میشن. مثلا Value ایی به اسم Wallpaper مسیر عکس پس‌زمینه دسکتاپت رو نگه میداره. یا Value ای به اسم WallpaperStyle میگه عکس باید کشیده بشه (Stretch) یا وسط قرار بگیره (Center).HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advancedکاربرد: این مسیر پر از تنظیمات جذاب برای فایل اکسپلوره. مثلا Value ای به اسم Hidden اگه مقدارش 1 باشه یعنی فایل‌های مخفی نشون داده بشن و اگه 2 باشه یعنی مخفی بمونن.مسیرهای مربوط به اطلاعات سیستم و نرم‌افزارها.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersionکاربرد: یه معدن طلا از اطلاعات مربوط به خود ویندوز. چیزهایی مثل ProductName (مثلا Windows 10 Pro)، CurrentVersion (ورژن ویندوز)، RegisteredOwner (نام صاحب سیستم) اینجا پیدا میشه.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstallکاربرد: لیست تمام برنامه‌هایی که روی سیستمت نصب کردی اینجا هست. وقتی وارد Control Panel میشی تا یه برنامه رو حذف کنی، ویندوز لیستش رو از اینجا میخونه.مسیرهای مربوط به تعیین برنامه پیش‌فرض فایل‌ها.HKEY_CLASSES_ROOT\.docxکاربرد: اینجا مشخص میشه که فایل‌هایی با پسوند docx. از چه نوعی هستن. اگه Value پیش‌فرضش (Default) رو ببینی، نوشته مثلا Word.Document.12.HKEY_CLASSES_ROOT\Word.Document.12\shell\open\commandکاربرد: این مسیر به ویندوز میگه وقتی کاربر روی یه فایل ورد کلیک کرد، دقیقا چه دستوری رو با چه پارامترهایی باید اجرا کنه تا اون فایل باز بشه. بدافزارها میتونن این مسیرها رو دستکاری کنن تا به جای برنامه اصلی، خودشون اجرا بشن.کار با Registry توسط پایتون.برای کار با رجیستری ویندوز در پایتون، نیازی به نصب هیچ کتابخونه‌ی خارجی‌ نداری. خود پایتون یه ماژول داخلی و قدرتمند به اسم winreg داره که تمام ابزارهای لازم رو در اختیارمون میذاره.پس اولین قدم توی کدمون، وارد کردن این ماژوله:import winregقبل از اینکه بتونی چیزی رو از رجیستری بخونی یا توش بنویسی، اول باید به کلید مورد نظرت وصل بشی و یه دسترسی ازش بگیری. این کار مثل اینه که قبل از خوندن یه فایل، اول باید اون رو ()open کنی. برای این کار از تابع winreg.OpenKeyEx استفاده می‌کنیم.این تابع چندتا ورودی مهم میگیره:کندو (Hive): کندوی اصلی که کلید ما توش قرار داره. از مقادیر خود ماژول winreg استفاده می‌کنیم. مثلا:winreg.HKEY_CURRENT_USERمسیر زیرکلید (Sub-key Path): آدرس کامل کلیدی که میخوایم باز کنیم.رزرو شده (Reserved): این پارامتر همیشه 0 هست.سطح دسترسی (Access): مشخص میکنیم که میخوایم به این کلید فقط برای خوندن دسترسی داشته باشیم یا برای نوشتن هم لازمش داریم. مهم‌ترین‌ها:winreg.KEY_READ: فقط برای خوندن (پیش‌فرض).winreg.KEY_WRITE: فقط برای نوشتن.winreg.KEY_ALL_ACCESS: دسترسی کامل (خوندن، نوشتن، حذف و...).بهترین کار اینه که عملیات باز کردن کلید رو داخل یه بلوک with انجام بدیم. اینجوری پایتون خودش حواسش هست که بعد از تموم شدن کارمون، اتصال به کلید رو ببنده و منابع سیستم رو آزاد کنه.مثال برای درک بهتر: باز کردن کلید معروف Run برای خوندن برنامه‌های استارت‌آپ:import winreg

hive = winreg.HKEY_CURRENT_USER
path = r&quot;Software\Microsoft\Windows\CurrentVersion\Run&quot;

try:
    with winreg.OpenKeyEx(hive, path, 0, winreg.KEY_READ) as key:
        print(f&quot;Successfully opened key: {path}&quot;)

except FileNotFoundError:
    print(f&quot;Error! The key &#039;{path}&#039; was not found&quot;)

except Exception as e:
    print(f&quot;Error: {e}&quot;)حالا که کلید رو باز کردیم، دو کار اصلی میتونیم باهاش انجام بدیم:1 - خوندن یک مقدار (Value) مشخص.2 - لیست کردن تمام مقدارهای داخل یک کلید (Enumeration).کار اول: برای این کار از تابع winreg.QueryValueEx استفاده می‌کنیم. این تابع اسم مقدار رو میگیره و مقدار واقعی (Data) اون رو برمی‌گردونه. کد:import winreg

hive = winreg.HKEY_CURRENT_USER
path = r&quot;Software\Microsoft\Windows\CurrentVersion\Run&quot;

try:
    with winreg.OpenKeyEx(hive, path, 0, winreg.KEY_READ) as key:
        print(f&quot;Successfully opened key: {path}&quot;)

        value_name = &quot;cmd&quot; # اسم مقداری که میخوای بخونی

        data, reg_type = winreg.QueryValueEx(key, value_name)

        print(f&quot;Value Name: {value_name}&quot;)
        print(f&quot;Data: {data}&quot;)
        print(f&quot;Data Type: {reg_type}&quot;)

except FileNotFoundError:
    print(f&quot;Error! The key &#039;{path}&#039; was not found&quot;)

except Exception as e:
    print(f&quot;Error: {e}&quot;)خروجی:Successfully opened key: Software\Microsoft\Windows\CurrentVersion\Run
Value Name: cmd
Data: C:\Windows\system32\cmd.exe
Data Type: 1(من یه دونه مقدار ساختم به اسم cmd که برای داده‌ی اون آدرس cmd رو وارد کردم تا cmd پس از اجرای سیستم بالا بیاد)کار دوم: اینجا از winreg.EnumValue استفاده می‌کنیم که با دادن اندکس، اسم مقدار، نوع و داده‌ش رو برمی‌گردونه. تو یه حلقه این کار رو ادامه میدیم تا خطای OSError بیاد (یعنی دیگه مقداری نیست). کد:import winreg

hive = winreg.HKEY_CURRENT_USER
path = r&quot;Software\Microsoft\Windows\CurrentVersion\Run&quot;

try:
    with winreg.OpenKeyEx(hive, path, 0, winreg.KEY_READ) as key:
        index = 0

        while True:
            try:
                name, data, reg_type = winreg.EnumValue(key, index)
                print(f&quot;{index}: {name} = {data}&quot;)
                index += 1

            except OSError:
                break  # دیگه مقداری وجود نداره

except FileNotFoundError:
    print(&quot;کلید پیدا نشد&quot;)

except Exception as e:
    print(f&quot;خطا: {e}&quot;)خروجی:0: MicrosoftEdgeAutoLaunch_FCE02F16768008C88057B9C15E001F4B = &quot;C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe&quot; --win-session-start
1: cmd = C:\Windows\system32\cmd.exeمرحله بعد: نوشتن، ویرایش یا ساختن مقدار جدید توی رجیستری.تو دنیای بدافزارها، خیلی وقتا دیده میشه که یه بدافزار برای اجرای خودش بعد از ری‌استارت سیستم، یه مقدار جدید توی کلید Run میسازه. این دقیقا همون کاریه که ما الان می‌خوایم تمرینی انجام بدیم (برای اینکار از متد SetValueex استفاده میشه). کد:import winreg

hive = winreg.HKEY_CURRENT_USER
path = r&quot;Software\Microsoft\Windows\CurrentVersion\Run&quot;

try:
    with winreg.OpenKeyEx(hive, path, 0, winreg.KEY_SET_VALUE) as key:
        value_name = &quot;MyName&quot;  # اسم مقداری که قراره بسازیم یا ویرایش کنیم
        value_data = r&quot;C:\Windows\system32\cmd.exe&quot;  # دیتای مربوط به اون مقدار

        winreg.SetValueEx(key, value_name, 0, winreg.REG_SZ, value_data)
        print(&quot;مقدار با موفقیت ثبت شد&quot;)

except FileNotFoundError:
    print(&quot;کلید مورد نظر پیدا نشد&quot;)

except Exception as e:
    print(f&quot;خطا: {e}&quot;)با اجرای این کد یه مقدار با اسم MyName داخل کلید مروبطه ساخته میشه و برای داده اون آدرس cmd.exe ثبت میشه.نکته. اگه اون مقدار قبلا وجود داشته باشه، مقدارش رو آپدیت میکنه! اگه وجود نداشته باشه، می‌ساز.(بیشتر از این لازم نیست روی این موضوع وقت بزاریم)</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Wed, 23 Jul 2025 16:18:27 +0330</pubDate>
            </item>
                    <item>
                <title>صفر تا صد توابع در زبان C</title>
                <link>https://virgool.io/@mrNazouri13/%D8%B5%D9%81%D8%B1-%D8%AA%D8%A7-%D8%B5%D8%AF-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-c-pnxjuwbjefxw</link>
                <description>تو این مقاله در مورد تعریف و نحوه استفاده از توابع در زبان C مواردی ارائه میشه.تا الان تنها تابعی که داخل زبان C باهاش آشنا شدیم، تابع main هست. گفتیم که این تابع نقطه شروع اجرای برنامست! یکم با این تابع آشنا بشیم و بحث اصلی رو شروع کنیم...تابع main یه تابع خاصه که وقتی برنامه اجرا میشه، کامپایلر از اونجا شروع می‌کنه به اجرای کد. به عبارت دیگه، وقتی برنامت رو اجرا می‌کنی سیستم‌عامل مستقیم میره سراغ تابع main و کدی که داخلش نوشتی رو اجرا می‌کنه.می‌تونی توابع دیگه‌ایی غیر از main تعریف کنی و این توابع می‌تونن بیرون از main باشن. این کار به چند دلیل انجام میشه:سازمان‌دهی کد: اگه بخوای همه‌ی کدت رو داخل main بنویسی، وقتی برنامت بزرگ میشه، خیلی شلوغ و نامرتب میشه. با تعریف توابع جداگونه، می‌تونی کدت رو تمیز و ماژولار کنی.استفاده مجدد: توابع جداگونه رو میتونی چندبار تو برنامت (یا حتی تو برنامه‌های دیگه) استفاده کنی.فرض کن می‌خوای یه برنامه بنویسی که یه عدد رو بگیره و بگه زوجه یا فرد. می‌تونی این کارو فقط تو main انجام بدی ولی اگه بخوای این چک کردن رو چندبار استفاده کنی، بهتره یه تابع جدا بنویسی. کد:#include &lt;stdio.h&gt;

int is_even(int number)
{
    if (number % 2 == 0) {
        return 1; // 1 یعنی زوج
    } else {
        return 0; // 0 یعنی فرد
    }
}

int main()
{
    int num = 4;
    if (is_even(num)) {
        printf(&quot;عدد %d زوجه!\n&quot;, num);
    } else {
        printf(&quot;عدد %d فرده!\n&quot;, num);
    }

    return 0;
}(الان کاری نداریم که تابع چطور ساخته میشه! فقط میخوام موضوع main رو درک کنید)درنتیجه، من میتونم مواردی رو (مثل توابع) بیرون از تابع main ایجاد کنم. تابع main خاصه چون وقتی برنامه اجرا میشه سیستم‌عامل خودش main رو صدا می‌زنه. اما توابع دیگه‌ایی که بیرون از main تعریف میکنی، خود به‌ خود اجرا نمیشن مگر اینکه یه جایی (معمولا از داخل main یا یه تابع دیگه که از main شروع شده) صداشون کنی.حالا بریم سراغ موضوع اصلی...تابع (Function): تابع یه تیکه کد جدا و مستقله که یه کار مشخص رو انجام میده. تو هر وقت به اون کار نیاز داشتی، فقط باید تابع رو صدا بزنی. مزایای اصلی استفاده از function:جلوگیری از تکرار کد: اگه یه کاری رو قراره 10 بار انجام بدی، کدش رو یه بار تو یه تابع می‌نویسی و 10 بار اون تابع رو صدا می‌زنی.سازماندهی و خوانایی: برنامت به بخش‌های کوچیک و قابل فهم تقسیم میشه. به جای یه کد هزار خطی درهم برهم، چندتا تابع با اسم‌های معنی‌دار داری.اشکال‌زدایی راحت‌تر: اگه یه جای کار بلنگه، می‌دونی مشکل احتمالا توی کدوم function هست و مستقیم میری سراغ همون.شکل کلی تعریف تابع:Return_Type function_name(parameters)
{
    بدنه‌ تابع
}نوع برگشتی (Return Type): کلمه‌ای که قبل از اسم تابع میاد میگه که تابع ما بعد از اینکه کارش تموم شد، چه نوع مقداری رو به ما پس میده (return می‌کنه) حالت های مختلف:int: عدد صحیح برمی‌گردونه.void: هیچ چیزی برنمی‌گردونه.char و float و double و struct و... هم داریم.اسم تابع (Function Name): اسمی که ما برای تابع انتخاب می‌کنیم. بهتره یه اسم با معنی باشه که بگه این تابع چیکار می‌کنه.پارامترها (parameters): متغیرهایی که داخل پرانتز قرار دارن. ورودی‌های تابع هستن، یعنی اطلاعاتی که ما به تابع میدیم تا کارش رو با اونا انجام بده. تو کد پایین ما دوتا عدد صحیح بهش میدیم (باید Data Type هر پارامتری که برای یک تابع تعریف می‌کنی رو مشخص کنی)بدنه‌ی تابع: جایی که عملیات اصلی انجام میشه.مثال:int add(int a, int b)
{
    return a + b;
}نحوه صدا زدن تابع (Call کردن تابع): تابع رو توی main (یا توابع دیگه که اونا داخل main صدا زنده میشن) میتونی صدا بزنی:#include &lt;stdio.h&gt;

int add(int a, int b)
{
    return a + b;
}

int main()
{
    int result = add(3, 4);
    printf(&quot;%d&quot;, result);
}تابعی که هیچ چیزی برنمیگردونه:#include &lt;stdio.h&gt;

void greet()
{
    printf(&quot;Hello&quot;);
}

int main()
{
    greet();
}خروجی: Helloتابعی بدون پارامتر ولی با خروجی:#include &lt;stdio.h&gt;

char tf()
{
    return &#039;x&#039;;
}

int main()
{
    char ch = tf();
    printf(&quot;%c\n&quot;, ch);

    // یا

    printf(&quot;%c&quot;, tf());
}خروجی: (دوتا x)تابعی با پارامتر ولی بدون خروجی:#include &lt;stdio.h&gt;

void sayHi(char name[])
{
    printf(&quot;Hello %s&quot;, name);
}

int main()
{
    sayHi(&quot;Amirhosein&quot;);
}چرا این کد خطا نداد با اینکه توی تابع sayHi گفتم ورودیش یه []char name هست ولی نگفتم چندتا خونه باید داشته باشه؟ چرا C نگفت مثلا باید بنویسی char name[10] یا یه چیزی شبیه به اون؟وقتی توی پارامتر تابع بنویسی []char name یعنی:من نمیخوام خود آرایه رو بفرستی، فقط آدرس شروعش رو بده بهم.یعنی چی آدرس شروعش؟فرض کن یه کیف داری. وقتی این کیف رو می‌خوای به کسی نشون بدی، کل کیف رو نمیدی دستش. فقط می‌گی: کیف من روی میز اون گوشست، برو ببینش.یعنی فقط آدرس کیف رو میدی، نه خود کیف رو.درنتیجه، وقتی می‌گی:sayHi(&quot;Amirhosein&quot;);در واقع C خودش رشته Amirhosein رو تو حافظه می‌ذاره و آدرسش رو می‌ده به تابع. و چون رشته‌ها همیشه ته‌شون یه 0\ دارن، تابع میفهمه کجا تموم میشن.نکته. اگه تابع قراره داده‌ایی رو برگشت بده، باید از return استفاده کنم. آیا فقط از یک return میشه استفاده کرد؟ خیر. بسته به برنامه میتونم چندین return قرار بدم. کد:#include &lt;stdio.h&gt;

int tf(int number)
{
    if (number % 2 == 0) {
        return 1;
    }
    return 0;
}

int main()
{
    if (tf(5)) {
        printf(&quot;Zoje&quot;);
    }
    else {
        printf(&quot;Fard&quot;);
    }
}نکته. توابع باید بالای main تعریف بشن، اگه تابعی رو پایین main تعریف کنم و بخوام داخل main صداش بزنم، خطا میده! چرا که اون تابع هنوز شناخته نشده و دارم تلاش میکنم صداش بزنم. مثال:int main()
{
    if (tf(5)) {
        printf(&quot;Zoje&quot;);
    }
    else {
        printf(&quot;Fard&quot;);
    }
}

int tf(int number)
{
    if (number % 2 == 0) {
        return 1;
    }
    return 0;
}حالا اگه به هر دلیلی بخوام تابع رو پایین main تعریف کنم، راه حل چیه؟به این کد دقت کن:#include &lt;stdio.h&gt;

int tf (int);

int main()
{
    if (tf(5)) {
        printf(&quot;Zoje&quot;);
    }
    else {
        printf(&quot;Fard&quot;);
    }
}

int tf (int number)
{
    if (number % 2 == 0) {
        return 1;
    }
    return 0;
}بالای main برای C مشخص کردم که یه نوع تابع وجود داره به اسم tf که نوع int رو قراره return کنه و یه دونه int هم قراره به عنوان پارامتر دریافت کنه و در آخر ; قرار دادم. بعد اومدم پایین main تابع رو کامل تر تعریف کردم و بدنه تابع رو هم نوشتم. با این روش خطا بهم نمیده.نکته. وقتی داخل یه تابع (مثلا main یا هر تابع دیگه) یه متغیر تعریف می‌کنی، به اون میگن متغیر محلی (Local Variable). ویژگی‌های متغیرهای محلی (Local Variables):- فقط توی همون تابع شناخته میشن- وقتی تابع اجرا میشه، متغیر ساخته میشه و وقتی تابع تموم میشه، متغیر از بین میره (یعنی متغیرهای محلی عمرشون فقط تو زمان اجرای تابع هست)- دو تا متغیر با اسم یکسان میتونن تو توابع مختلف باشن (چون هر تابع محدوده خودشو داره)- متغیرهای داخل بلوک {} باز هم محلی هستن (حتی اگه تو یه حلقه یا شرط داخل یه تابع بنویسی) مثال:int main()
{
    if (1) {
        int x = 5;
        printf(&quot;%d\n&quot;, x);
    }
    printf(&quot;%d\n&quot;, x);
}تو خط 7 خطا دارم چون متغیری تحت عنوان x وجود نداره (اون x چون داخل {} ساخته شده بود، بازهم یه متغیر محلی به حساب میومد و بیرون از اون نمیشه ازش استفاده کرد (حتی با اینکه داخل یک تابع هستن))(پیشنهاد میکنم مقاله (مفهوم Scope و Namespace ها در پایتون) رو مطالعه کنید که به درک این مقاله کمک میکنه)درکنار Local Variables یا متغیرهای محلی، Global Variables یا متغیرهای سراسری هم داریم! وقتی بیرون از هر تابعی (حتی بیرون main) یه متغیر تعریف کنی، اون میشه متغیر global. یعنی همه‌ی توابع تو کل برنامه میتونن بهش دسترسی داشته باشن (هم میتونن مقدارش رو بخونن و هم مقدارش رو تغییر بدن) مثال:#include &lt;stdio.h&gt;

int x = 10;  // Global Variables

void sayHi() {
    printf(&quot;x inside sayHi = %d\n&quot;, x);
}

int main() {
    printf(&quot;x inside main = %d\n&quot;, x);
    sayHi();
    return 0;
}خروجی:x inside main = 10
x inside sayHi = 10به کد زیر دقت کن:void tf() {
    int count = 0;
    count++;
    printf(&quot;count = %d\n&quot;, count);
}

int main() {
    tf();
    tf();
    tf();
    tf();
}خروجی:count = 1
count = 1
count = 1
count = 1هر بار که تابع tf اجرا میشه، متغیر count از نو ساخته میشه و دوباره مقدارش میشه 0.الان متغیر رو با static ایجاد میکنم:#include &lt;stdio.h&gt;

void tf() {
    static int count = 0;
    count++;
    printf(&quot;count = %d\n&quot;, count);
}

int main() {
    tf();
    tf();
    tf();
    tf();
}خروجی:count = 1
count = 2
count = 3
count = 4کلمه static قبل از متغیر، یعنی این متغیر:فقط همون اولین بار ساخته بشه.مقدارش بین اجرای تابع‌ها حفظ بشه.فقط توی همون تابع قابل استفادست (local scope داره) اما تا آخر برنامه تو حافظه باقی میمونه.تابع بازگشتی چیه؟ تابع بازگشتی، تابعیه که خودش رو صدا می‌زنه!تصور کن یه عروسک بزرگ داری. وقتی بازش می‌کنی، داخلش یه نسخه کوچیکتر از همون عروسک وجود داره. دوباره اون رو باز می‌کنی و باز هم یه نسخه کوچیکتر داخلشه. این کار رو ادامه میدی تا به کوچیک ترین عروسک برسی که دیگه باز نمیشه. یک تابع بازگشتی همین‌طوری کار می‌کنه. برای حل یک مسئله بزرگ، خودش رو با یک نسخه کوچیکتر و ساده‌تر از همون مسئله صدا می‌زنه. این کار رو اونقدر تکرار می‌کنه تا به ساده‌ترین حالت ممکن برسه که جوابش مشخصه و دیگه نیازی به صدا زدن دوباره خودش نداره.هر تابع بازگشتی باید دو قانون اصلی رو رعایت کنه. اگه یکی از اینا نباشه، برنامه یا کار نمیکنه یا توی یه حلقه بی‌نهایت گیر می‌کنه و کرش می‌کنه.1 - شرط توقف (Base Case): شرط توقف همون کوچیک‌ترین عروسکه که دیگه باز نمیشه. این شرط به تابع میگه که: مسئله به قدر کافی ساده شده، دیگه خودت رو صدا نزن و این جواب نهایی رو برگردون. اگه شرط توقف وجود نداشته باشه، تابع تا ابد خودش رو صدا می‌زنه تا اینکه حافظه کامپیوتر پر بشه و برنامه با خطای Stack Overflow کرش کنه.2 - گام بازگشتی (Recursive Step): این همون بخشیه که تابع، خودش رو دوباره صدا می‌زنه. اما نکته کلیدی اینه که باید مسئله رو به شکلی تغییر بده که به شرط توقف نزدیک‌تر بشه. یعنی هر بار عروسک رو که باز می‌کنی، باید به عروسک کوچک‌تری برسی، نه یه عروسک هم‌اندازه یا بزرگ‌تر.برای مثال توابع بازگشتی، میخوام مثال فاکتوریل رو بهتون توضیح بدم! اما قبلش، فاکتوریل چیه؟فاکتوریل یه عملیات ریاضی خیلی سادس که با علامت تعجب (!) نشون داده میشه. فاکتوریلِ یه عدد، یعنی اون عدد رو در تمام عددهای صحیحِ قبل از خودش (تا 1) ضرب کنیم. مثال فاکتوریل عدد 4:4! = 4 × 3 × 2 × 1 = 24فاکتوریل عدد 5:5! = 5 × 4 × 3 × 2 × 1 = 120به کد زیر دقت کن:#include &lt;stdio.h&gt;

int factorial(int number) {
    int result = 1;
    while (number &gt; 1) {
        result *= number;
        number--;
    }
    return result;
}

int main() {
    printf(&quot;%d&quot;, factorial(5));
}تو این کد با استفاده از حلقه و بدون استفاده از توابع بازگشتی فاکتوریل رو بدست اوردم.تو کد زیر با استفاده از توابع بازگشتی اینکارو انجام میدم:#include &lt;stdio.h&gt;

unsigned long long int factorial(int number) {
    if (number == 1) {
        return 1;
    }
    else {
        return number * factorial(number - 1);
    }
}

int main() {
    printf(&quot;%d&quot;, factorial(5));
}تحلیل کد رو نمیرم. چرا؟ چون توابع بازگشتی چی بشه بخواد استفاده بشه و بیشتر از این (فعلا) لازم نیست براش وقت بزاریم.</description>
                <category>امیرحسین ناظوری</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Sun, 20 Jul 2025 18:07:26 +0330</pubDate>
            </item>
            </channel>
</rss>