Code Talk - Networking
Low level talk about how information moves across the internet.
Why? Because we’re moving to AWS and Scot wants to try teaching this.
Types of addresses:
|IP address||Mac address|
|Related to geolocation (network location associated with physical location)||Hardwired to computer’s network card|
|Higher level (IP layer, layer 3)||Lower level (ethernet, layer 2)|
||48bit, usually represented in hex, example:
ifconfig - shows IP address, netmask, and more
$ ifconfig lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP> inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 nd6 options=201<PERFORMNUD,DAD> gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 stf0: flags=0<> mtu 1280 en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether a4:5e:60:d0:47:85 inet6 fe80::4b4:2f9:9d8c:bc76%en0 prefixlen 64 secured scopeid 0x4 inet 10.9.97.112 netmask 0xfffff800 broadcast 10.9.103.255 nd6 options=201<PERFORMNUD,DAD> media: autoselect status: active
ipcalc <ip address> <netmask> - tells you stuff about ip address and subnet
$ ipcalc 10.9.97.112 0xfffff800 Address: 10.9.97.112 00001010.00001001.01100 001.01110000 Netmask: 255.255.248.0 = 21 11111111.11111111.11111 000.00000000 Wildcard: 0.0.7.255 00000000.00000000.00000 111.11111111 => Network: 10.9.96.0/21 00001010.00001001.01100 000.00000000 HostMin: 10.9.96.1 00001010.00001001.01100 000.00000001 HostMax: 10.9.103.254 00001010.00001001.01100 111.11111110 Broadcast: 10.9.103.255 00001010.00001001.01100 111.11111111 Hosts/Net: 2046 Class A, Private Internet
brew install ipcalc if not already installed
Subnet is a neighborhood. Individual connections have IP addresses, grouped by subnet.
Local network communication
Local communication uses the Mac address.
Packet: data we’re sending across the internet, has many layers
Packet layers (inner to outer):
- JSON from application (for example)
- HTTP request
- IP address (both source and destination)
- Mac address (both source and destination)
Getting closer to hardware as we go outwards.
Scenario: on our local network, we want to send a packet to everyone in subnet
When sending packets in local network, we go from IP address to Mac address using ARP request. ARP request asks “who has this IP address?”, then whichever host responds “yes”. Then source host remembers destination host Mac address.
Get all address in local network:
$ arp -a ? (10.9.96.1) at 0:0:5e:0:1:14 on en0 ifscope [ethernet] ? (10.9.97.117) at e0:5f:45:8d:ea:b0 on en0 ifscope [ethernet] ? (10.9.97.127) at 64:b0:a6:e1:8e:f8 on en0 ifscope [ethernet] ? (10.9.97.201) at 60:f4:45:8c:56:af on en0 ifscope [ethernet] ? (10.9.97.209) at d4:61:9d:0:7c:c6 on en0 ifscope [ethernet]
Default gateway and routes
How to communicate outside our local network?
Our router is our default gateway. Check it out in System Preferences > Network > TCP/IP.
In our packet, Mac address is local router, and IP address is for example, Google’s IP address.
Check out routing tables using
$ netstat -nr Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 10.9.96.1 UGSc 39 0 en0 10.9.96/21 link#4 UCS 37 0 en0 10.9.96.1/32 link#4 UCS 1 0 en0 10.9.96.1 0:0:5e:0:1:14 UHLWIir 39 90 en0 1085 10.9.96.2 b0:c6:9a:77:c6:10 UHLWI 0 1 en0 1143 10.9.97.112/32 link#4 UCS 0 0 en0 10.9.97.127 64:b0:a6:e1:8e:f8 UHLWI 0 0 en0 545 10.9.97.201 60:f4:45:8c:56:af UHLWI 0 0 en0 1025 10.9.97.209 d4:61:9d:0:7c:c6 UHLWI 0 0 en0 763 10.9.97.225 e0:ac:cb:8c:d6:60 UHLWI 0 0 en0 752 10.9.97.227 0:24:36:b8:14:1a UHLWI 0 0 en0 830
Why do we need IP address AND Mac address to send stuff?
- IP addresses change
- When you boot, you don’t have an IP address
- Need Mac address to hit the right device (packet will go from device to device, moving towards one IP address)
Traffic crossing the internet
Methods we used to get our packet out of our local network are repeated for many other networks until we arrive at destination network and given to host.
Packet is reassembled each router it passes through, updating src Mac address and destination Mac address.
Example packet route:
IP dest 18.104.22.168
IP src 104.x.x.x
Mac address src=”your Mac address”
Mac address dest=gateway1
IP dest 22.214.171.124
IP src 104.x.x.x
Mac address src=gateway1
Mac address dest=gateway2
traceroute to see routers packet passes through.
$ traceroute google.com traceroute to google.com (126.96.36.199), 64 hops max, 52 byte packets 1 10.9.96.2 (10.9.96.2) 10.974 ms 1.879 ms 0.870 ms 2 188.8.131.52 (184.108.40.206) 2.047 ms 11.580 ms 2.100 ms 3 google-gw.customer.alter.net (220.127.116.11) 1.985 ms 2.070 ms 1.755 ms 4 * * * 5 18.104.22.168 (22.214.171.124) 2.976 ms 126.96.36.199 (188.8.131.52) 2.919 ms 184.108.40.206 (220.127.116.11) 7.841 ms 6 lga25s62-in-f14.1e100.net (18.104.22.168) 4.204 ms 2.743 ms 2.624 ms
Problem: we’re running out of IP address.
IPv4 is a 32bit address space, so limited to ~4 billion addresses. We’re pretty close to hitting that limit.
Solution: NAT (network address translations) gateways
NAT gateways turn local address spaces to public address spaces (aka publically routeable spaces).
In AWS, they use 1to1 NAT for almost everything with public IP address.