TCP/IP协议-网络层

风尘

文章目录

  1. 1. 路由器
    1. 1.1. 工作原理
  2. 2. 网际协议-IP
    1. 2.1. IP首部
    2. 2.2. IPv4编址

[TOC]

路由器

  • 转发 当一个分组到达某路由器输入链路接口时,该路由器须将该分组移动到适当的输出链路接口的路由器本地动作。转发发生的尺度很短,因此通常用硬件来实现。它是 数据平面 唯一实现的功能。
  • 路由选择 当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由和路径。计算这些路径的算法被称为路由选择算法。路由选择发生的时间尺度长,因此通常用软件来实现,它是 控制平面 实现的功能。
  • 路由表 每台网络路由器内存中都有一个路由表,当收到一份数据报时,路由器检查分组首部一个或多个字段值,用于在其路由表中索引,然后进行转发分组。路由表中包含以下信息:
    • 目的 IP 地址 它可以是一个完整的主机地址,也可以是一个网络地址。由该表中的标志字段指定。
    • 下一跳(下一站)IP 地址 指在一个可以直接相连网络上的路由器,可以转发的数据报。下一跳路由器不是最终目的,但它可以把传送它的数据报转发到最终目的地。
    • 标志 其中一个标志指明目的IP地址是网络地址还是主机地址;另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口。
    • 为数据报的传输指定一个网络接口

工作原理

当收到一份数据报进行转发时,它先要搜索路由表。当数据报来自某个网络接口时,IP首部先检查目的IP是否为本机IP地址之一或者广播IP地址。如果是,数据报被发送到由IP首部协议字段所指定的协议模块进行处理。反之,如果IP层被设置为路由器功能,那么就对数进行转发,否则数据报被丢弃。

IP路由选择是逐跳进行的,IP并不知道到达目的地的完整路径。所有IP路由选择只为数据报传输提供下一站路由器的IP地址。它假定下一站路由器比发送数据报的主机更接近目的地,且下一站路由器与该主机是直接相连的。

IP路由选择步骤:

  1. 搜索路由表,寻找与目的IP完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接网络接口(取决于标志字段的值)。
  2. 搜索路由表,寻找与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接网络接口(取决于标志字段的值)。网络上的所有主机可以通过这个表目进行寻径,这种搜索网络的匹配方法必须考虑可能的子网掩码。
  3. 搜索路由表,寻找标记为“默认(default)”的表目,如果找到,则把报文发送给该静止指定的下一站路由器。
  4. 如果上面步骤都没有成功,该数据报不能被发送。如果该数据报来自本机,则会向应用程序返回一个“主机或网络不可达”错误。

为网络指定一个路由器,而不必为每个主机指定一个,这是IP路由选择的一个基本特性。这样可以极大缩小路由表的规模,比如 Internet 上路由器只有几千个表目,而不会超过100万个。

网际协议-IP

IPTCP/IP协议族中最为核心的协议。所有TCPUDPICMPIGMP数据都以IP数据报格式传输。

它不能保证IP数据报能成功地到达目的地。 IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区, IP有一个简单的错误处理算法:丢弃该数据报,然后发送 ICMP消息报给信源端。

它是无连接的,不维护任何数据报文的后续状态信息。每个数据报相互独立,因此IP数据报可以不按顺序接收。当一个端向另一端发送两个数据报(AB),每个数据报都是独立进行路由选择,可能选择不同线路,所以B可能在A之前到达。

IP首部

IP首部IP首部

最高位在左边,记为0bit; 最低位在右边,记为31bit

4个字节的32bit的值以下面次序输出:

​ 首先,0~7bit; 其次8~15bit; 然后16~23bit; 最后24~31bit

TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序(big endian)

以其他形式存储的二进制整数的机器(如little endian),必须在传输数据之前把首部转换成网络字节序。

目前协议 版本(Ver) 号是4,因此有时IP也被称为IPv4

首部长度(IHL) 指的是首部占用32bit的数目,普通IP该字段的值为5行(固定部分),每行 32/8=432/8=4 字节 ,因此首部长度为 54=205*4=20 个字节。如果有选项部分,由于首部长度为4bit,所以最大值为 241=152^4-1=15 行(即取值范围 0-15),所以首部最大长度为 154=6015*4=60 字节。

服务类型(TOS,Type Of Service),字段包括

  • 一个3bit的优先权子字段(现在已被废弃),默认值000

  • 4bitTOS子字段,分别代表(最小时延、最大吞吐量、最高可靠性、最小费用),只能置其中1bit1,如果均为0,那么就意味着一般服务。

应用 最小延时 最大吞吐量 最高可靠性 最小费用 16进制值
Telnet/Rlogin 1 0 0 0 0x10
FTP
控制 1 0 0 0 0x10
数据 0 1 0 0 0x08
任意块数据 0 1 0 0 0x08
TFTP 1 0 0 0 0x10
SMTP
命令阶段 1 0 0 0 0x10
数据阶段 0 1 0 0 0x08
DNS
UDP查询 1 0 0 0 0x10
TCP查询 0 0 0 0 0x00
区域查询 0 1 0 0 0x08
IMCP
差错 0 0 0 0 0x00
查询 0 0 0 0 0x00
任何IGP 0 0 1 0 0x04
SNMP 0 0 1 0 0x04
BOOTP 0 0 0 0 0x00
NNTP 0 0 0 1 0x02
  • 1bit的未用位(必须置0)

Telnet/Rlogin应用为例,因为这两个应用主要用于传输少量交互数据,所以要求最小传输时延。其TOS最终值为000,1000,0,换算成十六进制为0x10

现在大多数TCP/IP实现都不支持TOS特性,但自4.3BSD Reno以后新版本系统都对它进行了设置。另外,新路由协议OSPEIS-IS都能根据这些字段进行路由决策。

由于大多数实现都不使用TOS字段,因此像SLIP这种排队机制自己来判断和处理,驱动程序先查看协议段(确定是否是一个TCP段),然后检查TCP信源和信宿的端口号,以判断是否是一个交互服务。

总长度(Total Length) 字段指整个IP数据报长度,以字节为单位。利用首部长度总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长度为16bit,所以IP数据报最大长度为 2161=65,5352^{16}-1=65,535 即,65,535字节。也就是最大传输单元(Maximum Transmission Unit,MTU) 为65,535字节。

尽管可以传输最大65,535字节的数据报,但大多数链路层都会对它进行分片。而且主机也要求不能接收超过576字节的数据报。类似UDP的应用,它们限制用户数据报长度为512字节,小于576字节。

事实上现在大多数的实现(特别是那些支持网络的文件系统NFS的实现)允许超过8192字节的IP数据报。

标识(Identification) 字段,唯一的标识主机发送的每一分数据报。通常每发送一份报文它的值就会加1

RFC 791 [Postel 1981a]认为标识字段应该由让IP发送数据报的上层来选择。假设有两个连续的IP数据报,其中一个是由TCP生成的,而另一个是由UDP生成的,那么它们可能具有相同的标识字段。尽管这也可以照常工作(由重组算法来处理),但是在大多数从伯克利派生出来的系统中,每发送一个IP数据报,IP层都要把一个内核变量的值加1,不管交给IP的数据来自哪一层。内核变量的初始值根据系统引导时的时间来设置。

TTL(time-to-live) 生存时间字段,设置了数据报可以经过的最多路由器数,指定了数据报的生存时间。初始值由源主机设置(通常为3264),经过一个处理它的路由器该值减1,当该值为0时,数据报被丢弃,并发送ICMP报文通知源主机。

首部检验和(Header Checksum) 字段,根据IP首部计算的检验和码,它不对首部后面的数据进行计算。

ICMPIGMPUDPTCP在它们各自的首部中均含有首部检验和码。

为了计算一份数据报的IP检验和,首先将检验和字段置为0。然后,将首部中的数据按每16bit一块分成若干块(每块包含16位的原因是检验和正好是16位,这样便于将计算结果填充到对应的16位字段),对首部中每个16bit求和(注意当高位溢出时,需要低位回卷)后取反(即0变成1,1变成0)结果并存储到检验和字段中。

第二种计算方法是,先将各字段二进制数据先取反,再求和。

抓包数据

Internet protocol Version 4, src: 192.168.0.109(192.168.0.109), Dst: 224.0.0.252(224.0.0.252)
Version: 4
Header length: 20bytes
Differentiated Service field: 0x00 
Total length: 71
Identification: 0x1fd6 (8150)
Flags: 0x00
Fragment offset: 0
Time to live: 1
Protocol: UDP (17)
Header checksum: 0xf7be [correct]
	[Good: True]
	[Bad: False]
Souce: 192.168.0.109
Destination: 224.0.0.252

结合上面抓包数据,发送方检验和计算步骤见下图:

IP首部检验和计算步骤IP首部检验和计算步骤

检验和求和前,首先将各字段各进制数值转换成二进制数值。如首部长度(Header length)数据报值为20bytes,先将其转换成十进制值为 32/8=4,20/4=532/8=4,20/4=5(行),然后再将5转成二进制101,由于首部长度占4bit,所以不足位补0,即0101

求和时,当最高位需要进位时,进位被回卷到最低位。如上图虚线框结果,最高位1+1=101+1=10,只保留数值0,数值1回卷到最低位,即0+0+1=10+0+1=1,其中1就是高位回卷的数值。

接收方校验数据步骤和发送方类似,区别在于接收方不再将检验和字段置为0,而是发送方计算好的值0xf7be1111011110111110,所以接收方最终计算结果为 0000100001000001+1111011110111110=11111111111111110000100001000001+1111011110111110=1111111111111111。如果结果每个比特位不全是1,那么IP将丢弃收到的数据报,但是不生成差错报文,由上层去发现丢失的数据报并进行重传。

最后一个字段是可选字段,目前这些选项定义如下:

  • 安全和处理限制(用于军事领域,参见RFC 1108[Kent 1991])
  • 记录路径(让每个路由器都记录下它的IP地址)
  • 时间戳(让每个路由器都记录下它的IP地址和时间)
  • 宽松源站选路(为数据指定一系列必须经过的IP地址)
  • 严格源站选路(与宽松源站选路类似,但是要求只能经过指定的IP地址,不能经过其他地址)

IPv4编址

一台主机通常只有一条链路连接的网络,当主机中IP想发送一个数据报时,它就在该链路上发送。而路由器的任务是从链路上接收数据报,并从其它链路上转发出去,所以路由器必须拥有两条以上的链路。

主机、路由器与物理链路之间的边界叫作接口IP要求每台主机和路由器都拥有自己的IP地址。

一个IP地址与一个接口关联,而不是与包括该接口的主机或路由器相关联。

子网 具有相同的前半部分地址的一组IP地址,可以利用地址的前半部分划分组。在一个IP网络中划分子网使我们能将一个单一的大型网络,分成若干个较小的网络。

这样做原因是A类、B类地址为主机分配了太多的空间,在一个网络内一般不会存在如此多主机,同时子网的存在,使得外部路由器只需要知道通往子网的IP地址路径即可,再由子网去寻找具体子网IP地址即可;从而不需要知道所有子网下的IP地址路径,可以缩减路由表的规模。基于以上原因IP允许划分更小的网络,称为子网

大多数子网都是B类地址,也可以用于C类地址,很少出现在A类地址因为A类地址本身就很少。但是,大多数A类地址都是进行子网划分的。

现在所有主机都要求支持子网编址,子网编址不再把IP地址看成单纯的的 网络号主机号 组成,而是把主机号再分成一个 子网号主机号

主机除了IP地址外,还需要知道有多少比特留给了子网号和主机号,这个问题通过子网掩码 来解决。子网掩码也是一个32bit的值,其中网络号子网号的值均为1主机号值为0

两种B类地址子网掩码两种B类地址子网掩码

如果知道本机IP地址,就可以知道地址分类(A、B或C类),也就知道网络号和子网号之间的分界线。而根据子网掩码可知道子网号和主机号之间的分界线。

假设主机地址:140.252.1.1(B类地址),子网掩码:255.255.255.0(8bit子网号,8bit主机号)
- 当目的地址是:140.252.4.5,可知B类网络号相同(均为140.252),子网号不同(分别为1和4)
- 当目的地址是:140.252.1.22,可知B类网络号相同(均为140.252),子网号相同(均为1),主机号不同(分别为1和22)
- 当目的地址是:192.43.235.6(C类地址),可知网络号不同,因此不需要进一步比较了
给定两个 IP 地址和子网掩码后,IP 路由选择功能一直进行这样的比较。

子网掩码通过无类别域间路由选择(Classless Inter-Domain Routing,CIDR) 分配策略分配地址,它是一个按位,基于前缀的用于解释IP地址的标准。当使用子网寻址时,32bitIP被划分为两部分,并且也具点分有十进制数形式a.b.c.d/x,其中x表示地址的第一部分即最左侧开始的比特数,叫做前缀,该部分定义了子网地址。

如,IP地址为:140.252.1.1
使用 CIDR 子网掩码表示为 140.252.1.1/24
|
| 转换为二进制
V                    24bit
11111111 11111111 11111111 000000000
255      255      255      0

所以子网掩码为:255.255.255.0
|
| 与 IP 按位与计算
V
  11111111 11111111 11111111 000000000 子网掩码
& 10001100 11111100 00000001 000000001 IP
——————————————————————————————————————————
  10001100 11111100 00000001 000000000
   140      252      1        0
   
结果为:140.252.1.0 其表达的含义为该 IP 地址属于 140.252.1.0 这个网络,其主机号为 1,即这个网络中编号为 1 的主机。