TCP/IP (四) ---- 网际层

  网际层提供的协议负责局域网网段之外的传递,其中重要的协议包括IP、ARP和ICMP。网际层对应于OSI模型的网络层,也就是所谓的第3层。
  计算机通过网络接口设备(比如网络适配器)与网络进行通信,网络接口设备具有唯一的物理地址,用于接收发向该地址的数据。像以太网网卡这样的设备对于上层协议层的细节是一点也不了解的,它不知道IP地址,也不知道发送来的帧是要给Telnet还是FTP,它只是监听是否收到了数据帧,发现其中目标地址与自己物理地址相符的帧,并把这个帧传递给上层协议栈。
  这种物理寻址方式适合单个局域网网段。由不间断介质连接在一起的若干台计算机利用物理地址就可以实现所需的功能。只需使用网络访问层的低级协议就可以把数据从网络适配器直接传递另一个网络适配器。但是,在路由式网络中,不能利用物理地址实现数据传输,因为根据物理地址进行传输所需的过程不能跨越路由接口来运行。即使这样是可行的,根据物理地址传输数据也是非常麻烦的,因为内置在网卡里的固定物理地址不能在地址空间上引入逻辑结构。
因此,TCP/IP隐藏了物理地址,以一种逻辑化、层次化的寻址方案对网络进行组织。这种逻辑寻址方案由网际层的IP协议维护,而逻辑地址被称为IP地址。地址解析协议(ARP)是另一种网际层协议,它维护一个表格,用于把IP地址映射到物理地址。这个ARP表连接了IP地址与网卡物理地址。
  在一个路由式网络中TCP/IP软件使用如下策略在网络上发送数据。

1.如果目的地址与源地址在同一个网段,源计算机就把数据包直接发送给目的计算机。IP地址被ARP解析为物理地址,数据被直接发送到目的网络适配器。
2.如果目的地址与源地址不在一个网段上,就执行如下过程。
a)直接将数据报发送到网关。网关是位于局域网网段上的一个设备,能够把数据报转发到其他网段,网关地址被ARP解析为物理地址,数据被发送到网关的网络适配器。
b)数据报通过网关被路由到较高级别的网段,再次重复上述过程。如果目的地址在这个新网段里,数据就被发送到目的,否则数据报就会被发送到另一个网关。
c)数据报经过一系列网关被转发到目的网段,目的IP地址被ARP解析为物理地址,数据被发送到目的网络适配器。

为了在复杂的路由式网络中传输数据,网际层协议必须具有以下功能:

识别网络中所有的计算机;
提供一种方式来判断何时需要通过网关来传递消息;
提供一种与硬件无关的方式来识别目的网段,从而让数据报能够高效率地经过路由器到达正确的网段;
提供一种方式把目标计算机的逻辑IP地址转化为物理地址,让数据能够传输给目的计算机的网络适配器。

网际协议(IP)

  IP协议提供了一种分层的、与硬件无关的寻址系统,具有在复杂的路由式网络中传递数据所需的服务。TCP/IP网络上的每个网络适配器都有一个唯一的IP地址。
  在讨论TCP/IP时,我们经常会说计算机有一个IP地址,这是因为大多数计算机只有一个网卡。然而,具有多个网卡的计算机也很常见,比如作为路由器或代理服务器的计算机必须有多个网卡,因此也就有多个IP地址。术语“主机”通常用于表示与某个IP地址相关联的网络设备。在某些操作系统上,可以给一个网络适配器指定多个IP地址。网络上的IP地址是有一定规则的,因此我们可以通过查看IP地址来了解主机的位置,也就它所在的网络或子网,换句话说,IP地址中一部分有点像邮政编码(表明大致区域),而另一部分有点像街道地址(表明大致区域内的准确位置)。
IP地址分为两个部分:网络ID;主机ID。

IP报头字段

  每个IP数据报都以一个IP报头开始。源计算机的TCP/IP软件构造这个IP报头,目的计算机的TCP/IP软件利用IP报头中封装的信息处理数据。IP报头包含大量信息,包括源IP地址、目的IP地址、数据报长度、IP版本号和对路由器的特殊指令。
IP报头的最小长度是20字节。

  版本:这个4位的字段表示所使用的IP版本。目前IP版本是4,相应的二进制是0100。
  网际报头长度(IHL):这个4位字段表示IP报头以32位字为单位的长度。IP报头的最小长度是5个32比特字,相应的二进制表示是0101。
  服务类型:源IP能够指定特殊的路由信息。有些路由器会忽略这个字段的信息,但随着服务质量(QoS)技术的出现,这个字段得到了更多的重视。这个8位字段的主要用途是对等待通过路由器的数据报区分优先级,而目前大多数IP实现把是这个字段全填为0。
  总长度:这个16位的字段表示IP数据报的长度,单位是字节,这个长度包含了IP报头和数据载荷。
  标识:这个16位的字段是一个依序变大的数值,分配给源IP发出的消息。当传递到IP层的消息太大而不能放到一个数据报里时,IP会把消息拆分到多个数据报,并对这些数据报排序分配相同的标识号。接收端利用这些数值重组为原始消息。
  标记:这个字段表示分段可能性。第1位未使用,其值应该为0。第2位称为DF(不分段),表示是否允许分段,0表示允许,1表示不允许。第3位是MF(更多分段),表示是否还有分段正在传输,设置为0时表示没有更多分段需要发送,或是数据报根本没有分段。
  分段位移:这个13位的字段是一个数值,被赋予每个连续的分段。目的设备的IP利用这个值以正确的次序重组分段。这个数值使用的单位是8字节。
  生存时间(TTL):这个字段表示数据报在被抛弃之前能够保留的时间(以秒为单位)或路由器跳数。每个路由器都会检查这个字段,并且至少把它减去1,或数据报在路由器中延迟的秒数。当这个字段的值为0时,数据报会被抛弃。跳数代表数据报到达目的之前必须经过的路由器的数量。如果数据报在到达目的之前经过了5个路由器,我们就说距离目的有5跳。
  协议:这个8位的字段表示接收数据载荷的协议,比如协议标识为6(二进制为00000110)的数据报会被传递到TCP模块。
  报头校验和:这个字段包含16位的校验和,只用于检验报头本身的有效性。数据报经过的每个路由器都会对这个值进行重新计算,因为TTL字段的值是在不断变化的。
  源IP地址:这个32位的字段包含了数据报的源IP地址。
  目的IP地址:这个32位的字段包含了数据报的目的IP地址。目的IP根据这个值检验发送的正确性。
  IP选项:这个字段支持一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。
  **填充:**IP选项字段的长度不是固定的。填充字段可以提供一些额外的0,从而保证整个报头的长度是32位的整倍数(报头长度必须是32位字的整倍数,因为“网际头长度(IHL)”字段以32位字为单位表示报头的长度)。
  IP数据载荷:这个字段一般用于保存传递给TCP或UDP(在传输层中)、ICMP或IGMP的数据。数据块的长度不定,可以包含数千字节。

IP寻址

  IP地址是一个32位的地址,被分为4个8位段(八位组)。人们人们不习惯使用32位的二进制地址或8位的二进制八位组,所以IP地址最常用的表达形式是“点分十进制形式”,由4个八位组组成的,每个八位组必须单独进行转换。在这种形式里,每个八位组都以相应的十进制数值表示,4个十进制数值以句点分隔。8位二进制可以表示0~255之间的数值,所以这种形式中每个十进制的数值都位于0~255之间。点分十进制IP地址是这个样子的:209.121.131.14。

  IP地址中的一部分是网络ID,另一部分是主机ID。划分网络ID和主机ID的最初方案是使用地址分类。虽然最近出现的CIDR无类别寻址降低了地址分类的重要性,但作为理解TCP/IP寻址的一个出发点,地址分类还是值得在此进行讨论的。地址分类系统把IP地址划分到不同的地址类。绝大多数IP地址属于以下几类。

A类地址:IP地址的前8位表示网络ID,后24位表示主机ID。
B类地址:IP地址的前16位表示网络ID,后16位表示主机ID。
C类地址:IP地址的前24位表示网络ID,后8位表示主机ID。

  那么,计算机或路由器如何判断一个IP地址是A类、B类还是C类呢?TCP/IP地址的规则使得地址本身就可以说明其类别:二进制地址的前几个位说明了地址属于哪一类,规则如下:

如果32位的地址以0开头,它就是A类地址;
如果32位的地址以10开头,它就是B类地址;
如果32位的地址以110开头,它就是C类地址。

  这种规则很容易转化为点分十进制形式,因为它们有效地限制了地址中第一个值的范围。例如,由于A类地址中第一个值的最高位必须是0,所以在点分十进制的形式中,第一个值不能大于127。
Internet规范还定义了特殊用途的D类和E类地址。D类地址用于多播。多播是把一个消息发送到网络的子网,这与广播是不同的,后者需要网络上全部节点都进行处理。
  D类地址最前面的4位是1110,对应于十进制数值是224~239。
  E类网络是实验性质的,一般不用于生产环境。E类网络地址最前面的5位是11110,对应于十进制数值是240~247。
  从理论上讲,Internet上每台计算机都必须有一个唯一的IP地址。在实际应用中,代理服务器软件和NAT设备的使用让未注册和非唯一的地址也可以连接Internet。
  有一些IP地址具有特殊含义,不会分配给主机。

全0的主机ID表示网络本身。例如,IP地址129.152.0.0是指网络ID为129.152的B类网络。
全1的主机ID表示广播。广播是向网络中全部主机发送的消息。IP地址129.152.255.255就是网络ID为129.152的B类网络的广播地址(十进制的255对应于全1的八位组11111111)。地址255.255.255.255也可以用于网络上的广播。
以十进制值127开头的地址是环回地址。目的地址为环回地址的消息是由本地TCP/IP软件发送的,其目的在于测试TCP/IP软件是否工作正常。

RFC1597(之后被RFC1918取代)保留了一些IP地址范围用于私有网络,其设想是,这些私有网络不会连接到Internet,所以不必要求是唯一的。目前,这些私有地址范围经常用于“网络地址转换(NAT)”设备背后的受保护网络。

10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255

由于私有地址范围不必与其余地址同步,所以整个地址范围对于任何网络都是可用的。网络管理员利用这些私有地址可以获得更大的子网空间和可用地址范围。
地址范围169.254.0.0~169.255.255.255保留用于自动配置。

地址解析协议(ARP)

  局域网上的计算机使用网际层的地址解析协议(ARP)把IP地址映射为物理地址。主机必须知道目的网络适配器的物理地址才能向它发送数据,网段上每台主机在内存中都保存着一个被称为ARP表或ARP缓存的表格,其中包含着网段上其他主机的IP地址与物理地址的对应关系。当主机需要向网段上的其他主机发送数据时,它会查看ARP缓存来获得目的的物理地址。ARP缓存是动态变化的。如果要接收数据的地址当前并不存在于ARP缓存,主机就会发送一个名为ARP请求帧的广播。
  ARP请求帧包含未解析的IP地址,还包含发送这个请求的主机的IP地址和物理地址。网段上的其他主机接收到这个ARP请求,拥有这个未解析IP地址的主机会向发出请求的主机发送自己的物理地址。这个新的IP地址与物理地址的对应关系就会添加到请求主机的ARP缓存里。
  一般来说,ARP缓存里的条目在一定时间之后会过期,条目就会被从表里删除。当主机需要向这个条目所包含的IP地址发送数据时,解析过程会再次重复。

逆向 ARP( RARP)

  RARP的含义是逆向ARP,也就是ARP的逆过程。当我们知道IP地址而不知道物理地址时,可以使用ARP;而在知道物理地址而不知道IP地址时,则应使用RARP。

Internet控制消息协议(ICMP)

  发送到远程计算机的数据通常会经过一个或多个路由器,这些路由器在把数据传输到最终目的地的过程中可能发生多种问题。路由器利用Internet控制消息协议(ICMP)消息把问题通知给源IP。ICMP还有用于其他调试和排错的功能。
最常见的ICMP消息:

EchoRequest(回显请求)和EchoReply(回显应答):ICMP经常被用于测试,比如测试连接的ping命令实际上就是在使用ICMP。ping向某个IP地址发送一个数据报,并且要求目的计算机在响应中返回所发送的数据。ping实际使用的命令是ICMP的EchoRequest和EchoReply。
SourceQuench(源抑制):如果一台高速计算机向远程计算机发送大量数据,可能会使路由器产生过载。这时路由器可以利用ICMP向源IP发送SourceQuench消息,让它降低发送数据的速度。如果有必要,还可以向源IP发送额外的源抑制消息。
DestinationUnreachable(目的不可到达):如果路由器收到一个不能传递的数据报,ICMP就会向源IP返回一个DestinationUnreachable消息。路由器不能传递消息的原因之一是网络由于设备故障或维修而关闭。
TimeExceeded(超时):当数据报由于TTL为0而被抛弃时,ICMP就会向源IP发送这个消息。这表示对于当前TTL值来说,到达目标需要经过太多的路由器;或者是说明路由表出了问题,导致数据报在同一台路由器上连续循环。当数据报无限循环且永远不能到达目的地时,就会发生路由环路。假设3台路由器分别位于洛杉矶、旧金山和丹佛。洛杉矶的路由器向旧金山的路由器发送一个数据报,后者又发送给丹佛,丹佛又发送给洛杉矶。这样一来,数据报就被陷在其中,不断在这3台路由器之间循环,直到TTL为0。路由环路不应该发生,但偶尔也会出现。当网络管理员在路由表里设置了一条静态路由时,有时就可能导致环路路由。
FragmentationNeeded(需要分段):如果一个数据报的“Don’tFragment(不可分解)”位被设置为1,而路由器必须要对数据报进行分段才能把它转发到下一台路由器或目的地,这时ICMP就会发送这条消息。

你可能感兴趣的:(网络编程学习笔记)