网络基础——IP协议
宽带上网是如何实现的
网络层是TCP/IP的心脏,主要负责终端节点之间的通信,把网络报从源主机发送到目标主机,所以这种通信也叫点对点的通信。
网络层的作用
数据链路层只能在同一数据链路上的节点通信,一旦跨越多个数据链路,就要借助网络层,才能通信。网络层可以跨越不同的数据链路,实现两个节点之间的通信。
IP地址
在计算机网络通信中,为了识别通信对端,需要一个类似于地址的标识码对节点进行标识,就好比找一个需要门牌号,MAC地址用于标识同一链路的不同计算机,而网络层用于表示地址信息的是IP地址。
IP地址用于再连接到网络的主机中识别出进行通信的目标地址,因此,在TCP/IP中所有主机或路由器都必须设定自己的IP地址。IP是TCP/IP通信的基石。
公网IP与私有IP
起初,互联网中主机和路由器都配置有一个唯一的IP地址,随着互联网发展,IP地址严重不足,于是有了一种新的技术,不要求每台计算机或路由器都分配一个固定的ip,而是在必要的时候职位相应数量的设配分配唯一的IP。
包含在这个范围内的IP都属于私有IP,其他成为全局IP,也叫公网IP。
公网IP地址基本要在整个互联网内保持唯一,但私有IP不需要,只要在同一局域网内保持唯一即可。在不同域内出现相同的私有IP不影响使用。
家用宽带上网实现
服务提供商动态的为需要上网的用户分配公网IP,每次重连该IP地址可能发生变化。IP会分配到路由器上,而我们通过有线或无线连接到路由器的手机或电脑的IP地址则是有DHCP动态分配的私有IP地址。
IP地址详解
IP地址格式
IP地址分为ipv4和ipv6两种类型。本文主要基于ipv4来说
ipv4地址有32位的二进制数字标识,为了方便记录按照八位分一组,分为四组,转为10进制就是我们现在看到的样子。
IP地址一般配置在网卡上,一般一块主机网卡会配置一个IP地址(可多个),而路由器会配置两块以上的网卡(因为路由器连接的是两个网段)
IP地址的组成
IP地址由网络地址和主机地址两部分组成。
网络地址用于标识当前节点所在的局域网,主机地址用于标识同一局域网不同的主机。
IP地址分类
按照网络层次和规划的子网大小,通常将IP地址分为一下4类。
- A 类地址:首位以 0 开头,第 1-8 位是网络地址,后24位是主机地址,
0.0.0.0~127.0.0.0
是 A 类的网络地址,可容纳 16777214(224-2) 个主机地址; - B 类地址:前两位以 10 开头,第 1-16 位是网络地址,后 16 位是主机地址,
128.0.0.0~191.255.0.0
是 B 类的网络地址,可容纳 65534(216-2) 个主机地址; - C 类地址:前三位以 110 开头,第 1-24 位是网络地址,后 8 位是主机地址,
192.168.0.0~239.255.255.0
是 C 类的网络地址,可容纳 254(28-2) 个主机地址; - D 类地址:前四位以 1110 开头,第 1-32 位是网络地址,没有主机地址,
224.0.0.0~239.255.255.255
是 D 类的网络地址,常用于多播;
全部为0标识对应的网络地址或IP地址不可获知,都为1的主机地址通常为广播地址。
子网掩码
如果以上面的A、B、C三类划分子网的话,划分出的子网太少了也存在这极大的ip浪费。
通过一种叫做子网掩码
的识别码将子网网络地址细分为A、B、C类粒度更小的网络。这种方式会将原来的A、B、C类主机地址的一部分也作为网络地址,从而让IP地址的网络地址和主机地址不再受限于IP地址的分类,将原有的网络划分为更多的子网。
子网掩码和 IP 地址一样也是由 32 位二进制数表示,格式和 IP 地址类似,只不过其对应 IP 地址网络地址部分的位都是 1,主机地址部分的位都是 0,我们将 IP 地址与子网掩码做按位与运算,就可以计算出该 IP 地址的网络地址部分。
广播地址和环回地址
广播地址用于同一局域网中相互连接的主机间发送数据,IP地址中的主机地址全部设置为1,就成为了广播地址。本地广播会被路由器屏蔽,不会到达外部网络。
环回地址是在同一台计算机内部的程序之间进行网络通信时所使用的默认地址,一般使用一个特殊的 IP 地址 127.0.0.1
作为环回地址,该地址还有一个与之具有相同意义的主机名 localhost
,使用这个 IP 地址或主机名,数据包不会流向网络。
路由控制详解
路由控制定义
发送数据包时使用地址就是IP地址,仅有IP地址还不足以将包发送到目标地址,在数据包发送过程中还需要指明下一跳路由或主机,以便发往最终目标地址。
跳:是网络中的一个区间(网段),在以太网等数据链路中使用MAC地址传输数据帧,此时的一跳指的是源MAC地址到目标MAC地址之间传输帧的区间。也就是说它是主机或路由器网卡不经过其他路由器而能直接到达的相邻主机或路由器网卡之间的一个区间。
为了将数据包发送给目标主机,所有主机和路由器都维护着一张路由控制表,该表记录IP数据在下一步应该发送给哪个路由器,IP数据包将根据这个数据表在各个数据链路上传输。
路由控制流程
从源主机10.1.1.30发送一个数据包到目标主机10.1.2.10,由于10.1.2.10的网络地址与源主机10.1.1.0/24的网络地址不匹配,所以数据包被转发到路由器,路由器的路由控制表中已经存在10.1.2.0/24的网络地址映射,则直接将请求转发到对应的路由器,如果目标主机IP地址在该路由器所在的数据链路中,再将数据包发送过去,就完成了将数据包发送到目标主机的流程。
IP报文头格式
通过IP协议进行网络通信时,需要在数据前面加一个IP头信息,包含着基于IP协议进行发包控制时所有的必要信息:
- 版本:用于标识IP头部的版本号,ipv4版本号即为4
- 首部长度:IP头部的大小,单位为4字节
- 区分服务:用来表示服务质量,IP协议本身是一种尽力服务的协议,无法保证通信质量。DSCP 字段用于在通过 DiffServ 控制网络质量的时候设置包的优先级;ECN 则主要用于网络通信中的显式拥塞通知。
- 总长度:IP头部与数据部分结合起来的总字节数,最大65535
- 标识:用于IP包分片重组,不同分片标识值不同
- 标志:表示包被分片的相关信息
- 片偏移:用来标识被分片的每一个分段相对于原始数据的位置。以上三个字段用于 IP 包的分片与重组。
- 生存时间:最初设计为网络包的有效时间,实际用于可以中转多少个路由器,每经过一个路由器,TTL值减1,直到为0则丢弃该包。
- 协议:标识 IP 首部的上一层首部隶属于哪个协议,比如 TCP 或 UDP
- 首部校验和:只校验数据报的首部,不校验数据部分,主要用来确保 IP 数据报不被破坏。
- 源地址:发送端 IP 地址。
- 目标地址:接收端 IP 地址。
- 可选项:通常在实验或诊断时才使用。
- 填充:在有可选项的情况下,首部长度可能不是32位的整数倍,通过向该字段填充0,将其调整为32位整数倍,以方便计算机进行处理。
- 数据:传输的具体数据
IP地址是如何自动分配的
DHCP的引入
DHCP:动态主机配置协议。
DHCP的工作原理
使用DHCP之前,需要现在局域网内假设一台DHCP服务器,然后将DHCP所要分配的IP地址设置到服务器上,此外,还需要将子网掩码、路由控制、DNS服务器地址等信息也设置到服务器上。
新加入的机器或设备(DHCP客户端)使用IP地址0.0.0.0
发送一个广播包,目标IP地址为255.255.255.255
(广播地址)。广播包里包含了该机器的MAC地址,请求DHCP服务器为其分配IP地址。
DHCP服务器收到广播后会通知新加入的机器可用的网络设置(通过MAC地址确定唯一),包括IP地址,子网掩码,网关等信息,这个通知仍然以广播形式发送,因为这个时候新机器还没有分配IP地址,此时DHCP就已经将这个IP地址标记为已分配,其他机器将无法获取到这个IP.
新机器拿到这个IP地址后,会给DHCP服务器发送一个DHCP请求,表示接受这个DHCP服务器分配的IP地址,此时还是使用广播包,DHCP服务器收到请求后,会返回给新机器一个DHCP ACK消息包,新机器收到消息后,有操作系统完成IP地址分配。
当新机器离开这个网段时,会发送 DHCP 解除包让这个 IP 地址回到 DHCP IP 地址池,以便其他新接入设备使用。
之所以分成两个阶段,是因为当有多台 DHCP 服务器时,新机器只会选中其中一个服务器分配的 IP 地址,一般是最先到达的那个,客户端发起第二次广播请求,还会告知其他服务器,我已经选择了某一台 DHCP 服务器分配的地址,其他服务器分配的 IP 地址可以回收给其他客户端使用。
域名与IP地址是如何映射的
DNS服务器
以v.qq.com
为例其中 qq表示固有域名,com表示顶级域名,固有域名和顶级域名通过.分隔,v称作二级域名。
域名一般通过在域名服务商那里注册获取,然后域名与IP地址的映射也是在域名服务商那里完成。映射之后,就可以通过域名与对应的主机通信了。
DNS服务器指的是管理域名的主机或软件,它可以管理所在分层的域名信息:
- 根DNS服务器:返回顶级域DNS服务器的IP地址
- 顶级域DNS服务器:返回权威DNS服务器的IP地址
- 权威DNS服务器返回固有域名对应主机的IP地址
每一个分层都设有 DNS 服务器,各层 DNS 服务器都了解该层以下分层中所有 DNS 服务器的 IP 地址,所有 DNS 服务器又都了解根 DNS 服务器的 IP 地址,以便在当前分层找不到映射的 IP 地址时,跳转到根 DNS 服务器从上往下继续查找。
DNS查询原理
- 用户在浏览器中输入
www.baidu.com
访问百度首页,计算机会先从本地hosts
文件或 DNS 缓存解析器中查询有无相应的 IP 地址映射记录,如果有的话直接返回,否则进入下一步; - 将域名发给本地 DNS 服务器(通过 DHCP 配置,一般由宽带运营商自动分配)进行查询,如果缓存中有记录则返回对应 IP 地址,否则进入下一步;
- 将域名发给根 DNS 服务器进行查询,根 DNS 服务器不会直接解析域名,但是会返回查询域名对应顶级域名 DNS 服务器的 IP 地址,比如这里是
.com
; - 然后本地 DNS 服务器会到
.com
顶级域名服务器查询,顶级域 DNS 服务器会根据查询域名返回baidu.com
对应的权威 DNS 服务器的 IP 地址; - 接下来,本地 DNS 服务器根据返回的权威 DNS 服务器的 IP 地址去对应的服务器(域名解析出处)进行查询,这一次就可以获取到
www.baidu.com
域名对应的 IP 地址了,拿到这个 IP 地址,就可以将其返回给对应的计算机。
IP地址与MAC地址是如何映射的
ARP的引入
在数据链路底层节点通信是根据MAC地址来的。只有知道每个IP地址对应的MAC地址才能把数据包发送给目标主机。通过IP地址获取MAC地址就需要借助ARP,ARP是一种地址解析协议。以目标IP为条件,来定位下一个应该接收数据包的网络设备的MAC地址,如果MAC地址不存在,意味着目标主机不在该网段内,接着通过ARP查找下一跳路由器的MAC地址。
ARP的工作原理
主机A为了获取主机B的MAC地址,首先通过广播发送一个ARP请求包,这个请求包中包含了B主机的IP地址,由于广播会被同一数据链路上的所有主机和路由器接收,因此ARP的请求包会被这个链路上的所有主机和路由器进行解析,如果ARP请求包中的目标IP与自己IP地址一样,则将自己的MAC地址塞入ARP响应包返回给主机A,有了IP地址和MAC地址就可以完成链路内的IP通信。
接收ARP请求的主机也可以从ARP请求包获取发送端主机的MAC地址。
IP地址与MAC地址对比
整个互联网就是通过路由器将一个个网段连接起来的。同一网段内通过MAC地址即可通信,但是跨网段的通信需要通过IP地址。
ping的底层工作原理
ping与ICMP
ping
是基于ICMP进行工作的,ICMP——互联网控制报文协议。
ICMP的主要功能包括,确认IP包是否成功发送到目标地址,通知在发送过程中IP包被废弃的原因,改善网络设置。
ICMP报文类型
ping工作原理
ping
命令执行的时候,源主机首先会构建一个 ICMP 请求数据包,ICMP 数据包内包含多个字段。最重要的是两个,第一个是类型字段,对于请求数据包而言该字段为 8
;另外一个是顺序号,主要用于区分连续 ping
的时候发出的多个数据包。每发出一个请求数据包,顺序号会自动加 1
。
然后,由 ICMP 协议将这个数据包连同地址 220.181.57.216
一起交给 IP 层。IP 层将以 220.181.57.216
作为目的地址,本机 IP 地址作为源地址,加上一些其他控制信息,构建一个 IP 数据包。
接下来,需要加入 MAC 头,最后将它们传送出去。
主机 B 收到数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。
主机 B 会构建一个 ICMP 应答包,应答数据包的类型字段为 0
,顺序号为接收到的请求数据包中的顺序号,然后再发送出去给主机 A。
在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达(类型 3
);如果接收到了 ICMP 应答包,则说明目标主机可达。
为了安全起见,某些机器和设备是禁止被 ping
的,所以,ping
不通并不意味着一定是网络不通,对于禁止 ping
命令的主机,需要通过 telnet
命令测试是否可以连接。
通过NAT技术实现公网IP与私有IP地址间的转换
在 NAT 路由器(即本地网络与外部网络连接的路由器)内部有一张自动生成的用来转换地址的表,当 10.0.0.10
(私有IP) 向 163.221.120.9
(公网IP) 发送第一个包时生成这张表,并按照表中的映射关系进行处理。
当私有网络内的多台机器同时都要与外部通信进行通信时,仅仅转换 IP 地址,人们不免担心公网 IP 地址是否够用,这时采用包含端口号一起转换的方式可以解决这个问题:
即在通过 NAT 路由器做 IP 地址转化时将本地网络中不同主机转化为同一个 IP 地址,而将端口号转化为不同端口号,以示区别。
这里需要注意的是,在使用 TCP 或 UDP 的通信中,只有当目标地址、源地址、目标端口、源端口以及协议类型(TCP或UDP)五项内容都一致时才被认为是同一个通信连接。