IP,ARP,RIP和BGP协议
前言
今天还是接着学习计算机网络方面的内容,争取在开学之前先把计算机网络的内容过一遍,JAVA学过一点,但是不精通,能看懂一些简单的代码,仅此而已,大三就只有三门课,数据库,网络,JAVA,好好学,别放弃,最近腰疼的厉害,可能是那天找女朋友的原因,爬山去了,累了个半死,回来就腰疼了.唉,身体跟不上了,身体是革命的本钱,保护好自己的身体,说不定将来买苹果的时候用到了呢...
网络层是实现互联网的最重要的一层.正是网络层面上,各个局域网根据IP协议相互连接,最终构成覆盖全球的因特网.更高层的协议,无论是TCP还是UDP,必须通过网络层的IP数据报(datagram)来传递信息.OS也会提供盖层的socket,从而允许用户直接操作IP包.
IP数据包是符合IP协议的信息(也就是0/1序列),我们后面简称IP数据包为IP包.IP包分为头部(header)和数据(Data)两部分.数据部分是要传送的信息,头部是为了能够实现传输而附加的信息(这与以太网帧的头部功能类型,如果对帧感到陌生,看前面)
IP包的格式
IP协议可以分为IPV4和IPV6两种,IPV6是改进版本,用于在未来取代IPV4协议.咱们先以IPV4为例,下面是IPV4的格式:
与帧类似,IP包的头部也有多个区域.我们将注意力放在红色的发出地(source address)和目的地(destination address).他们都是IP地址.IPV4的地址为4 bytes的长度(也就是32位).我们通常将IPV4的地址分为4个十进制的数,每个数的范围为0-255,比如192.0.0.1就是一个IP地址.填写在IP包头部的是该地址的二进制形式.
IP地址是全球地址,它可以识别”社区”(局域网)和”房子”(主机).这是通过将IP地址分类实现的.(这一点前面我说了).
类型 | 起始范围 | 终止范围 | 子网掩码 |
A | 1.0.0.0 | 126.255.255.255 | 255.0.0.0 |
B | 127.0.0.0 | 191.255.255.255 | 255.255.0.0 |
C | 192.0.0.0 | 223.255.255.255 | 255.255.255.0 |
每个IP地址的32位分别为前后两部分,第一部分用来区分局域网,第二部分用来区分该局域网的主机.子网掩码(Subnet Mask)告诉我们这两部分的分界线,比如255.0.0.0(也就是8个1和24个0)表示前八位用于分区局域网,后24位用于区分主机.由于A,B,C分类已经规定好,所以当一个IP地址属于B类范围时,我们就知道它的前16位和后16位分别表示局域网和主机.
网卡与路由器
IP地址是分配给每个房子(计算机)的”邮编”.但这个说法并不精确.IP地址实际上识别的是网卡(NIC).网卡是计算机的一个硬件,它在接受到网络信息之后,将信息交给计算机(处理器/内存).当计算机需要发送信息的时候,也要通过网卡发送.一台计算机可以有不止一个网卡,比如计算机就有一个以太网卡和一个WiFi网卡.计算机在接受或者发送信息的时候,要现决定想要通过哪个网卡.
路由器实际上就是一台配备有多个网卡的专用电脑.它让网卡接入到不同的网络中,这样,就构成了”邮局”的概念.比如下图中位于中间位置的路由器有两个网卡,地址分别为199.165.145.17和199.165.146.3 . 他们分别接入到两个网络199.165.145和199.165.146 .
IP包接力
IP包的传输要通过路由器的接力.没一个主机和路由中都存在一个路由表,路由表根据目的地的IP地址,规定了等待发送的IP包所应该走的路线.
比如我们从主机147.17生成发送到146.21的IP包:铺开信封,写好信号的开头(剩下的数据部分可以是TCP包,也可以是UDP包,也可以是任意乱写的字,咱们不关心这个),注明目的地IP地址(199.165.146.21)和发出地IP地址(199.165.145.17).主机145.17随后参照自己的路由表(routing table),里面有三行记录:
145.17 路由表(Genmask为子网掩码,Iface用于说明使用哪个网卡接口,Gateway为网关,Destination为目的地址)
Destination | Gateway | Genmask | Iface |
199.165.145.0 | 0.0.0.0 | 255.255.255.0 | eth0 |
0.0.0.0 | 199.165.145.17 | 0.0.0.0 | eth0 |
分析:这里有两条记录.
第一条表示,如果IP目的地址是199.165.145.0这个网络的主机,那么只需要自己在eth0上的网卡直接传送(“本地社区”:直接送达),不用前往router(Gateway 0.0.0.0=”本地送信”).
第二行表示所有不符合第一行的目的IP地址,都应该送往Gateway 199.165.145.17,也就是中间router接入在eth0的网卡Ip地址(邮局在eth0的分支).
我们的IP包目的地为199.165.146.21,不符合第一行,所以按照第二行,发送到中间的router.主机145.17会将IP包放入帧的payload,并在帧的头部写上199.165.145.17对应的MAC地址,这样,就可以按照小喇叭那一讲中的方法在局域网中传送了.
中间的router在收到IP包之后(实际上是收到以太协议的帧,然后从帧中的payload读取IP包),提取目的地IP地址,然后对照自己的routing table:
Destination | Gateway | Genmask | Iface |
199.165.145.0 | 0.0.0.0 | 255.255.255.0 | eth0 |
199.165.146.0 | 0.0.0.0 | 255.255.255.0 | eth1 |
0.0.0.0 | 199.165.146.8 | 0.0.0.0 | eth1 |
从前两行我们看到,由于router横跨eth0和eth1两个网络,它可以直接通过eth0和eth1上的网卡直接传送IP包.
第三行表示,如果是前面两行之外的IP地址,则需要通过eth1,送往199.165.146.8(右边的router).
我们的目的地符合第二行,所以将IP放入一个新的帧中.
在真的头部下上199.165.146.21的MAC地址,直接发送到主机146.21.(在linux下,可以使用$route -n来查看routing table)
IP包可以进一步接力,到达更远的主机.IP包从主机出发,格局沿途路由器路由表(routing table)指导,在router间接力.IP包最终到达某个router,这个router与目标主机唯一同一局域网中,可以直接建立链接层的通信.最后,IP包被送到目标主机.这样一个过程叫做routing(IP包接力,因为路由这个词包含的含义太多了)
整个过程中,IP包不断的被主机和路由装入帧(信封)并拆开,然后借助链接层,在局域网的各个NIC之间传送帧.整个过程中,我们的IP包的内容保持完整,没有发生变化.最终的效果是一个IP包从一个主机传送到另一个主句.利用IP包,我们不需要去关心底层(比如链接层)发生了什么.
ARP协议
在上面的过程中,我们实际上假设了,每一台主机和路由都能了解局域网内的IP地址和MAC地址的对应关系,这是实现IP包封装到帧的基本条件IP地址与MAC地址的对应是通过ARP协议传播到局域网的每个主机和路由.每一台主机或路由中都有一个ARP cache,用以存储局域网内的IP地址和MAC地址如何对应.
ARP协议(ARP介于链接层和网络层之间,ARP包需要包裹在一个帧中)的工作方式如下:主机会发出一个ARP包,该ARP包中包含有自己的IP地址和MAC地址.通过ARP包,主机以广播的形式询问局域网上所有的主机和路由:我是IP地址xxxx,我的MAC地址是xxxx,有人知道199.165.146.4的MAC地址吗?拥有该IP地址的主机会回复发出请求的主机:哦,我知道,这个IP地址属于我的一个NIC,它的MAC地址是xxxx.由于发送ARP请求的主机采取的是广播形式,并附带有自己的IP地址和MAC地址,其他的主机和路由会同时检查自己的ARP cache,如果不符合,则更新自己的ARP cache.
这样,经过几轮的ARP请求之后,ARP cache会达到稳定.如果局域网上设备发生变动,ARP重复上面过程.
(在linux下,可以使用$arp命令来查看ARP的过程.ARP协议只用与IPV4,IPV6使用Neighbor Discovery Protocol来代替ARP的功能)
Routing Table的生成
我们还有另一个假设,就是每个主机和路由上都已经有了合理的routing table.这个routing table描述了网络的拓扑结构,如果你了解自己的网络连接,可以手写自己主机的routing table.但是,一个路由可能有多个出口,所以routing table可能会很长.更重要的是,周围链接的其他路由可能发生变动(新增一个路由器或者路由器坏了),我们就需要routing table能及时将交通导向其他的出口.我们需要一种更加智能的探测周围的网络拓扑结构,并自动生成routing table.
我以一个案例来说问题.如果北京机场前往朝阳门,那么可以采取2号航站楼=>三元桥==>东直门==>朝阳门.2号航站楼和朝阳门分别是出发和目的主机.而三元桥和东直门为中间的两个router.如果三元钱==>东直门这条路维修了,我们就需要更改三元桥的routing table,从而给前往朝阳门的乘客(IP包)指示:请走如下路线三元桥==>芍药居.然后依照芍药居的routing table前往朝阳门(芍药居==>东直门==>朝阳门).
一种用来生成routing table的协议是RIP.它通过距离来决定routing table,所以属于distance-vector protocol.对于RIP来说,所谓的距离是从出发地到目的地沿途的路由器数目.比如上面从机场到朝阳门,按照2号航站楼==>三元桥==>东直门==>朝阳门路线,途径两个路由器,距离就是2.我们最初可以手动生成三元桥的routing table.随后,根据RIP协议,三元桥向周围的路由器和主机广播自己前往各个IP的距离(比如到机场为0).收到RIP包的路由器路由器和主机根据RIP包和自己到发送RIP包的主机的距离,算出自己前往各个IP的距离.东直门与三元桥的距离为1.东直门收到三元桥的RIP包(到机场的距离为0),那么东直门途径三元桥前往机场的距离为1+0=1.如果东直门自己的RIP记录都比这个远(比如东直门==>芍药居==>三元桥==>机场=2).那么东直门更改自己的routing table:前往机场的交通都发往三元桥而不是芍药居.如果东直门自身的RIP包和收到的新的RIP包没有差别,那么东直门保持routing table不变.上述过程在各个点不断重复RIP广播/计算距离/更新routing table的过程,最终所有的主机和路由器都能生成最合理的路径.
注意:RIP的基本逻辑是:如果A距离B为6,而我距离A为1,那么我途径A到B的距离为7.
RIP处于技术的原因,认为距离超过15的IP不可到达.所以RIP更多用于互联网的一部分(比如整个中国电信的网络).这样一个互联网的部分往往属于同一个ISP或者同一个管理机构,所以叫做自治系统.自治系统内部的主机和路由根据通向外部的边界路由器来和其他的自治系统通信.各个边界路由器之间通过BGP来生成自己前往其他自治系统的路由表,而自治系统内部则参考边界路由器,使用RIP来决定routing table.BGP的基本工作过程与RIP类似,但是在考虑距离的同事,也权衡比如政策,连接性能等其他因素,再决定交通的走向.
总结
我们一开始讲述了IP包根据routing table进行接力的过程.为了顺利的实现接力,我们又进一步深入到ARP和RIP/BGP.这三个协议都协助了IP传输.ARP让每台电脑和路由器知道自己局域网内IP地址和MAC地址的对应关系,从而顺利实现IP包到帧的封装.RIP协议可以生成自治系统内部合理的routing table.BGP协议可以生成自制系统外部的routing table.
在整个过程中,我们都将注意力放在了IP包大的传输过程中,而故意忽略了一些细节.而上面的IP接力过程适用于IPV6.