น่าเสียดายที่สิ่งนี้แตกต่างกันไปตามระบบปฏิบัติการที่คุณใช้
บน Microsoft Windows ผูกซ็อกเก็ตเพื่อ::
ผูกกับพอร์ต IPv6 เท่านั้น ดังนั้นเพื่อฟังบนอยู่ทั้งหมดทั้ง IPv4 และ IPv6 คุณจะต้องผูกไว้กับเช่นเดียวกับ0.0.0.0
::
สารสกัดต่อไปนี้มาจากกล่อง Vista:
C:\>netstat -an | find "445"
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP [::]:445 [::]:0 LISTENING
ตัวอย่างที่ฉันให้คือพอร์ต 445 ใช้สำหรับการรับส่งข้อมูล SMB เมื่อไม่ได้ใช้ NetBIOS ในขณะที่คุณสามารถดูจะมีผลผูกพันกับทั้งสอง0.0.0.0
และ::
เพื่อให้ตามลำดับทั้ง IPv4 และ IPv6 ลูกค้าทำงาน
บน Linux ::
นั้นรวมถึงที่อยู่ IPv4 ที่ใช้งานร่วมกันได้ตามที่คุณคาดเดาได้อย่างถูกต้องดังนั้นการรวมเข้า0.0.0.0
ด้วยกันจึงไม่จำเป็น ฉันเขียนโปรแกรม Python อย่างง่ายที่ผูกกับAF_INET6
ซ็อกเก็ต::
เท่านั้น แม้ว่าฉันจะไม่ได้ผูกกับAF_INET
ซ็อกเก็ต (IPv4) แต่ก็ยังยอมรับการเชื่อมต่อจากไคลเอนต์ IPv4 ถ้าบอกว่าเชื่อมต่อกับมันก็จะแสดงขึ้นเป็นเชื่อมต่อจาก10.1.1.3
::ffff:10.1.1.3
ยกเว้นว่ามันจะมีขนดก ข้อมูลข้างต้นไม่ได้ใช้กับ Linux หาก/proc/sys/net/ipv6/bindv6only
ตั้งค่าไว้1
ซึ่งในกรณีนี้ลักษณะการทำงานเหมือนกับ Windows ที่มีผลผูกพันกับ::
จะรับฟังการร้องขอ IPv6 เท่านั้น หากคุณต้องการฟังคำขอ IPv4 ด้วยคุณจะต้องสร้างAF_INET
ซ็อกเก็ตและฟัง0.0.0.0
เช่นกัน โชคดีที่ค่าเริ่มต้นสำหรับbindv6only
คือ0
มีโอกาสน้อยมากที่คุณจะต้องจัดการกับเรื่องนี้ (ยกเว้นถ้าคุณใช้ Debian ซึ่งเป็นค่าเริ่มต้นจริง ๆbindv6only = 1
)
ทั้งหมดนี้มีประโยชน์ที่จะรู้ในการตรวจสอบเพื่อดูว่าบริการรองรับ IPv6 หรือไม่และเปิดใช้งาน IPv4 ด้วยหรือไม่ นี่คือเซิร์ฟเวอร์ SSH ของฉัน:
$ netstat -64ln | grep 22
tcp6 0 0 :::22 :::* LISTEN
อย่างที่คุณเห็น SSH นั้นรับฟังเฉพาะ::
พอร์ต 22 อย่างไรก็ตามไม่เพียงแค่ฟังไคลเอนต์ IPv6 เท่านั้น แต่ทำงานได้ดีจากไคลเอนต์ IPv4 เนื่องจากการเข้ากันได้กับ IPv4 เพื่อพิสูจน์สิ่งนี้หากคุณดูที่:
$ cat /proc/sys/net/ipv6/bindv6only
0
bindv6only
ถูกปิดใช้งาน (ค่าเริ่มต้น) หากถูกตั้งค่าไว้1
ฉันจะต้องสนับสนุนให้ SSH ฟัง0.0.0.0
เช่นกัน (หรือแทน)
ขออภัยที่ไม่มีข้อมูลในด้าน Mac OS X ฉันเคยใช้มันในอดีต แต่ฉันชอบความสวยงามของ GNOME ดังนั้นฉันจึงไม่ได้ใช้มันในเวลานาน อย่างไรก็ตามฉันคิดว่าพฤติกรรมนี้เหมือนกับ Linux
หวังว่านี่จะช่วยได้