某一天,当我被很多世俗规则限制住自己的行为而不能去做很多正常人能做的事时,于是突然间感觉到:人,本不该来到这个世上!自从我们呱呱坠地那一刻起就注定我们这辈子要承受很多痛苦。。。打破规则和循规蹈矩间永远也找不到合适的平衡点。想起电影《刺客联盟》(又名通缉令)中女杀手fox最终以结束所有刺客(include herself)生命来继续维持规则的正序那撼动人心的行为,我会依旧选择墨守陈规。或许哪天运气好能找到这个平衡点!但那得看老天哪天心情好赐给我这个运气了。However,我依然有很多该做的事情要做,continue!

卷一中对于IP,ARP,RARP协议分三章来写,但至于我自己这种笔记性质的博文来说,没必要扣住每一点都说个详详细细。但我尽量会最短的术语来阐述所有的知识点。对于这三种协议我在这一篇博文中会都涉及,因为它们在TCP/IP协议中同属网络层协议。

IP协议概述

如同卷一中所说那样,IP协议是TCP/IP中最为核心的协议,因为所有的TCP,UDP,ICMP以及IGMP协议都以IP数据报进行数据传输。IP常被称为不可靠,无连接的协议。对于不可靠和无连接这两个术语也曾经迷惑过我很长时间,因为但从字面意思来看,不可靠好像是指IP协议经常传些错误的消息,无连接好像是指IP传输可以没有网络连接就可以完成。这种理解错的是一塌糊涂,其实我更纠结缘何当初要把这两个术语的原英文unreliable和connectionless要翻译成这么容易让人产生歧义理解的不可靠和无连接。其实翻译成“不保证成功传达”和“不保证数据传输的持续性”或许会更好一点。令人不得不怀疑当初第一位翻译者纯粹是为了翻译而翻译。因为这两个词在国内很多大学课堂里也总是被老师不断的进行解释以防学生歧义理解。至此,也该解释下这两个词的本意了:不可靠是指IP协议传输并不保证每一个数据报都能传达到目的地;无连接是指IP协议传输并不保证数据报传输的持续性,即很可能出现先传送的后达到这种场景。

IP地址和MAC地址

IP地址也被成为逻辑地址,因为它的出现只是为了封装底层物理地址的繁杂性。而每台主机的物理地址其实是被固定在硬件网卡的ROM中的。由于在链路层的数据帧(也被称为MAC帧)中,经常用物理地址当作数据传输的目的地址和源地址,因此也将物理地址称为MAC地址。

地址解析协议ARP协议

在网络层及其以上的协议栈中,从来都是使用IP地址的,而数据的传输最终还是要靠物理地址来识别其具体位置,这就存在了每台主机中物理地址和IP地址的映射关系的建立。对于一台主机来说,得到其自己的IP地址和MAC地址比较容易,但如何得和管理到局域网中其它主机的IP地址和MAC地址的映射关系便成了棘手问题。事实上,每台主机设有它自己的ARP高速缓存,保存与其相连的局域网中其它主机的IP地址和MAC地址的映射关系。当IP数据报从链路层发往其它主机时候,会:

1.先查看ARP高速缓存中有无此IP地址对应的MAC地址,若有,则发送,若没有,则2:

2.ARP进程会在本局域网上以广播的形式发送一个ARP请求分组,其内容为此IP地址,MAC地址,和要查询的IP地址,如下(此图源自卷一);

clip_p_w_picpath002[4]

3.局域网中其它的主机ARP进程都会接收此请求,然后查看此请求中的查询IP地址是不是自己的IP地址,若是,则保存此请求中的IP地址和MAC地址到自己的ARP缓存中,以待后用,同时将自己的地址信息回传给发送端,若不是,则不响应。

如此便得到了要发送的IP数据报的硬件地址且正常发送内容;可以看得出,ARP请求分组是以广播形式发送,以单播形式回应。这一切过程一般由硬件地址解析(网卡或路由器)自动进行,用户进程并不知道这些也无法知道其过程。每个MAC映射地址的保存期一般都被设为10——20分钟,即超过这个时间区间不用此映射,ARP进程回自动删掉此映射。以下是我的计算机中的ARP缓存信息:

clip_p_w_picpath004[4]

逆地址解析协议RARP

RARP协议在国内教科书中基本都是一笔带过,在卷一中写的相对多一些。它层在过去起到比较重要的作用,而现在基本没人会单独的使用此协议了,其原理与ARP差不多,只是需要特殊的数据帧来封装和响应。早期一些无盘系统通过此协议得到自己的IP地址。现在的DHCP协议(应用层协议)就包含此协议。

IP数据报首部

IP数据报首部一般为20字节,其大概信息如下(图源自卷一):

clip_p_w_picpath006[4]

每个字段信息如下:

4位版本:用来标识IP协议版本,版本相同才能进行通讯,一般都标识为IPV4;

4位首部长度:表示IP数据报首部长度,最大值为15,首部长度为即15个32位字长(60字节);

16位总长度:IP数据报总长度,理论上最大长度为65535,而实际上很少有超过1500字节的;

16位标识:IP协议的实现在存储器中维护一个count值,每产生一个新的IP数据报,count就加1,如一个数据报长度超过链路层MTU值(见第一篇链路层)时,就会将此数据报的标识字段复制到所有被分片的数据帧中,以此便可以使得接受端在接受到数据报后正确的组装一个IP数据报;

3位标志:此字段在卷一中没有详细说明,事实上,其只有第二位和第三位被使用,第二位标识是否允许分片,第三位标识此IP数据报是否位最后一个数据报;

8位生存时间(TTL):这个值比较重要,用来指定此IP数据报能经过的最大路由器个数,当经过路由器的个数超过此值还未被传达,则丢弃此数据报;

8位协议:用来标识此IP数据报是属于何种协议,以下为指定表(图源自国内教科书):

clip_p_w_picpath008[4]

16位首部检验和:类似链路层中的CRC校验码,用来检测此数据报是否在传输过程中发生差错变化;

对于IP数据报的首部说明,至此也就差不多了;

IP路由选择

当IP层将一帧封装完后,剩下的工作便是进行传输了。将一个IP数据报发送到目的主机最直接的情况是目的主机与源主机直接相连(同一个令牌环网或以太网),则只需要直接发送就行了,更为一般的情况是目的主机与源主机不在统一个网络,如此便需要进行很多路由器后才能传达。对于如何选择下一个路由器便成了主要的焦点。每台主机的IP层协议实现都会在内存中有一个IP路由表,如果目的主机与源主机不在同一个网络,则进行路由表搜索,以发送到下一个路由器,路由表的结构通常是目的主机所在网络号,和下一跳地址组成的KEY-VALUE对。当一个数据报在发送前都会检测其TTL是否为0,若为0,则丢弃,否则,进行路由表搜索,搜索过程一般如下:

1.在路由表中搜索目的IP地址,如果存在,则将IP数据报直接发送到此地址,否则,进行(2);

2.搜索目的网络所对应的子网地址(子网寻址,后面会讲到),如果存在,则将IP数据报发送到此子网号对应的下一跳地址,否则,进行(3);

3.搜索目的网络所对应的网络号,如果存在,则将IP数据报发送到此网络号对应的下一跳,否则,进行(4);

4.查找默认路由地址,若存在,则将IP数据报发送到此默认路由地址,否则(5);

5.丢弃此IP数据报;

子网寻址

现在基本上所有的路由器都支持子网寻址。事实上,A类地址和B类地址都分配了太多空间给主机号(2^24和2^16),这使得可用的网络号有限,而可用的主机号则得到浪费,于是便将主机号又划分位子网号和主机号。例如一个B类地址将之前的16位主机号中的前8位划分给子网号,后8位划分给主机号,于是得到的子网有2^8,可分配的主机号有2^8(255)这么多。

为了识别一个划分子网后的IP地址的网络号和主机号,便出现了子网掩码。例如我所在的计算机的子网掩码为255.255.255.0,IP地址为192.168.1.105;将子网掩码与IP地址逐位相与后所得到的结果192.168.1.0就是我的网络号,主机号就是105了。此IP地址为一个C类地址,它的主机号默认位8位,105作为主机号后,就没有可用的子网号了,于是我的计算机没有进行子网划分。而若我的IP地址为128.96.32.32,这是一个B类地址,其主机号在没划分子网时有2^16这么多,得到的网络号是128.96.32.0;主机号就是最后的32了,而B类地址默认的网络号是前16位,即128.96.0.0,现在却成了192.96.32.0了,那么多出的32部分就是子网号了。

在RFC 950出来后,路由器在与相邻路由器进行消息转发时,必须发送自己的子网掩码给对方,而若一个主机未划分子网号,则发送默认子掩码号给相邻路由器,各类地址的默认子网掩码如下(事实上是将未划分子网时的网络号全赋为1的结果):

A类:255.0.0.0;

B类:255.255.0.0;

C类:255.255.255.0;

如此,将IP地址与这些子网掩码相与后,所得到的结果正是未划分子网时的网络号。

netstat命令和ifconfig命令

看下我所在计算机的IP,子网掩码,硬件地址信息(使用ifconfig -a得出的结果)

clip_p_w_picpath010[4]

eth0是个多播地址(后续章节会讲到),lo是本地环回地址(在第一篇中有介绍),wlan是接入广域网中的地址;

下图是我的计算机的路由表(使用netstat -r得出):

clip_p_w_picpath012[4]

若目的地址是192.168.1.0和本地环回地址,则直接发送,否则发送到默认网关192.168.1.1,此地址为局域网中的路由器,通过它发送到wlan中去。