localhost چیست؟ آدرس ⁦127.0.0.1⁩ به زبان ساده

تاریخ انتشار:

15 دقیقه مطالعه

Acar Diveroli
نویسنده: Acar Diveroli
فرمان ⁦> ping localhost⁩ با مکان‌نمای آبی، خط حلقه‌ای که به نقطه آغازش برمی‌گردد، پاسخ‌هایی از ⁦::1⁩ و نشان LOOPBACK

پروژه‌ای را اجرا می‌کنید و ترمینال سطر Local: http://localhost:5173 را چاپ می‌کند. یک آموزش از شما می‌خواهد localhost:3000 را باز کنید. یا فهرست دستگاه‌های متصل به روتر Wi-Fi خود را باز می‌کنید و نام یکی از آن‌ها «localhost» است. وقتی متوجه این واژه شوید آن را همه‌جا می‌بینید، و همیشه یک معنا دارد: همین دستگاه، در حال گفت‌وگو با خودش.

در این نوشته توضیح می‌دهیم localhost چیست، چه نسبتی با 127.0.0.1 و ::1 دارد و وقتی آن را باز می‌کنید چه اتفاقی می‌افتد. سپس به عدد پس از دونقطه، تفاوت localhost با 0.0.0.0 و آدرس آی‌پی شما، اینکه چه کسی به آن دسترسی دارد، خروجی ping localhost در ویندوز و دلیل اینکه ترافیک محلی نباید از پروکسی بگذرد می‌پردازیم.

localhost چیست؟

localhost یک نام میزبان (hostname) رزروشده است که همیشه یعنی «دستگاهی که روی آن اجرا می‌شوم». وقتی مرورگر، یک اسکریپت یا هر برنامه دیگری به localhost وصل می‌شود، اتصال از یک برنامه روی رایانه شما به برنامه دیگری روی همان رایانه می‌رود.

این نام را یک استاندارد حفظ می‌کند. ⁦RFC 6761⁩ (سال 2013) localhost را در میان نام‌های دامنه با کاربرد ویژه فهرست کرده است: نرم‌افزاری که نام‌ها را به آدرس تبدیل می‌کند باید همیشه، بی‌آنکه از سرور DNS بپرسد، با یک آدرس loopback به آن پاسخ دهد و رجیستری‌های دامنه نباید آن را به کسی واگذار کنند. این قاعده نام‌هایی را هم که به .localhost ختم می‌شوند، مانند app.localhost، در بر می‌گیرد.

هر دستگاه localhost خودش را دارد: روی لپ‌تاپ شما همان لپ‌تاپ است و روی گوشی‌تان همان گوشی. همین یک نکته بیشتر سردرگمی‌های مربوط به localhost را توضیح می‌دهد، از «روی رایانه‌ام کار می‌کند اما روی گوشی‌ام نه» تا «همکارم نمی‌تواند لینکم را باز کند».

⁦127.0.0.1⁩ و ⁦::1⁩ چه هستند؟

127.0.0.1 و ::1 آدرس‌های loopback هستند که localhost به آن‌ها اشاره می‌کند؛ اولی در IPv4 و دومی در IPv6. آدرس loopback (آدرس بازگشت به خود) ترافیک را به یک رابط شبکه مجازی به نام رابط loopback می‌فرستد و این رابط آن را مستقیم به همان دستگاه برمی‌گرداند.

IPv4 برای این کار یک بلوک کامل کنار گذاشته است. ⁦RFC 1122⁩، سند الزامات میزبان‌ها از سال 1989، هر آدرسی را که با 127 آغاز می‌شود «آدرس loopback داخلی میزبان» تعیین کرد که نباید بیرون از میزبان دیده شود. رجیستری آدرس‌های ویژه در ⁦RFC 6890⁩ هنوز 127.0.0.0/8 را با نام «Loopback» فهرست می‌کند و آن را نه قابل هدایت (forwardable) و نه سراسری (global) علامت می‌زند: روترها هرگز آن را جلو نمی‌فرستند.

این بلوک از 127.0.0.0 تا 127.255.255.255 را در بر می‌گیرد، یعنی حدود 16.7 میلیون آدرس، و همه آن‌ها به خود دستگاه برمی‌گردند: روی رایانه آزمایشی ما با ویندوز 11، فرمان ping 127.45.6.7 درست مانند 127.0.0.1 پاسخ داد. IPv6 فقط یک آدرس loopback دارد، ::1؛ ⁦RFC 4291⁩ الزام می‌کند بسته‌ای که به این آدرس فرستاده شده، اگر روزی از راه شبکه برسد، دور انداخته شود.

درخواست به localhost چگونه مسیر خود را طی می‌کند؟

درخواست به localhost همان مراحل هر درخواست وب را طی می‌کند، اما همه مراحل درون دستگاه شما رخ می‌دهند. وقتی localhost:3000 را در مرورگر تایپ می‌کنید، این اتفاق‌ها می‌افتد:

  1. مرورگر آدرس را می‌پرسد. سیستم‌عامل باید localhost را، همان‌طور که example.com را، به آدرس تبدیل کند.
  2. سیستم بی‌آنکه از شبکه بپرسد پاسخ می‌دهد. حل‌کننده‌های نام (resolver) خودشان localhost را می‌شناسند، و لینوکس و macOS هم سطری مانند 127.0.0.1 localhost را در فایل hosts نگه می‌دارند؛ فایل hosts فایل متنی کوچکی است که پیش از پرسیدن از DNS، نام‌ها را به آدرس‌ها نگاشت می‌کند (فایل hosts کجاست و چگونه ویرایش می‌شود). در آزمایش curl ما روی ویندوز 11، localhost هم به ::1 و هم به 127.0.0.1 تبدیل شد.
  3. بسته به رابط loopback می‌رود. سیستم آن را به‌جای آداپتور Wi-Fi یا اترنت به یک رابط مجازی می‌دهد که هیچ کابلی پشتش نیست. هیچ چیزی به روتر شما نمی‌رسد.
  4. سیستم دنبال برنامه‌ای روی پورت 3000 می‌گردد. اگر برنامه‌ای آنجا گوش دهد، درخواست را دریافت می‌کند. اگر هیچ برنامه‌ای گوش ندهد، سیستم بی‌درنگ اتصال را رد می‌کند.
  5. پاسخ از همان راه برمی‌گردد، بی‌آنکه از دستگاه بیرون برود.

چون این نام دو آدرس برمی‌گرداند، یک کلاینت ممکن است نخست ::1 را امتحان کند و سپس به 127.0.0.1 برود؛ وقتی سرور آزمایشی ما فقط روی 127.0.0.1 گوش می‌داد، curl دقیقاً همین کار را کرد. کلاینتی که به آدرس دوم نمی‌رود، با وجود اینکه سرور در حال اجراست، رد می‌شود.

⁦localhost:3000⁩ یعنی چه؟

localhost:3000 یعنی «برنامه‌ای روی همین دستگاه که روی پورت 3000 گوش می‌دهد». پورت عددی از 0 تا 65,535 است که به سیستم می‌گوید کدام برنامه باید اتصال را دریافت کند: آدرس آی‌پی دستگاه را پیدا می‌کند و پورت، برنامه روی آن دستگاه را.

عددهایی که بیشتر جست‌وجو می‌شوند، پورت‌های پیش‌فرض ابزارهای توسعه پرکاربرد هستند:

  • 3000: پورت پیش‌فرض next dev در Next.js و انتخابی رایج در آموزش‌های Node.js.
  • 5173: پورت پیش‌فرض سرور توسعه Vite.
  • 8000: پورت پیش‌فرض وب‌سرور داخلی پایتون، python -m http.server.
  • 8080: پورت جایگزین ثبت‌شده برای ترافیک وب که بسیاری از سرورهای محلی و پروکسی‌ها از آن استفاده می‌کنند.

اگر چیزی اجرا نکرده باشید، هیچ برنامه‌ای آنجا گوش نمی‌دهد و صفحه بارگذاری نمی‌شود. اینکه چرا 8080 هم به کار پروکسی‌ها می‌آید و هم به کار سرورهای توسعه، و برنامه‌ای را که یک پورت را گرفته چگونه پیدا کنید، در نوشته پورت 8080 چیست؟ آمده است.

پورت در قاعده‌های امنیتی مرورگر هم اهمیت دارد. دو آدرس که فقط در پورت با هم فرق دارند دو مبدأ (origin) متفاوت به شمار می‌آیند؛ پس صفحه‌ای روی localhost:5173 که یک API روی localhost:3000 را فرا می‌خواند درخواستی میان‌مبدأ (cross-origin) می‌فرستد و API باید با هدرهای CORS آن را مجاز کند.

تفاوت localhost، ⁦127.0.0.1⁩، ⁦0.0.0.0⁩ و آدرس آی‌پی شما

این آدرس‌ها در ترمینال شبیه هم به نظر می‌رسند، اما دسترسی به هر کدام در اختیار گروه بسیار متفاوتی است:

آدرسمعناچه کسی به آن دسترسی دارد
localhostنامی برای همین دستگاهفقط همین دستگاه
127.0.0.1آدرس loopback در IPv4فقط همین دستگاه
::1آدرس loopback در IPv6فقط همین دستگاه
0.0.0.0برای سرور: همه آدرس‌های این دستگاهدستگاه‌های دیگر هم، اگر فایروال اجازه دهد
192.168.1.20 (نمونه)آدرس این دستگاه در شبکه خانگیدستگاه‌های همان شبکه
آدرس آی‌پی عمومیآدرس روتر شما در اینترنتاینترنت، فقط اگر روتر یک پورت را هدایت کند

0.0.0.0 یک تنظیم گوش دادن است، نه یک مقصد: سروری که روی آن گوش می‌دهد اتصال‌ها را روی همه آدرس‌هایی که دستگاه دارد می‌پذیرد. سرور توسعه Next.js و سرور داخلی پایتون به‌طور پیش‌فرض روی همه آدرس‌ها گوش می‌دهند، اما Vite تا وقتی --host را اضافه نکنید روی localhost می‌ماند.

چرا localhost از اتصال خودداری می‌کند؟

پیام «localhost از اتصال خودداری کرد» یعنی مرورگر به رایانه خودتان رسیده، اما هیچ برنامه‌ای اتصال را روی آن پورت نپذیرفته است. در کروم با رابط فارسی، عنوان صفحه «نمی‌توان به این سایت دست یافت» است (در نسخه‌های قدیمی‌تر: «دسترسی به این سایت امکان‌پذیر نیست») و زیر آن سطر «localhost از اتصال خودداری کرد.» و کد ERR_CONNECTION_REFUSED می‌آید.

معمولاً سرور توسعه اجرا نمی‌شود، روی پورت دیگری اجرا می‌شود یا روی آدرس loopback دیگر گوش می‌دهد. بررسی‌های هر حالت در نوشته خطای ⁦err_connection_refused⁩ چیست و چگونه رفع می‌شود؟ آمده است.

چرا مرورگرها localhost را زمینه امن به شمار می‌آورند؟

چون ترافیکی که به آدرس loopback می‌رود هرگز از دستگاه بیرون نمی‌رود، مرورگرها با http://localhost حتی بدون گواهی مانند یک صفحه HTTPS رفتار می‌کنند. زمینه امن (secure context) صفحه‌ای است که مرورگر آن‌قدر به آن اعتماد دارد که قابلیت‌های حساسی مانند service worker، موقعیت مکانی یا دسترسی به دوربین از راه getUserMedia() را برایش باز کند.

راهنمای MDN درباره زمینه‌های امن میزبان‌هایی را که این رفتار را دریافت می‌کنند فهرست می‌کند: localhost، نام‌هایی که به .localhost ختم می‌شوند، بلوک 127.0.0.0/8 و ::1. در آزمایش ما با کرومیوم 145، window.isSecureContext هم روی http://localhost:3000 و هم روی http://127.0.0.1:3000 مقدار true را برگرداند.

این استثنا در مرز دستگاه تمام می‌شود. همان برنامه اگر از گوشی‌تان و از راه آدرس رایانه در شبکه خانگی با http:// ساده باز شود، زمینه امن نیست؛ پس قابلیتی که روی localhost کار می‌کند ممکن است آنجا کار نکند.

آیا localhost امن است و دیگران می‌توانند به آن برسند؟

هیچ‌کس در شبکه شما یا در اینترنت نمی‌تواند به 127.0.0.1 یا ::1 شما وصل شود: روترها این آدرس‌ها را جلو نمی‌فرستند و روی هر دستگاه دیگری این آدرس‌ها یعنی همان دستگاه. به برنامه‌ای که فقط روی localhost گوش می‌دهد، فقط نرم‌افزارهای روی رایانه خودتان دسترسی دارند.

خطرها در سه جای دیگر هستند:

  • برنامه‌هایی که روی همه آدرس‌ها گوش می‌دهند. سروری که روی 0.0.0.0 گوش می‌دهد از شبکه خانگی شما در دسترس است، و اگر روتر پورتش را هدایت کند از اینترنت هم. سرور داخلی پایتون همین کار را می‌کند، مگر اینکه --bind 127.0.0.1 را اضافه کنید.
  • وب‌سایت‌هایی که باز می‌کنید. اسکریپت‌های یک صفحه در مرورگر شما اجرا می‌شوند و می‌توانند بکوشند به localhost درخواست بفرستند. نسخه‌های اخیر کروم پیش از آن از شما اجازه می‌گیرند، و CORS نمی‌گذارد صفحه پاسخ محلی را بخواند، مگر اینکه برنامه محلی اجازه دهد.
  • نرم‌افزاری که از قبل روی رایانه شماست. هر برنامه‌ای روی دستگاه، از جمله بدافزار، می‌تواند با localhost گفت‌وگو کند؛ پس برای پایگاه‌های داده محلی و پنل‌های مدیریتی هم رمز بگذارید.

چگونه localhost را پینگ کنیم؟

در ویندوز Command Prompt (خط فرمان) یا PowerShell، یا در macOS و لینوکس Terminal (ترمینال) را باز کنید و تایپ کنید:

bash
ping localhost

این خروجی رایانه آزمایشی ما با ویندوز 11 است؛ نام رایانه را با MY-PC جایگزین کرده‌ایم. زبان سطرها به زبان ویندوز شما بستگی دارد، اما آدرس‌ها و زمان‌ها یکسان می‌مانند:

text
Pinging MY-PC [::1] with 32 bytes of data:
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms

Ping statistics for ::1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

ویندوز در سطر اول به‌جای واژه localhost نام خود رایانه را می‌نویسد. پاسخ‌ها از ::1 می‌آیند، چون ویندوز نخست از IPv6 استفاده کرد؛ ping -4 localhost استفاده از IPv4 را اجباری می‌کند و پاسخ از 127.0.0.1 می‌آید. همه زمان‌ها زیر یک میلی‌ثانیه‌اند، چون بسته‌ها هرگز از دستگاه بیرون نرفتند.

در macOS و لینوکس، ping تا وقتی Ctrl+C را فشار دهید ادامه می‌دهد؛ ping -c 4 localhost پس از چهار پاسخ متوقف می‌شود. اگر ping localhost شکست بخورد، مشکل در خود رایانه است، برای نمونه فایل hosts که localhost را به جای دیگری می‌فرستد، نه در روتر یا نزد ارائه‌دهنده اینترنت شما.

localhost و پروکسی: چرا ترافیک محلی نباید از پروکسی بگذرد؟

پروکسی‌ای که در اینترنت است نمی‌تواند به localhost شما برسد، چون برای سرور پروکسی localhost یعنی خود سرور پروکسی. به همین دلیل تنظیمات پروکسی برای آدرس‌های محلی استثنا دارند.

در ویندوز، در مسیر ⁦Settings > Network & internet > Proxy⁩ (تنظیمات > شبکه و اینترنت > پروکسی)، بخش تنظیم دستی پروکسی گزینه Don't use the proxy server for local (intranet) addresses (برای آدرس‌های محلی یا اینترانت از سرور پروکسی استفاده نشود) را دارد که مایکروسافت توصیه می‌کند تیک‌خورده بماند، و یک فهرست استثنا که می‌توانید localhost و 127.0.0.1 را به آن اضافه کنید. کروم هرگز localhost یا آدرس‌های loopback را از پروکسی عبور نمی‌دهد، مگر اینکه با یک قاعده عبور (bypass) ویژه اجرا شود.

ابزارهای خط فرمان ممکن است این کار را برایتان انجام ندهند. در آزمایش ما با ⁦curl 8.22.0⁩، تعریف متغیر http_proxy باعث شد درخواست http://localhost:3000 به پروکسی برود و آنجا به timeout بخورد؛ با افزودن NO_PROXY=localhost,127.0.0.1,::1 درخواست مستقیم به برنامه محلی رسید، همان‌طور که مستندات curl درباره متغیرهای محیطی پروکسی شرح می‌دهد.

localhost در سوی دیگر هم دیده می‌شود: پروکسی‌های اشکال‌زدایی روی رایانه خودتان و در آدرسی مانند 127.0.0.1:8080 اجرا می‌شوند و تنظیم پروکسی مرورگر به آنجا اشاره می‌کند. وقتی اسکریپت‌هایتان ترافیک بیرونی خود را از راه سرویسی دور مانند پروکسی مسکونی می‌فرستند، نام‌های محلی را در NO_PROXY نگه دارید تا فراخوانی‌های API خودتان روی همان دستگاه بمانند.

کجا با localhost روبه‌رو می‌شوید؟

  • توسعه وب. سرورهای توسعه هنگام شروع یک آدرس localhost چاپ می‌کنند و شما سایت را نخست همان‌جا آزمایش می‌کنید.
  • پایگاه‌های داده و ابزارهای مدیریتی محلی. پایگاه داده‌ای که برای استفاده خودتان نصب کرده‌اید می‌تواند فقط روی 127.0.0.1 گوش دهد و از دسترس دستگاه‌های دیگر دور بماند.
  • ورود از برنامه‌های دسکتاپ. برخی برنامه‌ها فرایند ورود را با فرستادن مرورگرتان به آدرسی مانند http://127.0.0.1:51004/... تمام می‌کنند که خود برنامه آنجا گوش می‌دهد؛ ⁦RFC 8252⁩ این الگو را برای OAuth شرح می‌دهد.
  • فهرست دستگاه‌های روتر شما. دستگاهی که نامی از خودش اعلام نمی‌کند ممکن است آنجا با نام «localhost» دیده شود.

اشتباهات رایج

  • باز کردن localhost روی گوشی برای رسیدن به رایانه. روی گوشی، localhost خود گوشی است؛ از آدرس رایانه در شبکه خانگی استفاده کنید.
  • فرستادن لینک localhost برای دیگران. http://localhost:3000 که برای همکارتان می‌فرستید رایانه او را باز می‌کند، نه رایانه شما را.
  • گوش دادن روی 0.0.0.0 وقتی فقط خودتان به برنامه نیاز دارید. تا وقتی دستگاه دیگری لازم نیست به آن برسد، آن را فقط روی 127.0.0.1 اجرا کنید.
  • فرستادن ترافیک محلی از راه یک پروکسی دور. بدون استثنا، درخواست به پروکسی می‌رود و پروکسی دستگاه شما را نمی‌بیند.
  • فرستادن localhost به آدرس دیگری در فایل hosts. برنامه‌ها انتظار دارند localhost آدرس loopback باشد و وقتی نیست، به شکل‌های عجیبی از کار می‌افتند.

راهنمای انتخاب

نیاز شماچه باید کرد
باز کردن پروژه‌ای که همین حالا اجرا کرده‌ایداز آدرسی که سرور توسعه چاپ می‌کند استفاده کنید
«localhost از اتصال خودداری کرد»سرور را اجرا کنید، پورت را بررسی کنید، سپس 127.0.0.1 را با همان پورت امتحان کنید
آزمایش سایت از گوشیبگذارید سرور روی شبکه گوش دهد و آی‌پی محلی رایانه را باز کنید
خصوصی نگه داشتن یک ابزار محلیآن را فقط روی 127.0.0.1 اجرا کنید و با رمز از آن محافظت کنید
بررسی نرم‌افزار شبکه خود رایانهping localhost را اجرا کنید
استفاده از پروکسی در اسکریپت‌ها بدون خراب شدن فراخوانی‌های محلیlocalhost,127.0.0.1,::1 را در NO_PROXY بگذارید

پرسش‌های متداول

⁦localhost:3000⁩ چیست؟

برنامه‌ای است که روی پورت 3000 دستگاه خودتان گوش می‌دهد و بیشتر وقت‌ها یک سرور توسعه است. Next.js به‌طور پیش‌فرض از پورت 3000 استفاده می‌کند، پس این آدرس معمولاً پس از اجرای یک فرمان شروع ظاهر می‌شود. اگر هیچ برنامه‌ای روی آن پورت اجرا نشود، مرورگر پیام «localhost از اتصال خودداری کرد.» را نشان می‌دهد.

آیا localhost همان آدرس آی‌پی من است؟

خیر. localhost آدرس loopback است، 127.0.0.1 یا ::1، که فقط دستگاه خودتان می‌تواند از آن استفاده کند و روی هر دستگاهی یکسان است. آدرس شما در شبکه خانگی، مانند 192.168.1.20، به دستگاه‌های دیگر امکان می‌دهد به شما برسند، و آدرس آی‌پی عمومی‌تان همان است که وب‌سایت‌ها می‌بینند.

آیا یک وب‌سایت می‌تواند به localhost من دسترسی داشته باشد؟

از سرور خودش نه، اما صفحه‌ای که باز می‌کنید در مرورگر شما اسکریپت اجرا می‌کند و آن اسکریپت‌ها می‌توانند تلاش کنند. کروم از نسخه 142، پیش از آنکه یک وب‌سایت عمومی به آدرس‌های شبکه محلی یا loopback برسد، از شما اجازه می‌گیرد (اطلاعیه کروم درباره Local Network Access).

چرا روتر من دستگاهی به نام localhost نشان می‌دهد؟

روتر هر دستگاه را با نامی فهرست می‌کند که آن دستگاه هنگام گرفتن آدرس از راه DHCP می‌فرستد. برخی دستگاه‌ها هرگز نامی از خودشان نمی‌گیرند و یک نام پیش‌فرض می‌فرستند، و در بسیاری از سیستم‌های مبتنی بر لینوکس این نام پیش‌فرض localhost است. این یک دستگاه واقعی در شبکه شماست، نه آدرس loopback رایانه‌تان؛ مک آدرس آن را با دستگاه‌های خودتان مقایسه کنید و اگر نتوانستید آن را شناسایی کنید، رمز Wi-Fi را تغییر دهید.

چگونه localhost را از گوشی باز کنم؟

با واژه localhost نمی‌شود، چون روی گوشی این واژه یعنی خود گوشی. به همان Wi-Fi وصل شوید، سرور توسعه را طوری اجرا کنید که روی شبکه گوش دهد (Vite به --host نیاز دارد) و آدرس رایانه در شبکه خانگی را همراه پورت باز کنید، مانند http://192.168.1.20:5173. فایروال رایانه هم باید اجازه دهد.

آیا localhost بدون اتصال اینترنت کار می‌کند؟

بله. ترافیک localhost هرگز از دستگاه بیرون نمی‌رود؛ پس یک سرور محلی، یک پایگاه داده محلی و ping localhost با Wi-Fi خاموش هم کار می‌کنند.

خلاصه

localhost نامی است که هر دستگاه برای خودش به کار می‌برد و آدرس‌های loopback، یعنی 127.0.0.1 و ::1، پشت آن قرار دارند؛ ترافیکی که به آن فرستاده می‌شود درون دستگاه برمی‌گردد. شماره پورت برنامه را انتخاب می‌کند، به همین دلیل localhost:3000 سرور توسعه شما را باز می‌کند. دستگاه‌های دیگر نمی‌توانند به localhost برسند؛ خطرهای واقعی برنامه‌هایی هستند که روی همه آدرس‌ها گوش می‌دهند و درخواست‌های محلی که به یک پروکسی دور فرستاده می‌شوند. اگر اسکریپت‌هایتان ترافیک بیرونی را از راه پروکسی می‌فرستند، localhost را در فهرست استثناها نگه دارید و گزینه‌ها را در صفحه محصولات پروکسی ما مقایسه کنید.

پرسش از ChatGPTپرسش از Claude