Localhost OR loopback naming - network-programming

During development of an IpAddress library's part, I'm confronted to a minor dilema.
How to name my function testing the address to be a LocalHost / Loopback.
What is the difference between this 2 designations?
In other libs , they make this choices:
Boost.asio -> is_loopback
Qt -> isLoopback
wxWidget -> IsLocalHost
Why do they call isLoopback a test like address == "::1" ??
ANSWER:
"localhost" is usually an alias for the "loopback" interface. They can and are often used interchangeably.
Subquestion: Is it the same definition between IPv4 and IPv6?

The previous answer is not entirely correct.
Loopback +interface+ may have configured multiple IP addresses, not only from localhost network. It is a common practice to put non-local address on loopback interface in e.g. dynamic routing, where you don't want to lose routes to router's IP in case any interface goes down.
On the other hand, loopback IPv4 +network+ is defined by IANA as 127.0.0.0/8. Surprisingly, for IPv6 they reserved only ::1/128 address.
To answer your question: if you want to check only addresses, I'd pick isLocalhost(). And to be a bit zealous, I'd check there for the whole network - I happened to see 127.0.0.2 a few times...

Related

Could IPv4 loopback addresses be used for IPC?

I was quite surprised when I found out that there was a really big range of IP addresses allocated for loopback (127.x.y.z).
I didn't find much information about why it's like this, except that it could be used for testing networks and protocols locally, which got me thinking if it could be a good idea to use these addresses for IPC.
At the moment, as far as I know, IPC based on networking is usually done with TCP/UDP by opening sockets on ports which are most likely not used by any other service.
So my question is, to be even more sure that there won't be a port collision, could other loopback addresses be used instead?
For a more concrete example, could two processes communicate through sockets on address 127.31.41.59 and ports 27 and 18 (or even different loopback addresses)?

Understanding the difference between local and global IPv6 address

I'm implementing REST client in my Delphi application. The devices, I will be connecting to can be on local or global IPv6 addresses. The devices are having REST server and my application prepares REST URI by using %interface_index at the end of IPv6 address.
I'm observing connection problems when I use interface index(Zone_id) in the ipv6 address when its global.
I'm wondering if there is a way where i can differentiate between these and decide when to use the index or not.
IANA maintains some documents that may help. For example, Internet Protocol Version 6 Address Space
Every IPv6 interface will have a Link-Local address. Packets addressed with Link-Local addresses cannot be routed off the link (hence, Link-Local). Every link will use the same network, so you need to distinguish Link-Local addresses by adding a Zone ID. All Link-Local addresses are in the fe80::/10 network.
Global addresses are in the 2000::/3 range, but there are some address blocks within that range that are not forwardable or globally reachable. See the IANA IPv6 Special-Purpose Address Registry.
You should also study RFC 4291, IP Version 6 Addressing Architecture.

What is the significance of port number in localhost?

Different websites uses different ports, like Codecademy uses localhost:8000 in its AngularJS and Ruby On Rails tutorials. So, I want to know what is the use of this 8000 in localhost:8000. Thanks in advance :-)
This is not specific to one framework, it's a much lower level. From Wikipedia:
In computer networking, a port is a software construct serving as a communications endpoint in a computer's host operating system. A port is always associated with an IP address of a host and the protocol type of the communication. It completes the destination or origination address of a communications session. A port is identified for each address and protocol by a 16-bit number, commonly known as the port number.
Specific, well-known port numbers are often used to identify specific applications and services. Of the thousands of enumerated ports, 1024 well-known port numbers are reserved by convention to identify specific service types on a host. The protocols that primarily use ports are the Transport Layer protocols, such as the Transmission Control Protocol (TCP) and the User Datagram Protocol (UDP) of the Internet Protocol Suite.
In the client-server model of application architecture, ports are used to provide a multiplexing service on each port number that network clients connect to for service initiation, after which communication is reestablished on another connection-specific port number.
I assume, there's a task runner like grunt or gulp serving the page via BrowserSync (or similar). They use a different port than 80 to not interfere with an already occupied port by a local web server (apache, nginx,...).
This is just a port which rails is listening to. It depends on how you configure your rails server, and, IMHO does not mean anything useful. Sometimes you have to assign service to a different port because default port is occupied by some other service. Sometimes it is done by security reasons, so the hacker from outside world has to know the port you are using. But it's actually not very hard to know
Just to add to what the others have said: all network communications require an ip address (which can be got from a domain name like www.google.com) and a port number. However, if a port number is not supplied then the http server uses the default: this is usually port 80. So, if you were to go to "localhost" without a port, you are effectively saying "localhost:80". Your computer probably doesn't know what to do with this. If you say "localhost:8000", and there's a rails server there, then it will handle the request.

bind and ip aliasing

Ip Aliasing allows us to associate more than one ip address to the same interface. My question is how can one bind and hence receive the data from all of the addresses associated to an interface? Is there some option like INADDR_ANY available for the purpose?
Always remember that bind(2) does not bind to interfaces, but addresses.
Each socket generally only stores exactly one binding, even if that is 0.0.0.0 port 0. It is just that 0.0.0.0, :: and port 0 are taken as wildcards when checking incoming requests. As such, you will need one socket for non-wildcard addresses.
See setsockopt SO_BINDTODEVICE if you really need interface binding, but that is in general not the right thing to do in programs other than e.g. tcpdump, as it will inhibit contacting over different interfaces even if they allow reception. For example, if your own host has 192.168.0.1 as an address on a private LAN, binding to eth1 will make it impossible to connect to 192.168.0.1 from .0.1 itself over lo. Hence, device binding is usually undesired.
Try binding to the interface, using setsockopt and SO_BINDTODEVICE.

Difference between dot notation and string based IP

When setting the IP for where the client should connect,do I need to make distinguish between and IP like 208.56.123.1 and one like "www.domain.com" ?
IP is only the number.
So, 208.56.123.1 is IP, but www.domain.com is not - it's a symbolic name. Both are addresses, but only the number is IP.
Symbolic name will usually resolve to an actual IP using DNS server.
As to your question, will both work the same, the answer is - it only depends on how your client is implemented.
Both addresses should refer to the same location, though it might be better to target the symbolic name, because IP is more likely to change.
Depends on the use case. Most programming languages / network libraries come with built-in support for name resolution.
Low-level system calls like bind() or connect() do not support name resolution and require you to get the IP.

Resources