一、网络层概念
首先需要对网络层需要了解一个非常重要的概念,这里的网络指的是什么网络。其实就是前面所说的互联网,也就是互相连接的局域网。如果单纯的用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报文格式

最外层是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 协议
三、网关
3.1 网关的概念
我们都知道互联网是局域网的互相连接,那么网关在互联网中扮演什么角色呢?很明显,网关负责将不同的互联网相连接。
3.2 路由的概念
路由的概念,其实可以简单的理解为数据包的地图导航,通过路由规则,可以让数据包发往下一跳节点,不断地根据路由导航,最终访问到想要访问的机器。可以通过如下命令查看所有的路由。
route -n
3.3 默认路由、静态路由和动态路由
可以通过如下命令添加一个默认路由,默认路由的作用就是当找不到其他所有路由的时候,会选择的一个路由,一般静态路由设置的是网关。
route add default gw ${ip} ${dev}
可以通过如下命令静态路由,静态路由的作用当有一些特殊的路由学不到的时候,需要配置静态路由。
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。
