计算机网络初探(ip协议)
粗读了两遍计算机网络(谢希仁),对于计算计算机网络算是有了一个初步的了解,所以打算写一篇文章(希望是教程)进行巩固(主要围绕IP协议)。
局域网
因特网的产生和广泛使用极大地改变了我们的生活,但对于不了解当中技术细节的人来说,因特网的工作是透明的,即我们不知道在每次点击一个链接,发送一个文件,或者进行联机游戏时计算机的软硬件背后,无数线缆,电磁波,甚至卫星是怎样将我们的数据运送到另一台计算机上,而我们能感受到的只有毫秒间的数据收发和一个世界范围内的网络互联。
首先,从比较原始的地方开始讲起,当我们有许多的计算机并且想要通过一种方法实现所有计算机之间的互联从而实现数据交换,最为简单的方法是什么?我们可以这样,为每一台计算机分配一个唯一标识符(mac地址)来定位他,然后将所有打算接入网络的计算机用导线连接起来,这样就非常简单且原始的实现的物理层次上的互联。那么他们之间该如何进行通信呢(暂不考虑对接受到的数据的解读)?
参考下图:图一
假如H1试图与H2进行通信,首先H1细心的将自己想要表达的东西打包好,注明收到消息的计算机的标识符,然后将这份数据包裹发送到线路中,由于这份包裹只有目的计算机的地址,他不知道目的计算机的具体位置,所以只好采用最笨的方法,一个一个的问:“你的地址是***吗”,例如当H3收到了这份包裹,但是却发现他不是发给自己的,就不予理睬,而包裹只能问下一个,直到他遇到了H2,H2发现这份包裹注明的目的地址是自己的地址,于是收下并打开他。这样便完成了一次H1到H2的通信。这种收发数据的方式被称为轮询,即每次发送一个数据包裹都需要询问每个计算机,直到找到目的主机。(事实上这是一个只通过集线器连接的局域网)
这种方法构建的网络似乎也不赖,计算机之间可以正常通信,那么可以考虑继续将更多的计算机加入进来了。但是在这之前,我们会发现这种网络有个小毛病,就是每次网络上只能有一份包裹在传输,如果有第二个包裹也发送到网络中,二者就会发生碰撞,从而造成混乱。怎么解决这种情况呢?方法就是谦让。谦让体现在每当有一台计算机试图发送一个数据包裹时,先检测当前网络状态,如果网络中没有任何人在通信,即网络所有线路都是空闲的,那么自己便将数据包裹发送出去,而一旦发现有人在通信,即网络线路上有数据包裹正在跑来跑去,那么自己就先等着,等一会在检测一次网络线路是否空闲。然而在这里还有另一个问题,就是存在两台计算机同时发送数据包裹或是因为网络固有的时延而没有检测到网络线路上有包裹而导致他们都发送了包裹到网络上,那么碰撞必然发生,而解决方法则是一旦发生碰撞,那么两份包裹都丢弃,然后两台计算机各自沉默一个随机的时间之后再次检测网络线路选择是否发送。二者通过各自等待一个随机的时间,很好的避免了二者的再次碰撞。(CSMA/CD协议)
解决了碰撞的问题。那么可以继续我们的主题,将更多的计算机加入进来!随着更多的计算机的加入,网络规模也越来越大,在较大规模下的网络中。我们当前的网络有个很致命的问题,那就是刚刚讨论过的谦让。在很小型的网络中由于这种谦让所带来的延迟是可以忽略不计的,但是一但网络规模大起来,比如几百台甚至上千台计算机构成的网络,每当有一台计算机在通信时,其他所有的计算机都要等待他通信结束后才能发送自己的包裹,这种延迟是不能被接受的。这时便不得不引入一种新的设备来将这种这个碰撞范围进行限制,这种设备就是网桥(一种专用计算机)。
如图:图二
网桥将一个原本为一个整体的网络划分为一个一个的子网络并将他们连接起来,这样做最大的优点便是将碰撞范围很好的控制在一个个小型的子网络中。
同时呢,在网桥中储存并维护一张由标识符组成的查找表,对应于不同的线路接口,
如图:图三
每当有一台计算机试图与某一台计算机进行数据交换(通信)时,便将数据报包裹注明目的计算机的标识符,在本子网进行广播,如果目的主机不在本子网,则通过专用线路递交给网桥,而后网桥通过查找转发表找到与该标识符匹配的计算机,将这份数据通过连接到这台计算机的线路发送给他。(只通过网桥连接的局域网)
上述的模型在小型的网络中也许会工作的很好,但是现实是我们有几十亿台地理分布在世界各地的计算机,显然之前的模型完全不能使用,因为这种策略本质上仍是简单的线性查找,查找过程和对数据包裹的运送将耗费极大的时间和资源。这时候,一些优秀的算法思想便可以被应用起来了。行之有效的方法是分治,而这种算法的实现就是IP协议。
IP协议下的分组转发
我们先撇开技术方面的内容,来想这样一个问题——如何在中国找到某个美女并要到她的联系方式。因为每个人在世界上都是独一无二的,比较笨的方法就是,从当前所在地开始逢人便问,你是那个美女吗(她的个人信息就是独一无二的标识符),问遍整个中国,直到找到这个人,成功得到了她的电话。
这种方法是按照美女的全球唯一标识符(长相,年龄,血型,基因型等信息的组合体)来确定她,很浪漫的方式,但却非常低效且不现实。
那么接下来就是另一种方法,根据她的地址信息来定位她。比如她的地址是辽宁省-沈阳市-长滩县-张家村-2-22号-户主之女-美女,那么首先我们应该最先得知的是要到辽宁省去,所以第一次选择我们就排除了中国80%的地方,下一条信息是沈阳市,我们又排除了辽宁省的70%的地方,之后在定位到长滩县,张家村,到了这里搜索范围已经很小了,我们得知美女住2-22号,按照住户序号的分配规律(按块分配,有序)我们仍可以很快定位到2-22这家住户,但是我们发现,户主有12个女儿,我们已经没有任何信息可以帮助我们将户主女儿们划分开了,所以只能一个一个的询问,通过匹配长相,年龄,血型,基因型等信息的组合体(即唯一标识符)来定位到美女,所幸搜索范围只有12个,很快我们就找到了美女。
过程如图:图四
下面回到技术方面,我们的计算机同美女一样,在因特网中它也必须只有一个唯一标识符,而这个标识符是生产我们计算机网卡时网卡制造商写在其中的,叫做mac地址,是一个48为二进制数,具有全球唯一性。mac地址才是最终我们能将美女从12个相似的美女中将她选出来的关键。之前说过单纯使用mac地址的索引来实现通信是一件非常不明智的事,而且不同的主机(计算机,路由器等都可称为主机)在系统,软硬件上的差异性将会使得这种方法更为不可靠。那么,IP协议是如何实现IP数据报(相似之前的数据包裹,即将要发送的数据按照Ip协议的规则打包后的数据包)在全球范围内的高效分组转发并屏蔽了诸多的差异性呢?其实从找美女的第二个例子我们应该能够看出IP协议转发的思想了。
首先简单介绍下IP地址的长相:204.79.197.200;它是一个32位二进制数,通常通过每8位进行一次划分,为了表示方便通常将每8位二进制数表示为十进制。我们可以认为第一段204即对应于地理位置“市”,相应的,79对应于“县”,197对应于“村”,200对应于户主的某个女儿。其中前三者被称为网络地址,代表主机所属的区域,最后一个8位是已经无法再划分的主机号,每个拥有主机号的主机都是一个不同的个体(户主的12个女儿)。
这种划分方式称为划分子网(分类别编址),即将一个本来很大的相似的群体划分为不同层次,在这里将网络地址划分为A类,B类,C类。在我们给出的这个IP地址中,A类地址:204.0.0.0,B类地址:204.79.0.0,C类地址:204.79.197.0;能看出A类地址所能包含的主机数量最大,B类次之,C类最小。前者可以包含若干个后者。那么当我要找到主机号为200的主机时就很简单了,首先找到网络地址为204.0.0.0的网络,第一步我们排除了大部分的网络,而后找到网络地址为204.79.0.0的网络(其实可以认为204.79.0.0是204.0.0.0网络下的一台主机),然后是网络204.79.197.0,这时发现网络已经没有再进行划分了,所以在该网络进行广播,遍历所有的主机号,找到主机号为200的目的主机。
如图:图五
更进一步考虑,我们有必要每次都去查看一个人所在地范围最大的地址吗?通信的发起者同接受者一样,也是位于某个村子的某个门牌号里的某人,也许他要发送信息的目的对象就是本村的人(同一局域网内),这时还要去查看他是哪个省,哪个市吗?显然没必要。在这里我们一定要理解一点,那就是计算机始终是存在于整个网络的边缘或者说网络的终端,中心区域为连接在一起的互联网。这就像我们每个人的住所一样,都是存在于国-省-市-县-村-号的模型的门牌号中这个最底层中,上面各层都是人为抽象出来的。所以当某个局域网内的主机试图向因特网中的某台主机(IP:200.78.132.44)通信时,首先判断目的主机是否和自己在一个局域网中,如果是,那么直接将IP数据报根据主机号(44)发送给目的主机(12个女儿找美女的过程),路由器(转发IP数据报的专用计算机)都不必经过,这很大程度上的节省了互联网的线路资源,同时也提高了通信的速度。
这里不得不简要介绍一下路由器。路由器是一台用于转发IP数据报文的专用计算机,他有若干个端口,每个端口有一个网络地址,代表不同的网络并连接到他们。同时路由器也有自己的IP地址和mac地址,标识他作为一个主机本身在网络中的位置。当IP数据报在互联网上传输时,每台路由器都根据其IP地址作为独立的主机被定位。路由器会维护一张路由表,包含了他连接的子网络。比如有一份IP报文IP地址为172.43.50.15,此时这份报文到达路由器H1,H1查找自己的路由表,发现自己所连接的各个子网的网络地址没有匹配报文网络地址的端口,但是他发现H2所连接的子网有匹配的端口,于是他将IP数据报转发给H2,此时H2查找转发表,发现自己连接的子网有个地址为172.43.50.0的匹配项,于是便将这个报文从这个端口发送出去到达该子网络,由于这是一个简单的局域网,所以路由器将IP数据报的IP地址转换为目的主机的mac地址,情况转化为在局域网中根据mac地址查找主机(12女儿选美女)。
回到正题,如果目的主机不在本局域网,那么便将数据报转交给本局域网的连接到互联网的路由器(路由器可以被认为是一台主机,此时他连接到发出数据报的网络的端口的IP地址是204.79.197.0)。这台路由器首先判断IP数据报的目的网络地址是否在本网络中(可以认为路由器之间又组成了一个局域网,这块网络的网络地址为200.79.0.0。197是当前路由器一个端口的主机号,不过这个主机号代表的是一个网络而不是一个主机)。如果数据报的网络地址(200.78.132.0)就是由这一层路由器组成的网络,那么我们先将每台路由器都看做单独的主机,并假想这是一个由路由器组成的局域网,那么当一个路由器向另一个主机发送数据报时,首先IP地址被转换成mac地址并在当前局域网内广播(12女儿找美女),当找到目的路由器后,路由器查找转发表,如果有匹配的网络地址,则将数据报发送至该网络,重复上述过程,直到数据报被运输到局域网进行广播,找到主机数据传输结束。如果某层网络没有匹配项,则通过连接更大的网络的路由逐层向上传递至更高的网络(范围更大),直至有匹配的网络地址,而后在向下传递。