网络层:
网络层(network layer)是实现互联网最重要的一层。正是在网络层面上,各个局域网根据IP协议相互连接,最终构成覆盖全球的Internet。更高层的协议,无论是TCP还是UDP,必须通过网络层的IP数据包(datagram)来传递信息。操作系统也会提供该层面的套接字(socket),从而允许用户直接操作IP包。
IP数据包:
IP数据包简称为IP包。它是符合IP协议的0/1序列。信息包含在这一序列中。IP包分为头部(header)和数据(Data)两部分。数据部分是要传送的信息,头部是为了能够实现传输而附加的信息。
与帧类似,IP包的头部也有多个区域。我们将注意力放在源地址(source address)和目的地(destination address)。它们都是IP地址。IPv4的地址为4 bytes的长度(也就是32位)。我们通常将IPv4的地址分为四个十进制的数,每个数的范围为0-255,比如192.0.0.1就是一个IP地址。填写在IP包头部的是该地址的二进制形式。
IP地址是全球地址,它可以识别局域网和主机。这是通过将IP地址分类实现的。下图则为 IP 地址分类:
- 每个IP地址的32位分为前后两部分,第一部分用来区分局域网,第二个部分用来区分该局域网的主机。
- 子网掩码(Subnet Mask)告诉我们这两部分的分界线,比如255.0.0.0(也就是8个1和24个0)表示前8位用于区分局域网,后24位用于区分主机。由于A、B、C分类是已经规定好的,所以当一个IP地址属于B类范围时,我们就知道它的前16位和后16位分别表示局域网和主机。
网卡与路由器
网卡(NIC):
IP地址是分配给每个计算机的。但这个说法并不精确。IP地址实际上识别的是网卡(NIC, Network Interface Card)。
网卡是计算机的一个硬件,它在接收到网路信息之后,将信息交给计算机的CPU处理。当计算机需要发送信息的时,也要通过网卡发送。一台计算机可以有不只一个网卡,比如笔记本就有一个以太网卡和一个WiFi网卡。计算机在接收或者发送信息的时候,要先决定想要通过哪个网卡。
路由器:
路由器(router)实际上就是一台配备有多个网卡的专用电脑。它让网卡接入到不同的网络中。他专门负责与多个网络之间的寻址与通信。跨网段的数据通信一般都会经过路由器
路由寻址:
IP包的传输要通过路由器的接力。每一个主机和路由中都存有一个路由表(routing table)。路由表根据目的地的IP地址,规定了等待发送的IP包所应该走的路线。
始发:
比如我们从主机145.17生成发送到146.21的IP数据包,剩下数据部分可以是TCP包,可以是UDP包,我们暂时不关心。注明目的地IP地址(199.165.146.21)和发出地IP地址(199.165.145.17)。主机145.17随后参照自己的路由表,看到路由表中的记录:
145.17 routing table (Genmask为子网掩码,Iface用于说明使用哪个网卡接口)
这里有两行记录:
- 第一行,如果IP目的地是199.165.145.0这个网络的主机,那么只需要自己在eth0上的网卡直接传送(“本地社区”:直接送达),不需要前往路由器(Gateway 0.0.0.0 = “本地送信”)。
- 第二行,所有不符合第一行的IP目的地,都应该送往Gateway 199.165.145.17,也就是中间路由器接入在eth0的网卡IP地址。因为 目的地址和子网掩码全为 0.0.0.0 是缺省路由(当匹配不到路由明细时,就会往这个接口发出)
中转
我们的IP包目的地为199.165.146.21,不符合第一行,所以按照第二行,发送到中间的路由器。主机145.17会将IP包放入帧的payload,并在帧的头部写上199.165.145.17对应的MAC地址,这样,就可以在局域网中传送了。
中间的路由器在收到IP包之后(实际上是收到以太协议的帧,然后从帧中的payload读取IP包),提取目的地IP地址,然后对照自己的路由表:
送达:
数据包的目的地符合第二行,所以将IP放入一个新的帧中, 在帧的头部写上199.165.146.21的MAC地址,直接发往主机146.21。
总结:
这样,我们就完成了“路由”的过程。整个过程中,IP包不断被主机和路由封装入帧并拆开,然后借助连接层,在局域网的各个NIC之间传送帧。整个过程中,我们的IP包的内容保持完整,没有发生变化(有变化的是TTL值、FCS校验码等字段)。最终的效果是一个IP包从一个主机传送到另一个主机。利用IP包,我们不需要去操心底层(比如连接层)发生了什么。
路由协议:
之前的信息传递基于一个假设:每个人手里都有份准确的地图。用计算机的话来说,就是每个主机和路由上都已经有一张路由表。这个路由表描述了网络上的路径信息。如果你了解自己的网络连接,可以手写自己主机的路由表。但是,一个路由器可能有多个出口,所以路由表可能会很长。更重要的是,周围连接的其他路由器可能发生变动(比如新增路由器或者拓扑变更),我们就需要路由表能及时将交通导向其他的出口。我们需要一种更加智能的探测周围的网络拓扑结构,并自动生成路由表—— 路由协议
一些比较出名的路由协议有: OSPF、BGP、ISIS 等
这里不过多介绍,不然可以讲一天 =.=