计算机网络模型(三):运输层
简介
网络层的东西太多了,也非常繁杂,很难面面俱到,但是我会尽量把大部分的,重要的东西复习到。
一直以来,人们对网络层一直有争议,就是网络的可靠性交付应该由谁完成?是网络还是端系统?最终,因特网采用了后者,即不保证质量的承诺,
我们目前的网络只是向上提供简单灵活的、无连接的、尽最大努力交付的数据报服务。网络在发送分组的时候不需要先建立连接。正是这种思路,才使得我们如今的互联网廉价,迅速发展成如今的规模。
网络层有许多协议,我们一个一个说。
IP协议
和我们之前说的TCP服务一样,和IP协议配套的还有一些协议,我先在这里说明一下,它们都是属于网络层的协议,分别是ICMP协议,IGMP协议和ARP协议。本来还有RARP协议,但是现在已经不用,ARP代替了它。
IP地址的分类
我们现在常用的IP是IPv4,由32位组成。
I
P
地
址
:
:
=
{
<
网
络
号
>
,
<
主
机
号
>
}
IP地址::=\{<网络号>,<主机号>\}
IP地址::={<网络号>,<主机号>}
如图所示,地址可以分为5类,ABC都是单播地址,适用于一对一通信。
- A、B、C类地址网络号字段分别为8、16、24位,其分类标准为前几位:0、10、110。
- D类地址用于多播
- E为以后使用
所以,一个IP地址不仅仅可以指明主机,还能指明主机所连接的网络。
为了可读性,我们往往每8位插入一个空格,便于使用。而对于人类的读取,我们会将二进制转换成十进制,将空格转换为“点”,使用起来方便很多。但是,机器中并不存在这样的空格或者点。
常用的三种类别IP地址
A类
A类地址的网络号有一位固定,还剩7位可用。所以A类地址理论可有
2
7
?
1
=
127
2^7 - 1=127
27?1=127个,但是其中地址段127(01111111) 被用于回环测试,即127.0.0.1这样的地址只能给本机测试,不作为网络发送的地址,因此A类地址共有126个可用。
对于主机号,A类地址的主机号占3字节,而全零主机号表示网络地址,全一主机号标识该网络上的所有主机,因此A类地址主机最大个数为:
2
24
?
2
=
16777214
2^{24}-2=16777214
224?2=16777214个。
整个A类的地址空间共
2
31
2^{31}
231个地址。
B类
B类地址的前两位确定,为10。但是规定128.0.0.0是不指派的,可以指派的B类最小地址为128.1.0.0,为啥不是128.0.0.1?因为B类地址的网络号是2字节的,后面是主机号。所以B类地址可以指派的网络数为
2
14
?
1
=
16383
2^{14}-1=16383
214?1=16383。
对于主机,B类地址最大主机数为
2
16
?
2
=
65534
2^{16}-2=65534
216?2=65534。一样,全零全1不做指派。
整个B类地址空间共
2
30
2^{30}
230个。
C类
除去最开始的110,还有21位可以分配。192.0.0.0不指派,可以指派的最小地址为192.0.1.0。因此C类地址可指派的网络总数为
2
21
?
1
=
2097151
2^{21}-1=2097151
221?1=2097151。
对于主机,最大容量主机数为
2
8
?
2
2^8-2
28?2。
地址空间共
2
29
2^{29}
229个。
特点
- IP地址管理机构只用分配IP的网络号,主机号由网络号的单位自行分配。
- 路由表只需要根据网络号进行分组转发,减少了路由表的存储空间和路由时间。
- 一个网络指的是拥有同一个网络号的主机集合。因此,由网桥和转发器连接起来的局域网仍是一个网络;拥有不同主机号的局域网必须由路由器连接。
IP报文
和TCP报文一样,IP报文也分为首部与数据。 第一行:
- 版本:指IP协议的版本。(IPv4还是IPv6),只有相同版本协议才能通信。
- 首部长度:4位,但是一个单位表示4字节。也就是说IP报文首部最大长度为
4
?
2
4
=
64
4*2^4=64
4?24=64字节,即IP数据报首部最大长度为64字节,最小为20字节固定长度。
- 区分服务:8位,没用过。
- 总长度:指一个IP报文总长度,占16位,所以最大长度为
2
16
?
1
=
65535
2^{16}-1=65535
216?1=65535字节。但是基本没有这么长的报文,都会拆分来发送,这种拆分叫做分片。在后面会提到。
第二行:
- 标识:占16位,IP软件在存储器中维持一个计数器。每产生一个数据报,该计数器加一。该字段与顺序无关,因为IP是无连接的,字段与分片有关。
- 标志:占3位,但是目前只有2位有意义。最低位为MF(more fragmant),MF=1时表示后面还有分片,MF=0时表示后面没有分片了,是最后一个;中间的一位记为DF(don’t fragment),表示不能分片,DF=0时才可以分片。
- 片位移:占13位,分片后,某片在原分组中的相对位置,以8个字节为单位,也就是说,每个分片都是8字节的整数倍。这个后面将分片会说。
第三行:
- 生存时间:8位,原先就是时间,现在改为了跳数。路由器在收到ip报文的时候会判断是不是自己网络的报文,如果不是就会转发,此时生存时间减一。如果生存时间为1,那么该数据报只能本局域网发送。此外,如果生存时间为0,路由器会放弃该报文。因为是8位,所以最大生存时间为255。
- 协议:8位,指依附于IP报文的下层协议。
- 首部校验和:占16位,不检验数据部分,只检验首部。具体检验方法见后文。
第四行:源地址 第五行:目的地址
分片原理
目前,因特网主流的分片长度为MTU=1500,即IP报文首部加数据部分最多长度为1500字节。
现假设一报文长度为3820字节,首部为20字节,那么要根据MTU=1500进行分片。
我们知道3820字节是3800的数据部分和20的首部,1500分片是首部+数据,因此数据部分只有1480字节。
3800
/
1480
=
2......840
3800/1480=2......840
3800/1480=2......840,因此我们的分片应该是1500,1500,860。
下面画图理解一下: 关于标识,相同报文具有相同标识,报文分片以后,这些分片的标识相同。根据标识和片位移,我们可以重组报文。
校验和算法
由于IP报文的特殊性,我们不希望用太复杂的算法来进行校验,否则转发的时候效率很低。
- 发送时,把IP首部划分为许多16位字的序列,并把检验和字段置零;
- 用反码求和将16位字相加,得到的和取反码,写入检验和字段。
- 接收方将首部16位字再使用反码求和,结果取反码,得出结果。
- 结果如果是0,则报文无差错。否则弃掉。
IP分组转发流程
IP报文中有源地址和目的地址,使得IP报文可以从源地址发送到目的地址,但是更多的情况下,目的地址和源地址并不在一个网络内,它们之间可能有无数个路由器。现在,问题的关键是,路由器的路由表存什么内容。
假设路由表中存放主机信息,那么每一个路由表可能会存放成千上万个主机信息,这对路由表的存储能力是个压力,同时对寻找目的主机地址信息也是个压力,比如遍历操作的耗时,即使是哈希操作,也要额外耗费一定的存储空间,这显然是不能容忍的。
所以路由表采取了另一种方式存储:存储其他路由器的地址和跳到该路由器的方法。
假设现在有3个路由器,划分了4个网络:
划分子网与子网掩码
对于我们之前的两级IP地址,网络号+主机号,该分类不太灵活,且一个网络中可能含有过多的主机,于是有了三级IP地址和划分子网的概念。
I
P
地
址
:
:
=
{
<
网
络
号
>
,
<
子
网
号
>
,
<
主
机
号
>
}
IP地址::=\{<网络号>,<子网号>,<主机号>\}
IP地址::={<网络号>,<子网号>,<主机号>}
其基本思路如下:
- 一个物理网络可以将本网络划分成多个子网,但是对其他网络不可见,是纯粹本网络内部的事情。
- 子网号是从主机号借了若干位
- 找到网络号之后,再找到划分的子网号,找到主机所在的子网。
那是如何找到子网的呢?这就需要子网掩码。
子网掩码是32位的二进制数。一般来说,子网掩码前几位置一的个数和网络号+子网号的位数相同。显然, A类地址的默认子网掩码是255.0.0.0 B类地址的默认子网掩码是255.255.0.0 C类地址的默认子网掩码是255.255.255.0
举个例子:一直IP地址为141.14.72.24,子网掩码是255.255.192.0,那么网络地址的计算方法应该是:
I
P
=
141.14.72.24
=
10001101.00001110.01001000.00011000
子
网
掩
码
=
11111111.11111111.11000000.00000000
按
位
相
与
=
10001101.00001110.01000000.00000000
所
以
网
络
地
址
为
:
141.14.64.0
IP = 141.14.72.24 = 10001101.00001110.01001000.00011000\\ 子网掩码 = 11111111.11111111.11000000.00000000\\ 按位相与 = 10001101.00001110.01000000.00000000\\ 所以网络地址为:141.14.64.0
IP=141.14.72.24=10001101.00001110.01001000.00011000子网掩码=11111111.11111111.11000000.00000000按位相与=10001101.00001110.01000000.00000000所以网络地址为:141.14.64.0
- 首先判断目的主机与源主机是否在一个子网,用源主机的子网掩码与目的主机进行相与,得到128.30.33.128,而H1的网络地址为128.30.33.0,因此判断不在一个网络;
- 交给路由器R1,经过1中的重复操作,发现接口一可以直接交付,则将信息转给接口一交付。
CIDR的表示方法
由于IPv4只能表示
2
32
2^{32}
232个设备,但是我们现在各种手机,电脑,平板甚至家具,车都安装上了互联网设备,因此这个数量是不够用的。除了我们听说过的IPv6方法,还有就是CIDR(读音sider,Classless Inter-Domain Routing)。
该方法放弃了地址分类,所有的地址都是二级地址,表示为:
I
P
:
:
=
{
<
网
络
前
缀
>
,
<
主
机
号
>
}
IP::=\{<网络前缀>,<主机号>\}
IP::={<网络前缀>,<主机号>}
前缀代表了网络号之后用斜线记法表示网络前缀所占的位数。
如:
128.14.35.7
/
20
=
10000000
?
00001110
?
0010
 ̄
0000
?
00000000
128.14.35.7/20 = \underline{10000000\ 00001110\ 0010}0000\ 00000000
128.14.35.7/20=10000000?00001110?0010?0000?00000000
CIDR不划分子网,指的是网络号不划分,但是同一个网络号内依然可以对子网进行划分。划分后,依然可以显示为单个网络的多个子网。比如20位掩码后,对网络划分8个子网,需要3位,那么掩码就会变成23位。
这又出现了问题,假设现在某大学的学院A希望把报文发给同学校学院B,但是又不想经过学校的路由器。报文目的地址为:D=206.0.71.130,学校的IP网络为:206.0.68.0/22,学院B网络为:206.0.71.128/25。那么,通过与运算,发现二者网络号都匹配,这时该怎么办?
我们遵循最长匹配原则,即选择网络掩码最长的进行匹配,这样能更快定位到主机的地址。
此外,找IP地址不能遍历去找,如果一个路由表中有4w个地址,遍历的话太费时间。于是我们最常用的方式就是二叉搜索树。
这样可以匹配唯一前缀,增加了效率,对于每一个IP地址,最差时间复杂度也是
O
(
l
o
g
32
)
O(log32)
O(log32),也就是常数时间。
IP地址硬件地址
IP地址我们之前已经说明了,是管理网络的,那么硬件地址是什么呢?
硬件地址又称MAC地址,标识了唯一的设备。我记得本科的时候有一位同学问了一个问题:既然IP地址和MAC地址都是唯一的标识,那为什么不用一个呢?这个问题把老师问懵了,老师说教了这么多年头一次见这样的问题。
其实我们可以想想,我们每个人都有身份证号,是我们的唯一ID,假设我们每个人都有一个房子,房子只住一个人,那么房子的地址就是IP地址。我要找你,不可能根据身份证号找你,只能根据你家的地址取找你。MAC和IP的关系就类似于此。
之前我们说TCP或者UDP协议的时候,没提到的是这些报文也依附于其他报文的存在,那就是IP数据报,而IP数据报依附于MAC地址存在。
下一篇章仍是网络层,由于网络层东西太多,不得不分开说。
|