ความยาวสูงสุดของการแสดงข้อความของที่อยู่ IPv6?


430

ฉันต้องการจัดเก็บข้อมูลที่ส่งคืนโดย$_SERVER["REMOTE_ADDR"]ใน PHP ลงในฟิลด์ DB เป็นงานที่ค่อนข้างง่ายจริงๆ ปัญหาคือว่าฉันไม่สามารถหาข้อมูลที่ถูกต้องเกี่ยวกับความยาวสูงสุดของแสดงเกี่ยวกับใจของที่อยู่ IPv6 $_SERVER["REMOTE_ADDR"]ซึ่งเป็นสิ่งที่เว็บเซิร์ฟเวอร์ให้ผ่าน

ฉันไม่ได้สนใจในการแปลงแทนต้นฉบับเดิมเข้าไปใน 128 บิตที่อยู่มักจะมีการเข้ารหัสในฉันเพียงแค่ต้องการทราบว่าจำนวนตัวอักษรสูงสุดที่มีความจำเป็นในการจัดเก็บอยู่ IPv6 ใด ๆ $_SERVER["REMOTE_ADDR"]กลับโดย


6
ดัชนีโซนเป็นอย่างไร?
Robert Tupelo-Schneck

5
#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48)

ที่มา: lxr.free-electrons.com/source/include/linux/inet.h

1
คำถามstackoverflow.com/questions/1076714/…มีคำตอบที่คล้ายกัน แต่มีประโยชน์
Edward

คำตอบ:


615

45 ตัวอักษร

คุณอาจคาดหวังที่อยู่

0000:0000:0000:0000:0000:0000:0000:0000

8 * 4 + 7 = 39

8 กลุ่มของตัวเลข 4 หลักโดยมี 7 ตัว:ระหว่างกัน

แต่ถ้าคุณมีที่อยู่ IPv6 ที่แมป IPv4คุณสามารถเขียนสองกลุ่มสุดท้ายในฐาน 10 คั่นด้วย.เช่น [::ffff:192.168.100.228]. เขียนออกมาอย่างสมบูรณ์:

0000:0000:0000:0000:0000:ffff:192.168.100.228

(6 * 4 + 5) + 1 + (4 * 3 + 3) = 29 + 1 + 15 = 45

หมายเหตุนี่คือการประชุมอินพุต / ดิสเพลย์ - มันยังคงเป็นที่อยู่ 128 บิตและสำหรับการจัดเก็บมันน่าจะดีที่สุดที่จะสร้างมาตรฐานในรูปแบบที่คั่นด้วยโคลอนแบบดิบคือ[0000:0000:0000:0000:0000:ffff:c0a8:64e4]ที่อยู่ข้างต้น


245
ไฟล์ส่วนหัวกำหนด INET6_ADDRSTRLEN เป็น 46 ซึ่งเหมาะกับ 45 ตัวอักษรบวกกับโมฆะต่อท้าย
wisnij

6
น่าสังเกตว่าที่อยู่ IPv6 อาจมีขอบเขตขอบเขตstackoverflow.com/questions/5746082/…เช่นคุณได้รับจาก RemoteEndpointMessageProperty.Address
Rory

ไม่ใช่ ipv4 adresses ที่เขียนเช่น :: ffff: 127.0.0.1?
graywolf

52
@FelipeSchenone ความคิดแบบนั้นมันไม่มีประโยชน์ - คิดขนาดและใช้มัน ครั้งเดียวที่คุณต้องการขยายบัฟเฟอร์คือถ้ามันช่วยให้มีการเติมได้ 64 ตัวอักษร แต่ 45 (+1) เป็นวิธีที่ดีที่สุด
gbjbaanb

1
สิ่งนี้คำนึงถึงเปอร์เซ็นต์การลงชื่อเข้าใช้ที่อยู่ ipv6 หรือไม่ อ้างถึง - superuser.com/questions/99746/…
gaurav

85

บน Linux ดูค่าคงที่INET6_ADDRSTRLEN(รวม<arpa/inet.h>ดูman inet_ntop) ในระบบของฉัน (ส่วนหัว "in.h"):

#define INET6_ADDRSTRLEN 46

ตัวละครตัวสุดท้ายคือการยกเลิก NULL อย่างที่ฉันเชื่อดังนั้นความยาวสูงสุดคือ 45 เช่นเดียวกับคำตอบอื่น ๆ


2
48 นี่ฉันเห็นอะไร github.com/torvalds/linux/blob/master/include/linux/inet.h#L50
eis

@ eis อาจเป็นในปี 2013 อาจเพิ่มขึ้นสำหรับการจัดตำแหน่ง struct
Iiridayn

13

ตอบคำถามของฉันเอง:

โดยปกติแล้วที่อยู่ IPv6 จะถูกเขียนเป็นแปดกลุ่มของตัวเลขฐานสิบหกสี่หลักโดยที่แต่ละกลุ่มจะถูกคั่นด้วยโคลอน (:)

นั่นคือสูงสุด 39 ตัวอักษร


7
อย่างไรก็ตามเห็นได้ชัดว่ามีข้อแม้ดูstackoverflow.com/a/7477384/3787376 ("ความยาวสูงสุดสำหรับที่อยู่ IP ของลูกค้า") - อ้างจาก: "สำหรับที่อยู่ IPv6 ที่แมป IPv4 สตริงสามารถมีความยาวได้มากกว่า 39 ตัวอักษร" มันบอกว่า "IPv4-mapped IPv6" คือ 45 ตัวอักษรและอยู่ในรูปแบบ "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190" สูงสุดควรเป็น 45 อักขระ คำตอบที่stackoverflow.com/a/166157/3787376 (คำถามนี้) ก็ดูเหมือนจะแสดงให้เห็นถึงจุดนี้
Edward

6

ฉันคิดว่า @Deepak คำตอบในลิงค์นี้ใกล้กับคำตอบที่ถูกต้องมากขึ้น ความยาวสูงสุดสำหรับที่อยู่ IP ของลูกค้า ขนาดที่ถูกต้องคือ 45 ไม่ใช่ 39 บางครั้งเราพยายามตรวจสอบขนาดเขตข้อมูล แต่ดูเหมือนจะดีกว่าถ้าเราเตรียมขนาดพื้นที่จัดเก็บที่เพียงพอ


4

ตามที่ระบุไว้ที่อยู่ ipv6 มาตรฐานจะมีไม่เกิน 45 ตัวอักษร แต่ที่อยู่ ipv6 ยังสามารถรวม% ตอนจบตามด้วยสตริง "ขอบเขต" หรือ "โซน" ซึ่งไม่มีความยาวคงที่ แต่โดยทั่วไปจะเป็นจำนวนเต็มบวกเล็กน้อยหรืออินเทอร์เฟซเครือข่าย ชื่อดังนั้นในความเป็นจริงมันอาจใหญ่กว่า 45 ตัวอักษร ชื่ออินเทอร์เฟซเครือข่ายมักจะเป็น "eth0", "eth1", "wlan0" ดังนั้นการเลือก 50 เนื่องจากขีด จำกัด น่าจะดีพอ


3
จริง แต่นี่เป็นเพียงที่อยู่ link-local และคุณจะไม่เห็นสิ่งใดเลยเมื่อเว็บไซต์ของคุณทำงานบนอินเทอร์เน็ต (และหวังว่าจะไม่เกิดขึ้นแม้ในขณะที่กำลังพัฒนา)
Michael Hampton

1

ระวังส่วนหัวบางอย่างเช่นHTTP_X_FORWARDED_FORที่ดูเหมือนจะมีที่อยู่ IP เดียว พวกเขาอาจมีหลายที่อยู่ (ห่วงโซ่ของผู้รับมอบฉันทะฉันถือว่า)

พวกเขาจะปรากฏว่าคั่นด้วยเครื่องหมายจุลภาค - และอาจมีความยาวมากกว่า 45 ตัวอักษรดังนั้นโปรดตรวจสอบก่อนเก็บไว้ใน DB


3
A ขัดแย้งเล็กน้อย -1 (ขัดแย้งเพราะฉันเคยตกหลุมกับดักนี้มาก่อนและฉันเดาว่าคำตอบนี้มีข้อมูลที่เกี่ยวข้องกับบางคนที่จะมาถึงในหน้านี้) เพราะสิ่งนี้ชัดเจนว่าไม่ใช่คำตอบสำหรับคำถามที่ถาม มันน่าจะดีกว่าถ้าเป็นความเห็นในคำถาม
Mark Amery
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.