ทำไมจึงมีความแตกต่างระหว่าง ping“ localhost” และ ping“ ที่อยู่ IP ในพื้นที่”


32

การใช้cmdและpingบน Windows ให้ผลลัพธ์ต่อไปนี้แก่ฉัน:

  • ส่ง Ping "localhost":

ป้อนคำอธิบายภาพที่นี่

  • ส่ง Ping ไปที่ "192.168.0.10" (ที่อยู่ IP ในเครื่อง):

ป้อนคำอธิบายภาพที่นี่

สถานการณ์ทั้งสองนั้นไม่เหมือนกันหรือไม่

ฉันหมายถึงฉันกำลังกระตุกอินเทอร์เฟซเดียวกันเครื่องเดียวกันและที่อยู่เดียวกัน ทำไมฉันถึงได้ผลลัพธ์ที่แตกต่างเช่นนี้

แก้ไข: นี่คือipconfig /allหน้าจอของฉัน:

ป้อนคำอธิบายภาพที่นี่


18
คุณไม่ได้ทำการอินเทอร์เฟซเดียวกันแม้ว่าจะไม่มีอินเทอร์เฟซทางกายภาพใด ๆ ที่คุณยังคงมี "โลคัลโฮสต์"
Tamara Wijsman

หากโดย "อินเทอร์เฟซเดียวกัน" คุณหมายถึงอินเทอร์เฟซย้อนกลับคุณถูกต้อง หากคุณหมายถึงส่วนต่อประสานอีเธอร์เน็ตคุณคิดผิดด้วยเหตุผลหลายประการ (ตัวอย่างเช่น :: 1 เกี่ยวข้องกับอีเทอร์เน็ตอินเตอร์เฟสได้อย่างไรและทำไมอีเธอร์เน็ตอินเตอร์เฟส - ซึ่งหน้าที่คือการส่งแพ็กเก็ตอีเทอร์เน็ตบนสายไฟและรับจากสาย - มีส่วนร่วมในการดำเนินการที่ไม่เกี่ยวข้องกับ แพ็คเก็ตอีเธอร์เน็ตหรือสายไฟ?)
David Schwartz

ผมค่อนข้างบางคำถามนี้ได้รับการถามใน Stackoverflow ก่อนถ้าฉันสามารถหามัน ...
คริส S

หัวใจของสิ่งนี้ได้รับคำตอบจาก SO ดังนั้นฉันเชื่อว่า: stackoverflow.com/questions/6938039//
Dawson Toth

ฉันคิดว่าสิ่งที่น่าสนใจคือ: ทำไมคุณถึงได้รับจำนวนไบต์ที่ถูกถ่ายโอนและ TTL เมื่อทำการส่งโฮสต์ระยะไกล แต่ไม่ใช่เมื่อทำการ ping localhost ไม่มีใครสนใจว่ารูปแบบที่อยู่ IP นั้นค่อนข้างปิด
dhasenan

คำตอบ:


46

คุณไม่ได้กระตุกอินเทอร์เฟซเดียวกันโดยไม่ต้องมีอินเทอร์เฟซทางกายภาพใด ๆ ที่คุณยังมี "โลคัลโฮสต์"

คุณlocalhostใช้เพื่ออ้างถึงคอมพิวเตอร์ของคุณจาก IP "ภายใน" ไม่ใช่จาก IP ภายนอก "" ของคอมพิวเตอร์ของคุณ ดังนั้นแพ็กเก็ต ping จึงไม่ผ่านส่วนต่อประสานเครือข่ายทางกายภาพใด ๆ ผ่านอินเทอร์เฟซวนกลับเสมือนเท่านั้นซึ่งส่งแพ็กเก็ตโดยตรงจากพอร์ตไปยังพอร์ตโดยไม่ต้องมีฟิสิคัลฮ็อป

คุณอาจจะยังคงสงสัยว่าทำไมlocalhostมีการแก้ไขปัญหาไปในขณะที่แบบดั้งเดิมที่เราจะคาดหวังให้แก้ไขไปยังที่อยู่::1 IPv4 127.0.0.1โปรดทราบว่าโดยทั่วไป.localhostคือ TLD (ดูRFC 2606 ) ซึ่งชี้กลับไปยังที่อยู่ IP แบบวนกลับ (สำหรับ IPv4 ดูที่RFC 3330โดยเฉพาะ 127.0.0.0/8)

การค้นหาlocalhostโดยใช้nslookupช่วยให้เรา:

nslookup localhost

...
Name:    localhost
Addresses:  ::1
          127.0.0.1

ดังนั้น Windows ต้องการใช้ที่อยู่ IP IPv6 วนกลับ::1(ดูRFC 2373 ) เนื่องจากเป็นรายการแรก

เอาล่ะมาจากไหนมาดูไฟล์โฮสต์กันดีกว่า

type %WINDIR%\System32\Drivers\Etc\Hosts

...
# localhost name resolution is handled within DNS itself.
#       127.0.0.1       localhost
#       ::1             localhost
...

อืมเราต้องดูการตั้งค่า DNS ของ Windows

บทความ KB นี้บอกเราเกี่ยวกับการตั้งค่าที่มีผลต่อสิ่งที่ Windows ต้องการโดยเน้นเป็นตัวหนา:

  1. ใน Registry Editor ค้นหาแล้วคลิกคีย์ย่อยของรีจิสทรีต่อไปนี้:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. คลิกสองครั้งที่ DisabledComponents เพื่อแก้ไขรายการ DisabledComponents

    หมายเหตุ: หากรายการ DisabledComponents ใช้งานไม่ได้คุณจะต้องสร้างมันขึ้นมา โดยทำตามขั้นตอนต่อไปนี้:

    1. ในเมนูแก้ไขชี้ไปที่ใหม่แล้วคลิกค่า DWORD (32 บิต)

    2. พิมพ์ DisabledComponents แล้วกด ENTER

    3. คลิกสองครั้งที่ DisabledComponents

  3. พิมพ์ค่าใดค่าหนึ่งต่อไปนี้ในฟิลด์ Value data: เพื่อกำหนดค่าโปรโตคอล IPv6 ให้อยู่ในสถานะที่ต้องการแล้วคลิกตกลง:

    • พิมพ์0เพื่อเปิดใช้งานส่วนประกอบ IPv6 ทั้งหมด (การตั้งค่าเริ่มต้นของ Windows)
    • พิมพ์0xffffffffเพื่อปิดใช้งานส่วนประกอบ IPv6 ทั้งหมดยกเว้นส่วนต่อประสานย้อนกลับ IPv6 ค่านี้ยังกำหนดค่า Windows ให้นิยมใช้ Internet Protocol รุ่น 4 (IPv4) ผ่าน IPv6 โดยแก้ไขรายการในตารางนโยบายคำนำหน้า สำหรับข้อมูลเพิ่มเติมดูที่การเลือกที่อยู่ต้นทางและปลายทาง
    • พิมพ์0x20เพื่อให้ชอบ IPv4 มากกว่า IPv6 โดยการแก้ไขรายการในตารางนโยบายคำนำหน้า
    • พิมพ์0x10เพื่อปิดใช้งาน IPv6 ในอินเทอร์เฟซ nontunnel ทั้งหมด (บนทั้ง LAN และอินเตอร์เฟสแบบจุดต่อจุด [PPP])
    • พิมพ์0x01เพื่อปิดใช้งาน IPv6 ในทุกอินเทอร์เฟซทันเนล ซึ่งรวมถึงโปรโตคอลการกำหนดที่อยู่ของอุโมงค์อัตโนมัติภายในเว็บไซต์ (ISATAP), 6to4 และ Teredo
    • พิมพ์0x11เพื่อปิดใช้งานการเชื่อมต่อ IPv6 ทั้งหมดยกเว้นสำหรับการเชื่อมต่อวนรอบ IPv6
  4. รีสตาร์ทคอมพิวเตอร์เพื่อให้การตั้งค่านี้มีผล

ตารางนโยบายคำนำหน้านี้คืออะไร

netsh interface ipv6 show prefixpolicies(หรือprefixpolicyในรุ่นก่อนหน้า)

Precedence  Label  Prefix
----------  -----  --------------------------------
        50      0  ::1/128
        45     13  fc00::/7
        40      1  ::/0
        10      4  ::ffff:0:0/96
         7     14  2002::/16
         5      5  2001::/32
         1     11  fec0::/10
         1     12  3ffe::/16
         1     10  ::/96

ตารางนี้ตัดสินว่าส่วนนำหน้าใดที่มีความสำคัญเหนือกว่าส่วนนำหน้าอื่น ๆ ในระหว่างการแก้ไข DNS

อ่าใช้ KB ที่เราสามารถเพิ่มรายการที่นี่ซึ่งแสดงว่า IPv4 มีความสำคัญมากกว่า IPv6

หมายเหตุ:ไม่มีเหตุผลที่จะแทนที่พฤติกรรมนี้เว้นแต่ว่าคุณกำลังประสบปัญหาที่เข้ากันได้ การเปลี่ยนการตั้งค่านี้ใน Windows Server ของเราทำให้เมลเซิร์ฟเวอร์ของเราแตกหักดังนั้นจึงควรจัดการอย่างระมัดระวัง ...


จริงๆแล้ว 'localhost' ไม่ใช่โดเมนระดับบนสุด แต่เป็นชื่อโฮสต์ ความแตกต่างนั้นลึกซึ้งมาก แต่โดยทั่วไปชื่อโดเมนทุกชื่อเป็นชื่อโฮสต์ แต่ชื่อโฮสต์ทั้งหมดไม่ใช่ชื่อโดเมน ตามระเบียบการประชุมชื่อโฮสต์ที่ลงท้ายด้วย ful stop ต้องเป็น FQDN และชื่อโฮสต์ส่วนใหญ่ที่ไม่สิ้นสุดในการหยุดแบบเต็มสามารถแปลงเป็น FQDN โดยการต่อท้ายโดเมนหลักย้อนกลับไปต่อท้ายรูตหากต้องการ อย่างไรก็ตามนี่เป็นเพียงการประชุม 'localhost' ถูกสงวนไว้โดย RFC 2606 เพื่อป้องกันไม่ให้กลายเป็น TLD เนื่องจากมีแนวโน้มที่จะทำงานไม่ถูกต้องและอาจทำให้เกิดปัญหาได้
Kevin Cathcart

2
ไม่ถูกต้องเป็น RFC 2606 กล่าวถึง: The ".localhost" TLD has traditionally been statically defined in host DNS implementations as having an A record pointing to the loop back IP address and is reserved for such use.หมายเหตุการใช้TLDและทราบว่ามีการกำหนดแบบดั้งเดิม อันที่จริงping localhost.งานที่ยืนยันว่าอย่างน้อยก็เป็นจริงในบริบทของคำถามนี้ ประโยคสุดท้ายของคุณไม่ใช่สิ่งที่ RFC กล่าวโปรดอ้างอิงถ้ามัน "ป้องกันไม่ให้กลายเป็น TLD" เพราะสิ่งที่มันบอกว่ามันเป็น TLD แบบดั้งเดิม มิฉะนั้นพวกเขาจะไม่อ้างถึงthe .localhost TLD
Tamara Wijsman

ฉันแข็งแกร่งเกินไป localhostสามารถเป็น TLD หากเซิร์ฟเวอร์ DNS ที่แท้จริงตอบสนอง แต่โดยทั่วไปแล้ว localhost จะถูกกำหนดเป็นชื่อโฮสต์ใน / etc / hosts ซึ่งชื่อโฮสต์จะถูกค้นหาก่อนที่จะพยายามแก้ไขผ่าน DNS เป็นเช่นนี้dig localhostมักจะไม่ได้กลับมา "เป็น" บันทึก 127.0.0.1 หรือบันทึก AAAA สำหรับ :: 1 นั่นหมายความว่า RFC ผิดพลาดเมื่อมีการแจ้งtraditionally been statically defined in host DNS implementationsแต่จะได้รับคืนโดยบริการค้นหาชื่อของระบบซึ่งไม่ได้ใช้ DNS เสมอไป
Kevin Cathcart

@KevinCathcart: เราอยู่ในคำถาม Windows ที่นี่และรุ่น Windows ระบุว่า DNS ทำด้วยตัวเอง nslookupจะส่งกลับระเบียน ดังนั้น YMMV ...
Tamara Wijsman

1
@KevinCathcart digส่งคืนระเบียน A, AAAA และ NS ของฉันlocalhostรวมถึงระเบียนผู้มีอำนาจสำหรับ:localhost. IN NS localhost.
KutuluMike

20

ติดต่อย้อนกลับที่มีอยู่เป็นอิสระของอินเตอร์เฟซอีเธอร์เน็ต (s)

แม้จะไม่มีความซับซ้อนของIPv6คุณก็มีที่อยู่สองแห่งที่แตกต่างกัน

ที่อยู่IPv4 แบบวนลูป: 127.0.0.1
ที่อยู่ IPv4 ของอินเทอร์เฟซ Ethernet ของคุณ: 192.168.0.10

อินเทอร์เฟซแบบวนรอบอาจอยู่ในเลเยอร์ซอฟต์แวร์ที่แตกต่างกันมากขึ้นจากระยะไกลจากฮาร์ดแวร์จริง ฉันสงสัยว่ามันขึ้นอยู่กับวิธีใดก็ตามในไดรเวอร์อินเตอร์เฟส Ethernet เฉพาะของคุณ


11

Localhost และที่อยู่ IP ของคุณไม่เหมือนกัน

localhost เป็นซอฟต์แวร์พิเศษเฉพาะที่อยู่ IP ที่เชื่อมโยงกับระบบของคุณ Localhost หรือ 127.0.0.1 เป็นที่อยู่ย้อนกลับ มันชี้ไปที่ระบบของคุณเสมอและสามารถเข้าถึงได้จากคอมพิวเตอร์ของคุณเท่านั้น การจัดเส้นทางนี้เกิดขึ้นในระดับระบบปฏิบัติการและแน่นอนไม่เคยออกจาก NIC ... ดังนั้นจึงไม่มีโอกาสที่จะได้รับผลกระทบจากเครือข่าย ....

การ Ping ที่อยู่ IP ของคุณคล้ายกัน แต่อาจเกี่ยวข้องกับเครือข่ายสแต็คทั้งหมดเนื่องจากต้องตรวจสอบว่าเป็นที่อยู่ IP ของคุณและกำหนดเส้นทางอย่างถูกต้อง ...

ผลควรเหมือนกัน แต่อาจมีความแตกต่างได้

ตัวอย่างเช่นถอดสายเคเบิลเครือข่ายของคุณ Ping ที่อยู่ IP คงที่ของคุณ คุณอาจไม่มีเส้นทางไปยังโฮสต์หรือข้อผิดพลาดอื่น ๆ ตอนนี้ ping localhost หรือ 127.0.0.1 และมันจะทำงาน


ดังนั้น ping localhost นั้นไร้ประโยชน์อย่างสมบูรณ์ใช่ไหม ฉันหมายถึงถ้าฉันต้องการทดสอบส่วนต่อประสานของฉัน ....
Diogo

4
@DiogoRocha ถูกต้อง ping localhost ไม่ได้สัมผัสกับฮาร์ดแวร์เลย Heck ping 192.168.0.10 อาจไม่ให้ข้อมูลที่เชื่อถือได้เช่นกันหากไดรเวอร์การ์ดเครือข่ายสกัดกั้นคำขอที่ได้รับจากตัวเอง
Scott Chamberlain

@DiogoRocha คำศัพท์ของคุณปิดอยู่ 127.0.0.1 เป็นอินเตอร์เฟส แต่เป็นเสมือน
barlop

@Diogo ไม่มาก Localhost ช่วยให้คุณสามารถทดสอบพฤติกรรมเครือข่ายของแอปพลิเคชันหรือตรวจสอบว่าสแต็กเครือข่ายใช้งานได้ .... แต่ไม่ได้ทดสอบไดรเวอร์ ตัวอย่างเช่นหากคุณมี NIC Driver ที่ไม่ดี localhost อาจสามารถช่วยพิสูจน์ว่าเป็นไดรเวอร์ของ nic ระยะทางของคุณจะแตกต่างกันอย่างแน่นอน !!
Benjamin Schollnick

6

ฉันรู้จากภาพหน้าจอคำถามนี้ไม่ได้เกี่ยวกับ Linux แต่อาจทำให้มีประโยชน์ "case in point"

บนระบบปฏิบัติการนั้นถ้าคุณ ping หนึ่งในที่อยู่ของการ์ดเชื่อมต่อภายในเครื่องมันจะถูกแปลเป็นอุปกรณ์ลูปแบ็ค (แฮ็กกรณีพิเศษ) ซึ่งหมายความว่าแพ็คเก็ตจริงไปที่อุปกรณ์วนรอบ (ซึ่งมีผลกระทบทั้งหมดที่คุณอาจคิดว่า: ตัวอย่างเช่นจากมุมมองของไฟร์วอลล์ไฟร์วอลล์แพ็คเก็ตเหล่านั้นกำลังเข้ามาในอินเทอร์เฟซย้อนกลับและจะจับคู่กฎสำหรับอินเทอร์เฟซนั้น)

อุปกรณ์ที่กำหนด IP จะไม่เห็นแพ็กเก็ต (นี่เป็นสิ่งที่ดีเพราะมันจะไม่ทำสิ่งที่ถูกต้องกับแพ็คเก็ตเหล่านั้น: มันจะต้องการส่งหน่อออก)

อย่างไรก็ตามหากอินเทอร์เฟซที่เก็บ IP นั้นควรจะลงไปแสดงว่าคุณขาดการเชื่อมต่อนั้น การแมปกับลูปแบ็คจะหยุดทำงาน

ดังนั้นในคำอื่น ๆ มันเป็นการออกแบบที่ใช้การได้เพื่อพิจารณาว่าที่อยู่ในพื้นที่เหล่านั้นเป็นชื่อแทนสำหรับอุปกรณ์ลูปแบ็ค

รหัสอ้างอิง:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2623

ip_route_output_slowลองดูที่ฟังก์ชั่น สายนี้fib_lookupและถ้าฟังก์ชั่นนี้ส่งกลับรหัสRTN_LOCAL, dev_outถูกเขียนใหม่เพื่อย้อนกลับ:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2769


4

ดูเหมือนว่านามแฝง "Localhost" จะถูกแก้ไขเป็นลูปแบ็ค IPv6 และเมื่อคุณใช้ที่อยู่ IPv4 อย่างชัดเจนจะไม่ปรากฏ


6
ระบบปฏิบัติการดูเหมือนจะไม่เห็นด้วยกับคุณ
EBGreen

6
ไม่เป็นไรมันถูกตั้งค่าให้คอมพิวเตอร์เห็นได้ชัด localhost กำลังชนลูปแบ็ค ipv6
Rob

1
@DiogoRocha ไม่มีที่อยู่ดังกล่าว :: 1 ใน IPV4 world 127.0.0.1 เป็น IP ที่สงวนไว้สำหรับลูปแบ็คที่นั่น :: 1 อย่างไรก็ตามมีอยู่สำหรับ IPV6 และเช่น 127.0.0.1 ถูกสงวนไว้สำหรับการวนรอบ IPV6
แอนดี้

4
คำถามนี้จะตอบคำถามได้อย่างไร คุณแค่ระบุสิ่งที่ชัดเจน
Tamara Wijsman

4
โปรดอธิบายอย่างละเอียดในคำตอบของคุณนี่ไม่ได้อธิบายอะไรเลยจริงๆ
Ivo Flipse

1

@ebwhite ถูกต้องเกี่ยวกับอะไร

ตอนนี้สาเหตุที่คุณอาจตั้งค่าTeredo (ฉันไม่สามารถบอกได้จากภาพหน้าจอของคุณวางลงในไฟล์ข้อความและวางผลลัพธ์ทั้งหมดจะดีกว่า) - พฤติกรรมของ localhost ที่IPv6สอดคล้องกับระบบของฉันIPv4เครือข่ายเท่านั้นที่มีการติดตั้งเพรียง แต่ระบบโดยไม่ได้ทำงานตามที่คุณคาดว่าจะได้รับเมื่อคุณปิง127.0.0.1 localhostฉันได้ทำการทดสอบกับ Windows XP และต้องการดูว่าระบบ Windows 7 ของฉันทำอะไรและอัพเดตคำถาม

โดยทั่วไประบบเริ่มต้นกับ IPv6 ถ้า IPv6 สามารถใช้ได้เพื่อให้ระบบของคุณทำงานตามที่ควรโดยการออกแบบ


เขาไม่ได้รับการถ่ายโอน Bytes หรือ TTL ด้วยหนึ่งในภาพหน้าจอ IPv6 นั้นคืออะไร? ทำไม?
barlop

ยังสอดคล้องกับสิ่งที่ฉันเห็นใน windows 7 - ฉันเดาว่าเวลาเดินทางไปกลับนั้นเล็กน้อย
Journeyman Geek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.