Cách tách địa chỉ IP trong Python

Mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 của Python là một viên ngọc không được đánh giá cao từ thư viện chuẩn Python. Bạn không cần phải là một kỹ sư mạng toàn diện để tiếp xúc với các địa chỉ IP trong tự nhiên. Địa chỉ IP và mạng có mặt khắp nơi trong cơ sở hạ tầng và phát triển phần mềm. Chúng củng cố cách máy tính xưng hô với nhau

Vừa học vừa làm là một cách hiệu quả để nắm vững địa chỉ IP. Mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 cho phép bạn làm điều đó bằng cách xem và thao tác địa chỉ IP dưới dạng đối tượng Python. Trong hướng dẫn này, bạn sẽ hiểu rõ hơn về địa chỉ IP bằng cách sử dụng một số tính năng của mô-đun
>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 của Python

Trong hướng dẫn này, bạn sẽ học

  • Cách địa chỉ IP hoạt động, cả về lý thuyết và mã Python
  • Cách mạng IP đại diện cho các nhóm địa chỉ IP và cách bạn có thể kiểm tra mối quan hệ giữa hai địa chỉ này
  • Cách mô-đun
    >>> from ipaddress import IPv4Address
    
    >>> addr = IPv4Address["220.14.9.37"]
    >>> addr
    IPv4Address['220.14.9.37']
    
    4 của Python khéo léo sử dụng mẫu thiết kế cổ điển để cho phép bạn làm được nhiều việc hơn với chi phí ít hơn

Để làm theo, bạn chỉ cần Python 3. 3 trở lên kể từ khi

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 được thêm vào thư viện chuẩn Python trong phiên bản đó. Các ví dụ trong hướng dẫn này được tạo bằng Python 3. 8

Tải xuống miễn phí. Nhận một chương mẫu từ CPython Internals. Hướng dẫn về Trình thông dịch Python 3 chỉ cho bạn cách mở khóa hoạt động bên trong của ngôn ngữ Python, biên dịch trình thông dịch Python từ mã nguồn và tham gia phát triển CPython

Địa chỉ IP trong lý thuyết và thực hành

Nếu bạn chỉ nhớ một khái niệm về địa chỉ IP, thì hãy nhớ điều này. một địa chỉ IP là một số nguyên. Phần thông tin này sẽ giúp bạn hiểu rõ hơn về cách hoạt động của địa chỉ IP và cách chúng có thể được biểu diễn dưới dạng các đối tượng Python

Trước khi bạn chuyển sang bất kỳ mã Python nào, có thể hữu ích khi xem khái niệm này được bổ sung bằng toán học. Nếu bạn ở đây chỉ để xem một số ví dụ về cách sử dụng mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4, thì bạn có thể bỏ qua phần , để sử dụng chính mô-đun đó

Loại bỏ các quảng cáo

Cơ chế của địa chỉ IP

Ở trên, bạn đã thấy địa chỉ IP rút gọn thành một số nguyên. Một định nghĩa đầy đủ hơn là địa chỉ IPv4 là số nguyên 32 bit được sử dụng để biểu thị máy chủ lưu trữ trên mạng. Thuật ngữ máy chủ đôi khi được sử dụng đồng nghĩa với một địa chỉ

Theo đó, có 232 địa chỉ IPv4 có thể có, từ 0 đến 4.294.967.295 [trong đó giới hạn trên là 232 - 1]. Nhưng đây là hướng dẫn dành cho con người, không phải robot. Không ai muốn ping địa chỉ IP

>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
0

Cách phổ biến hơn để thể hiện địa chỉ IPv4 là sử dụng ký hiệu bốn dấu chấm, bao gồm bốn số nguyên thập phân được phân tách bằng dấu chấm

220.14.9.37

Mặc dù vậy, không rõ ràng ngay lập tức số nguyên cơ bản mà địa chỉ

>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
1 đại diện là gì. Về mặt công thức, bạn có thể chia địa chỉ IP
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
1 thành bốn thành phần octet của nó

>>>

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365

Như hình trên, địa chỉ

>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
1 đại diện cho số nguyên 3,691,907,365. Mỗi octet là một hoặc một số từ 0 đến 255. Với điều này, bạn có thể suy ra rằng địa chỉ IPv4 tối đa là
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
4 [hoặc
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
5 theo ký hiệu hex], trong khi địa chỉ tối thiểu là
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
6

Tiếp theo, bạn sẽ thấy mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 của Python thực hiện phép tính này cho bạn như thế nào, cho phép bạn làm việc với biểu mẫu mà con người có thể đọc được và để số học địa chỉ xuất hiện ngoài tầm nhìn

Mô-đun Python
>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4

Để làm theo, bạn có thể tìm nạp địa chỉ IP bên ngoài của máy tính để làm việc với dòng lệnh

$ curl -sS ifconfig.me/ip
220.14.9.37

Điều này yêu cầu địa chỉ IP của bạn từ trang ifconfig. tôi, có thể được sử dụng để hiển thị một loạt thông tin chi tiết về kết nối và mạng của bạn

Ghi chú. Vì lợi ích của tính chính xác về mặt kỹ thuật, đây hoàn toàn có thể không phải là địa chỉ IP công cộng của máy tính của bạn. Nếu kết nối của bạn nằm phía sau một bộ định tuyến NATed, thì tốt hơn hết bạn nên coi đó là một IP "đại lý" mà qua đó bạn truy cập Internet

Bây giờ hãy mở một REPL của Python. Bạn có thể sử dụng lớp

>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 để xây dựng một đối tượng Python bao hàm một địa chỉ

>>>

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']

Truyền một ____20_______0 chẳng hạn như ____20_______1 cho hàm tạo ____6_______9 là cách tiếp cận phổ biến nhất. Tuy nhiên, lớp cũng có thể chấp nhận các loại khác

>>>

>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']

Mặc dù xây dựng từ một

>>> int[addr]
3691907365
>>> addr.packed
b'\xdc\x0e\t%'
0 mà con người có thể đọc được có lẽ là cách phổ biến hơn, nhưng bạn có thể thấy đầu vào
>>> int[addr]
3691907365
>>> addr.packed
b'\xdc\x0e\t%'
4 nếu bạn đang làm việc với thứ gì đó như

Các chuyển đổi ở trên cũng có thể theo hướng khác

>>>

>>> int[addr]
3691907365
>>> addr.packed
b'\xdc\x0e\t%'

Ngoài việc cho phép đầu vào và đầu ra khứ hồi cho các loại Python khác nhau, các phiên bản của

>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 cũng có thể được băm. Điều này có nghĩa là bạn có thể sử dụng chúng làm khóa trong loại dữ liệu ánh xạ, chẳng hạn như từ điển

>>>

>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }

Trên hết,

>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 cũng triển khai cho phép so sánh bằng cách sử dụng số nguyên bên dưới

>>>

>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37

Bạn có thể sử dụng bất kỳ tiêu chuẩn nào để so sánh các giá trị nguyên của các đối tượng địa chỉ

Ghi chú. Hướng dẫn này tập trung vào các địa chỉ Giao thức Internet phiên bản 4 [IPv4]. Ngoài ra còn có các địa chỉ IPv6, là 128-bit chứ không phải 32-bit và được thể hiện ở dạng đầu tiên, chẳng hạn như

>>> int[addr]
3691907365
>>> addr.packed
b'\xdc\x0e\t%'
7. Vì số học của các địa chỉ phần lớn giống nhau nên hướng dẫn này loại bỏ một biến khỏi phương trình và tập trung vào các địa chỉ IPv4

Mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 có chức năng xuất xưởng linh hoạt hơn, chấp nhận một đối số đại diện cho địa chỉ IPv4 hoặc IPv6 và cố gắng hết sức để trả về một phiên bản
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 hoặc một phiên bản
>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
1 tương ứng

Trong hướng dẫn này, bạn sẽ đi thẳng vào việc theo đuổi và xây dựng các đối tượng địa chỉ với

>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9

Như bạn đã thấy ở trên, bản thân hàm tạo cho

>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 ngắn gọn và hấp dẫn. Đó là khi bạn bắt đầu gộp các địa chỉ thành các nhóm hoặc mạng, mọi thứ trở nên thú vị hơn

Loại bỏ các quảng cáo

Mạng IP và giao diện

Mạng là một nhóm các địa chỉ IP. Các mạng được mô tả và hiển thị dưới dạng các dải địa chỉ liền kề. Ví dụ: một mạng có thể bao gồm các địa chỉ

>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
4 đến
>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
5, một mạng chứa 256 địa chỉ

Bạn có thể nhận ra một mạng bằng địa chỉ IP trên và dưới của nó, nhưng làm thế nào bạn có thể hiển thị mạng này bằng một quy ước ngắn gọn hơn?

Ký hiệu CIDR

Một mạng được xác định bằng địa chỉ mạng cộng với tiền tố trong

>>>

>>> from ipaddress import IPv4Network
>>> net = IPv4Network["192.4.2.0/24"]
>>> net.num_addresses
256

Ký hiệu CIDR đại diện cho một mạng là

>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
6. Tiền tố định tuyến [hoặc độ dài tiền tố hoặc chỉ tiền tố], trong trường hợp này là 24, là số lượng bit dẫn đầu được sử dụng để trả lời các câu hỏi như liệu một địa chỉ nhất định có phải là một phần của mạng hay có bao nhiêu địa chỉ nằm trong mạng. [Ở đây các bit đầu đề cập đến N bit đầu tiên đếm từ bên trái của số nguyên trong hệ nhị phân. ]

Bạn có thể tìm tiền tố định tuyến với thuộc tính

>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
7

>>>

>>> net.prefixlen
24

Hãy nhảy ngay vào một ví dụ. Địa chỉ

>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
8 có trong mạng
>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
9 không? . Với tiền tố
>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
2, bạn có thể chỉ cần cắt bỏ octet cuối cùng và xem các phần của
>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
3 có khớp không

Hình dung khác, tiền tố

>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
2 dịch thành một mặt nạ mạng, như tên gọi của nó, được sử dụng để che giấu các bit trong các địa chỉ được so sánh

>>>

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
0

Bạn so sánh các bit dẫn đầu để xác định xem một địa chỉ có phải là một phần của mạng hay không. Nếu các bit đầu khớp nhau, thì địa chỉ là một phần của mạng

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
1

Ở trên, 8 bit cuối cùng của

>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
8 được che dấu [với
>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
6] và bị bỏ qua khi so sánh. Một lần nữa,
>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 của Python giúp bạn tiết kiệm kiến ​​thức toán học và hỗ trợ kiểm tra tư cách thành viên

>>>

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
2

Điều này có thể thực hiện được nhờ kho tàng đang quá tải toán tử, theo đó

>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
8 xác định
>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
9 để cho phép thử nghiệm tư cách thành viên bằng cách sử dụng toán tử
>>> from ipaddress import IPv4Network
>>> net = IPv4Network["192.4.2.0/24"]
>>> net.num_addresses
256
0

Trong ký hiệu CIDR

>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
9, phần
>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
4 là địa chỉ mạng, được sử dụng để xác định mạng

>>>

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
3

Như bạn đã thấy ở trên, địa chỉ mạng

>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
4 có thể được coi là kết quả mong đợi khi áp dụng mặt nạ cho địa chỉ IP máy chủ

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
4

Khi bạn nghĩ về nó theo cách này, bạn có thể thấy tiền tố

>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
2 thực sự chuyển thành
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 đúng như thế nào

>>>

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
5

Trên thực tế, nếu bạn thích, bạn có thể tạo một

>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
8 trực tiếp từ hai địa chỉ

>>>

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
6

Ở trên,

>>> hash[IPv4Address["220.14.9.37"]]
4035855712965130587

>>> num_connections = {
..     IPv4Address["220.14.9.37"]: 2,
..     IPv4Address["100.201.0.4"]: 16,
..     IPv4Address["8.240.12.2"]: 4,
.. }
4 là địa chỉ mạng trong khi
>>> from ipaddress import IPv4Network
>>> net = IPv4Network["192.4.2.0/24"]
>>> net.num_addresses
256
8 là mặt nạ mạng

Ở đầu kia của phổ trong mạng là địa chỉ cuối cùng hoặc địa chỉ quảng bá, là một địa chỉ duy nhất có thể được sử dụng để liên lạc với tất cả các máy chủ trên mạng của nó

>>>

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
7

Còn một điểm nữa đáng nói về netmask. Bạn sẽ thường thấy độ dài tiền tố là bội số của 8

Prefix LengthNumber of AddressesNetmask816,777,216

>>> from ipaddress import IPv4Network
>>> net = IPv4Network["192.4.2.0/24"]
>>> net.num_addresses
256
91665,536
>>> net.prefixlen
24
024256
>>> from ipaddress import IPv4Network
>>> net = IPv4Network["192.4.2.0/24"]
>>> net.num_addresses
256
8321
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
4

Tuy nhiên, bất kỳ số nguyên nào trong khoảng từ 0 đến 32 đều hợp lệ, mặc dù ít phổ biến hơn

>>>

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
8

Trong phần này, bạn đã biết cách xây dựng một phiên bản

>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
8 và kiểm tra xem một địa chỉ IP nhất định có nằm trong đó hay không. Trong phần tiếp theo, bạn sẽ tìm hiểu cách lặp qua các địa chỉ trong mạng

Loại bỏ các quảng cáo

Vòng lặp qua mạng

Lớp

>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
8 hỗ trợ phép lặp, nghĩa là bạn có thể lặp lại các địa chỉ riêng lẻ của nó trong một vòng lặp
>>> net.prefixlen
24
5

>>>

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
9

Tương tự,

>>> net.prefixlen
24
6 trả về một trình tạo sẽ mang lại các địa chỉ được hiển thị ở trên, không bao gồm các địa chỉ mạng và quảng bá

>>>

$ curl -sS ifconfig.me/ip
220.14.9.37
0

Trong phần tiếp theo, bạn sẽ đi sâu vào một khái niệm liên quan chặt chẽ đến mạng. mạng con

mạng con

Mạng con là một phân khu của mạng IP

>>>

$ curl -sS ifconfig.me/ip
220.14.9.37
1

Ở trên,

>>> net.prefixlen
24
7 chỉ chứa 16 địa chỉ, đủ cho bạn và một vài tủ xung quanh bạn. Ngược lại,
>>> net.prefixlen
24
8 chứa 65.536 địa chỉ

Một cách phổ biến để đạt được mạng con là lấy một mạng và tăng độ dài tiền tố của nó lên 1. Hãy lấy ví dụ này từ Wikipedia

Mạng con IPv4 []

Ví dụ này bắt đầu với một mạng

>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
2

$ curl -sS ifconfig.me/ip
220.14.9.37
2

Chia mạng con bằng cách tăng độ dài tiền tố từ 24 lên 25 liên quan đến việc dịch chuyển các bit xung quanh để chia mạng thành các phần nhỏ hơn. Đây là một chút lông toán học. May mắn thay,

>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
8 khiến nó trở nên dễ dàng vì
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
01 trả về một trình vòng lặp trên các mạng con

>>>

$ curl -sS ifconfig.me/ip
220.14.9.37
3

Bạn cũng có thể cho

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
01 tiền tố mới nên là gì. Tiền tố cao hơn có nghĩa là nhiều mạng con hơn và nhỏ hơn

>>>

$ curl -sS ifconfig.me/ip
220.14.9.37
4

Bên cạnh địa chỉ và mạng, còn có phần cốt lõi thứ ba của mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 mà bạn sẽ thấy tiếp theo

Giao diện máy chủ

Cuối cùng nhưng không kém phần quan trọng, mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 của Python xuất một lớp
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
05 để biểu diễn giao diện máy chủ. Giao diện máy chủ là một cách để mô tả, ở dạng nhỏ gọn duy nhất, cả địa chỉ IP máy chủ và mạng mà nó nằm trong đó

>>>

$ curl -sS ifconfig.me/ip
220.14.9.37
5

Ở trên,

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
06 có nghĩa là “địa chỉ IP
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
07 trong mạng
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
08. ”

Ghi chú. Trong bối cảnh mạng máy tính, giao diện cũng có thể đề cập đến giao diện mạng, phổ biến nhất là thẻ giao diện mạng [NIC]. Nếu bạn đã từng sử dụng công cụ

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
09 [*nix] hoặc
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
10 [Windows], thì bạn có thể biết công cụ của mình bằng tên chẳng hạn như
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
11,
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
12 hoặc
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
13. Hai loại giao diện này không liên quan

Nói cách khác, một mình địa chỉ IP không cho bạn biết địa chỉ đó thuộc [các] mạng nào và địa chỉ mạng là một nhóm các địa chỉ IP chứ không phải một địa chỉ duy nhất.

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
05 cung cấp cho bạn cách thể hiện đồng thời, thông qua ký hiệu CIDR, một địa chỉ IP máy chủ duy nhất và mạng của nó

Loại bỏ các quảng cáo

Dải địa chỉ đặc biệt

Bây giờ bạn đã biết về cả địa chỉ IP và mạng ở mức cao, điều quan trọng cần biết là không phải tất cả các địa chỉ IP đều được tạo như nhau—một số là đặc biệt

Cơ quan cấp số được gán Internet [IANA], song song với Lực lượng đặc nhiệm kỹ thuật Internet [IETF], giám sát việc phân bổ các dải địa chỉ khác nhau. Cơ quan đăng ký địa chỉ mục đích đặc biệt IPv4 của IANA là một bảng rất quan trọng chỉ ra rằng các dải địa chỉ nhất định phải có ý nghĩa đặc biệt

Một ví dụ phổ biến là địa chỉ riêng. Địa chỉ IP riêng được sử dụng để liên lạc nội bộ giữa các thiết bị trên mạng không yêu cầu kết nối với Internet công cộng. Các phạm vi sau đây được dành riêng cho sử dụng cá nhân

RangeNumber of AddressesNetwork AddressBroadcast Address

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
1516,777,216
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
16
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
17
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
181,048,576
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
19
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
20
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
2165,536
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
22
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
23

Một ví dụ được chọn ngẫu nhiên là

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
24. Vì vậy, làm thế nào để bạn biết rằng địa chỉ này là riêng tư?

>>>

$ curl -sS ifconfig.me/ip
220.14.9.37
6

Loại địa chỉ đặc biệt thứ hai là địa chỉ liên kết cục bộ, là địa chỉ chỉ có thể truy cập được từ bên trong một mạng con nhất định. Một ví dụ là Dịch vụ đồng bộ hóa thời gian của Amazon, có sẵn cho các phiên bản AWS EC2 tại IP liên kết cục bộ

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
26. Nếu phiên bản EC2 của bạn nằm trong một đám mây riêng ảo [VPC], thì bạn không cần kết nối Internet để cho phiên bản của bạn biết mấy giờ rồi. khối 169. 254. 0. 0/16 được dành riêng cho các địa chỉ liên kết cục bộ

>>>

$ curl -sS ifconfig.me/ip
220.14.9.37
7

Ở trên, bạn có thể thấy rằng một cách để xác nhận rằng

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
24 là địa chỉ sử dụng cá nhân là kiểm tra xem địa chỉ đó có nằm trong phạm vi
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
15 hay không. Nhưng mô-đun
>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 của Python cũng cung cấp một bộ để kiểm tra xem một địa chỉ có phải là một loại đặc biệt hay không

>>>

$ curl -sS ifconfig.me/ip
220.14.9.37
8

Tuy nhiên, một điều cần lưu ý về

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
30 là nó sử dụng định nghĩa rộng hơn về mạng riêng so với ba phạm vi IANA được hiển thị trong bảng trên. Mô-đun
>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 của Python cũng bao gồm các địa chỉ khác được phân bổ cho các mạng riêng

  • >>> [
    ..     220 * [256 ** 3] +
    ..      14 * [256 ** 2] +
    ..       9 * [256 ** 1] +
    ..      37 * [256 ** 0]
    .. ]
    3691907365
    
    32 được sử dụng cho “. ”
  • >>> [
    ..     220 * [256 ** 3] +
    ..      14 * [256 ** 2] +
    ..       9 * [256 ** 1] +
    ..      37 * [256 ** 0]
    .. ]
    3691907365
    
    33 được sử dụng cho các địa chỉ loopback
  • >>> [
    ..     220 * [256 ** 3] +
    ..      14 * [256 ** 2] +
    ..       9 * [256 ** 1] +
    ..      37 * [256 ** 0]
    .. ]
    3691907365
    
    34 được sử dụng cho các địa chỉ liên kết cục bộ như đã thảo luận ở trên
  • >>> [
    ..     220 * [256 ** 3] +
    ..      14 * [256 ** 2] +
    ..       9 * [256 ** 1] +
    ..      37 * [256 ** 0]
    .. ]
    3691907365
    
    35 được sử dụng để đánh giá hiệu suất của mạng

Đây không phải là một danh sách đầy đủ, nhưng nó bao gồm các trường hợp phổ biến nhất

Mô-đun Python
>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 Dưới mui xe

Ngoài API tài liệu của nó, mã nguồn CPython cho mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 và lớp của nó cung cấp một số thông tin chuyên sâu tuyệt vời về cách bạn có thể sử dụng một mẫu được gọi là thành phần để cho mã của riêng bạn mượn một API thành ngữ

Vai trò cốt lõi của sáng tác

Mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 tận dụng một mẫu hướng đối tượng được gọi là thành phần. Lớp
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 của nó là một hỗn hợp bao bọc một số nguyên Python đơn giản. Xét cho cùng, địa chỉ IP về cơ bản là số nguyên

Ghi chú. Công bằng mà nói, mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 cũng sử dụng một liều lượng kế thừa lành mạnh, chủ yếu để giảm trùng lặp mã

Mỗi phiên bản

>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 có một thuộc tính gần như riêng tư
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
43 mà chính nó là một
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
44. Nhiều thuộc tính và phương thức khác của lớp được điều khiển bởi giá trị của thuộc tính này

>>>

$ curl -sS ifconfig.me/ip
220.14.9.37
9

Thuộc tính

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
43 thực sự là thứ chịu trách nhiệm tạo ra
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
46. Chuỗi cuộc gọi là
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
47 cuộc gọi
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
48, mà
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 thực hiện như chỉ
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
50

Nếu bạn hỏi các nhà phát triển CPython về điều này, thì họ có thể cho bạn biết rằng

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
43 là một chi tiết triển khai. Mặc dù không có gì thực sự riêng tư trong Python, nhưng dấu gạch dưới ở đầu biểu thị rằng ____10_______43 gần như riêng tư, không phải là một phần của API ___________4 công khai và có thể thay đổi mà không cần thông báo trước. Đó là lý do tại sao việc trích xuất số nguyên bên dưới bằng
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
46 sẽ ổn định hơn

Tuy nhiên, với tất cả những gì đã nói, chính lớp

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
43 cơ bản mang lại phép thuật cho các lớp
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 và
>>> IPv4Address["220.14.9.37"] > IPv4Address["8.240.12.2"]
True

>>> addrs = [
..     IPv4Address["220.14.9.37"],
..     IPv4Address["8.240.12.2"],
..     IPv4Address["100.201.0.4"],
.. ]
>>> for a in sorted[addrs]:
..     print[a]
...
8.240.12.2
100.201.0.4
220.14.9.37
8

Loại bỏ các quảng cáo

Mở rộng
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9

Bạn có thể chứng minh sức mạnh của số nguyên

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
43 bên dưới bằng cách mở rộng lớp địa chỉ IPv4

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
0

Việc thêm

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
60 cho phép bạn sử dụng toán tử nhị phân AND [
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
61]. Bây giờ bạn có thể trực tiếp áp dụng netmask cho IP máy chủ

>>>

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
1

Ở trên,

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
60 cho phép bạn sử dụng trực tiếp một
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 hoặc một
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
44 khác làm mặt nạ. Bởi vì
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
65 là một lớp con của
>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9, séc
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
67 sẽ trả về
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
68 trong trường hợp đó

Bên cạnh quá tải toán tử, bạn cũng có thể thêm các thuộc tính hoàn toàn mới

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
2

Trong

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
69 [dòng 8], sử dụng
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
70 biến đổi địa chỉ IP thành một mảng byte, sau đó được định dạng dưới dạng biểu diễn chuỗi ở dạng nhị phân của nó

Trong

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
71, cuộc gọi tới
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
72 trên dòng 14 có hai phần

  1. Nó xóa mọi thứ ngoài 0 và 1 khỏi chuỗi đầu vào
  2. Nó phân tích kết quả, giả sử cơ sở 2, với
    >>> [
    ..     220 * [256 ** 3] +
    ..      14 * [256 ** 2] +
    ..       9 * [256 ** 1] +
    ..      37 * [256 ** 0]
    .. ]
    3691907365
    
    73

Sử dụng

>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
74 và
>>> [
..     220 * [256 ** 3] +
..      14 * [256 ** 2] +
..       9 * [256 ** 1] +
..      37 * [256 ** 0]
.. ]
3691907365
75 cho phép bạn chuyển đổi và xây dựng từ một
>>> int[addr]
3691907365
>>> addr.packed
b'\xdc\x0e\t%'
0 của 1 và 0 trong ký hiệu nhị phân

>>>

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
3

Đây chỉ là một số cách chứng minh cách tận dụng mẫu IP dưới dạng số nguyên có thể giúp bạn mở rộng chức năng của

>>> IPv4Address[3691907365]  # From an int
IPv4Address['220.14.9.37']

>>> IPv4Address[b"\xdc\x0e\t%"]  # From bytes [packed form]
IPv4Address['220.14.9.37']
9 với một lượng nhỏ mã bổ sung

Phần kết luận

Trong hướng dẫn này, bạn đã thấy cách mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4 của Python có thể cho phép bạn làm việc với các địa chỉ IP và mạng bằng cách sử dụng các cấu trúc Python phổ biến

Dưới đây là một số điểm quan trọng mà bạn có thể lấy đi

  • Địa chỉ IP về cơ bản là một số nguyên và điều này làm nền tảng cho cả cách bạn có thể thực hiện phép tính số học thủ công với các địa chỉ và cách các lớp Python từ
    >>> from ipaddress import IPv4Address
    
    >>> addr = IPv4Address["220.14.9.37"]
    >>> addr
    IPv4Address['220.14.9.37']
    
    4 được thiết kế bằng cách sử dụng thành phần
  • Mô-đun
    >>> from ipaddress import IPv4Address
    
    >>> addr = IPv4Address["220.14.9.37"]
    >>> addr
    IPv4Address['220.14.9.37']
    
    4 tận dụng quá tải toán tử để cho phép bạn suy ra mối quan hệ giữa địa chỉ và mạng
  • Mô-đun
    >>> from ipaddress import IPv4Address
    
    >>> addr = IPv4Address["220.14.9.37"]
    >>> addr
    IPv4Address['220.14.9.37']
    
    4 sử dụng thành phần và bạn có thể mở rộng chức năng đó nếu cần để bổ sung hành vi

Như mọi khi, nếu bạn muốn tìm hiểu sâu hơn, thì đọc nguồn mô-đun là một cách tuyệt vời để làm điều đó

Đọc thêm

Dưới đây là một số tài nguyên chuyên sâu mà bạn có thể xem để tìm hiểu thêm về mô-đun

>>> from ipaddress import IPv4Address

>>> addr = IPv4Address["220.14.9.37"]
>>> addr
IPv4Address['220.14.9.37']
4

  • Tài liệu Mô-đun
    >>> from ipaddress import IPv4Address
    
    >>> addr = IPv4Address["220.14.9.37"]
    >>> addr
    IPv4Address['220.14.9.37']
    
    4 của Python
  • Tổng quan về Mô-đun “ipaddress” của Python

Đánh dấu là đã hoàn thành

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Brad Solomon

Brad là một kỹ sư phần mềm và là thành viên của Nhóm hướng dẫn Python thực sự

» Thông tin thêm về Brad

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

Geir Arne

Jim

Joanna

Gia-cốp

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Chuyên gia Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Bạn có thể tách địa chỉ IP không?

Mặt nạ mạng con được sử dụng để chia địa chỉ IP thành hai phần . Một phần xác định máy chủ [máy tính], phần còn lại xác định mạng mà nó thuộc về.

split[] trong Python là gì?

Phương thức split[] chia chuỗi thành danh sách . Bạn có thể chỉ định dấu phân cách, dấu phân cách mặc định là bất kỳ khoảng trắng nào. Ghi chú. Khi maxsplit được chỉ định, danh sách sẽ chứa số phần tử đã chỉ định cộng với một.

Làm cách nào để so sánh hai địa chỉ IP trong Python?

Nó cũng có thể được sử dụng để so sánh các giá trị địa chỉ IP cũng như số học địa chỉ IP để thao tác các địa chỉ IP. .
Xác thực địa chỉ IPV4. Hàm ip_address xác thực địa chỉ IPV4. .
Xác thực Địa chỉ IPV6. .
Kiểm tra loại địa chỉ IP. .
So sánh địa chỉ IP. .
Địa chỉ IP Số học

Trình phân tích cú pháp địa chỉ IP Python là gì?

Mô-đun IPParser Python được tạo để đơn giản hóa việc chấp nhận địa chỉ IPv4, tên DNS và thông tin máy chủ/mục tiêu khi tạo các công cụ mạng hoặc bảo mật khác . Đầu vào của người dùng được lấy và phân tích cú pháp để cung cấp danh sách địa chỉ IPv4 hoặc tên DNS có thể được sử dụng để lặp lại.

Chủ Đề