ipaddress 0.8.0 → 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rock.yml +5 -0
- data/CHANGELOG.rdoc +15 -0
- data/Gemfile +3 -0
- data/{LICENSE → LICENSE.txt} +1 -1
- data/README.rdoc +106 -69
- data/Rakefile +2 -19
- data/ipaddress.gemspec +20 -49
- data/lib/ipaddress.rb +35 -10
- data/lib/ipaddress/ipv4.rb +124 -14
- data/lib/ipaddress/ipv6.rb +9 -0
- data/lib/ipaddress/mongoid.rb +75 -0
- data/lib/ipaddress/prefix.rb +2 -2
- data/lib/ipaddress/version.rb +3 -0
- data/test/ipaddress/ipv4_test.rb +91 -23
- data/test/ipaddress/ipv6_test.rb +27 -23
- data/test/ipaddress/mongoid_test.rb +70 -0
- data/test/ipaddress/prefix_test.rb +4 -10
- data/test/ipaddress_test.rb +34 -7
- data/test/test_helper.rb +10 -3
- metadata +64 -28
- data/VERSION +0 -1
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fec38076134eaf8fe0a449f7e96d9be946d37b0f
|
4
|
+
data.tar.gz: 43c5c532b9d10c030e27a490eab789107a5c2680
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ffd4cc11627aa588ef044a35767addb3a9498221746727435561439729e04e51fe1b70a660ffbc1f79ed952fdcd46fec30c5e88ef79667e9d68099eb9953a8b6
|
7
|
+
data.tar.gz: b273220fcdc8584a5841e16841a68f0b271d183d0e40c96ac1160cdc23bcd868f7460c0e6c4c1d2e590e1aa3e4ad7fc046540b5610a517637df1268818d3a262
|
data/.gitignore
ADDED
data/.rock.yml
ADDED
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,19 @@
|
|
1
|
+
== ipaddress 0.8.2
|
2
|
+
|
3
|
+
CHANGED:: merged bundler branch to cleanup gemspec and Rakefiles
|
4
|
+
FIXED:: IPAddress::IPv4.split handling (Issue #40)
|
5
|
+
NEW:: Added #[]= method to IPv4/6 classes to add octet writing support. (Issue #24)
|
6
|
+
NEW:: IPV4#multicast?
|
7
|
+
NEW:: IPV4#loopback?
|
8
|
+
NEW:: IPV4#to()
|
9
|
+
|
10
|
+
== ipaddress 0.8.1
|
11
|
+
|
12
|
+
CHANGED:: ipaddress now uses minitest for testing, all tests passing
|
13
|
+
|
1
14
|
== ipaddress 0.8.0
|
2
15
|
|
16
|
+
CHANGED:: ipaddress now uses this[https://gist.github.com/cpetschnig/294476] regexp to validate IPv6 addresses. Thanks to Christoph Petschnig for his regexp and to Bronislav Robenek for fixing this.
|
3
17
|
CHANGED:: Removed extension methods and extension directory to facilitate integration with the stdlib
|
4
18
|
CHANGED:: Reworked IPv4#<=>, now intuitively sorts objects based on the prefix
|
5
19
|
CHANGED:: IPv4#supernet now returns "0.0.0.0/0" if supernetting with a prefix less than 1
|
@@ -10,6 +24,7 @@ NEW:: IPv6#broadcast_u128
|
|
10
24
|
NEW:: IPv6#each
|
11
25
|
NEW:: IPv6#<=>
|
12
26
|
NEW:: IPv4#split
|
27
|
+
NEW:: IP#ntoa
|
13
28
|
|
14
29
|
== ipaddress 0.7.5
|
15
30
|
|
data/Gemfile
ADDED
data/{LICENSE → LICENSE.txt}
RENAMED
data/README.rdoc
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
== <b>IPAddress 1.0 is currently under development and will be released soon! Stay tuned!</b>
|
2
|
+
|
3
|
+
---
|
4
|
+
|
1
5
|
= IPAddress
|
2
6
|
|
3
7
|
IPAddress is a Ruby library designed to make the use of IPv4 and IPv6
|
@@ -17,7 +21,7 @@ examples of typical usage.
|
|
17
21
|
* Ruby >= 1.8.7 (not tested with previous versions)
|
18
22
|
* Ruby 1.9.2 or later is strongly recommended
|
19
23
|
|
20
|
-
IPAddress 0.8.
|
24
|
+
IPAddress 0.8.2 has been tested on:
|
21
25
|
|
22
26
|
* ruby-1.8.7-p334 [ i386 ]
|
23
27
|
* ree-1.8.7-2011.03 [ i386 ]
|
@@ -25,6 +29,8 @@ IPAddress 0.8.0 has been tested on:
|
|
25
29
|
* jruby-1.6.1 [ linux-i386-java ]
|
26
30
|
* ruby-1.9.1-p431 [ i386 ]
|
27
31
|
* ruby-1.9.2-p180 [ i386 ]
|
32
|
+
* ruby-2.0.0-p353 [ x86_64-darwin14.0.0 ]
|
33
|
+
* ruby-2.1.3-p242 [ x86_64-darwin14.0.0 ]
|
28
34
|
|
29
35
|
If you want to collaborate feel
|
30
36
|
free to send a small report to my email address, or
|
@@ -63,14 +69,14 @@ The latest documentation can be found online at
|
|
63
69
|
|
64
70
|
== IPv4
|
65
71
|
|
66
|
-
Class IPAddress::IPv4 is used to handle IPv4 type addresses. IPAddress
|
72
|
+
Class `IPAddress::IPv4` is used to handle IPv4 type addresses. IPAddress
|
67
73
|
is similar to other IP Addresses libraries, like Ruby's own
|
68
74
|
IPAddr. However it works slightly different, as we will see.
|
69
75
|
|
70
76
|
=== Create a new IPv4 address
|
71
77
|
|
72
78
|
The usual way to express an IP Address is using its dotted decimal
|
73
|
-
form, such as 172.16.10.1
|
79
|
+
form, such as `172.16.10.1`, and a prefix, such as `24`, separated by a
|
74
80
|
slash.
|
75
81
|
|
76
82
|
172.16.10.1/24
|
@@ -83,11 +89,11 @@ or, in a easier way, using the IPAddress parse method
|
|
83
89
|
|
84
90
|
ip = IPAddress.parse "172.16.10.1/24"
|
85
91
|
|
86
|
-
which accepts and parses any kind of IP (IPv4, IPV6 and
|
92
|
+
which accepts and parses any kind of IP (uint32, IPv4, IPV6 and
|
87
93
|
IPv4 IPv6 Mapped addresses).
|
88
94
|
|
89
95
|
If you like syntactic sugar, you can use the wrapper method
|
90
|
-
IPAddress()
|
96
|
+
`IPAddress()`, which is built around `IPAddress::parse`:
|
91
97
|
|
92
98
|
ip = IPAddress "172.16.10.1/24"
|
93
99
|
|
@@ -96,13 +102,13 @@ You can specify an IPv4 address in any of two ways:
|
|
96
102
|
IPAddress "172.16.10.1/24"
|
97
103
|
IPAddress "172.16.10.1/255.255.255.0"
|
98
104
|
|
99
|
-
In this example, prefix
|
105
|
+
In this example, prefix `/24` and netmask `255.255.255.0` are the same and
|
100
106
|
you have the flexibility to use either one of them.
|
101
107
|
|
102
108
|
If you don't explicitly specify the prefix (or the subnet mask),
|
103
109
|
IPAddress thinks you're dealing with host addresses and not with
|
104
|
-
networks. Therefore, the default prefix will be
|
105
|
-
255.255.255.255
|
110
|
+
networks. Therefore, the default prefix will be `/32`, or
|
111
|
+
`255.255.255.255`. For example:
|
106
112
|
|
107
113
|
# let's declare an host address
|
108
114
|
host = IPAddress::IPv4.new "10.1.1.1"
|
@@ -110,11 +116,18 @@ networks. Therefore, the default prefix will be /32, or
|
|
110
116
|
puts host.to_string
|
111
117
|
#=> "10.1.1.1/32"
|
112
118
|
|
113
|
-
The new created object has prefix
|
119
|
+
The new created object has prefix `/32`, which is the same
|
114
120
|
as we created the following:
|
115
121
|
|
116
122
|
host = IPAddress::IPv4.new "10.1.1.1/32"
|
117
|
-
|
123
|
+
|
124
|
+
You can also pass a `uint32` to obtain an `IPAddress::IPv4` object:
|
125
|
+
|
126
|
+
# Create host object
|
127
|
+
ip = IPAddress 167837953
|
128
|
+
puts ip.to_string
|
129
|
+
#=> "10.1.1.1/32"
|
130
|
+
|
118
131
|
=== Handling the IPv4 address
|
119
132
|
|
120
133
|
Once created, you can obtain the attributes for an IPv4 object:
|
@@ -127,25 +140,25 @@ Once created, you can obtain the attributes for an IPv4 object:
|
|
127
140
|
#=> 24
|
128
141
|
|
129
142
|
In case you need to retrieve the netmask in IPv4 format, you can use
|
130
|
-
the IPv4#netmask method:
|
143
|
+
the `IPv4#netmask` method:
|
131
144
|
|
132
145
|
ip.netmask
|
133
146
|
#=> "255.255.255.0"
|
134
147
|
|
135
|
-
A special attribute, IPv4#octets
|
148
|
+
A special attribute, `IPv4#octets`, is available to get the four
|
136
149
|
decimal octets from the IP address:
|
137
150
|
|
138
151
|
ip.octets
|
139
152
|
#=> [172,16,10,1]
|
140
153
|
|
141
|
-
Shortcut method IPv4#[]
|
154
|
+
Shortcut method `IPv4#[]`, provides access to a given octet whithin the
|
142
155
|
range:
|
143
156
|
|
144
157
|
ip[1]
|
145
158
|
#=> 16
|
146
159
|
|
147
160
|
If you need to print out the IPv4 address in a canonical form, you can
|
148
|
-
use IPv4#to_string
|
161
|
+
use `IPv4#to_string`:
|
149
162
|
|
150
163
|
ip.to_string
|
151
164
|
#=> "172.16.10.l/24"
|
@@ -161,7 +174,7 @@ object. For example:
|
|
161
174
|
#=> "172.16.10.l/25"
|
162
175
|
|
163
176
|
If you need to use a netmask in IPv4 format, you can achive so by
|
164
|
-
using the IPv4#netmask
|
177
|
+
using the `IPv4#netmask=` method:
|
165
178
|
|
166
179
|
ip.netmask = "255.255.255.252"
|
167
180
|
|
@@ -174,7 +187,7 @@ Some very important topics in dealing with IP addresses are the
|
|
174
187
|
concepts of +network+ and +broadcast+, as well as the addresses
|
175
188
|
included in a range.
|
176
189
|
|
177
|
-
When you specify an IPv4 address such as
|
190
|
+
When you specify an IPv4 address such as `172.16.10.1/24`, you are
|
178
191
|
actually handling two different information:
|
179
192
|
|
180
193
|
* The IP address itself, "172.16.10.1"
|
@@ -183,11 +196,11 @@ actually handling two different information:
|
|
183
196
|
The network number is the IP which has all zeroes in the host
|
184
197
|
portion. In our example, because the prefix is 24, we identify our
|
185
198
|
network number to have the last 8 (32-24) bits all zeroes. Thus, IP
|
186
|
-
address
|
199
|
+
address `172.16.10.1/24` belongs to network `172.16.10.0/24`.
|
187
200
|
|
188
|
-
This is very important because, for instance, IP
|
201
|
+
This is very important because, for instance, IP `172.16.10.1/16` is
|
189
202
|
very different to the previous one, belonging to the very different
|
190
|
-
network
|
203
|
+
network `172.16.0.0/16`.
|
191
204
|
|
192
205
|
==== Networks
|
193
206
|
|
@@ -208,7 +221,7 @@ number, calculated after the original object. We want to outline here
|
|
208
221
|
that the network address is a perfect legitimate IPv4 address, which
|
209
222
|
just happen to have all zeroes in the host portion.
|
210
223
|
|
211
|
-
You can use method IPv4#network
|
224
|
+
You can use method `IPv4#network?` to check whether an IP address is a
|
212
225
|
network or not:
|
213
226
|
|
214
227
|
ip1 = IPAddress "172.16.10.1/24"
|
@@ -223,11 +236,11 @@ network or not:
|
|
223
236
|
|
224
237
|
The broadcast address is the contrary than the network number: where
|
225
238
|
the network number has all zeroes in the host portion, the broadcast
|
226
|
-
address has all one's. For example, ip
|
227
|
-
|
228
|
-
|
239
|
+
address has all one's. For example, ip `172.16.10.1/24` has broadcast
|
240
|
+
`172.16.10.255/24`, where ip `172.16.10.1/16` has broadcast
|
241
|
+
`172.16.255.255/16`.
|
229
242
|
|
230
|
-
Method IPv4#broadcast has the same behavior as is
|
243
|
+
Method `IPv4#broadcast` has the same behavior as is `#network`
|
231
244
|
counterpart: it creates a new IPv4 object to handle the broadcast
|
232
245
|
address:
|
233
246
|
|
@@ -245,7 +258,7 @@ address:
|
|
245
258
|
So we see that the netmask essentially specifies a range for IP
|
246
259
|
addresses that are included in a network: all the addresses between
|
247
260
|
the network number and the broadcast. IPAddress has many methods to
|
248
|
-
iterate between those addresses. Let's start with IPv4#each
|
261
|
+
iterate between those addresses. Let's start with `IPv4#each`, which
|
249
262
|
iterates over all addresses in a range
|
250
263
|
|
251
264
|
ip = IPAddress "172.16.10.1/24"
|
@@ -258,7 +271,7 @@ It is important to note that it doesn't matter if the original IP is a
|
|
258
271
|
host IP or a network number (or a broadcast address): the #each method
|
259
272
|
only considers the range that the original IP specifies.
|
260
273
|
|
261
|
-
If you only want to iterate over hosts IP, use the IPv4#each_host
|
274
|
+
If you only want to iterate over hosts IP, use the `IPv4#each_host`
|
262
275
|
method:
|
263
276
|
|
264
277
|
ip = IPAddress "172.16.10.1/24"
|
@@ -267,7 +280,7 @@ method:
|
|
267
280
|
puts host
|
268
281
|
end
|
269
282
|
|
270
|
-
Methods IPv4#first and IPv4#last return a new object containing
|
283
|
+
Methods `IPv4#first` and `IPv4#last` return a new object containing
|
271
284
|
respectively the first and the last host address in the range
|
272
285
|
|
273
286
|
ip = IPAddress "172.16.10.100/24"
|
@@ -278,6 +291,28 @@ respectively the first and the last host address in the range
|
|
278
291
|
ip.last.to_string
|
279
292
|
#=> "172.16.10.254/24"
|
280
293
|
|
294
|
+
Checking if an address is loopback is easy with the `IPv4#loopback?`
|
295
|
+
method:
|
296
|
+
|
297
|
+
ip = IPAddress "127.0.0.1"
|
298
|
+
|
299
|
+
ip.loopback?
|
300
|
+
#=> true
|
301
|
+
|
302
|
+
Checking if an address is in the multicast range can be done using the `IPv4#multicast?`
|
303
|
+
method:
|
304
|
+
|
305
|
+
ip = IPAddress "224.0.0.1/32"
|
306
|
+
|
307
|
+
ip.multicast?
|
308
|
+
#=> true
|
309
|
+
|
310
|
+
The ability to generate a range also exists by using the `IPv4#to()` method. This allows you to create a subnet agnostic range based off a fixed amount.
|
311
|
+
|
312
|
+
ip = IPAddress "172.16.10.100/24"
|
313
|
+
ip.to('172.16.10.110')
|
314
|
+
#=> ["172.16.10.100", ..., "172.16.10.110"]
|
315
|
+
|
281
316
|
=== IP special formats
|
282
317
|
|
283
318
|
The IPAddress library provides a complete set of methods to access an
|
@@ -295,38 +330,43 @@ The first thing to highlight here is that all these conversion methods
|
|
295
330
|
only take into consideration the address portion of an IPv4 object and
|
296
331
|
not the prefix (netmask).
|
297
332
|
|
298
|
-
So, to express the address in binary format, use the IPv4#bits method:
|
333
|
+
So, to express the address in binary format, use the `IPv4#bits` method:
|
299
334
|
|
300
335
|
ip.bits
|
301
336
|
#=> "10101100000100000000101000000001"
|
302
337
|
|
303
338
|
To calculate the 32 bits unsigned int format of the ip address, use
|
304
|
-
the IPv4#to_u32 method
|
339
|
+
the `IPv4#to_u32` method
|
305
340
|
|
306
341
|
ip.to_u32
|
307
342
|
#=> 2886732289
|
308
343
|
|
309
|
-
This method is the equivalent of the Unix call pton()
|
344
|
+
This method is the equivalent of the Unix call `pton()`, expressing an
|
310
345
|
IP address in the so called +network byte order+ notation. However, if
|
311
346
|
you want to transmit your IP over a network socket, you might need to
|
312
|
-
transform it in data format using the IPv4#data method:
|
347
|
+
transform it in data format using the `IPv4#data` method:
|
313
348
|
|
314
349
|
ip.data
|
315
350
|
#=> "\254\020\n\001"
|
316
351
|
|
317
|
-
|
352
|
+
Also, you can transform an IPv4 address into a format which is
|
318
353
|
suitable to use in IPv4-IPv6 mapped addresses:
|
319
354
|
|
320
355
|
ip.to_ipv6
|
321
356
|
#=> "ac10:0a01"
|
322
357
|
|
358
|
+
Finally, much like `IPv4#to_ipv6` you can use to `IPv4#to_h` method to return a non-semicolon delineated string (useful with pcap/byte level usage):
|
359
|
+
|
360
|
+
ip.to_h
|
361
|
+
#=> "ac100a01"
|
362
|
+
|
323
363
|
=== Classful networks
|
324
364
|
|
325
365
|
IPAddress allows you to create and manipulate objects using the old
|
326
366
|
and deprecated (but apparently still popular) classful networks concept.
|
327
367
|
|
328
368
|
Classful networks and addresses don't have a prefix: their subnet mask
|
329
|
-
is univocally identified by their address, and therefore
|
369
|
+
is univocally identified by their address, and therefore divided in classes.
|
330
370
|
As per RFC 791, these classes are:
|
331
371
|
|
332
372
|
* Class A, from 0.0.0.0 to 127.255.255.255
|
@@ -388,7 +428,7 @@ Subnetting is easy with IPAddress. You actually have two options:
|
|
388
428
|
* IPv4#subnet: specify a new prefix
|
389
429
|
* IPv4#split: tell IPAddress how many subnets you want to create.
|
390
430
|
|
391
|
-
Let's examine IPv4#subnet first. Say you have network "172.16.10.0/24"
|
431
|
+
Let's examine `IPv4#subnet` first. Say you have network "172.16.10.0/24"
|
392
432
|
and you want to subnet it into /26 networks. With IPAddress it's very
|
393
433
|
easy:
|
394
434
|
|
@@ -408,7 +448,7 @@ representing the new subnets.
|
|
408
448
|
Another way to create subnets is to tell IPAddress how many subnets you'd
|
409
449
|
like to have, and letting the library calculate the new prefix for you.
|
410
450
|
|
411
|
-
Let's see how it works, using IPv4#split method. Say you want 4 new subnets:
|
451
|
+
Let's see how it works, using `IPv4#split` method. Say you want 4 new subnets:
|
412
452
|
|
413
453
|
network = IPAddress("172.16.10.0/24")
|
414
454
|
|
@@ -421,15 +461,15 @@ Let's see how it works, using IPv4#split method. Say you want 4 new subnets:
|
|
421
461
|
"172.16.10.192/26"]
|
422
462
|
|
423
463
|
Hey, that's the same result as before! This actually makes sense, as the
|
424
|
-
two operations are complementary. When you use IPv4#subnet with the new
|
464
|
+
two operations are complementary. When you use `IPv4#subnet` with the new
|
425
465
|
prefix, IPAddress will always create a number of subnets that is a power
|
426
466
|
of two. This is equivalent to use IPv4#split with a power of 2.
|
427
467
|
|
428
|
-
Where IPv4#split really shines is with the so called "uneven subnetting".
|
468
|
+
Where `IPv4#split` really shines is with the so called "uneven subnetting".
|
429
469
|
You are not limited to split a network into a power-of-two numbers of
|
430
470
|
subnets: IPAddress lets you create any number of subnets, and it will
|
431
471
|
try to organize the new created network in the best possible way, making
|
432
|
-
an
|
472
|
+
an efficient allocation of the space.
|
433
473
|
|
434
474
|
An example here is worth a thousand words. Let's use the same network
|
435
475
|
as the previous examples:
|
@@ -447,8 +487,8 @@ How do we split this network into 3 subnets? Very easy:
|
|
447
487
|
|
448
488
|
As you can see, IPAddress tried to perform a good allocation by filling up
|
449
489
|
all the address space from the original network. There is no point in splitting
|
450
|
-
a network into 3 subnets like
|
451
|
-
|
490
|
+
a network into 3 subnets like `172.16.10.0/26`, `172.16.10.64/26` and
|
491
|
+
`172.16.10.128/26`, as you would end up having `172.16.10.192/26` wasted (plus,
|
452
492
|
I suppose I wouldn't need a Ruby library to perform un-efficient IP
|
453
493
|
allocation, as I do that myself very well ;) ).
|
454
494
|
|
@@ -460,8 +500,8 @@ We can go even further and split into 11 subnets:
|
|
460
500
|
"172.16.10.96/28", "172.16.10.112/28", "172.16.10.128/27",
|
461
501
|
"172.16.10.160/27", "172.16.10.192/26"]
|
462
502
|
|
463
|
-
As you can see, most of the networks are
|
464
|
-
|
503
|
+
As you can see, most of the networks are `/28`, with a few `/27` and one
|
504
|
+
`/26` to fill up the remaining space.
|
465
505
|
|
466
506
|
==== Summarization
|
467
507
|
|
@@ -489,10 +529,10 @@ instance the following two networks:
|
|
489
529
|
These two networks can be expressed using only one IP address
|
490
530
|
network if we change the prefix. Let Ruby do the work:
|
491
531
|
|
492
|
-
IPAddress::IPv4::summarize(ip1,ip2).to_string
|
532
|
+
IPAddress::IPv4::summarize(ip1,ip2).map(&:to_string)
|
493
533
|
#=> "172.16.10.0/23"
|
494
534
|
|
495
|
-
We note how the network
|
535
|
+
We note how the network `172.16.10.0/23` includes all the
|
496
536
|
addresses specified in the above networks, and (more important) includes
|
497
537
|
ONLY those addresses.
|
498
538
|
|
@@ -509,7 +549,7 @@ is not an aggregate network for +ip1+ and +ip2+.
|
|
509
549
|
If it's not possible to compute a single aggregated network for
|
510
550
|
all the original networks, the method returns an array with all the
|
511
551
|
aggregate networks found. For example, the following four networks can be
|
512
|
-
aggregated in a single
|
552
|
+
aggregated in a single `/22`:
|
513
553
|
|
514
554
|
ip1 = IPAddress("10.0.0.1/24")
|
515
555
|
ip2 = IPAddress("10.0.1.1/24")
|
@@ -531,7 +571,7 @@ network:
|
|
531
571
|
#=> ["10.0.1.0/24","10.0.2.0/23","10.0.4.0/24"]
|
532
572
|
|
533
573
|
In this case, the two summarizables networks have been aggregated into
|
534
|
-
a single
|
574
|
+
a single `/23`, while the other two networks have been left untouched.
|
535
575
|
|
536
576
|
==== Supernetting
|
537
577
|
|
@@ -550,13 +590,13 @@ you can supernet it with a new /23 prefix
|
|
550
590
|
ip.supernet(23).to_string
|
551
591
|
#=> "172.16.10.0/23"
|
552
592
|
|
553
|
-
However if you supernet it with a
|
593
|
+
However if you supernet it with a `/22` prefix, the network address will
|
554
594
|
change:
|
555
595
|
|
556
596
|
ip.supernet(22).to_string
|
557
597
|
#=> "172.16.8.0/22"
|
558
598
|
|
559
|
-
This is because
|
599
|
+
This is because `172.16.10.0/22` is not a network anymore, but an host
|
560
600
|
address.
|
561
601
|
|
562
602
|
== IPv6
|
@@ -638,7 +678,7 @@ methods:
|
|
638
678
|
#=> 64
|
639
679
|
|
640
680
|
A compressed version of the IPv6 address can be obtained with the
|
641
|
-
IPv6#compressed method:
|
681
|
+
`IPv6#compressed` method:
|
642
682
|
|
643
683
|
ip6 = IPAddress "2001:0db8:0000:0000:0008:200c:417a:00ab/64"
|
644
684
|
|
@@ -648,7 +688,7 @@ IPv6#compressed method:
|
|
648
688
|
=== Handling the IPv6 address
|
649
689
|
|
650
690
|
Accessing the groups that form an IPv6 address is very easy with the
|
651
|
-
IPv6#groups method:
|
691
|
+
`IPv6#groups` method:
|
652
692
|
|
653
693
|
ip6 = IPAddress "2001:db8::8:800:200c:417a/64"
|
654
694
|
|
@@ -656,7 +696,7 @@ IPv6#groups method:
|
|
656
696
|
#=> [8193, 3512, 0, 0, 8, 2048, 8204, 16762]
|
657
697
|
|
658
698
|
As with IPv4 addresses, each individual group can be accessed using
|
659
|
-
the IPv6#[] shortcut method:
|
699
|
+
the `IPv6#[]` shortcut method:
|
660
700
|
|
661
701
|
ip6[0]
|
662
702
|
#=> 8193
|
@@ -668,14 +708,14 @@ the IPv6#[] shortcut method:
|
|
668
708
|
#=> 0
|
669
709
|
|
670
710
|
Note that each 16 bits group is expressed in its decimal form. You can
|
671
|
-
also obtain the groups into hexadecimal format using the IPv6#hexs
|
711
|
+
also obtain the groups into hexadecimal format using the `IPv6#hexs`
|
672
712
|
method:
|
673
713
|
|
674
714
|
ip6.hexs
|
675
715
|
#=> => ["2001", "0db8", "0000", "0000", "0008", "0800", "200c", "417a"]
|
676
716
|
|
677
717
|
A few other methods are available to transform an IPv6 address into
|
678
|
-
decimal representation, with IPv6.to_i
|
718
|
+
decimal representation, with `IPv6.to_i`
|
679
719
|
|
680
720
|
ip6.to_i
|
681
721
|
#=> 42540766411282592856906245548098208122
|
@@ -685,8 +725,8 @@ or to hexadecimal representation
|
|
685
725
|
ip6.to_hex
|
686
726
|
#=> "20010db80000000000080800200c417a"
|
687
727
|
|
688
|
-
To print out an IPv6 address in human readable form, use the IPv6#to_s
|
689
|
-
and IPv6#to_string_uncompressed methods
|
728
|
+
To print out an IPv6 address in human readable form, use the `IPv6#to_s`, `IPv6#to_string`
|
729
|
+
and `IPv6#to_string_uncompressed` methods
|
690
730
|
|
691
731
|
ip6 = IPAddress "2001:db8::8:800:200c:417a/64"
|
692
732
|
|
@@ -696,8 +736,8 @@ and IPv6#to_string_uncompressed methods
|
|
696
736
|
ip6.to_string_uncompressed
|
697
737
|
#=> "2001:0db8:0000:0000:0008:0800:200c:417a/96"
|
698
738
|
|
699
|
-
As you can see, IPv6.to_string prints out the compressed form, while
|
700
|
-
IPv6.to_string_uncompressed uses the expanded version.
|
739
|
+
As you can see, `IPv6.to_string` prints out the compressed form, while
|
740
|
+
`IPv6.to_string_uncompressed` uses the expanded version.
|
701
741
|
|
702
742
|
==== Compressing and uncompressing
|
703
743
|
|
@@ -731,7 +771,7 @@ actually created internally).
|
|
731
771
|
You can create a new IPv6 address from different formats than just a
|
732
772
|
string representing the colon-hex groups.
|
733
773
|
|
734
|
-
For instance, if you have a data stream, you can use IPv6::parse_data
|
774
|
+
For instance, if you have a data stream, you can use `IPv6::parse_data`,
|
735
775
|
like in the following example:
|
736
776
|
|
737
777
|
data = " \001\r\270\000\000\000\000\000\b\b\000 \fAz"
|
@@ -772,7 +812,7 @@ support for unspecified, loopback and mapped IPv6 addresses.
|
|
772
812
|
==== Unspecified address
|
773
813
|
|
774
814
|
The address with all zero bits is called the +unspecified+ address
|
775
|
-
(corresponding to 0.0.0.0 in IPv4). It should be something like this:
|
815
|
+
(corresponding to `0.0.0.0` in IPv4). It should be something like this:
|
776
816
|
|
777
817
|
0000:0000:0000:0000:0000:0000:0000:0000
|
778
818
|
|
@@ -814,7 +854,7 @@ packets with the unspecified address.
|
|
814
854
|
|
815
855
|
==== Loopback address
|
816
856
|
|
817
|
-
The loopback
|
857
|
+
The loopback address is a unicast localhost address. If an
|
818
858
|
application in a host sends packets to this address, the IPv6 stack
|
819
859
|
will loop these packets back on the same virtual interface.
|
820
860
|
|
@@ -841,13 +881,13 @@ or by using the wrapper:
|
|
841
881
|
ip.to_string
|
842
882
|
#=> "::1/128"
|
843
883
|
|
844
|
-
Checking if an address is loopback is easy with the IPv6#loopback
|
884
|
+
Checking if an address is loopback is easy with the `IPv6#loopback?`
|
845
885
|
method:
|
846
886
|
|
847
887
|
ip.loopback?
|
848
888
|
#=> true
|
849
889
|
|
850
|
-
The IPv6 loopback address corresponds to 127.0.0.1 in IPv4.
|
890
|
+
The IPv6 loopback address corresponds to `127.0.0.1` in IPv4.
|
851
891
|
|
852
892
|
==== Mapped address
|
853
893
|
|
@@ -857,7 +897,7 @@ structure of the address is
|
|
857
897
|
|
858
898
|
::ffff:w.y.x.z
|
859
899
|
|
860
|
-
where w.x.y.z is a normal IPv4 address. For example, the following is
|
900
|
+
where `w.x.y.z` is a normal IPv4 address. For example, the following is
|
861
901
|
a mapped IPv6 address:
|
862
902
|
|
863
903
|
::ffff:192.168.100.1
|
@@ -881,7 +921,7 @@ Let's check it's really a mapped address:
|
|
881
921
|
ip6.to_string
|
882
922
|
#=> "::ffff:172.16.10.1/128"
|
883
923
|
|
884
|
-
Now with the
|
924
|
+
Now with the `#ipv4` attribute, we can easily access the IPv4 portion
|
885
925
|
of the mapped IPv6 address:
|
886
926
|
|
887
927
|
ip6.ipv4.address
|
@@ -902,7 +942,7 @@ following format:
|
|
902
942
|
|
903
943
|
ip6 = IPAddress "::172.16.10.1"
|
904
944
|
|
905
|
-
That is, two colons and the IPv4 address. However, as by RFC, the ffff
|
945
|
+
That is, two colons and the IPv4 address. However, as by RFC, the `ffff`
|
906
946
|
group will be automatically added at the beginning
|
907
947
|
|
908
948
|
ip6.to_string
|
@@ -955,7 +995,4 @@ feedback and bug reports.
|
|
955
995
|
|
956
996
|
== Copyright
|
957
997
|
|
958
|
-
Copyright (c) 2009-
|
959
|
-
|
960
|
-
|
961
|
-
|
998
|
+
Copyright (c) 2009-2015 Marco Ceresa and Mike Mackintosh. See LICENSE for details.
|