ทำไมการส่ง Ping แบบ 192.168.072 (เพียง 2 จุด) ส่งคืนการตอบกลับจาก 192.168.0.58


379

ฉันพลาดจุดที่อยู่ IP ผิดพลาดและพิมพ์ลง192.168.072ไป
ด้วยความประหลาดใจของฉันฉันเชื่อมต่อกับเครื่องที่192.168.0.58

ถ้าผม ping ฉันได้รับการตอบสนองจาก192.168.072192.168.0.58

ทำไมนี้


ฉันใช้พีซี Windows บนโดเมน Windows


หากฉัน ping 192.168.72ฉันได้รับการตอบสนองจาก192.168.0.72ดังนั้นจึงดูเหมือนว่า0ใน072(ในความผิดพลาดเดิมของฉัน) มีความสำคัญ


คำถามนี้เป็นคำถามที่ผู้ใช้ซูเปอร์ของสัปดาห์
อ่านบล็อกสำหรับรายละเอียดเพิ่มเติมหรือมีส่วนร่วมในบล็อกด้วยตัวคุณเอง



2
ที่น่าสนใจสิ่งเดียวกันเกิดขึ้นบน Linux: ping 192.168.072พิมพ์PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[... ]
หอยทากเชิงกล

9
สิ่งที่สุ่มมากขึ้นคือคุณมีเครื่องจักรที่192.168.0.58จะรับการตอบกลับ อัตราต่อรองของสิ่งนั้นคืออะไร?
James Mertz

3
@ KronoS มันไม่แปลกจริง ๆ ถ้าคุณอยู่ในโรงเรียนหรือเครือข่าย บริษัท เซิร์ฟเวอร์ DHCP บางตัวจะให้ที่อยู่เพิ่มมากขึ้นและส่วนใหญ่จะใช้
Taum

5
192.168.0.58หมดเวลาแล้วสำหรับฉัน .. การร้องขอการ ping ทั้งหมดทำให้เซิร์ฟเวอร์ล้มลงได้หรือไม่!
iamserious

คำตอบ:


570

ทุกคนกำลังยุ่งกับ RFCs คลาส IP และเช่นนั้น เพียงเรียกใช้การทดสอบสองสามครั้งเพื่อดูว่าpingคำสั่งแยกวิเคราะห์อินพุต IP โดยผู้ใช้อย่างไร

> ping 1
Pinging 0.0.0.1 with 32 bytes of data:

> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:

> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:

> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:

> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.

> ping 255
Pinging 0.0.0.255 with 32 bytes of data:

> ping 256
Pinging 0.0.1.0 with 32 bytes of data:

อย่างที่คุณเห็นpingคำสั่ง (ใน Windows) อนุญาตให้คุณใช้รูปแบบที่อยู่ IP แบบต่างๆ ที่อยู่ IPv4 สามารถแบ่งออกเป็นสี่ส่วน (“ dotted-quad”) ดังนี้: A.B.C.D, และpingคำสั่งอนุญาตให้คุณออกไปบางส่วน, กรอกค่าเริ่มต้น0ดังนี้:

1 part  (ping A)       : 0.0.0.A
2 parts (ping A.B)     : A.0.0.B
3 parts (ping A.B.C)   : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D

หากคุณจัดหาชิ้นส่วนเพียงชิ้นเดียวหากอยู่ต่ำกว่า 255 (สูงสุดสำหรับ octet) จะถือว่าเป็น octet ดังกล่าว แต่ถ้ามากกว่า 255 ก็จะถูกแปลงและรีดลงในฟิลด์ถัดไป (เช่นmod 256)

มีบางกรณีที่ขอบเช่นการให้มากกว่าสี่ส่วนดูเหมือนจะใช้งานไม่ได้ (เช่นgoogle.comIP ของการส่งPing จะไม่ทำงาน0.74.125.226.4หรืออย่างใดอย่างหนึ่ง74.125.226.4.0)

คุณยังสามารถใช้รูปแบบเลขฐานสิบหกทั้งในรูปแบบจุดและรูปแบบแบน แต่ต้องจัดรูปแบบโดยรอดำเนินการล่วงหน้า0xไปยังแต่ละ octet


ดังนั้นมีหลายวิธีในการแสดงที่อยู่ IP (IPv4) คุณสามารถใช้รูปแบบแบบแบนหรือแบบจุด (หรือแบบจุดสามจุดแบบจุดคู่หรือแบบจุดเดียว) และสำหรับแต่ละรูปแบบคุณสามารถใช้ทศนิยม (ฐานแปดและฐานสิบหก) ตัวอย่างเช่นคุณสามารถ ping ได้google.comหลายวิธีดังนี้:

  • google.com  (ชื่อโดเมน)
  • 74.125.226.4  (ทศนิยมแบบจุด)
  • 1249763844  (ทศนิยมทศนิยม)
  • 0112.0175.0342.0004  (จุดแปดด้าน)
  • 011237361004  (ฐานแปดแบน)
  • 0x4A.0x7D.0xE2.0x04  (ฐานสิบหกประ)
  • 0x4A7DE204  (ฐานสิบหกแบน)
  • 74.0175.0xe2.4  (ಠ_ಠ)

(ขอบคุณพระเจ้าที่ไม่ได้เพิ่มการสนับสนุนรูปแบบสัญกรณ์!)


ใบสมัคร :

ในกรณีของคุณการส่ง Ping 192.168.072จะใช้รูปแบบที่สามในตารางด้านบน ( A.B.0.C) ดังนั้นคุณจึงส่ง Ping จริง192.168.0.072ๆ เพิ่มเติมเนื่องจากคุณมีศูนย์นำในส่วนสุดท้ายจะถือว่าเป็นฐานแปดซึ่งในทศนิยมเป็น 58

แก้ไขปริศนาแล้ว


โปรดทราบว่าในขณะที่pingคำสั่งWindows อนุญาตให้ใช้รูปแบบที่หลากหลายสำหรับอินพุตและตีความรูปแบบที่ไม่ได้มาตรฐานในรูปแบบที่เห็น แต่ก็ไม่ได้แปลว่าคุณสามารถใช้รูปแบบดังกล่าวได้ทุกที่ บางโปรแกรมอาจบังคับให้คุณให้ทั้งสี่ส่วนของจุดประสี่ส่วนอื่น ๆ อาจไม่อนุญาตให้มีการผสมและจับคู่ทศนิยมและฐานแปดและอื่น ๆ

นอกจากนี้ที่อยู่ IPv6 ยังทำให้ตรรกะการแยกวิเคราะห์และการยอมรับรูปแบบอินพุตมีความซับซ้อนยิ่งขึ้น


ภาคผนวก :

syss ชี้ให้เห็นว่าถ้าคุณใช้อักขระที่ไม่ถูกต้องในหนึ่งในตัวเลข (เช่น, 8หรือ9เมื่อใช้ฐานแปด, gในโหมด hex, ฯลฯ ) แล้วpingฉลาดพอที่จะรับรู้และตีความมันเป็นสตริง (-al? -ic?) URL แทนที่จะเป็นที่อยู่ IP ตัวเลข

(ในฐานะคนที่มีโป่งพองและหัวใจวายจำนวนมากพยายามเขียนรหัส "ง่าย ๆ " ที่คาดคะเนเพื่อรองรับจำนวนการเปลี่ยนลำดับของค่าข้อมูลที่อธิบายอย่างทวีคูณฉันขอขอบคุณที่มัน - ดูเหมือนจะ - ประมวลผลรูปแบบอินพุตทั้งหมดอย่างถูกต้อง กรณีอย่างน้อย 3 1 +3 2 +3 3 +3 4 = 120ชุดรูปแบบ)

ดังนั้นในขณะที่การระบุ010.020.030.040ความประสงค์ปิง8.16.24.32ตามที่คาดไว้ผ่าน010.020.030.080ไปpingจะได้รับการปฏิบัติเช่น URL แทนการอยู่เหมือน IP foo.bar.baz.comซึ่งอาจ ( แต่เศร้าไม่ได้) ที่มีอยู่ ในคำอื่น ๆ ก็พยายามที่จะ ping โดเมนย่อย010บนโดเมนย่อย020บนโดเมนที่โดเมนระดับบนสุด030 080แต่เนื่องจาก080ไม่ได้เป็น TLD ที่ถูกต้อง (เช่น.com, .netและเพื่อนของพวกเขา) เชื่อมต่อล้มเหลวที่เหมาะสมในขั้นตอนแรก

สิ่งเดียวกันนี้เกิดขึ้นกับ090.010.010.010ที่อักขระไม่ถูกต้องอยู่ใน octet ที่แตกต่างกัน เช่นเดียวกัน0xf.0xf.0xf.0xfส่ง Ping 15.15.15.15แต่0xh1.0x1.0xg0.0fล้มเหลว

โอ้ฉันเดาว่านั่นคือสิ่งที่คุณจะไม่สามารถพูดได้หลายภาษา

อาจง่ายกว่าและปลอดภัยกว่าเพื่อให้แน่ใจว่าใช้ที่อยู่ 4 –dotted-quad (“ 40q” หรือไม่“ quaddy-quad” หรือ“ cutie-q”) เสมอ

ดังนั้นออกไปและเรียนรู้ฐานบางหมายเลข คุณจะสามารถแสดงให้เห็นและเป็นชีวิตของบุคคลและที่พวกเขากล่าวว่ามี 10 ประเภทของผู้คนที่รู้ไบนารีและผู้ที่ไม่ได้

อย่าคิดแม้แต่กับที่อยู่ IPv6 ฉันคิดว่าพวกเขาเป็นหนึ่งใน 111 แมวน้ำ !!!


39
overcomplicating? การทดลองมีประโยชน์มากและในกรณีนี้ให้คำตอบที่ดี แต่ถ้าไม่มีทฤษฎีหรือเอกสารหรือมาตรฐานคุณอาจพลาดปัจจัยสำคัญและไม่ทราบ หรือคุณอาจพิจารณาว่ารุ่นใดรุ่นหนึ่งทำงานและผิดประมาณ 90% ของการนำไปใช้งานที่นั่น หรือคุณอาจมีกฎที่อธิบายผลการทดสอบของคุณ แต่มีความซับซ้อนมากกว่ากฎที่ตั้งใจไว้ ในกรณีนี้ฉันคิดว่ากฎของเอกสาร (สำหรับinet_aton()) นั้นง่ายกว่าในแง่เดียว - ไม่มีเงื่อนไขสำหรับ "ต่ำกว่า / 255"
LarsH

71
เฮ้ดูสิ! ส่วน "วิทยาศาสตร์" ของวิทยาศาสตร์คอมพิวเตอร์ทำให้ปรากฏตัว! (ตั้งสมมติฐาน, ทดลอง, ตรวจสอบ)
Izkata

13
@ LarsH นั่นคือประเด็นของฉันแม้ว่าpingคำสั่ง (อย่างน้อยใน Windows) ก็เหมือนกับโปรแกรมของ Microsoft หลายโปรแกรม (โดยเฉพาะอย่างยิ่งเรื่องฉาวโฉ่) IE มันพยายามให้อภัยเกินไปและเอาทุกอย่างที่คุณโยนไปและพยายามตีความมัน ใช่มีเอกสารอย่างเป็นทางการเกี่ยวกับรูปแบบที่อยู่ IP แต่นี่ไม่ใช่คำถามเกี่ยวกับ ISO และ RFCs เป็นประโยชน์ฉันทำอะไรและมันเป็นคำถามแปลก ๆที่สามารถตอบได้โดยไม่ต้องหันไปใช้ ข้อกำหนดทางเทคนิค) - แม้ว่าการเชื่อมโยงไปยังพวกเขาในกรณีที่ OP ต้องการอ่านพวกเขาก็ดีเช่นกัน
Synetech

6
0 chmodนำหน้าแยกฐานแปดควรจะถูกทอดทิ้งอย่างสมบูรณ์ประหยัดสำหรับ แค่นั้นแหละ. นั่นเป็นข้อยกเว้นเพียงอย่างเดียวสำหรับการอนุญาตเลขฐานแปด ระยะเวลา
James Dunne

6
มันมีประโยชน์สำหรับการแปลง RGB HEX เป็น DEC lol ~C:\>ping 0xffffcc Pinging 0.255.255.204 with 32 bytes of data:
สัน

147

มีสองเหตุผลสำหรับสิ่งนี้:

ก่อนอื่นคำนำหน้า '0' จะระบุหมายเลขฐานแปด ตั้งแต่ตุลาคม (072) = ธันวาคม (58), 192.168.072 = 192.168.58

ประการที่สองที่สองไปสุดท้าย 0 สามารถลดลงจากที่อยู่ IP เป็นชวเลข 127.0.1 ตีความเป็น 127.0.0.1 และในกรณีของคุณ 192.168.58 ถูกตีความว่าเป็น 192.168.0.58


7
มันไม่ได้จัดกลุ่มเป็นศูนย์ ที่จริงแล้วถือว่าแต่ละจุดเป็นตัวคั่นที่สอดคล้องกับขอบเขตไบต์ต่อไป ดังนั้นที่อยู่ IP 2130706433 และ 127.0.0.1 จึงเป็นที่อยู่เดียวกัน
Serge

2
อย่างแม่นยำมากขึ้นมันเป็นสัญกรณ์ประสี่เหลี่ยมในกรณีของที่อยู่ IP
Guillaume86

4
ศูนย์ชั้นนำที่มีชื่อเสียงโด่งดังขึ้นอีกครั้ง!
Luc M

2
ตอนนี้นี่คือคำตอบที่แท้จริง!
l

2
คำตอบนั้นไม่ถูกต้องและทำให้เข้าใจผิด การดร็อป 0 ใน 1.0.2.3 (1.2.3) ให้ที่อยู่ IP อื่น (1.2.0.3)
sch

101

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

เราอาจเดาได้อย่างไร้เดียงสาว่าหากตัวเลขสี่ตัวใดขาดหายไปตัวแยกวิเคราะห์จะเพิ่มไบต์ที่เต็มไปด้วยเลขศูนย์ไปยังจุดสิ้นสุด (หรือจุดเริ่มต้น) ของลำดับของไบต์ แต่สิ่งนี้ไม่ตรงกับพฤติกรรมที่ OP รายงาน: 192.168.072 ได้รับการแยกวิเคราะห์เป็น 192.168 0 .58 ไม่ใช่ 192.168.58 0หรือ0 .192.168.58

เห็นได้ชัดว่าปิง Windows และ Linux (เวอร์ชันที่คุณลองใช้และรุ่นที่ฉันลองใช้) ใช้สิ่งที่เทียบเท่ากับ inet_aton () เพื่อแยกอาร์กิวเมนต์ IP address หน้าคนสำหรับ inet_aton ()พูดว่า:

The address supplied in cp can have one of the following forms:

 a.b.c.d   Each of the four numeric parts specifies a byte of the address; the
           bytes are assigned in left-to-right order to produce the binary
           address.

 a.b.c     Parts a and b specify the first two bytes of the binary address.
           Part c is interpreted as a 16-bit value that defines the rightmost
           two bytes of the binary address.  This notation is suitable for
           specifying (outmoded) Class B network addresses.

 a.b       Part a specifies the first byte of the binary address.  Part b is
           interpreted as a 24-bit value that defines the rightmost three bytes
           of the binary address.  This notation is suitable for specifying
           (outmoded) Class C network addresses.

 a         The value a is interpreted as a 32-bit value that is stored directly
            into the binary address without any byte rearrangement.

จึงมีคุณมีมัน ... 192.168.072เหมาะกับรูปแบบ abc ดังนั้น072(หลังจากแยกเป็นตัวเลขฐานแปด) ถูกตีความเป็นค่า 16 บิตที่กำหนดขวาสุด 2 0.58ไบต์ที่อยู่ไบนารีเทียบเท่ากับ

กฎข้างต้นเทียบเท่ากับการบอกว่าหากมีตัวเลขสี่ตัวใดหายไปจำเป็นต้องเติมไบต์ที่เต็มไปด้วยศูนย์ที่ต้องการทันทีก่อนที่ตัวเลขสุดท้ายที่กำหนด ... ไม่ใช่ที่สิ้นสุดหรือที่จุดเริ่มต้นของสตริงไบต์ (การแสดงด้วยวิธีนี้จะทำงานหากจำนวนสุดท้ายที่กำหนดน้อยกว่า 256)

โปรดทราบว่า ping รุ่นใหม่อาจไม่อนุญาตให้ใช้ชวเลขประเภทนี้หรือการตีความแบบฐานแปด รหัสที่มา 2010 สำหรับ iputils (รวมทั้งปิง) ที่ผมพบว่าใช้ inet_pton () มากกว่า inet_aton () เพื่อแยกอาร์กิวเมนต์ที่อยู่ IP หน้าคนสำหรับ inet_pton ()พูดว่า:

ต่างจาก inet_aton (3) และ inet_addr (3) inet_pton () รองรับที่อยู่ IPv6 ในทางกลับกัน inet_pton () ยอมรับเฉพาะที่อยู่ IPv4 ในรูปแบบเลขฐานสิบในขณะที่ inet_aton (3) และ inet_addr (3) อนุญาตให้ใช้รูปแบบตัวเลขและจุดทั่วไป (รูปแบบเลขฐานสิบหกและฐานแปด) ไม่จำเป็นต้องเขียนทั้งสี่ไบท์อย่างชัดเจน)


12
นี่คือคำตอบที่ดีที่สุด IMHO
Josh

บน Windows คุณกำลังมองหาinet_addrใน Winsock
user7116

24

คุณต้องพิจารณาด้วยว่า IP สามารถแสดงเป็นจำนวนเต็มที่รวมเข้าด้วยกันอย่างมีนัยสำคัญต่อตำแหน่งของพวกเขา

192.168.0.58 is :
  192 * 256^3
+ 168 * 256^2
+   0 * 256^1
+  58 * 256^0

นี่คือสิ่งดีๆ:

192.168.58 จะเป็น 192.168.0.58 เพราะ

    0 * 256^1 
+  58 * 256^0 
=  58

192.11010106 ก็จะเป็น 192.168.0.58 เพราะ

  168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 11010106

3232235578 ก็จะเป็น 192.168.0.58 เพราะ

  192 * 256^3 
+ 168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 3232235578

1
"192.168.56 จะเป็น 192.168.0.56 เพราะ 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58" คุณแน่ใจหรือไม่ คุณคาดว่าจะมีการคูณ 168 ด้วย 256 ^ 1 ในกรณีแรกและอีก 256 ^ 2 ในกรณีที่สอง ในทำนองเดียวกัน 192 จะถูกคูณด้วย 256 ^ 2 และ 256 ^ 3 ดังนั้น 192.168.56 สามารถ = 192.168.0.56 เท่านั้นหากมีกฎเพิ่มเติมในสถานที่เช่นการลดลงของศูนย์
LarsH

@ LarsH ฉันคิดว่าสิ่งที่ถูกกล่าวถึงในที่นี้คือมันใช้จากซ้ายไปขวาไม่เหมือนกับการนับ "ปกติ" ที่เรายึดทุกอย่างจากที่ 1 ดังนั้นจุดแรกทำให้อะไรก็ตามที่อยู่ทางซ้ายของมันถูกคูณด้วย 256 ^ 3, ที่สองด้วย 256 ^ 2, ที่สามด้วย 256 ถ้าไม่มีจุดทางด้านซ้ายของมันแล้วมันจะถูกเพิ่มโดยไม่มีการคูณด้วย 256 ^ n 1.2.3 ดังนั้น (1.2.3.0) จะแตกต่างจาก 1.2.3 (1.2.0.3) ถ้าฉันเข้าใจถูกต้อง
iX3

@ iX3: ถ้าเป็นเช่นนั้น "192.168.56 จะเป็น 192.168.0.56" จะไม่ถูกต้องเพราะในกรณีแรก 56 จะถูกคูณด้วย 256 ^ 1 ในขณะที่ในกรณีที่สอง 56 จะถูกคูณเท่านั้น y 256 ^ 0 และ 192.168.072 ของ OP จะถูกตีความเป็น 192.168.58.0 แทนที่จะเป็น 192.168.0.58
LarsH

สิ่งที่ทำให้เข้าใจผิดเล็กน้อยคือความจริงที่อยู่มี 0 มีหลักที่ 3 พิจารณาที่อยู่นี้ 192.168.1.56 รูปแบบ 3 หลักจะเป็น 192.168.312 เนื่องจาก 1 * 256 ^ 1 + 56 * 256 ^ 0 คือ 312
vesquam

1
เฉพาะจุดที่ใช้เพื่อกำหนดตัวเลขที่ควรคูณด้วยกำลัง 256 ตัวแยกวิเคราะห์ค้นหาจุดแรกและคูณจำนวนก่อนหน้านั้นด้วย 256 ^ 3 ทำซ้ำสำหรับจุดที่ 2 และ 3 แต่คูณด้วย 256 ^ 2 และ 256 ^ 1 ตามลำดับ จากนั้นจะรวมผลลัพธ์ทั้งหมดเข้าด้วยกัน (โดยนัยบางอย่างอาจรวมผลรวมไว้แทน แต่ผลลัพธ์จะเหมือนกัน) หากจุดใด ๆ เหล่านั้นหายไปมันจะไม่ทำการคูณและเพียงเพิ่มจำนวนสุดท้ายลงในผลรวมการวิ่ง นั่นเป็นสาเหตุที่1.2.3.ทำให้เกิดข้อผิดพลาดเนื่องจาก parser ไม่สามารถค้นหาหมายเลขสุดท้ายที่จะเพิ่มลงในผลรวม
Justin ᚅᚔᚈᚄᚒᚔ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.