面向程序员的网络基本知识 - IP地址

Github

本系列文章旨在向程序员分享一些网络基本知识,让程序员具备基本的网络常识,以便与网络工程师沟通。本系列文章不会涉及如何组建网络、如何配置交换机/路由器等硬件相关的内容,所以不适合想考CCNA/HCNA证书的人士。

IP地址

IP地址,多么熟悉啊,比如192.168.1.1就是一个IP地址,但你可能未必知道IP地址的含义,本文将分享给你一些IP地址相关的基础知识。

IP地址的结构

事实上192.168.1.1这样的IP地址是一个IPv4地址,IPv4地址实际上是由4个字节组成,回想一下一个字节(byte)多少位(bit)来着?192.168.1.1实际上是二进制11000000.10101000.00000001.00000001的十进制表达。所以IP地址的最大值也就是255.255.255.255——11111111.11111111.11111111.11111111

所以在读下去之前请记住:IP地址是由4个字节组成,IP地址是二进制的。

network id和host

IP地址包含了两个信息:

  • network id,当前主机所属的二层网络
  • host,当前主机在二层网络中的ID

但是我们怎么从IP地址的4个字节中提取这两个信息呢?这就需要子网掩码(Subnet Mask)了。

子网掩码和IP地址一样也是4个字节,区别在于它的二进制形式中的1必须从左到右且连续,比如255.255.255.0的二进制是11111111.11111111.11111111.0254.255.255.0不是一个合法的子网掩码,因为它的二进制是11111110.11111111.11111111.0,1没有连续。1.255.255.0也不是一个合法的子网掩码,因为它的二进制是00000001.11111111.11111111.0,1不是从最左侧开始的。

我们在来看192.168.1.1的network id和host,它的子网掩码是255.255.255.0,为了简便起见,我们用子网掩码中的1的数量来表示:192.168.1.1/24

ip          : 11000000.10101000.00000001.00000001 (192.168.1.1)
subnet mask : 11111111.11111111.11111111.00000000 (255.255.255.0)
network id  : 11000000.10101000.00000001.00000000 (192.168.1.0)
host        : 00000000.00000000.00000000.00000001 (1)

我们把子网掩码和IP地址Bit AND一下,得到network id=192.168.1.0 ,把子网掩码取反码和IP地址Bit AND一下,得到host=1

那我们知道network id有什么用呢?当我们试图做网络通信的时候,操作系统会计算出源IP的network id和目标IP的network id,如果两者一样就说明在同一个二层网络,如果不一样则说明不在同一个二层网络,那么数据就会发送给路由器处理(回忆网络模型及网络设备的内容)。

IP地址类型

IP地址是分类型的,有:

  • A类:1-126.xxx.xxx.xxx / 8
  • B类:128-191.xxx.xxx.xxx / 16
  • C类:192-223.xxx.xxx.xxx / 24
  • D类:224-239.xxx.xxx.xxx
  • E类:240-255.xxx.xxx.xxx
  • loopback:127.xxx.xxx.xxx

不过我们一般都只会接触到A、B、C三类加一个loopback地址。

私有IP地址

在A、B、C三类IP地址中有部分地址保留为私有地址,Internet上的网络设备均不会接受、发送或者转发属于私有地址的源IP地址或目的IP地址。私有IP地址的范围是:

  • A类:10.0.0.0 ~ 10.255.255.255
  • B类:172.16.0.0 ~ 172.31.255.255
  • C类:192.168.0.0 ~ 192.168.255.255(这个很熟悉吧)

参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逻辑熊猫带你玩Python

Python | “Python太火,我都不敢不把这些告诉你”

之前说过,小编现在使用的环境是ubuntu server 16.04 LTS。默认安装的应用面没有python2.x,由于越来越多的平台弃用python2,所以...

1284
来自专栏练小习的专栏

关于flex布局的目前兼容性写法

flex虽然使用起来很方便,但是他的兼容性由于历史版本的原因,一直很让人头疼,低版本IE就不用说了,webkit目前也不是所有版本都能支持同一写法,测试半天之后...

3027
来自专栏北京马哥教育

setup.py即将下岗,PEP 518 说明继任者

2687
来自专栏逆向与安全

漏洞分析入门一

0x00: 什么是漏洞及漏洞分类 1. 漏洞是指信息系统在生命周期的各个阶段(设计、实现、运维等过程)中产生的某类问题,这些问题会对系统的安全(机密性、完整性、...

1992
来自专栏JackieZheng

十分钟带你了解服务化框架

在此之前 在此之前,你需要知道中间件的概念,可能在过往的从业生涯这个名词无数次的从你的眼前、耳畔都留下了足记,但是它的样子依然很模糊。 今天要说的服务化框架其...

1978
来自专栏北京马哥教育

用Python+MySQL实现2017年web日志分析报告

日志分析在web系统中故障排查、性能分析方面有着非常重要的作用。目前,开源的ELK系统是成熟且功能强大的选择。但是部署及学习成本亦然不低,这里我实现了一个方法上...

4157
来自专栏醒者呆

Go并发模式:管道与取消

关键字:Go语言,管道,取消机制,并发,sync.WaitGroup,包引用,通道,defer,select GO并发模式:管道与取消 简介 Go的并发能...

3086
来自专栏用户2442861的专栏

Java线程池管理及分布式Hadoop调度框架搭建

摘要:多线程一直不是件容易的事情,然而开发过程却又经常碰到,有时甚至还会被作为考校程序员实力的一个指标。这样一来,多线程已然成为一道必须迈过的砍!

2053
来自专栏FreeBuf

一名代码审计新手的实战经历与感悟

blueCMS介绍 个人认为,作为一个要入门代码审计的人,审计流程应该从简单到困难,逐步提升。因此我建议大家的审计流程为——DVWA——blueCMS——其他小...

4106
来自专栏Golang语言社区

Golang的GC信息

使用方法,如果程序为myserver。正常的启动方法为./myserver,如果需要收集GC信息启动方式如下GODEBUG=gctrace=1 ./myser...

1202

扫码关注云+社区

领取腾讯云代金券