سوکت در پایتون و رابطه آن با امنیت در شبکه
میدانیم پایتون، زبانی است با قابلیت های بسیار. از برنامه نویسی برای وب گرفته تا هوش مصنوعی و.... به همین دلیل افرادی زیادی به سمت آموزش پایتون رفتهاند. امروز میخواهیم قدرت این زبان محبوب را در شبکه بررسی کنیم تا بدانیم چه کاربردی دارد؟
چگونه میتوان از این زبان در بحث شبکه استفاده کرد؟
زبان پایتون با استفاده از ماژول خود به نام سوکت در شبکه کار میکند. پس قبل از آن، ما شما را با تاریخچه این ماژول و همچنین تعریفی از آن آشنا میکنیم. سپس آموزش مختصری از سوکت در پایتون میپردازیم. پس باما همراه باشید.
تاریخچه سوکت ها:
درباره تاریخچه سوکت ها باید بگویم که تاریخ خیلی طولانی دارند و استفاده از آنها در سال 1971 با آرپانت آغاز شد. سپس با توسعه API یا همان رابط های نرم افزاری که ارتباط بین نرم افزارهای مختلف را پیاده سازی میکنند در سال 1983 به نام سوکت بِرِکلی منتشر شد. احتمالا الان در ذهن خود میگویید آرپانت چیست؟سوکت برکلی چیست؟ باکمی صبر و حوصله به جواب میرسید.
در ادامه سوکت ها با اینترنت که در دهه 1990 جهانی شد، به کار خود ادامه دادند و کلید برنامه نویسی شبکه رقم خورد. سرورهای وب و مرورگرها تنها برنامه هایی بودند که با استفاده از سوکت ها به شبکه متصل شدند. شایع ترین کاربرد سوکت ها، برنامه مشتری - سرور است که در آن یک طرف به عنوان سرور عمل میکند و منتظر ارتباط از مشتریان است.
تعریف آرپانت و سوکت برکلی:
آرپانت (ARPANET) مخفف Advanced Research Projects Agency Network به معنی سازمان پروژههای تحقیقاتی پیشرفته شبکه، اولین شبکه Switching بسته های اطلاعات در دنیا بود و پس از مدتی تبدیل به اینترنت جهانی شد.
پس از پرتاب نخستین ماهواره اتحاد جماهیر شوروی به فضا و هنگامی که رقابت سختی از نظر تسلیحاتی بین دو ابر قدرت آن زمان جریان داشت و دنیا در دوران جنگ سرد به سر می برد، وزارت دفاع آمریکا در واکنش به این اقدام رقیب نظامی خود، آژانس پروژه های تحقیقاتی پیشرفته یا آرپا (ARPA) را تاسیس کرد. یکی از پروژه های مهم این آژانس، تامین ارتباطات در زمان جنگ جهانی احتمالی بود.
در همین سال ها، مراکز تحقیقاتی غیر نظامی که در امتداد دانشگاه ها بودند، برای اتصال کامپیوترها به یکدیگر در تلاش بودند. آن زمان کامپیوتر های Mainframe از طریق ترمینال ها به کاربران سرویس می دادند. در اثر اهمیت یافتن این موضوع آژانس آرپا (ARPA) منابع مالی پروژه اتصال دو کامپیوتر از راه دور به یکدیگر را در دانشگاه MIT بر عهده گرفت. در اواخر سال 1960 اولین شبکه کامپیوتری بین چهار کامپیوتر که دو تای آنها در MIT، یکی در دانشگاه کالیفرنیا و دیگری در مرکز تحقیقاتی استنفورد قرار داشتند، راه اندازی شد.
این شبکه آرپانت نامگذاری شد. در سال 1965 نخستین ارتباط راه دور بین دانشگاه MIT و یک مرکز دیگر نیز برقرار شد. تا این سال ها شبکه آرپانت به امور نظامی اختصاص داشت، اما در سال 1967 به عموم معرفی شد. Switching بستههای اطلاعات در آرپانت، بر اساس طرحی از دانشمند بریتانیایی دونالد دیویس و لارنس رابرت از آزمایشگاه لینکلن بود. در این سال ها حرکتی غیر انتفاعی به نام MERIT که چندین دانشگاه بنیانگذار آن بوده اند، مشغول توسعه روش های اتصال کاربران ترمینال ها به کامپیوتر مرکزی شدند.
نخستین شبکه از این نوع که چندین ایالت را به هم متصل می کرد Michnet نام داشت. روش اتصال کاربران به کامپیوتر میزبان در آن زمان به این صورت بود که یک نرم افزار خاص روی کامپیوتر مرکزی اجرا می شد و ارتباط کاربران را برقرار می کرد اما در سال 1976 نرم افزار جدیدی به نامHermes عرضه شد که برای نخستین بار به کاربران اجازه می داد از طریق یک ترمینال به صورت تعاملی ، مستقیماً به سیستم MERIT متصل شوند.
از وقایع مهم تاریخچه شبکه های کامپیوتری، ابداع روش سوئیچینگ بسته ای است. قبل از معرفی شدن این روش از سوئیچینگ مداری برای تعیین مسیر ارتباطی استفاده می شد؛ اما در سال 1974 با پیدایش پروتکل ارتباطی TCP/IP این پروتکل جایگزین پروتکل NCP شد و به پروتکل استاندارد برای آرپانت تبدیل شد. با این تغییر و تحول، شبکه های زیادی به بخش تحقیقاتی این شبکه متصل شدند و آرپانت به اینترنت تبدیل شد.
۲۹ اکتبر سال ۱۹۶۹ اولین پیام بین کامپیوتری ارسال شد. در این روز، چارلی کلاین، یکی از دانشجویان دانشگاه UCLA تلاش کرد کلمهی «login» را با استفاده از شبکهی بین کامپیوتری، به کامپیوتر دیگر در مرکز تحقیقات دانشگاه استنفورد ارسال کند. این شبکهی بین کامپیوتری، آرپانت (ARPANET) نام داشت که پایههای اینترنت را بنا کرد.
پس از ارسال حروف l و o، شبکهی آرپانت دچار مشکل شد و قطع شد. پس از یک ساعت تلاش، شبکه به حالت پایدار بازگشت و ارسال پیام با موفقیت انجام شد.
آرپانت مخفف عبارت شبکهی آژانس پروژههای تحقیقاتی پیشرفته (Advanced Research Projects Agency Network) است. این شبکه یکی از اولین شبکههای ارتباطی بر اساس ارسال و دریافت Packet بود و از پروتکل TCP/IP استفاده میکرد. هر ۲ فناوری استفاده شده در این شبکه، پایههای توسعهی اینترنت بودند. توسعهی شبکهی آرپانت توسط آژانس پروژههای تحقیقاتی پیشرفتهی وزارت دفاع ایالات متحدهی آمریکای پشتیبانی میشد. با پیشرفت پروژهی آرپانت، استانداردها و نیازها برای اتصال شبکههای متعدد به یکدیگر نیز توسعه یافتند. در سالهای بعد استانداردها و پروتکلهای اینترنت به مرور تدوین شدند و در نهایت در سال ۱۹۹۰، شبکهی آرپانت بازنشسته و تعطیل شد.
سوکت های برکلی: سوکتهای برکلی یا سوکتهای بیاسدی، فریم ورکی است که شامل رابطهای برنامهنویسی نرمافزار برای کار با سوکتهای اینترنتی است، که از این سوکتها برای ارتباطات بین پردازشی استفاده میشوند. امروزه تمام سیستمعاملهای مدرن یک پیادهسازی از سوکتهای برکلی را به همراه دارند چون این سوکتها روش استاندارد برای دسترسی به اینترنت هستند.
بیشتر بخوانید: شاید برای شما هم جالب باشد در دنیای پایتون خاکستری چه میگذرد.
سوکتها چه هستند؟
قبل از هر چیز بهتر است، بدانیم که سیستم عامل برنامه ها با یکدیگر صحبت نمی کنند بلکه این پردازش ها(Processes) هستند که عمل ارتباط با یکدیگر را انجام میدهند. در واقع پردازش ها، به برنامه هایی گفته می شود که درون و بین یک سیستم انتهایی در حال اجرا هستند و هنگامی که بر روی یک سیستم در حال اجرا می باشند، میتوانند با یکدیگر و با دیگر پردازش های ما بین خود ارتباط برقرار کنند. ارتباط این پردازش ها از طریق مبادله پیام می باشد.
یک پردازش پیام های ارسالی و یا دریافتی خود را از طریق یک نرم افزار واسط شبکه که اصطلاحا به آن سوکت گفته میشود از درون شبکه عبور می دهند. با یک بیان ساده میتوان گفت که سوکت به ترکیب یک آدرس ماشین (IP) و یک شماره درگاه (Port) گفته میشود. در برقراری ارتباط بین کامپیوترها در یک شبکه دو چیز بسیار مهم است:
-
آدرس ماشینی که میخواهیم اطلاعاتی از آن بگیریم یا به آن ارسال کنیم
-
برنامهای از آن ماشین که درخواست اطلاعات کرده یا اینکه میخواهیم اطلاعاتی از آن برنامه کسب کنیم.
این دو یعنی آدرس ماشین و شماره برنامه به وسیله سوکت در شبکه مشخص میشوند. پس یک سوکت یا پریز یا کانال در شبکه لینکی است میان دو اپلیکیشن، که میتوانند با همدیگر ارتباط برقرار کنند. این حالت میتواند به صورت محلی روی یک ماشین و یا به صورت ریموت بین دو ماشین جداگانه انجام شود. به صورت کلی سوکتها مانند یک لینک بین دو موجودیت کار میکنند و در بحث برنامه نویسی میتوان گفت، سوکت ها کانال ارتباطی ما در برنامه یا دروازه و ابزار ارسال و دریافت اطلاعات بین ما و طرف مقابل در سطح برنامه نویسی هستند.
HTTP و FTP و SMTP و POP3 چه هستند؟
اینها پروتکل هستن. یعنی قراردادها و استانداردهایی که تعیین میکنند برنامه های مختلف چطور با هم صحبت کنند. پروتکل مثل زبان است. مثلا زبان عربی، فارسی و غیره و سوکت یه دستگاه ارتباطی مثل تلفن است.
شما با تلفن زنگ میزنید به طرف مقابل و او گوشی را برمیدارد. حالا یک کانال ارتباطی بین شما وجود دارد که میتوانید از طریق آن، صدای یکدیگر رو بشنوید. این یعنی سوکت. اما فقط توانایی تبادل صدا کافی نیست، بلکه نیاز است طرفین به زبان مشترکی صحبت کنند تا حرف همدیگر را متوجه شوند. این زبان مشترک همان پروتکل ها هستند.
چه پروتکل هایی برای ارتباط سوکت استفاده می شود؟
همان طور که اشاره شد ما پروتکل های ارتباطی مانند TCP و UDP داریم. پروتکل TCP این امکان را به ما میدهد تا هم اطلاعات را ارسال و هم دریافت کنیم. به عبارتی تبادل اطلاعات به صورت دو طرفه خواهد بود. اما در پروتکل UDP ارسال اطلاعات به صورت یک .طرفه خواهد بود
پیش نیاز های برنامه نویسی سوکت در زبان پایتون
برای برنامه نویسی شبکه در زبان پایتون، نیاز است تا با تمام Syntax ها و مفهوم های ابتدایی این زبان آشنا باشید.
نحوه تعریف سوکت در پایتون چیست؟
برای ایجاد یک سوکت شما میتوانید از تابع socket.socket() استفاده کنید، سینتکس آن به صورت زیر است:
Import socket
s= socket.socket (socket family,socket type,protocol=0)
-
socket_family: این مورد نوع آدرس دهی برای ارتباط را مشخص میکند. این ورودی، یک مقدار عددی است اما میتوان مقادیر ثابت موجود در کتابخانه socket را نیز استفاده کرد
-
socket_type: مشخص کننده نوع سوکت است. این ورودی، یک مقدار عددی است و میتوان برای تعریف آن از مقادیر ثابت موجود در کتابخانه استفاده کرد. نوع سوکت در اصل نشان دهنده نحوه اتصال بین دو نود خواهد بود. معمولاً از مقدار socket.SOCK_STREAM برای ارتباط TCP و از socket.SOCK_DGRAM برای اتصال UDP استفاده میشود.
توابع مربوط به سوکت سرور
با استفاده از تابع bind() میتوان آدرس IP و پورت مورد نظر برای فعال شدن را تعیین کرد. توجه داشته باشید که پورتی که وارد میشود باید بر روی سیستم سرور آزاد بوده و توسط برنامه دیگری استفاده نشود. (همانطور که میدانید پورت های 1 تا 1024 به صورت پیشفرض توسط سیستم عامل رزرو شده اما میتوانید پورت های 1025 تا 65536 را بررسی کنید)
این تابع میتواند محدودیتی برای تعداد کانکشن های ایجاد شده با سرور را مشخص کند. حداقل مقدار تعریف شده برای آن 0 و سقف آن، با توجه به منابع سیستم سرور تعیین میشود. در صورتی که سرور این تعداد کانکشن را برقرار کرده باشد، در صورت دریافت درخواست برای ایجاد کانکشن جدید آنرا رد خواهد کرد.
این تابع درخواست هایی که برای سرور ارسال میشود را دریافت کرده و در صورت توان قبول خواهد کرد. برنامه بر روی تابع accept() به صورت بلاک شده خواهد ماند تا زمانی که درخواستی به سرور ارسال و از سمت سرور پذیرفته شود.پس از دریافت و قبول یک ارتباط (connection)، این تابع یک تاپل (tuple) را به عنوان خروجی باز میگرداند؛ این تاپل دو مقدار دارد، مقدار اول شئ کانکشن و مقدار دوم حاوی مشخصات کلاینت متصل شده در ارتباط می باشد.
توابع سوکت کلاینت
با استفاده از تابع اتصال، سرویس گیرنده میتواند درخواست ایجاد کانکشن را به سرور مقصد ارسال کرده و ارتباط خود را با آن آغاز کند.
توابع اصلی سوکت
توابع زیر را میتوان در هر دو طرف ارتباط (سرور یا کلاینت) استفاده کرد.
وقتی این تابع فراخوانی میشود مقدار ارسال شده در اتصال TCP را دریافت کرده و خروجی را به ما نشان میدهد. هنگام استفاده از این تابع، برنامه روی این خط بلاک شده و تا زمانی که پیامی در ارتباط دریافت نکند، پیشروی نخواهد کرد.
به عنوان ورودی اول ،تابع recv() یک مقدار عددی دریافت میکند؛ این عدد (buffer size) نشان دهنده تعداد حداکثر بایت هایی است که باید از خروجی بخواند. یعنی مشخص میکنیم حداکثر چند بایت از پیام دریافت شده را بخواند. خروجی تابع به صورت byte است؛ پس اگر بخواهیم آن را به عنوان یک رشته استفاده کنیم، بهتر است تابع decode() را روی آن صدا بزنیم.
تابع send() یک ورودی به صورت اجباری میگیرد و همان اطلاعاتی است که باید به مقصد (آن سوی ارتباط TCP) ارسال شود. ورودی تابع می بایست به صورت byte و با encode مشخص باشد؛ بنابراین در صورتی که بخواهیم یک رشته را ارسال کنیم، باید بر روی رشته مورد نظر ابتدا تابع encode() را صدا زده و خروجی آن را ارسال کنیم.
این تابع برای دریافت پیام در کانکشن ایجاد شده UDP استفاده میشود.
تابع sendto() برای ارسال پیام به مقصد در یک کانکشن UDP استفاده میشود. به عنوان سومین خروجی این تابع، میتوان مقصد (زوج آدرس و پورت) را تعریف کرد.
در ابتدای ایجاد کانکشن، ما یک کانکشن به آن طرف ارتباط ایجاد کرده و یک پورت را مشغول کرده ایم. با صدا زدن تابع close()روی کانکشن ایجاد شده، آن را بسته و پورت را آزاد میکنیم. بدیهی است که این کار در انتهای کارمان صورت خواهد پذیرفت.
ساخت برنامه چت با پایتون
برای ساخت برنامه چت به دو فایل مختلف نیاز داریم که اولی به عنوان سرور server.py و دومی به عنوان کلاینتclient.py شناخته خواهند شد.
ایجاد سوکت سرور و اتصال به سرور
ابتدا می بایست در سرور یک سوکت روی پورت مورد نظر ایجاد کرده، شنود TCP را روی آن فعال کنیم و منتظر دریافت درخواست ایجاد کانکشن میمانیم. سپس با استفاده از دستور socket() یک سوکت ایجاد میکنیم. چون قرار هست هر دو فایل روی یک سیستم اجرا شوند و خبری از دو سیستم با دو آدرس IP متفاوت نیست، آدرس مقصد را localhost یا آدرس 127.0.0.1 معرفی میکنیم؛ یعنی مقصد روی همین سیستم است.
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 14200))
s.listen(1)
#Waiting For a Connection
connection, client = s.accept()
همچنین در سمت مشتری (client) نیز یک سوکت ایجاد کرده و تلاش میکنیم تا به مقصد localhost و پورتی که در سرور تعریف کرده ایم (در اینجا 14200) متصل شویم.
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#connectings.connect(("localhost", 14200))
هنگامی که سرور در حال اجرا و منتظر دریافت درخواست ایجاد ارتباط باشد و خط ششم قطعه کد فوق اجرا شود، یک ارتباط TCP بین دو برنامه ایجاد خواهد شد. پس از ایجاد شدن ارتباط، سرور که منتظر دریافت پیام بود، از حالت بلاک از روی خط نهم آزاد شده و ادامه کدها را اجرا میکند.
ارسال و دریافت پیام در شبکه
حال که ارتباط ما به سرور ایجاد شد، میخواهیم از طریق کلاینت پیامی به سرور ارسال کنیم. پس در ادامه، اتصال کانکشن در سمت کلاینت را خواهیم داشت.
message = "Hello"
s.send(message.encode())
همانطور که گفته شد، پیام ها بر روی سوکت به صورت byte ارسال میشود و می بایست رشته متنی را با استفاده از تابع encode() به رشته ی بایتی تبدیل کنیم. اگر بخواهیم پس از ان که پیام هایمان را به سرور ارسال کردیم، منتظر دریافت تایید از سمت سرور باشیم و پیام سرور را نیز دریافت کنیم، این کار را با استفاده از تابع recv() به صورت زیر انجام میدهیم:
data = s.recv(32)
print(data.decode())
و در پایان، کانکشن ایجاد شده را خواهیم بست.
#Connection Closed
s.Close()
برای دریافت و ارسال پیام در سمت سرور، به طور کاملاً مشابه عمل خواهیم کرد. یعنی در ادامه کدهای قبلی server.py قطعه کدهای زیر را خواهیم نوشت.
print(client, 'Connected')
data = connection.recv(32)
print('Received "' + data.decode() + '"')
connection.send("Message Received!".encode())
connection.close()
در قطعه کد بالا، پس از برقراری کانکشن، اعلام میکنیم که یک کلاینت به سرور متصل شد و اطلاعات (آدرس IP و پورت) آن را چاپ میکنیم. سپس منتظر دریافت پیام از کلاینت خواهیم ماند. پس از دریافت و چاپ، پیام موفقیت آمیز بودن را برای client ارسال میکنیم.
کدهای سرور چت با پایتون:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 14200))
s.listen(1)
#Waiting For a Connection
connection, client = s.accept()
print(client, 'Connected')
data = connection.recv(32)
print('Received "' + data.decode() + '"')
connection.send("Message Received!".encode())
connection.close()
کدهای کلاینت چت پایتون
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#connecting
s.connect(("localhost", 14200))
message = "Hello"
s.send(message.encode())
data = s.recv(32)
print(data.decode())
#Connection Closed
s.close()
ماژول های برنامه نویسی تحت شبکه برای پایتون:
در زیر لیستی از ماژول های مهم و پرکاربرد پایتون در زمینه ی برنامه نویسی تحت شبکه را مشاهده می کنید.
ماژول پایتون
|
شماره ی درگاه یا پورت
|
کاربرد و موارد استفاده |
پروتکل |
httplib, urllib, xmlrpclib
|
80
|
برای اپلیکیشن های تحت وب/پروتکل ارسال اطلاعات بین
سرور، کلاینت
|
HTTP
|
nntplib
|
119
|
پروتکل دسترسی به گروه های خبری
|
NNTP
|
ftplib, urllib
|
20
|
انتقال فایل
|
FTP
|
smtplib
|
20
|
ارسال ایمیل
|
SMTP
|
poplib
|
110
|
واکشی ایمیل
|
POP3
|
imaplib
|
143
|
واکشی ایمیل
|
IMAP4
|
نظر بدهید
نظر شما در تصمیم دیگران اثرگذار است. لطفا برای ما و همراهان درسمن نظر خود را بنویسید.