三、IP:网际协议
3.1 引言
IP 是 TCP/IP 协议族中最为核心的协议。所有的 TCP 、UDP 、ICMP 及 IGMP 数据都以 IP 数据报格式传输。IP提供不可靠、无连接的数据包传输。
-
不可靠
不可靠意思是它不保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生错误时,IP会用一个错误处理算法:丢弃该数据报,然后发送ICMP给信源端。任何可靠性由上层 来提供。
-
无连接
**IP不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。**这点也说明了IP数据报的接受是可以不按顺序的。
若发送端先发送A,再发送B到目的端,因为无连接性,每个数据报会独立选择路由,可能选择不同的路线导致B比A先到目的端。
3.2 IP首部
不含选项字段的普通的I P首部长20字节。图中的I P首部里,最高位在左边,记为 0 bit,最低位在右边,记为31 bit。
网络字节序: 这4个字节的32 bit值要以一种叫作 big endian 字节序的次序传输:先传 0-7 bit,其次 8-15 bit,然后 16-23 bit,最后是 24-31 bit。TCP/IP首部所有二进制整数在网络中传输都要以这种次序,因此它又叫作网络字节序。
IP首部的各部分:
- 版本字段:当前版本号为4,叫作IPv4.
- 首部长度字段:是首部占32 bit 字的数目。它是一个4 bit字段,因此首部最长为60字节。普通IP数据报首部长度字段值为5,即20个字节
- 服务类型(TOS)字段😗*包括3 bit的优先权子字段(现已忽略)4 bit的TOS子字段,1 bit的未用子字段但是必须置0。**4 bit的TOS分别代表最小时延、最大吞吐量、最高可靠性、最小费用。4 bit中只能置1 bit。如果4 bit都为0就是一般服务。现在大多数TCP/IP实现都不支持TOS特性,不允许应用程序设置TOS字段。
-
总长度字段:**是指整个IP数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。**该字段16 bit,所以总长度最大65535字节,但是大多数链路层会对它进行分片。但是IP数据报长度若小于最小帧长46字节,总长度字段就更重要了,IP需要靠总长度字段知道46字节里有多少字节是IP数据包内容其他都是填充。
-
标识字段:是唯一的标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。
-
标志字段:讨论分片再提及。
-
片偏移字段:讨论分片再提及。
-
TTL(time-to - live):生存时间字段设置了数据报可以经过最多路由器数。他指定了数据报生存时间。由源主机设置(32或64),每经过一个路由器TTL就减一。当字段值为0时,数据报就丢弃,并发送ICMP报文通知源主机。
-
协议字段:根据协议字段可以判断是哪个协议向IP发送数据。
-
首部检验和字段:根据IP首部计算的检验和码。不对后面的数据进行计算。而ICMP、IGMP、UDP和TCP在他们各自首部都含有覆盖首部和数据的检验和码。
为了计算一份数据报的 IP检验和,首先把检验和字段置为 0。然后,对首部中每个 16 bit进行二进制反码求和(整个首部看成是由一串 16 bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个 16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全 1。如果结果不是全1(即检验和错误),那么I P就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
-
每一份IP数据报都包含源IP地址字段和目的IP地址字段。都是32bit值。
-
最后一个选项字段为任选项:数据报里一个可变长的可选信息。选项字段很少使用,也并不是都支持该字段。选项字段以32bit为界限,在必要时插入0作为填充字节,保证是32bit的整数倍。其用途如下
- 安全和处理限制(用于军事领域)
- 记录路径(让每个路由器都记下它IP地址)
- 时间戳(让每个路由器都记下它IP地址和时间)
- 宽松的源站选路(为数据报指定一系列必须经过的IP地址)
- 严格的源站选路(与上类似,但是严格指定必须经过这些地址,不能经过其他地址)
3.3 IP路由选择
IP路由选择是简单的、逐跳的,
若目的主机和源主机在同一共享网络上点对点连接,则IP数据报可直接发送到目的主机上。
若不在同一网络下,就发送给默认的一个路由器,再由路由器转发数据报。
一般情况下,IP可以从TCP、UDP、ICMP、IGMP接收数据报,或者从一个网络接口接收。
当接收到一份数据报后,IP会对内存里的路由表搜索一次。IP首先检查该IP数据报的目的IP地址是否为本机的IP地址之一或者IP广播地址?
- 如果是的,该数据报就按其IP首部指定的协议类型的协议处理。
- 如果不是,有两种情况:
- 若该IP层被设置“可以充当路由器”的功能,IP就会把该数据报进行转发;
- 若IP没有被设置为…功能,该数据报就会被丢弃。
路由表的组成:
目的IP地址:既可以是一个完整的主机地址,也可以是一个网络地址。主机地址有一个非0的主机号,指定某一特定主机。网络地址主机号为0,指定网络中所有主机。
下一站路由器的IP地址 或是 直接有连接的接口:
标志:
- 一个标志指明了目的IP地址是网络地址还是主机地址。
- 另一标志指明了下一个路由器地址是真正的路由器还是直接连接的接口。
为数据报传输指定一个网络接口
由上面路由表组成可以看出IP并不知道到达目的地的完整路径,每一个路由器只提供下一站的路由器IP地址。(假定下一站更接近目的)
IP路由选择完成的功能(按以下步骤执行):
- 搜索路由表,查找与目的IP地址匹配的表目(网络号主机号都要匹配),找到就把报文转发给该表目地址的路由器或接口。
- 搜索路由表,查找与目的网络号匹配的表目,找到就把报文转发给该表目地址的路由器或接口。
- 搜索路由表,找到标为“默认(default)”的表目,找到就把报文转发给该表目地址的路由器或接口。
如果上面三步都失败,则该数据报就不能被送达。此时若该数据报来自于本机,则向发送该数据报的应用发送“主机不可到达”或“网络不可到达”的错误。
默认路由和下一站路由器发送的ICMP间接报文是IP路由选择的一个功能强大的特性。
为每一个网络指定一个路由器而不是每一个主机指定一个路由器是IP路由选择的另一个基本特性。
3.4 子网寻址
当前所有主机都要求支持子网寻址(RFC 950)。即不再把IP地址只看作网络号和主机号组成。
在InterNIC获得某类I P网络号后,就由当地的系统管理员来进行分配,由他来决定是否建立子网,以及分配多少比特给子网号和主机号。
子网对外部路由器来说隐藏了内部网络组织(一个校园或公司内部)的细节。在我们的网络例子中,所有的I P地址都有一个B类网络号140.252。但是其中有超过30个子网,多于400台主机分布在这些子网中。由一台路由器提供了 Internet的接入。它可以缩小 Internet路由表的规模。
3.5 子网掩码
除了I P地址以外,主机还需要知道有多少比特用于子网号及多少比特用于主机号。这是在引导过程中通过子网掩码来确定的。
子网掩码是一个 32 bit的值,其中值为 1的比特留给网络号和子网号,为0的比特留给主机号。
尽管I P地址一般以点分十进制方法表示,但是子网掩码却经常用十六进制来表示,特别是当界限不是一个字节时。给定I P地址和子网掩码以后,主机就可以确定 I P数据报的目的是:
(1)本子网上的主机;
(2)本网络中其他子网中的主机;
(3)其他网络上的主机。如果知道本机的 I P地址,那么就知道它是否为A类、B类或C类地址(从I P地址的高位可以得知),也就知道网络号和子网号之间的分界线。而根据子网掩码就可知道子网号与主机号之间的分界线。
3.6 特殊的IP地址
我们把这个表分成三个部分。表的头两项是特殊的源地址,中间项是特殊的环回地址,最后四项是广播地址。
3.7 ifconfig命令
ifconfig命令一般在引导时运行,以配置主机上的每个接口。
由于拨号接口可能会经常接通和挂断(如 SLIP 链路),每次线路接通和挂断时,ifconfig都必须(以某种方法)运行。
ifconfig命令一般支持TCP / IP以外的其他协议族,而且有很多参数。关于这些细节可以查看系统说明书。
3.8 netstat命令
netstat命令也提供系统上的接口信息。 - i参数将打印出接口信息, - n参数则打印出I P地址,而不是主机名字。
这个命令打印出每个接口的 MTU、输入分组数、输入错误、输出分组数、输出错误、冲突以及当前的输出队列长度。
3.9 小结
- 了解 I P首部的格式,首部中的各个字段。
- 主机的路由选择可以非常简单:如果目的主机在直接相连的网络上,那么就把数据报直接传给目的主机,否则传给默认路由器。
- 路由选择决策:在表中有三种类型的路由:特定主机型、特定网络型和默认路由型。路由表中的表目具有一定的优先级。在选择路由时,主机路由优先于网络路由,最后在没有其他可选路由存在时才选择默认路由。
- IP路由选择是通过逐跳来实现的:数据报在各站的传输过程中目的 I P地址始终不变,但是封装和目的链路层地址在每一站都可以改变。
- 类地址一般都要进行子网划分。用于子网号的比特数通过子网掩码来指定。子网的划分缩小了I n t e r n e t路由表的规模。
- 有关信息通过 ifconfig和netstat命令可以获得。