一、网络层概念

首先需要对网络层需要了解一个非常重要的概念,这里的网络指的是什么网络。其实就是前面所说的互联网,也就是互相连接的局域网。如果单纯的用mac地址作为id去发送,那么网络中将充满无数的包,因为对于N个网络节点,如果没有剪枝,那么报文的复杂度将为2^N次方,复杂度是不可想象的,那么如何解决这个问题呢?网络层应运而生。下面开始介绍IP地址。

二、IP地址

首先需要知道的是,IP地址总共32位,这里以ipv4举例。IP地址还分为了公网IP地址以及私网IP地址,在云中公网IP的流量称之为南北向,私网流量称之为东西向。

2.1 私网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

    2.2 IP报文格式

    image.png
    最外层是MAC头,接下来一层就是IP头,重点介绍一下TOS,

    2.3.1 TOS的几种类型

  • 具体内容见IP头详解https://www.yuque.com/pib29a/zpfge3/dtq48u

    2.3.2 标识

    当发送的数据包需要分片发送的时候,需要设置相同的标识,用来标识源自于同一个数据包。

    2.3.3 片偏移

    配合标识一起使用,用于标识报文在数据包中位置。

    2.3.4 TTL

    报文的存活时间,每经过一个路由器,就-1,当TTL为0时,会被路由器丢包。

    2.3.5 协议

    使用IP报文的协议,常见的有TCP、UDP、ICMP等等。

    三、网关

    3.1 网关的概念

    我们都知道互联网是局域网的互相连接,那么网关在互联网中扮演什么角色呢?很明显,网关负责将不同的互联网相连接。

    3.2 路由的概念

    路由的概念,其实可以简单的理解为数据包的地图导航,通过路由规则,可以让数据包发往下一跳节点,不断地根据路由导航,最终访问到想要访问的机器。可以通过如下命令查看所有的路由。

    1. route -n

    3.3 默认路由、静态路由和动态路由

    可以通过如下命令添加一个默认路由,默认路由的作用就是当找不到其他所有路由的时候,会选择的一个路由,一般静态路由设置的是网关。

    1. route add default gw ${ip} ${dev}

    可以通过如下命令静态路由,静态路由的作用当有一些特殊的路由学不到的时候,需要配置静态路由。

    1. route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
  • add 增加一条路由

  • del 删除一条路由
  • net 添加网段路由
  • host 添加主机路由
  • target 目标网络和主机
  • gw:路由数据通过的网关
  • dev 路由通过的网络接口

动态路由是不断的学习到的路由。动态生成的。比如向网关学习。

3.3 局域网之内通信

3.3.1 同局域网通信

对于一个网络包,首先网络设备会检测目标IP地址是否和自己一个网段,如果是同一个网段,那么发现是同一个局域网,那就直接开始封装IP头,交给二层,二层去看ARP表,没有就发起ARP协议,获取dest mac,封装二层头,然后就直接发送了,同局域网是不经过网关的。

3.3.2 不同局域网通信。

如果网络设备检测到目标IP地址和自己不是一个网段。那就涉及到路由协议了,首先去查fib表,从精确地开始查起,什么是精确的?子网掩码越大,越精确。也就是网络号越长越精确。查看路由协议,如果找到对应的路由协议,确认了发往的目的地址,比如是这个局域网的网关,那么就开始查ARP表,封装MAC层。比如你是192.168.1.3,你想发往192.168.40.3,需要走的网关是192.168.1.1,那么封的包格式就如下:

  • 源IP是192.168.1.3
  • 目的IP是192.168.40.3
  • 源MAC就是192.168.1.3的MAC
  • 目的MAC是192.168.1.1网关的MAC。

当路由器收到你的数据包的时候,剥开二层头,发现目的IP是192.168.40.3,然后也是查找路由表,发现有一条路由指向了这个网段的地址,找到了发往的机器,就开始封包了,

  • 源IP和目的IP一直没动
  • 源MAC变成了192.168.1.1网关的MAC
  • 目的MAC变成了192.168.40.1网关的MAC

40.1的网关收到报文,之后同样,拆开报文,发现目的IP是和自己同一个网段,就不同走路由协议了,直接查ARP表,直接开始封装二层头,发给目标机器。

  • 源IP和目的IP一直没动
  • 源MAC变成了192.168.40.1网关的MAC
  • 目的MAC变成了192.168.40.3的MAC

这样数据包就到了目标机器了,等目标机器处理完消息,回复给源地址。流程差不多类型,唯一的不同就是,源IP和目的IP都是反过来的。
在云中就是通过这种方式打通两个局域网。称之为peering。

3.4 自己的电脑是如何上网的呢?

我们都知道,我们可以买个宽带,配个路由器,然后设置个DHCP,就可以连上网了。首先DHCP可以动态的向路由器申请一个IP地址的租约。当你访问一个网站的时候,路由器会通过NAT技术,将源IP,更改为一个公网地址,我们知道,私网地址只有在局域网中可以生效,当网络包发送到公网上的时候,源IP需要为公网的IP,否则包是可以发出去,但是回不来,因为人家根本不认识私网地址,除非配置了peering专线。
当经过路由器的时候,路由器会将你的请求保存下来,然后更改源IP为自己绑定的公网IP,发送出去,等网络包返回的时候,查找是谁发送的,然后更改目的IP为保存的源IP,这样,你请求的数据包的结果返回给了你。这个过程称之为SNAT。当然,除了客户端SNAT上网之外,现在很火的弹性公网IP,这个其实是通过DNAT实现的,当公网绑定为某个服务器的时候,网关通过DNAT,根据DNAT规则,修改目的IP,然后等机器返回的时候,在将源IP更改为公网IP,这样数据包就返回了。
除了SNAT和DNAT,还有一种FullNat,其实就是SNAT + DNAT,同时改变源IP和目标IP。