TCP/IP 详解 卷一 二

是的,我又充满血来学习了,而且这次也是啃书,这次是书籍:《TCP/IP详解》

怎么说呢、最近在一直有在面试,在面试的过程中,被问到一些深层次的东西、就会一脸懵逼,这也是我为什么开始下定决心去研究网络协议栈这种东西,但是最开始的想法是跟着《LwIP应用实战开发实战指南》,但是为了之后和小伙伴一起研究,一起学,然后选择了更为详细的《TCP/IP详解》这本书。之前总是没有人一起学习、然后就导致有几本书学到一半就没了动力去学习。

在接下来的学习过程中,我会和小伙伴一起学习,并约定一段时间进行互相提问,然后查看自己的掌握情况如何。在此过程中,我还会单独写一篇博客来记录互相提问的问题。

在此系列中,我会多使用电子书中的原句中放在文章中,但是会在其中穿插个人理解在其中(并不保证其绝对正确),以倾斜加粗的方式显示。

其中除却个人理解部分以及部分图片,均裁剪于原书。如果有些部分部分不甚了解,则可以查看原书第二版以及本人添加的个人理解。

引言

本章介绍了Internet中使用的网络层地址,又称为IP地址。我们讨论了如何为Internet中的设备分配地址,有助于路由可扩展性的地址层次结构分配方式,以及特殊用途的地址,包括广播、组播和任播地址。我们还讨论了IPv4和IPv6地址结构和用途的区别。

个人用户通常由Internet服务提供商( ISP)分配地址,通过支付费用来获得地址和执行路由0

表示IP地址

IPv4

大多数Internet用户熟悉IP地址,并且了解最流行的地址类型:IPv4地址。这些地址通常采用所谓的点分四组或点分十进制表示法。

IPv6

在IPv6中,地址的长度是128位,是IPv4地址长度的4倍。 IPv6地址的传统表示方法是采用称为块或字段的四个十六进制数,这些被称为块或字段的数由冒号分隔。例如,一个包含8个块的IPv6地址可写为5f05:2000:80ad:5800:0058:0800:2023:1d71。

IPv6的地址简写表示法:

1.一个块中前导的零不必书写。在前面的例子中,地址可写为5fO5:2000:80ad:5800:

58:800:2023:1d71。

2.全零的块可以省略,并用符号::代替。例如, IPv6地址0:0:0:0:0:0:0:1可简写为::10。同样,地址2001:0db8:0:0:0:0:0:2可简写为2001:db8::20为了避免出现歧义,一个IPv6地址中符号::只能使用一次

在某些情况下(例如表示一个包含地址的URL时), IPv6地址中的冒号分隔符可能与其他分隔符混淆,例如IP地址和端口号之间使用的冒号。在这种情况下,用括号字符[和]包围IPv6地址。

http://[2001:Odb8:85a3:08d3:1319‥8a2e:0370:7344]:443/

规则

1.前导的零必须压缩

2.::只能用于影响最大的地方(压缩最多的零)

3.a到f的十六进制数字应该用小写表示。

个人理解:本小节只是介绍了IP地址的表示方法,以及一些规则以用于统一规范。

基本的IP地址结构

由于拥有大量地址(特别是IPv6),可以方便地将地址空间划分成块。

大多数IPv4地址块最终被细分为一个地址,用于识别连接Internet或某些专用的内联网的计算机网络接口。这些地址称为单播地址。IPv4地址空间中大部分是单播地址空间。IPv6地址空间中大部分目前未使用。除了单播地址,其他类型的地址包括广播、组播和任播地址,它们可能涉及多个接口,还有一些特殊用途的地址。

分类寻址

当最初定义Internet地址结构时,每个单播IP地址都有一个网络部分,用于识别接口使用的IP地址在哪个网络中可被发现;

分类寻址

个人理解:分类寻址将前面的若干类用于区分地址。其实我在刚了解地址的五大类了,但是却不知道怎么确定是哪一个类的地址,以及分类有什么用。从这里可以看到,五大类中的所含主机数目是不同的,而在不同的网络中,可能使用的主机数目是不同的,因此便出现了ABC这三类的区别。
区分这些类 的方法就是网络号前的若干非自由位。如A类地址网络号有一个非自由位,且该位必须为0,也就导致了A类地址的地址范围是0.0.0.0~127.255.255.255,而128.0.0.0的第一位已经为1,已经不属于A类地址,属于下一类的B类地址。由此也可以判断出家庭网络中的IP为192.168.x.x为C类地址,且理论上只能存在254个主机,其中0,255不可用

空间划分

个人理解:这种分类寻址也是存在了一些弊端,容易造成地址的浪费且不方便

Internet地址分类方法在经历Internet增长( 20世纪80年代)的第一个十年中没有变化。此后,它开始出现规模问题,当每个新的网段被添加到Internet中,集中协调为其分配一个新的A类、B类或C类网络号变得很不方便。另外, A类和B类网络号通常浪费太多主机号,而C类网络号不能为很多站点提供足够的主机号。

子网寻址

在20世纪80年代初,随着局域网(LAN)的发展和增加,这个问题变得更棘手。为了解决这个问题,人们很自然想到一种方式,在一个站点接入Internet后为其分配一个网络号,然后由站点管理员进一步划分本地的子网数。在不改变Internet核心路由基础设施的情况下解决这个问题将会更好。

Internet其余部分将只能“看到”传统的A类、 B类和C类部分。支持此功能的方法称为子网寻址[RFCO950]。通过子网寻址,一个站点被分配一个A类、 B类或C类的网络号,保留一些剩余主机号进一步用于站点内分配。该站点可能将基础地址中的主机部分进一步划分为一个子网号和一个主机号。从本质上来说,子网寻址为IP地址结构增加了一个额外部分,但它没有为地址增加长度。因此,一个站点管理员能在子网数和每个子网中预期的主机数之间折中,同时不需要与其他站点协调。

子网寻址提供额外灵活性的代价是增加成本。

B类子网地址划分

个人理解:在此方法下,通过不同的子网ID长度,图中为8位,即可灵活的分配不易造成IP地址的浪费

子网掩码

子网掩码是由一台主机或路由器使用的分配位,以确定如何从一台主机对应IP地址中获得网络和子网信息。IP子网掩码与对应的IP地址长度相同(IPv4为32位, IPv6为128位)。它们通常在一台主机或路由器中以IP地址相同的方式配置,既可以是静态的(通常是路由器),也可以使用一些动态方式,例如动态主机配置协议(DHCP ;见第6章)。

子网掩码示例

个人理解:子网掩码在使用中,网络号和子网ID相同数目的ID为1,主机ID对应的位为0。其中前面为1的部分称为前缀(以/数字来区别)。如现在常用的局域网192.168.4.1中多使用子网掩码为255.255.255.0,此为C类地址,且子网ID占用0位,主机ID占用8位。使用子网掩码的方式,可以实现方便找到的所属的站点管理器/路由(将地址与掩码进行或运算 —> 192.168.4.0)。

可变长度子网掩码

在同一站点的不同部分,可将不同长度的子网掩码应用于相同网络号。虽然这样增加了地址配置管理的复杂性,但也提高了子网结构的灵活性,这是由于不同子网可容纳不同数量的主机。目前,大多数主机、路由器和路由协议支持可变长度子网掩码(VLSM)。

VLSM网络拓扑图

不同的子网掩码被用于站点中的子网128.32.0.0/16 :/24、 /25和/260这样,每个子网可提供不同数量的主机。

注意,主机和路由器的每个接口都需要用IP地址和子网掩码来描述,但掩码决定了网络拓扑的不同。墓于路由器中运行的动态路由协议(例如OSPF、 IS-1S、 RIPv2),流量能正确地在同一站点中的主机之间流动,以及通过Internet前往或来自外部站点。

尽管这可能并不显而易见,但有一个常见情况,即一个子网中只包含两台主机。当路由器之间被一条点到点链路连接,则每个端点都需要分配一个IP地址,常见做法是IPv4使用/31为前缀,目前也有建议IPv6使用/127为前缀[RFC6164]。

个人理解:VLSM给子网结构更加的提高了灵活性。可以更加详细的划分以及适配子网中不同数量的主机

广播地址

在每个IPv4子网中,一个特殊地址被保留作为子网广播地址。子网广播地址通过将IPv4地址的网络/子网部分设置为适当值,以及主机部分的所有位设置为1而形成。

广播地址的计算

个人理解:在常见的局域网内常见的广播地址为192.168.0.255。这种是无子网ID,主机ID为8位,或运算得到,而在有子网ID的情况下,例如6位,其广播地址最后一字节就不一定为255了。在之前的理解中,由于其常见为255,因此之前错误的认知是,广播地址就是255是不对的,要根据具体的子网ID 来判断

使用这种地址作为目的地的数据报,也被称为定向广播。至少在理论上,这种广播可作为一个单独的数据报通过Internet路由直至到达目标子网,再作为一组广播数据报发送给子网中所有主机。

定向广播是一个大问题,从安全的角度来看,它们至今在Internet中仍被禁用。 [RFC0919]描述了针对IPv4的各类广播, [RFC1812]建议支持由路由器转发定向广播,它不仅可用,而且默认启用。 [RFC2644]使这个策略发生逆转,路由器现在默认禁止转发定向广播,甚至完全省略支持能力。

个人理解:因此目前来说,IP地址设置为255也不可用?

IPv6地址和接口标识符

个人理解:说实话,IPv6地址中,包含的信息也太多了些(手动捂脸),实际情况中是在用到的时候再去翻书比较好

链路本地IPv6地址(和一些全球性IPv6地址)使用接口标识符(ⅡD)作为一个单播IPv6地址的分配基础。除了地址是以二进制值000开始之外, ⅡD在所有情况下都作为一个IPv6地址的低序位,这样它们必须在同一网络中有唯一前缀。 ⅡD的长度通常是64位,并直接由一个网络接日相关的链路层MAC地址形成,该地址使用修改的EU1-64格式[EU164],或者由其他进程随机提供的值形成,以提供可防范地址跟踪的某种程度的隐私保护(见第6章)。

个人理解:直接使用MAC确实不安全

在IEEE标准中, EUI表示扩展唯一标识符。EUI-64标识符开始于一个24位的组织唯一标识符(OUI),接着是一个由组织分配的40位扩展标识符,它由前面24位识别。

EUI-48和EUI-64

OUI的长度是24位,并占据EU1-48和EU1-64地址的前3个字节。这些地址的第一个字节的低两位分别是u位和g位。当u位被设置时,表示该地址是本地管理。当g位被设置时, 表示该地址是一组或组播类型的地址。

CIDR和聚合

20世纪90年代初,在采用子网寻址缓解增长带来的痛苦后, Internet开始面临更严重的规模问题。有三个问题很重要,需要立即引起注意:

1.到1994年,一半以上的B类地址已被分配。预计, B.类地址空间大约在1995年将被用尽。
2.32位的IPv4地址被认为不足以应付Internet在21世纪初的预期规模。
3.全球性路由表的条目数(每个网络号对应一条), 1995年大约为65000个条目,目前仍在增长中。随着越来越多A类、 B类和C类路由条目的出现,路由性能将受到影响。

前缀

为了帮助缓解IPv4地址(特别是B类地址)的压力,分类寻址方案通常使用一个类似VLSM的方案,扩展Internet路由系统以支持无类别域间路由(CIDR) [RFC4632]。

提供了一种方便的分配连续地址范围的方式,包含多于255台但少于65 536台主机。也就是说,不只是单个B类或多个C类网络号可分配给站点。使用CIDR,未经过预定义的任何地址范围可作为一个类的一部分,但需要一个类似于子网掩码的掩码,有时也称为CIDR掩码。

CIDR掩码不再局限于一个站点,而对全球性路由系统都是可见的。因此,除了网络号之外,核心Internet路由器必须能解释和处理掩码。这个数字组合称为网络前缀,它用于IPv4和IPv6地址管理。

一个n位的前缀是一个地址的前n个位的预定义值。它通常被追加到基本IP地址,并且后面跟着一个/字符。

网络前缀示意图

聚合

通过取消分类结构的IP地址,能分配各种尺寸的IP地址块。但是,这样做没有解决问题本大节中的第三个问题。

个人理解:第三个问题其实是因为越来越多的机构等接入了全球网络,便造成了全球性路由的性能的降低。IP->IP的最短路径问题以及快速找到条目的问题需要解决

维护Internet中到所有目的地的最短路径的同时,又能够显著减少路由表条目数。最有名的方法是20世纪70年代末由Kleiurock和Kamoun发表的分层路由研究[KK77]。他们发现,如果将网络拓扑排列为一棵树,并且以对这个网络拓扑“敏感的”方式来分配地址,这样可获得一个非常小的路由表,同时保持到所有目的地的最短路径。

树状拓扑网络

个人理解:通过这个图可以看到拓扑敏感的树状图所使用的条目比随机的少了很多,且通过该种结构很快的找到对应的地址。但是这种也造成了一个问题,一个拓补发生改变,需要重新分配地址,而与位置无关的则不需要。而如下所述聚合的方式以一种更好的方式解决了该问题

在Internet环境中,可采用分层路由思想以一种特定方式减少Internet路由条目数。这通过一个称为路由聚合的过程来实现。通过将相邻的多个IP前缀合并成一个短前缀(称为一个聚合或汇聚),可以覆盖更多地址空间。

聚合讲解示意图

个人理解:这个图展示了聚合的方式减少了路由条目数,通过或运算以及改变前缀的方式,将几个网络聚合成了一个范围更广的网络(前缀数字变小,前缀数目变少)

特殊用途地址

个人理解:这个用途,是真的只是看看就好,留个白,书中罗列了IPv4和IPv6的一些特殊用途。我也不搬砖截图了

IPv4/IPv6地址转换

在有些网络中,可能需要在IPv4和IPv6之间转换[RFC6127]。目前,已制定了一个用于单播转换的框架[RFC6144],以及一个正在开发的用于组播转换的方案[IDv 4v6mac]。

v4v6地址转换图

组播地址

IPv4和IPv6支持组播寻址。一个IP组播地址(也称为组或组地址)标识一组主机接口,而不是单个接口。一般来说,一个组可以跨越整个Internet。一个组所覆盖的网络部分称为组的范围[RFC2365]。常见的范围包括节点本地(同一计算机)、链路本地(同一子网)、站点本地(适用于一些站点)、全球(整个Internet)和管理。管理范围的地址可用于一个网络区域内已手动配置到路由器的地址。站点管理员可将路由器配置为管理范围边界,这意味着相关组的组播流量不会被路由器转发。注意,站点本地和管理范围只在使用组播寻址时有效。

在软件的控制下,每个Internet主机中的协议栈能加人或离开一个组播组。当一台主机向一个组发送数据时,它会创建一个数据报,使用(单播) IP地址作为源地址,使用组播IP地址作为目的地址。已加入组的所有主机将接收发送到该组的任何数据报。发送方通常不知道主机是否接收到数据报,除非它们明确做出应答。事实上,发送方甚至不知道通常有多少台主机接收它的数据报。

至此,原有的组播服务模型已成为大家所知的任意源组播(ASM)。在这种模型下,任何发送方可以发送给任何组;一个加入组的接收方被指定唯一的组地址。一种新方案称为源特定组播( SSM)[RFC3569][RFC4607],在每个组中只使用一个发送方(见[RFC4607]的勘误表)。在这种情况下,当一台主机加入一个组后,它会被指定一个信道地址,其中包括一个组地址和一个源IP地址。SSM避免了ASM模型部署时的复杂性。尽管有多种组播形式在整个Internet中广泛使用,但SSM是当前更受欢迎的候选者。

个人理解:ASM大概是用来实现UDP的组播,而SSM大概类似于上上一大节中的广播。感觉有点不大对劲,但目前我确实是这么理解的

IPv4组播地址

IPv6组播地址

个人理解:这两小节真的全是定义以及说出组播地址的详细描述,这里也不赘述了,如果真的想要了解的话,请查看书籍

任播地址

任播地址是一个单播IPv4或IPv6地址,这些地址根据它所在的网络确定不同的主机。

这是通过配置路由器通知Internet中多个站点有相同单播路由来实现。因此,一个任播地址不是指Internet中的一台主机,而是对于任播地址“最合适”或“最接近”的一台主机。任播地址最常用于发现一台提供了常用服务的计算机[RFC4786]。例如,某个数据报发送到一个任播地址,可用于找到DNS服务器(见第11章), 6to4网关将IPv6流量封装在IPv4隧道中[RFC3068],或用于组播路由的RP中[RFC4610]。

个人理解:哈哈哈哈哈,这是个什么鬼东西

分配

IP地址空间通常被分配为大的块,这由一些分层次组织的权威机构完成。

个人理解:这一大节是讲IP地址如何进行分配,对于学习协议来说,大概看一下就好,没什么需要记得。因此略过

与IP相关的攻击

IP地址基本上都是数字,只有少数网络攻击涉及它们。一般情况下,执行攻击可发送“欺骗”数据包(见第5章)或其他相关活动。也就是说, IP地址现在有助于查明涉嫌不良活动的个体(例如,对等网络中的版权侵权或非法材料分发)。这样做可能被以下几个原因所误导。例如,在很多情况下,IP地址只是暂时的,并在不同时间重新分配给不同用户。因此,在精确计时中出现任何错误,容易造成数据库中的IP地址到用户的映射出错。另外,访问控制没有被广泛和安全地部署;用户可能通过一些公共的接入点,或一些无意中开放的家庭或办公室的无线路由器连接Internet。在这种情况下,不知情的家庭或企业所有者可能因IP地址而成为嫌疑人,即使这个人并不是网络流量的发送者。这种情况也可能因受攻击的主机被用于组成僵尸网络而发生。目前,这类计算机(和路由器)可通过基于Internet的黑市来租赁,并被用于执行攻击、非法内容服务和其他违法活动[RFC4948]。

总结

IP地址用于识别和定位整个Internet系统(单播地址)中设备的网络接口。它也用于识别多个接口(组播、广播或任播地址)。每个接口有一个最少32位的IPv4地址,并且通常有几个128位的IPv6地址。单播地址由一些分层次组织的管理机构分配成块。由这些机构分配的前缀表示一个单播IP地址空间块,这些块通常分配给ISP,并由它们为自已的用户分配地址。这种前缀通常是ISP地址块的子区间(称为供应商聚合的地址或PA地址),但也可能代之为用户拥有的地址(称为供应商独立的地址或PI地址)。数值相邻的地址前缀(PA地址)可被聚合,以节省路由表空间和提高Internet扩展性。这种方法出现于由A、 B、 C类网络号组成的“有类别” Internet网络结构被无类别域间路由(CIDR)所取代时。CIDR允许根据对地址空间的不同需求,将不同大小的地址块分配给某个组织, CIDR实际上可以更有效地分配地址空间。任播地址是根据发送者位置指向不同主机的单播地址;这种地址常用于发现可能出现在不同位置的网络服务

IPv6单播地址与IPv4地址有所不同。最重要的是, IPv6地址有一个范围的概念,无论是单播地址还是组播地址,都需要明确指出地址的有效范围。典型的范围包括节点本地、链路本地和全球范围。链路本地地址通常基于一个标准前缀和一个IID创建,这个IID可由低层协议(例如硬件/MAC地址)基于地址提供或取随机值。这种方法有助于自动配置IPv6地址。

IPv4和IPv6都支持同时指向多个网络接口的地址格式。 IPv4支持广播地址和组播地址,但IPv6只支持组播地址。广播允许一人对所有人通信,而组播允许一人对多人通信。发送方向组播组(IP地址)的发送,其行为有点像电视频道;发送方并不知道接收方信息或一个信道中有多少个接收方。 Internet中的全球性组播已发展了十多年,并且涉及很多协议,有些是针对路由,有些是针对地址分配和协调,有些是针对主机希望加入或离开一个组的信息。无论是IPv4还是IPv6,特别是IPv6,都有很多类型和用途的组播地址。 IPv6组播地址格式变化提供了基于单播前缀分配组的方法,在组中嵌入路由信息(RP地址),并且能基于IID创建组播地址。

可以说CIDR的开发和部署是Internet核心路由系统的一个根本性变化。 CIDR成功地为分配地址空间提供更多灵活性,并通过聚合提升路由的可扩展性。另外, IPv6在20世纪90年代初开始受到更多重视,这是出于很快将会需要更多地址的想法。当时没有预见的是,NAT (见第7章)的广泛使用显著推迟了IPv6的使用,这是因为连接Internet的每台主机不再需要唯一的地址。相反,大型网络使用专用地址空间已司空见惯。但是,可用于路由的IP地址数量最终将减少到零,因此未来将会出现一些变化。2011年2月, IANA分配了最后5个/8的IPv4地址前缀, 5个RIR备分配1个前缀0 2011年04月15目, APNIC用尽了其所有可分配的前缀。剩余前缀由不同RIR持有,预计最多只能几年保持未分配状态。 [IP4R]是一个关于当前IPv4地址利用率的统计。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!