Độ dài tối đa của biểu diễn văn bản của một địa chỉ IPv6?


430

Tôi muốn lưu trữ dữ liệu được trả về $_SERVER["REMOTE_ADDR"]trong PHP vào trường DB, nhiệm vụ khá đơn giản, thực sự. Vấn đề là tôi không thể tìm thấy bất kỳ thông tin thích hợp nào về độ dài tối đa của biểu diễn văn bản của một địa chỉ IPv6, đó là những gì một máy chủ web cung cấp thông qua $_SERVER["REMOTE_ADDR"].

Tôi không quan tâm đến việc chuyển đổi biểu diễn văn bản thành 128 bit mà địa chỉ thường được mã hóa, tôi chỉ muốn biết tối đa cần bao nhiêu ký tự để lưu trữ bất kỳ địa chỉ IPv6 nào được trả về $_SERVER["REMOTE_ADDR"].


6
Còn chỉ số vùng thì sao?
Robert Tupelo-Schneck

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

Nguồn: lxr.free-electrons.com/source/include/linux/inet.h

1
Câu hỏi stackoverflow.com/questions/1076714/ có một số câu trả lời tương tự nhưng hữu ích.
Edward

Câu trả lời:


615

45 ký tự .

Bạn có thể mong đợi một địa chỉ

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

8 * 4 + 7 = 39

8 nhóm gồm 4 chữ số với 7 chữ số :giữa chúng.

Nhưng nếu bạn có một địa chỉ IPv6 được ánh xạ IPv4 , hai nhóm cuối có thể được viết trong cơ sở 10 cách nhau ., ví dụ. [::ffff:192.168.100.228]. Viết đầy đủ:

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

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

Lưu ý, đây là quy ước nhập / hiển thị - đây vẫn là địa chỉ 128 bit và để lưu trữ, có lẽ tốt nhất là chuẩn hóa định dạng phân tách dấu hai chấm thô, tức là [0000:0000:0000:0000:0000:ffff:c0a8:64e4]cho địa chỉ trên.


245
Các tệp tiêu đề xác định INET6_ADDRSTRLEN là 46, phù hợp với 45 ký tự cộng với một dấu rỗng.
Wisnij

6
Đáng lưu ý rằng địa chỉ IPv6 cũng có thể chứa stackoverflow stackoverflow.com/questions/5746082/ , ví dụ: bạn nhận được địa chỉ đó từ RemoteEndpointMessageProperty.Address
Rory

địa chỉ ipv4 không được viết như :: ffff: 127.0.0.1?
Graywolf

52
@FelipeSchenone kiểu suy nghĩ không hữu ích - tìm hiểu kích thước và sử dụng nó. Lần duy nhất bạn muốn mở rộng bộ đệm là nếu nó giúp đệm hơn 64 ký tự, nhưng 45 (+1) là tối ưu.
gbjbaanb

1
điều này có tính đến phần trăm đăng nhập vào địa chỉ ipv6 không? Tham khảo - superuser.com/questions/99746/ từ
gaurav

85

Trên Linux, xem hằng số INET6_ADDRSTRLEN(bao gồm <arpa/inet.h>, xem man inet_ntop). Trên hệ thống của tôi (tiêu đề "in.h"):

#define INET6_ADDRSTRLEN 46

Ký tự cuối cùng là để chấm dứt NULL, như tôi tin, vì vậy độ dài tối đa là 45, như các câu trả lời khác.



@eis có lẽ là vào năm 2013. Có thể tăng lên để căn chỉnh cấu trúc.
Iiridayn

13

Trả lời câu hỏi của riêng tôi:

Địa chỉ IPv6 thường được viết dưới dạng tám nhóm gồm bốn chữ số thập lục phân, trong đó mỗi nhóm được phân tách bằng dấu hai chấm (:).

Vì vậy, tối đa 39 ký tự.


7
Tuy nhiên, rõ ràng có một cảnh báo, xem stackoverflow.com/a/7477384/3787376 ("Độ dài tối đa cho địa chỉ IP của máy khách") - Trích dẫn: "Đối với địa chỉ IPv6 được ánh xạ IPv4, chuỗi có thể dài hơn 39 ký tự.". Nó nói rằng "IPv6 được ánh xạ IPv4" có 45 ký tự và có định dạng "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190". Do đó tối đa phải là 45 ký tự. Câu trả lời tại stackoverflow.com/a/166157/3787376 (câu hỏi này) dường như cũng chứng minh điểm này.
Edward

6

Tôi nghĩ rằng câu trả lời @Deepak trong liên kết này gần với câu trả lời đúng hơn. Độ dài tối đa cho địa chỉ IP của khách hàng . Vì vậy, kích thước chính xác là 45 chứ không phải 39. Đôi khi chúng tôi cố gắng tranh giành kích thước trường nhưng có vẻ tốt hơn nếu chúng tôi chuẩn bị đủ kích thước lưu trữ.


4

Như đã chỉ ra, một địa chỉ ipv6 tiêu chuẩn có nhiều nhất là 45 ký tự, nhưng một địa chỉ ipv6 cũng có thể bao gồm% kết thúc theo sau là một chuỗi "phạm vi" hoặc "vùng", không có độ dài cố định nhưng thường là một số nguyên dương nhỏ hoặc giao diện mạng Tên, vì vậy trong thực tế, nó có thể lớn hơn 45 ký tự. Tên giao diện mạng thường là "eth0", "eth1", "wlan0", vì vậy chọn 50 làm giới hạn có thể đủ tốt.


3
Đúng, nhưng đây chỉ là địa chỉ liên kết cục bộ và bạn sẽ không thấy bất kỳ địa chỉ nào một khi trang web của bạn đang chạy trên Internet (và hy vọng thậm chí không phát triển nó).
Michael Hampton

1

Coi chừng các tiêu đề nhất định như HTTP_X_FORWARDED_FORcó vẻ chứa một địa chỉ IP duy nhất. Chúng thực sự có thể chứa nhiều địa chỉ (một chuỗi các proxy tôi giả sử).

Chúng sẽ xuất hiện được phân tách bằng dấu phẩy - và có thể dài hơn tổng cộng 45 ký tự - vì vậy hãy kiểm tra trước khi lưu trữ trong DB.


3
Một chút mâu thuẫn -1 (mâu thuẫn vì tôi đã rơi vào cái bẫy này trước đây và tôi đoán câu trả lời này chứa thông tin liên quan đến một số người sẽ đến trên trang này) vì dù sao đây rõ ràng không phải là câu trả lời cho câu hỏi được hỏi. Nó có lẽ sẽ tốt hơn khi bình luận về câu hỏi.
Đánh dấu Amery
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.