【摘录】网络是怎样连接的

发布于:2019-07-20 14:15,阅读数:155,点赞数:0


# 摘录 共计:188个摘录 ## 1.3 全世界DNS服务器的大接力 - 当记录类型为MX时,DNS服务器会在记录中保存两种信息,分别是邮件服务器的域名和优先级[插图]。 - 前面只介绍了A和MX这两个记录类型,实际上还有很多其他的类型。例如根据IP地址反查域名的PTR类型,查询域名相关别名的CNAME类型,查询DNS服务器IP地址的NS类型,以及查询域名属性信息的SOA类型等。 - 一个域的信息是作为一个整体存放在DNS服务器中的,不能将一个域拆开来存放在多台DNS服务器中。 - 负责管理下级域的DNS服务器的IP地址注册到它们的上级DNS服务器中,然后上级DNS服务器的IP地址再注册到更上一级的DNS服务器中,以此类推。也就是说,负责管理lab.glasscom.com这个域的DNS服务器的IP地址需要注册到glasscom.com域的DNS服务器中,而glasscom.com域的DNS服务器的IP地址又需要注册到com域的DNS服务器中。 - com和jp的上面还有一级域,称为根域。根域不像com、jp那样有自己的名字,因此在一般书写域名时经常被省略,如果要明确表示根域,应该像www.lab.glasscom.com. - 将根域的DNS服务器信息保存在互联网中所有的DNS服务器中。这样一来,任何DNS服务器就都可以找到并访问根域DNS服务器了。因此,客户端只要能够找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再一路顺藤摸瓜找到位于下层的某台目标DNS服务器 - 有时候并不需要从最上级的根域开始查找,因为DNS服务器有一个缓存[插图]功能,可以记住之前查询过的域名。如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应 - 当要查询的域名不存在时,“不存在”这一响应结果也会被缓存。 ## 2.3 收发数据 - 每个网络包能容纳的数据长度,协议栈会根据一个叫作MTU[插图]的参数来进行判断。MTU表示一个网络包的最大长度,在以太网中一般是1500字节 - 从MTU减去头部的长度,然后得到的长度就是一个网络包中所能容纳的最大数据长度,这一长度叫作MSS[插图]。 - 因为ACK号的返回变慢大多是由于网络拥塞引起的,因此如果此时再出现很多多余的重传,对于本来就很拥塞的网络来说无疑是雪上加霜。 - TCP采用了动态调整等待时间的方法,这个等待时间是根据ACK号返回所需的时间来判断的。具体来说,TCP会在发送数据的过程中持续测量ACK号的返回时间,如果ACK号返回变慢,则相应延长等待时间;相对地,如果ACK号马上就能返回,则相应缩短等待时间[插图]。 - 如果不等返回ACK号就连续发送包,就有可能会出现发送包的频率超过接收方处理能力的情况。 - 能够接收的最大数据量称为窗口大小[插图],它是TCP调优参数中非常有名的一个。 - 什么时候需要更新窗口大小呢?当收到的数据刚刚开始填入缓冲区时,其实没必要每次都向发送方更新窗口大小,因为只要发送方在每次发送数据时减掉已发送的数据长度就可以自行计算出当前窗口的剩余长度。因此,更新窗口大小的时机应该是接收方从缓冲区中取出数据传递给应用程序的时候。这个操作是接收方应用程序发出请求时才会进行的,而发送方不知道什么时候会进行这样的操作,因此当接收方将数据传递给应用程序,导致接收缓冲区剩余容量增加时,就需要告知发送方,这就是更新窗口大小的时机。 - 那么ACK号又是什么情况呢?当接收方收到数据时,如果确认内容没有问题,就应该向发送方返回ACK号,因此我们可以认为收到数据之后马上就应该进行这一操作。 - 接收方在发送ACK号和窗口更新时,并不会马上把包发送出去,而是会等待一段时间,在这个过程中很有可能会出现其他的通知操作,这样就可以把两种通知合并在一个包里面发送了。举个例子,在等待发送ACK号的时候正好需要更新窗口,这时就可以把ACK号和窗口更新放在一个包里发送,从而减少包的数量。当需要连续发送多个ACK号时,也可以减少包的数量,这是因为ACK号表示的是已收到的数据量,也就是说,它是告诉发送方目前已接收的数据的最后位置在哪里,因此当需要连续发送ACK号时,只要发送最后一个ACK号就可以了,中间的可以全部省略。当需要连续发送多个窗口更新时也可以减少包的数量,因为连续发生窗口更新说明应用程序连续请求了数据,接收缓冲区的剩余空间连续增加。这种情况和ACK号一样,可以省略中间过程,只要发送最终的结果就可以了。 ## 2.4 从服务器断开并删除套接字 - 和服务器的通信结束之后 - 这时我们就可以删除这个套接字了。不过,套接字并不会立即被删除,而是会等待一段时间之后再被删除 - 至于具体等待多长时间,这和包重传的操作方式有关。网络包丢失之后会进行重传,这个操作通常要持续几分钟。如果重传了几分钟之后依然无效,则停止重传。在这段时间内,网络中可能存在重传的包,也就有可能发生前面讲到的这种误操作,因此需要等待到重传完全结束。协议中对于这个等待时间没有明确的规定,一般来说会等待几分钟之后再删除套接字。 ## 2.5 IP与以太网的包收发操作 - ARP缓存中的值在经过一段时间后会被删除,一般这个时间在几分钟左右。这个删除的操作非常简单粗暴,不管ARP缓存中的内容是否有效,只要经过几分钟就全部删掉,这样就不会出问题了。 - 以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术 - 以太网经历了数次变迁,但其基本的3个性质至今仍未改变,即将包发送到MAC头部的接收方MAC地址代表的目的地,用发送方MAC地址识别发送方,用以太类型识别包的内容。因此,大家可以认为具备这3个性质的网络就是以太网[插图]。 - 真正生效的是网卡驱动进行初始化时在MAC模块中设置的那个MAC地址[插图]。在操作系统启动并完成这些初始化操作之后,网卡就可以等待来自IP的委托了。 - 报头是一串像10101010…这样1和0交替出现的比特序列,长度为56比特,它的作用是确定包的读取时机。 - 只要对信号进行一段时间的观察,就可以找到其变化的周期。因此,我们不能一开始就发送包的数据,而是要在前面加上一段用来测量时钟信号的特殊信号,这就是报头的作用[插图]。 - 发送信号的操作分为两种,一种是使用集线器的半双工模式,另一种是使用交换机的全双工[插图]模式。 - 在半双工模式中,为了避免信号碰撞,首先要判断网线中是否存在其他设备发送的信号。如果有,则需要等待该信号传输完毕,因为如果在有信号时再发送一组信号,两组信号就会发生碰撞。 - 接下来,PHY(MAU)模块会将信号转换为可在网线上传输的格式,并通过网线发送出去。 - PHY(MAU)的职责并不是仅仅是将MAC模块传递过来的信号通过网线发送出去,它还需要监控接收线路中有没有信号进来。在开始发送信号之前,需要先确认没有其他信号进来,这时才能开始发送。如果在信号开始发送到结束发送的这段时间内一直没有其他信号进来,发送操作就成功完成了。以太网不会确认发送的信号对方有没有收 - PHY(MAU)的职责并不是仅仅是将MAC模块传递过来的信号通过网线发送出去,它还需要监控接收线路中有没有信号进来。在开始发送信号之前,需要先确认没有其他信号进来,这时才能开始发送。如果在信号开始发送到结束发送的这段时间内一直没有其他信号进来,发送操作就成功完成了。以太网不会确认发送的信号对方有没有收到。根据以太网的规格,两台设备之间的网线不能超过100米[插图],在这个距离内极少会发生错误,万一[插图]发生错误,协议栈的TCP也会负责搞定,因此在发送信号时没有必要检查错误。 - 在发送信号的过程中,接收线路不应该有信号进来,但情况并不总是尽如人意,有很小的可能性出现多台设备同时进行发送操作的情况。如果有其他设备同时发送信号,这些信号就会通过接收线路传进来。在使用集线器的半双工模式中,一旦发生这种情况,两组信号就会相互叠加,无法彼此区分出来,这就是所谓的信号碰撞。这种情况下,继续发送信号是没有意义的,因此发送操作会终止。为了通知其他设备当前线路已发生碰撞,还会发送一段时间的阻塞信号[插图],然后所有的发送操作会全部停止。等待一段时间之后,网络中的设备会尝试重新发送信号。但如果所有设备的等待时间都相同,那肯定还会发生碰撞,因此必须让等待的时间相互错开。具体来说,等待时间是根据MAC地址生成一个随机数计算出来的。当网络拥塞时,发生碰撞的可能性就会提高,重试发送的时候可能又会和另外一台设备的发送操作冲突,这时会将等待时间延长一倍,然后再次重试。以此类推,每次发生碰撞就将等待时间延长一倍,最多重试10次,如果还是不行就报告通信错误。 - 在使用集线器的半双工模式以太网中,一台设备发送的信号会到达连接在集线器上的所有设备。这意味着无论是不是发给自己的信号都会通过接收线路传进来,因此接收操作的第一步就是不管三七二十一把这些信号全都收进来再说。 - 信号的开头是报头,通过报头的波形同步时钟,然后遇到起始帧分界符时开始将后面的信号转换成数字信息。 - 如果FCS校验没有问题,接下来就要看一下MAC头部中接收方MAC地址与网卡在初始化时分配给自己的MAC地址是否一致,以判断这个包是不是发给自己的。我们没必要去接收发给别人的包,因此如果不是自己的包就直接丢弃,如果接收方MAC地址和自己MAC地址一致,则将包放入缓冲区中[插图]。到这里,MAC模块的工作就完成了,接下来网卡会通知计算机收到了一个包。 - 通知计算机的操作会使用一个叫作中断的机制。 - 网卡向扩展总线中的中断信号线发送信号,该信号线通过计算机中的中断控制器连接到CPU。当产生中断信号时,CPU会暂时挂起正在处理的任务,切换到操作系统中的中断处理程序[插图]。然 - 网卡驱动被中断处理程序调用后,会从网卡的缓冲区中取出收到的包,并通过MAC头部中的以太类型字段判断协议的类型。现在我们在大多数情况下都是使用TCP/IP协议,但除了TCP/IP之外还有很多其他类型的协议,例如NetWare中使用的IPX/SPX,以及Mac电脑中使用的AppleTalk等协议。这些协议都被分配了不同的以太类型,如0080(十六进制)代表IP协议,网卡驱动就会把这样的包交给TCP/IP协议栈;如果是809B则表示AppleTalk协议,就把包交给AppleTalk协议栈,以此类推[插图]。 - 服务器返回的包的以太类型应该是0800,因此网卡驱动会将其交给TCP/IP协议栈来进行处理。接下来就轮到IP模块先开始工作了,第一步是检查IP头部,确认格式是否正确。如果格式没有问题,下一步就是查看接收方IP地址。如果接收网络包的设备是一台Windows客户端计算机,那么服务器返回的包的接收方IP地址应该与客户端网卡的地址一致,检查确认之后我们就可以接收这个包了。 - 如果接收方IP地址不是自己的地址,那一定是发生了什么错误。客户端计算机不负责对包进行转发,因此不应该收到不是发给自己的包[插图]。当发生这样的错误时,IP模块会通过ICMP消息将错误告知发送方 - 如果接收方IP地址正确,则这个包会被接收下来,这时还需要完成另一项工作。IP协议有一个叫作分片的功能,具体的内容我们将在第3章探索路由器时进行介绍。简单来说,网线和局域网中只能传输小包,因此需要将大的包切分成多个小包。如果接收到的包是经过分片的,那么IP模块会将它们还原成原始的包。分片的包会在IP头部的标志字段中进行标记,当收到分片的包时,IP模块会将其暂存在内部的内存空间中,然后等待IP头部中具有相同ID的包全部到达,这是因为同一个包的所有分片都具有相同的ID。此外,IP头部还有一个分片偏移量(fragment offset)字段,它表示当前分片在整个包中所处的位置。根据这些信息,在所有分片全部收到之后,就可以将它们还原成原始的包,这个操作叫作分片重组。 - TCP模块会根据IP头部中的接收方和发送方IP地址,以及TCP头部中的接收方和发送方端口号来查找对应的套接字[插图]。找到对应的套接字之后,就可以根据套接字中记录的通信状态,执行相应的操作了。例如,如果包的内容是应用程序数据,则返回确认接收的包,并将数据放入缓冲区,等待应用程序来读取;如果是建立或断开连接的控制包,则返回相应的响应控制包,并告知应用程序建立和断开连接的操作状态。 ## 2.6 UDP协议的收发操作 - 在某种情况下,即便没有TCP这样复杂的机制,我们也能够高效地重发数据,这种情况就是数据很短,用一个包就能装得下。如果只有一个包,就不用考虑哪个包未送达了,因为全部重发也只不过是重发一个包而已,这种情况下我们就不需要TCP这样复杂的机制了。 ## 3.1 信号在网线和集线器中传输 - 以太网信号的本质是正负变化的电压,大家可以认为网卡的PHY(MAU)模块就是一个从正负两个信号端子输出信号的电路。 ## 3.2 交换机的包转发操作 - 大家可以认为交换机的每个网线接口后面都是一块网卡。网线接口和后面的电路部分加在一起称为一个端口,也就是说交换机的一个端口就相当于计算机上的一块网卡[插图]。 - 交换机的端口不核对接收方MAC地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,交换机的端口不具有MAC地址[插图]。 - 将包存入缓冲区后,接下来需要查询一下这个包的接收方MAC地址是否已经在MAC地址表中有记录了。MAC地址表主要包含两个信息,一个是设备的MAC地址,另一个是该设备连接在交换机的哪个端口上。 - MAC地址表的内容进行维护 - 收到包时,将发送方MAC地址以及其输入端口的号码写入MAC地址表中。由于收到包的那个端口就连接着发送这个包的设备,所以只要将这个包的发送方MAC地址写入地址表,以后当收到发往这个地址的包时,交换机就可以将它转发到正确的端口了。交换机每次收到包时都会执行这个操作,因此只要某个设备发送过网络包,它的MAC地址就会被记录到地址表中。 - 地址表中的记录不能永久有效,而是要在一段时间不使用后就自动删除。 - 为了防止终端设备移动产生问题,只需要将一段时间不使用的过时记录从地址表中删除就可以了。 - 地址表中找不到指定的MAC地址。这可能是因为具有该地址的设备还没有向交换机发送过包,或者这个设备一段时间没有工作导致地址被从地址表中删除了。这种情况下,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。这样做不会产生什么问题,因为以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收包,而其他设备则会忽略这个包。 - 发送了包之后目标设备会作出响应,只要返回了响应包,交换机就可以将它的地址写入地址表,下次也就不需要把包发到所有端口了。 - 全双工模式是交换机特有的工作模式,它可以同时进行发送和接收操作,集线器不具备这样的特性。 - 。在全双工模式下,无需等待其他信号结束就可以发送信号,因此它比半双工模式速度要快[插图]。 - 在全双工模式刚刚出现的时候,还需要手动进行切换,但这样实在太麻烦,于是后来出现了自动切换工作模式的功能。这一功能可以由相互连接的双方探测对方是否支持全双工模式,并自动切换成相应的工作模式。此外,除了能自动切换工作模式之外,还能探测对方的传输速率并进行自动切换。这种自动切 - 在以太网中,当没有数据在传输时,网络中会填充一种被称为连接脉冲的脉冲信号。在没有数据信号时就填充连接脉冲,这使得网络中一直都有一定的信号流过,从而能够检测对方是否在正常工作,或者说网线有没有正常连接。 - 自动协商功能就利用了这样的脉冲信号,即通过这种信号将自己能够支持的工作模式[插图]和传输速率相互告知对方,并从中选择一个最优的组合[插图]。 ## 3.3 路由器的包转发操作 - 因为路由器是基于IP设计的,而交换机是基于以太网设计的[插图] - 路由器的端口具有MAC地址[插图],因此它就能够成为以太网的发送方和接收方[插图]。端口还具有IP地址,从这个意义上来说,它和计算机的网卡是一样的。当转发包时,首先路由器端口会接收发给自己的以太网包[插图],然后查询转发目标,再由相应的端口作为发送方将以太网包发送出去。这一点和交换机是不同的,交换机只是将进来的包转发出去而已,它自己并不会成为发送方或者接收方。 - 跃点计数,它表示距离目标IP地址的距离是远还是近。这个数字越小,表示距离目的地越近;数字越大,表示距离目的地越远。 - 信号到达网线接口部分,其中的PHY(MAU)模块和MAC模块将信号转换为数字信息,然后通过包末尾的FCS进行错误校验,如果没问题则检查MAC头部中的接收方MAC地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。 - 完成包接收操作之后,路由器就会丢弃包开头的MAC头部。MAC头部的作用就是将包送达路由器,其中的接收方MAC地址就是路由器端口的MAC地址。因此,当包到达路由器之后,MAC头部的任务就完成了,于是MAC头部就会被丢弃。 - 有时候路由表中会存在网络号长度相同的多条记录,例如考虑到路由器或网线的故障而设置的备用路由就属于这种情况。这时,需要根据跃点计数的值来进行判断。跃点计数越小说明该路由越近,因此应选择跃点计数较小的记录。 - 如果在路由表中无法找到匹配的记录,路由器会丢弃这个包,并通过ICMP[插图]消息告知发送方[插图]。 - 路由器工作的网络环境就是互联网,它的规模是远远大于以太网的,全世界所有的设备都连接在互联网上,而且规模还在持续扩大,未来的互联网里到底会有多少设备,我们谁都说不准。在如此庞大的网络中,如果将不知道应该转发到哪里的包发送到整个网络上,那就会产生大量的网络包,造成网络拥塞。因此,路由器遇到不知道该转发到哪里的包,就会直接丢弃。 - 只要将子网掩码设置为0.0.0.0,那么无论任何地址都能匹配到这一条记录,这样就不会发生不知道要转发到哪里的问题了。只要在这一条记录的网关列中填写接入互联网的路由器地址,当匹配不到其他路由时[插图],网络包就会被转发到互联网接入路由器。因此这条记录被称为默认路由,这一行配置的网关地址被称为默认网关。在计算机的TCP/IP设置窗口中也有一个填写默认网关的框,意思是一样的。计算机上也有一张和路由器一样的路由表,其中默认网关的地址就是我们在设置窗口中填写的地址。 - TTL字段表示包的有效期,包每经过一个路由器的转发,这个值就会减1,当这个值变成0时,就表示超过了有效期,这个包就会被丢弃。 - 这个机制是为了防止包在一个地方陷入死循环。如果路由表中的转发目标都配置正确,应该不会出现这样的情况,但如果其中的信息有问题,或者由于设备故障等原因切换到备用路由时导致暂时性的路由混乱,就会出现这样的情况。 - 最大包长度是由端口类型决定的,用这个最大长度减掉头部的长度就是MTU,将MTU与要转发的包长度进行比较。如果输出端口的MTU足够大,那么就可以不分片直接发送;如果输出端口的MTU太小,那么就需要将包按照这个MTU进行分片,但在此之前还需要看一下IP头部中的标志字段,确认是否可以分片[插图]。 - 如果查询标志字段发现不能分片,那么就只能丢弃这个包,并通过ICMP消息通知发送方。 - 如果是以太网端口,则按照以太网的规则将包转换为电信号发送出去;如果是ADSL则按照ADSL的规则来转换,以此类推。在家庭网络中,路由器后面一般连接ADSL等线路接入互联网,因此路由器会根据接入网的规则来发送包。 - 首先,为了判断MAC头部中的MAC地址应该填写什么值,我们需要根据路由表的网关列判断对方的地址。如果网关是一个IP地址,则这个IP地址就是我们要转发到的目标地址;如果网关为空[插图],则IP头部中的接收方IP地址就是要转发到的目标地址。知道对方的IP地址之后,接下来需要通过ARP[插图]根据IP地址查询MAC地址,并将查询的结果作为接收方MAC地址。路由器也有ARP缓存,因此首先会在ARP缓存中查询 - 路由器是基于IP设计的,而交换机是基于以太网设计的,因此IP与以太网的关系也就是路由器与交换机的关系。换句话说,路由器将包的传输工作委托给交换机来进行[插图]。 - 从包的转发目标也可以看出路由器和交换机之间的委托关系。IP并不是委托以太网将包传输到最终目的地,而是传输到下一个路由器。在创建MAC头部时,也是从IP的路由表中查找出下一个路由器的IP地址,并通过ARP查询出MAC地址,然后将MAC地址写入MAC头部中的,这表示IP对以太网的委托只是将包传输到下一个路由器就行了。当包到达下一个路由器后,下一个路由器又会重新委托以太网将包传输到再下一个路由器。随着这一过程反复执行,包就会最终到达IP的目的地,也就是通信的对象。 - 简单来说,IP (路由器)负责将包发送给通信对象这一整体过程,而其中将包传输到下一个路由器的过程则是由以太网(交换机)来负责的。 ## 3.4 路由器的附加功能 - 内网中的设备不能和互联网直接收发网络包,而是通过一种特别的机制进行连接,这个机制就叫地址转换。 - 将发送方IP地址从私有地址改写成公有地址。 - 当数据收发结束,进入断开阶段,访问互联网的操作全部完成后,对应表中的记录就会被删除。 - 用于外网访问的服务器可以放在地址转换设备的外面并为它分配一个公有地址,也可以将服务器的私有地址手动添加到地址转换设备中,这样就可以从互联网访问到这台具有私有地址的服务器了[插图]。 ## 4.1 ADSL接入网的结构和工作方式 - 所谓接入网,就是指连接互联网与家庭、公司网络的通信线路[插图]。一般家用的接入网方式包括ADSL[插图]、FTTH[插图]、CATV、电话线、ISDN等,公司则还可能使用专线。 - ADSL Modem会把包拆分成很多小格子(图4.3⑦),每一个小格子称为一个信元。信元是一个非常小的数据块,开头是有5个字节的头部,后面是48个字节的数据,用于一种叫作ATM[插图]的通信技术。大家可以将信元理解为一种更小一号的包,原理上跟TCP/IP将应用程序的数据拆分成块装进一个个包的过程是一样的[插图]。 - 如果使用信元来传输数据,就比较容易和其他设备进行整合,可以降低开发投入和设备投入。如果不是出于这样的原因,其实并不需要将包拆分成信元,实际上也有一些ADSL运营商使用的ADSL Modem是不进行数据拆分的。 - 同样是将数字信息转换成模拟信号,ADSL采用的方法要复杂一些。其中有两个原因,一个原因是方波信号的波形容易失真,随着距离的延长错误率也会提高;另一个原因是方波信号覆盖了从低频到高频的宽广频段,信号频率越高,辐射出来的电磁噪声就越强,因此信号频谱太宽就难以控制噪声。 - 振幅调制是用信号的强弱,也就是信号振幅的大小来对应0和1的方式 - 如果增加振幅变化的级别,就可以对应更多的比特。例如,如果将振幅增加到4个级别,则振幅从小到大可分别对应00、01、10和11,这样就可以表示两个比特了。 - 如果振幅有8个级别,就可以表示3个比特,16个级别就可以表示4个比特,速率也就越来越高。不过,信号会在传输过程中发生衰减,也会受到噪声影响而失真,如果振幅级别太多,接收方对信号的识别就容易出错,因此振幅级别也不能太多。 - 另一个组成要素是相位调制,这是一种根据信号的相位来对应0和1的方式。 - 正交振幅调制中,通过增加振幅和相位的级别,就可以增加能表示的比特数。例如,如果振幅和相位各自都有4个级别,那么组合起来就有16个级别,也就可以表示4个比特的值。当然,和单独使用振幅调制或相位调制的情况一样,级别过多就容易发生误判,因此这种方法提升的速率是有限度的。 - ADSL使用间隔为4.3125 kHz的上百个不同频率的波进行合成,每个波都采用正交振幅调制,而且,根据噪声等条件的不同,每个波表示的比特数是可变的。也就是说,噪声小的频段可以给波分配更多的比特,噪声大的频段则给波分配较少的比特[插图],每个频段表示的比特数加起来,就决定了整体的传输速率。 - ADSL技术中,上行方向(用户到互联网)和下行方向(互联网到用户)的传输速率是不同的,原因也在这里。如果上行使用26个频段,下行则可以使用95个或者223个频段,波的数量不同,导致了上下行速率不同。 - 下行使用的频段较高,这些信号容易衰减而且更容易受到噪声的影响,因此这些频段可能只能表示较少的比特数,或者干脆无法传输信号。距离越远,频率越高,这种情况也就越显著,因此如果你家距离电话局太远,速率就会下降。 - 当Modem通电后,会发送测试信号,并根据信号的接收情况判断使用的频段数量和每个频段的比特数,这个过程称为训练(握手),需要几秒到几十秒的时间。 - ,分离器需要负责将电话和ADSL的信号进行分离(图4.7)。电话线传入的信号是电话的语音信号和ADSL信号混合在一起的,如果这个混合信号直接进入电话机,ADSL信号就会变成噪音,导致电话难以听清。为了避免这样的问题,就需要通过分离器将传入的信号分离,以确保ADSL信号不会传入电话机。 - 分离器的功能是将一定频率以上的信号过滤掉,也就是过滤掉了ADSL使用的高频信号,这样一来,只有电话信号才会传入电话机,但对于另一头的ADSL Modem,则是传输原本的混合信号给它。ADSL Modem内部已经具备将ADSL频率外的信号过滤掉的功能,因此不需要在分离器进行过滤[插图]。 - 如果没有分离器,拿起电话听筒接通电话的状态,和放下听筒挂断电话的状态下,信号的传输方式是不同的。当放下听筒时,电话机的电路和电话线是断开的,当拿起听筒时电话机就和电话线相连,电话机的信号就会传到电话线上。这两种状态的差异会导致噪声等线路状态的改变,如果ADSL通信过程中拿起话筒导致线路状态改变,就需要重新训练(握手),这就会导致几十秒的通信中断,分离器可以防止发生这样的问题。当然,也有一种技术能够快速重新握手,即便没有分离器也不会影响ADSL通信,G.992.2的ADSL规格就包含这种技术,但ADSL信号还是会影响电话,因此G.992.2的ADSL规格中一般还是需要使用分离器。 - 电话线也会受到来自外部的噪声和来自内部的噪声(串扰[插图])的干扰,导致信号失真。此外,电话线原本的设计并没有考虑到传输ADSL这样的高频信号,从这个角度上可以说它比以太网双绞线更容易受到噪声的干扰。 - 电话线受到干扰的方式和双绞线有些不同。双绞线中只有一路方波信号,信号失真后就无法读取还原成数字信号,于是就会产生错误,但ADSL信号受到干扰后并不会立即造成错误。ADSL信号分布在多个频段上,只有和噪声频率相同的信号会受到影响而无法读取,即可用的信号数量减少,结果导致速率下降。 - 如果在电话局里安装一大堆和用户端一样的ADSL Modem,也可以完成这些工作,只不过安装这么多Modem需要占用大量的空间,而且监控起来也非常困难。因此,电话局使用了DSLAM设备,它是一种将相当于很多个ADSL Modem的功能集中 - DSLAM和用户端ADSL Modem相比还是有一个不同的地方。用户端ADSL Modem具备以太网接口,可以与用户端的路由器和计算机交互,收发以太网包,而DSLAM一般不用以太网接口,而是用ATM接口,和后方路由器收发数据时使用的是原始网络包拆分后的ATM信元形式[插图]。 - MAC头部和PPPoE头部的作用是将包送达BAS的接口,当接口完成接收工作后,它们就完成了使命,可以被丢弃了。 - 具有以太网接口的路由器在接收到包之后也会丢弃其中的MAC头部,道理是一样的。接下来,BAS会在包的前面加上隧道专用头部[插图],并发送到隧道的出口(图4.3 ⑭)[插图]。 - 然后,网络包会到达隧道出口的隧道专用路由器(图4.3 ⑮),在这里隧道头部会被去掉,IP包会被取出(图4.3 ⑯),并被转发到互联网内部(图4.3 ⑰)。 ## 4.2 光纤接入网(FTTH) - 光在被纤芯和包层的边界反射时,相位会发生变化。这个变化的量随光在反射面的反射角度不同而不同,大多数角度下,都会因为相位不同而被干涉抵消。不过,有几个特定的角度下,向反射面前进的光和反射回来的光的相位是一致的,只有以这些角度反射的光才能继续向前传导(图4.13)。进入光纤的光线有各种角度,但其中,只有少数按照特定角度入射以保持相位一致的光线才会继续传导。 - 这个角度非常关键,纤芯的直径也是根据这个角度来确定的,而且纤芯的直径大小会极大地改变光纤的性质 - 光纤可以划分成几种类型,大体上包括较细的单模光纤(8~10 μm)和较粗的多模光纤(50 μm或62.5 μm)。单模光纤的纤芯很细,只有入射角很小的光线才能进入,因此在能够保持相位一致的角度中,只有角度最小的光线能进入光纤。反过来可以说,单模光纤的纤芯直径就是按照只允许相位一致的最小角度的光进入而设计的。多模光纤的纤芯比较粗,入射角比较大的光也可以进入,这样一来,在相位一致的角度中,不仅角度最小的可以在光纤中传导,其他角度更大一些的也可以,也就是说,可以有多条光线在纤芯中同时传导。 - 单模和多模实际上表示相位一致的角度有一个还是多个 - 模光纤中可以传导多条光线,这意味着能通过的光线较多,对光源和光敏元件的性能要求也就较低,从而可以降低光源和光敏元件的价格。相对地,单模光纤的纤芯中只能传导一条光线,能通过的光线较少,相应地对于光源和光敏元件的性能要求就较高,但信号的失真会比较小。 - 信号失真与光在纤芯传导时反射的次数相关。 - 反射角越大的光线反射次数越多,走过的距离也就越长;相对地,反射角越小的光线走过的距离越短。 - 多条光线到达的时间不同,信号的宽度就会被拉伸,这就造成了失真。 - 单模光纤的失真小,可以比多模光纤更长,因此多模光纤主要用于一座建筑物里面的连接,单模光纤则用于距离较远的建筑物之间的连接。 - 。一种是用一根光纤直接从用户端连接到最近的电话局 - 可以认为是将以太网包原原本本地转换成了光信号。接下来,光信号通过连接到光纤收发器的光纤直接到达BAS前面的多路光纤收发器。 - 前往互联网的上行光信号和前往用户的下行光信号在光纤中混合在一起,信号会变得无法识别,因此我们需要对它们进行区分,办法是上行和下行信号采用不同波长的光。波长不同的光混合后可通过棱镜原理进行分离,因此光纤中的上行和下行信号即便混合起来也可以识别。像这样在一条光纤中使用不同的波长传输多个光信号的方式叫作波分复用。 - 另一种光纤的接入方式是在用户附近的电线杆上安装一个名为分光器的设备,通过这个设备让光纤分路,同时连接多个用户 - 使用一个叫作ONU[插图]的设备,它将以太网的电信号转换成光信号之后,会到达BAS前面的一个叫作OLT[插图]的设备。光信号的传导方式和刚才介绍的直连方式是一样的,但有一点不同,因为多个用户同时收发网络包时信号会在分光器产生碰撞。因此,OLT和ONU中具备通过调整信号收发时机来避免碰撞的功能。 - 当BAS端向用户发送数据时,分光器只需要将信号发给所有用户就可以了,这里并不会发生碰撞,但这样做会导致一个用户收到其他所有用户的信号,造成信息泄露的问题,因此需要在每个包前面加上用于识别ONU的信息,当ONU收到信号后,会接收发给自己的信号并将其转换成以太网信号。 ## 4.3 接入网中使用的PPP和隧道 - 着接入网发展到ADSL和FTTH,接入网连接的路由器也跟着演进,而这种进化型的路由器就叫作BAS。 - ADSL和FTTH接入网中,都需要先输入用户名和密码[插图],登录之后才能访问互联网,而BAS就是登录操作的窗口。BAS使用PPPoE[插图]方式来实现这个功能[插图]。 - 首先,用户向运营商的接入点拨打电话(图4.17①-1),电话接通后(图4.17①-2)输入用户名和密码进行登录操作(图4.17②-2)。用户名和密码通过RADIUS[插图]协议从RAS[插图]发送到认证服务器,认证服务器校验这些信息是否正确。当确认无误后,认证服务器会返回IP地址等配置信息 - 在接入互联网时,必须为计算机分配一个公有地址,但这个地址并不是事先确定的。因为在拨号连接时,可以根据电话号码来改变接入点,而不同的接入点具有不同的IP地址,因此无法事先在计算机上设置这个地址。所以,在连接时运营商会向计算机下发TCP/IP配置信息,其中就包括为计算机分配的公有地址。 - ADSL和FTTH中,用户和BAS之间是通过电缆或光纤固定连接在一起的,因此没有必要验证用户身份,所以实际上并不需要PPP的所有这些功能。然而,通过用户名和密码登录的步骤可以根据用户名来切换不同的运营商,这很方便[插图]。因此,接入运营商在ADSL和FTTH中一般也会使用PPP[插图]。 - 拨号接入中PPP借用了HDLC[插图]协议作为容器,而HDLC协议原本是为在专线中传输网络包而设计的,拨号接入方式对这一规格进行了一些修正。 - 以太网和PPP在设计上有所不同,为了弥补这些问题就重新设计了一个新的规格,这就是PPPoE。 - 。所谓隧道,就类似于套接字之间建立的TCP连接。 - 首先,接入路由器中需要配置运营商分配的用户名和密码[插图]。然后,接入路由器会根据PPPoE的发现机制来寻找BAS。这一机制和ARP一样是基于广播来实现的 - 这样用户端就知道了BAS的MAC地址,也就可以和BAS进行通信了 - 用户名和密码如何发送给BAS。这里有两种方式,一种是将密码进行加密的CHAP[插图]方式,另一种是不加密的PAP[插图]方式,在互联网接入路由器的设置画面中可以选择。 - 由于明文密码只在BAS和用户端路由器之间传输[插图],所以如果要窃取密码,要么在路由器和ADSL Modem中间进行窃听,要么爬到电线杆上安装窃听装置拾取电缆中泄漏的电磁波。不过,光纤是不会泄漏电磁波的,因此无法通过第二种方式进行窃听。 - 一对一连接的端口可以不分配IP地址。现在,在这种场景中按惯例都是不为端口分配IP地址的[插图],这种方式称为无编号(unnumbered)。这种情况下,BAS下发配置信息时就不会下发默认网关的IP地址。 - ADSL使用PPPoE方式时,是先将PPP消息装入以太网包中,然后再将以太网包拆分并装入信元,而PPPoA方式是直接将PPP消息装入信元 - 由于只是开头加不加MAC头部和PPPoE头部的区别,PPP消息本身是没有区别的,因此密码校验、下发TCP/IP配置参数、收发数据包等过程都是和PPPoE基本相同的。 - 由于PPPoA没有MAC头部,所以PPP消息是无法通过以太网来传输的,这就意味着需要和BAS收发PPP消息的设备,也就是计算机和路由器,必须和ADSL Modem是一体的,否则PPP机制就无法工作了。这个一体化的方式主要有以下两种。 - 第一种是将计算机和ADSL Modem用USB接口连接起来,这样ADSL Modem就和计算机成为一体了。不过,这种方式最终并没有普及。 - 另一种方式是像图4.21所示的这样,将ADSL Modem和路由器整合成一台设备。这种方式和PPPoE中使用路由器上网的方式基本没什么区别,因此得到了广泛的普及。 - 当然,PPPoA和PPPoE相比也有一些优势。PPPoE方式中,如图4.18所示,需要添加PPPoE头部和PPP头部,这意味着MTU就相应变小了[插图],这可能会降低网络的效率。而PPPoA不使用以太网包来传输PPP消息,因此不会发生MTU变小的问题。 - PPPoE会降低网络效率,PPPoA也有ADSL Modem和路由器无法分离的限制,这两个问题其实都是由PPP引起的。因此,有一些运营商不使用PPP,他们使用DHCP[插图]协议从BAS向用户端下发TCP/IP配置信息。 - DHCP经常用于通过公司网络向客户端计算机下发TCP/IP配置信息, - 不需要验证用户名和密码。没有用户名和密码,就意味着无法通过用户名来切换运营商网络,但这种方式也有优势,它可以单纯地直接传输以太网包,不需要添加额外的PPP头部,因此不会占用MTU。 ## 4.4 网络运营商的内部 - 互联网的实体并不是由一个组织运营管理的单一网络,而是由多个运营商网络相互连接组成的(图4.23)。ADSL、FTTH等接入网是与用户签约的运营商设备相连的,这些设备称为POP[插图],互联网的入口就位于这里。 - 专线不需要用户认证、配置下发等功能[插图],因此用一般的路由器就可以了。接下来是电话、ISDN等拨号方式的接入网,这里使用的路由器称为RAS。拨号接入需要对用户拨电话的动作进行应答,而RAS就具备这样的功能。 - PPPoE方式中,ADSL、FTTH接入服务商会使用BAS,运营商的路由器则与BAS相连。PPPoE中的身份认证和配置下发操作由接入服务商的BAS来负责,运营商的路由器只负责对包进行转发,因此这里也是使用一般的路由器就可以了。如果ADSL采用PPPoA方式接入,那么工作过程会有所不同,DSLAM通过ATM交换机[插图]与ADSL的运营商的BAS相连,然后再连接到运营商的路由器。用户端传输的信号先经过ADSL Modem拆分成ATM信元并进行调制,然后DSLAM将信号还原成信元,通过ATM交换机转发到BAS,最后BAS将信元还原成网络包,再通过运营商的路由器转发到互联网内部。 - NOC[插图]是运营商的核心设备,从POP传来的网络包都会集中到这里,并从这里被转发到离目的地更近的POP,或者是转发到其他的运营商。这里也需要配备高性能的路由器。 - 大家可以简单地认为,NOC就是规模扩大后的POP[插图]。 - 对于电话公司来说,其拥有的光纤不会全部自己使用,通过租借的方式也可以带来一定的收益,无论其业务本质是电话还是互联网,这一点都是共通的[插图]。这种服务就叫作通信线路服务。 - 其中也有一些公司不对光纤进行细分,而是直接将整条光纤租借出去[插图] ## 4.5 跨越运营商的网络包 - 对于互联网内部的路由器来说,无论最终目的地是否属于同一家运营商,都可以从路由表中查到,因此只要一次接一次按照路由表中的目标地址来转发包,最终一定可以到达Web服务器所在的POP。这样一来,我们就可以把包发到任何地方,包括地球的另一面。 - 获得对方的路由信息之后,我们也需要将自身的路由信息告知对方。这样一来,对方也可以将发往我们所在子网的包转发过来。这个路由信息交换的过程是由路由器自动完成的,这里使用的机制称为BGP[插图]。 - 如果运营商D将互联网上所有路由都告知运营商E,则运营商E不但可以访问运营商D,还可以访问运营商D后面的运营商B、A和C。然后,通过运营商D就可以向所有的运营商发送包。像这样,通过运营商D来发送网络包的方式称为转接。 - 公司中使用的方式是寻找与目的地之间的最短路由,并按照最短路由来转发包,因此,周围的所有路由器都是平等对待的。 - 。如果单纯采用最短路由的方式,那么其他运营商的包就都会走这条线路,这时,该运营商需要向其他运营商收取相应的费用,否则就成义务劳动了。 - 正是出于这样的原因,互联网中不能单纯采用最短路由,而是需要一种能够阻止某些来源的网络包的机制,互联网的路由交换机制就具有这样的功能。 - 公司中,路由信息是在所有路由器间平等交换的,但运营商之间的路由交换是在特定路由器间一对一进行的。这样一来,运营商就可以只将路由信息提供给那些交了费的运营商,那些没交费的运营商也就无法将网络包发送过来了。 - 在判断路由时,该机制不仅可以判断是否是最短路由,还可以设置其他一些判断因素。例如当某个目的地有多条路由时,可以对每条路由设置优先级。 - 互联网中有很多运营商,每个运营商都和其他多个运营商相互连接。因此,如果一个运营商走不过去,可以走另一个运营商,无论网络包要发送到什么地方,都会确保能够获取相应的路由信息。如果某个运营商做不到这一点,那它也就该倒闭了。 - 为了保证在遇到停电、火灾等事故,以及地震等自然灾害时,路由器等网络设备还能继续工作,IX所在的大楼都装有自主发电设备,并具有一定的抗震能力。其实这样的要求也不仅限于IX,运营商的NOC也是一样。 - IX的核心是具有大量高速以太网[插图]端口的二层交换机 ## 5.1 Web服务器的部署地点 - Web服务器不仅可以部署在公司里,也可以像图5.1(c)这样把服务器放在网络运营商等管理的数据中心里,或者直接租用运营商提供的服务器。数据中心是与运营商核心部分NOC直接连接的,或者是与运营商之间的枢纽IX直接连接的。换句话说,数据中心通过高速线路直接连接到互联网的核心部分,因此将服务器部署在这里可以获得很高的访问速度[插图],当服务器访问量很大时这是非常有效的。此外,数据中心一般位于具有抗震结构的大楼内,还具有自主发电设备,并实行24小时门禁管理,可以说比放在公司里具有更高的安全性。此外,数据中心不但提供安放服务器的场地,还提供各种附加服务,如服务器工作状态监控、防火墙的配置和运营、非法入侵监控等,从这一点来看,其安全性也更高。 ## 5.2 防火墙的结构和原理 - DNS查询使用的是UDP协议,而UDP与TCP不同,它没有连接操作,因此无法像TCP一样根据控制位来判断访问方向。所以,我们无法设置一个规则,只允许公司内部访问互联网上的DNS服务器,而阻止从互联网访问公司内部的DNS服务器。这一性质不仅适用于DNS,对于所有使用UDP协议的应用程序都是共通的。在这种情况下,只能二者择其一——要么冒一定的风险允许该应用程序的所有包通过,要么牺牲一定的便利性阻止该应用程序的所有包通过[插图]。 ## 5.3 通过将请求平均分配给多台服务器来平衡负载 - 假设现在我们有3台服务器,那么每台服务器的访问量会减少到三分之一,负载也就减轻了。要采用这样的方法,必须有一个机制将客户端发送的请求分配到每台服务器上。具体的做法有很多种,最简单的一种是通过DNS服务器来分配。当访问服务器时,客户端需要先向DNS服务器查询服务器的IP地址,如果在DNS服务器中填写多个名称相同的记录,则每次查询时DNS服务器都会按顺序返回不同的IP地址。 - 通过CGI等方式动态生成网页的情况下,有些操作是要跨多个页面的,如果这期间访问的服务器发生了变化,这个操作就可能无法继续。例如在购物网站中,可能会在第一个页面中输入地址和姓名,在第二个页面中输入信用卡号,这就属于刚才说的那种情况。 - 为了避免出现前面的问题,可以使用一种叫作负载均衡器的设备。 - 负载均衡器可以定期采集Web服务器的CPU、内存使用率,并根据这些数据判断服务器的负载状况,也可以向Web服务器发送测试包,根据响应所需的时间来判断负载状况。 - 人们想出了一些方案来判断请求之间的相关性。例如,可以在发送表单数据时在里面加上用来表示关联的信息,或者是对HTTP规格进行扩展,在HTTP头部字段中加上用来判断相关性的信息[插图]。这样,负载均衡器就可以通过这些信息来作出判断,将一系列相关的请求发送到同一台Web服务器,对于不相关的请求则发送到负载较低的服务器了。 ## 5.4 使用缓存服务器分担负载 - 缓存服务器是一台通过代理机制对数据进行缓存的服务器。代理介于Web服务器和客户端之间,具有对Web服务器访问进行中转的功能。当进行中转时,它可以将Web服务器返回的数据保存在磁盘中,并可以代替Web服务器将磁盘中的数据返回给客户端。这种保存的数据称为缓存,缓存服务器指的也就是这样的功能。 - 这种在客户端和Web服务器之间充当中间人的方式就是代理的基本原理。在中转消息的过程中,缓存服务器还会顺便将页面数据保存下来,随着缓存数据的积累,用户访问的数据命中缓存的几率也会提高。 - 缓存服务器使用的代理机制最早就是放在客户端一侧的,这才是代理的原型,称为正向代理[插图](forward proxy)。 - 当时的正向代理还有另外一个目的,那就是用来实现防火墙。 - 我们可以通过将请求消息中的URI中的目录名与Web服务器进行关联,使得代理能够转发一般的不包含完整网址的请求消息。我们前面介绍的服务器端的缓存服务器采用的正是这种方式,这种方式称为反向代理(reverse proxy)。 - 缓存服务器判断转发目标的方法还有一种,那就是查看请求消息的包头部。因为包的IP头部中包含接收方IP地址,只要知道了这个地址,就知道用户要访问哪台服务器了[插图]。这种方法称为透明代理(transparent proxy)。 - 我们必须将透明代理放在请求消息从浏览器传输到Web服务器的路径中,当消息经过时进行拦截。可能大家觉得这种方法太粗暴,但只有这样才能让消息到达透明代理,然后再转发给Web服务器。如果请求消息有多条路径可以到达Web服务器,那么就必须在这些路径上都放置透明代理,因此一般是将网络设计成只有一条路可以走的结构,然后在这一条路径上放置透明代理。连接互联网的接入网就是这样一个关口,因此可以在接入网的入口处放置反向代理[插图]。 - 使用透明代理时,用户不会察觉到代理的存在,也不会注意到HTTP消息是如何被转发的,因此大家更倾向于将透明代理说成是缓存[插图]。 ## 5.5 内容分发服务 - CDSP会与Web服务器运营者签约,使得CDSP的缓存服务器配合Web服务器工作。具体的方法我们后面会介绍,只要Web服务器与缓存服务器建立关联,那么当客户端访问Web服务器时,实际上就是在访问CDSP的缓存服务器了。 - 如何才能从这些服务器中找到离客户端最近的一个,并让客户端去访问那台服务器呢? - 第一个方法是像负载均衡一样用DNS服务器来分配访问。 - HTTP规格中定义了很多头部字段,其中有一个叫作Location的字段。当Web服务器数据转移到其他服务器时可以使用这个字段,它的意思是“您要访问的数据在另一台服务器上,请访问那台服务器吧。”这种将客户端访问引导到另一台Web服务器的操作称为重定向,通过这种方法也可以将访问目标分配到最近的缓存服务器。 - 这种方法的缺点在于增加了HTTP消息的交互次数,相应的开销也比较大 - 重定向的方法是根据客户端发送来的HTTP消息的发送方IP地址来估算距离的,因此精度较高。 - 重定向服务器不仅可以返回带有Location字段的HTTP消息,也可以返回一个通过网络包往返时间估算到缓存服务器的距离的脚本,通过在客户端运行脚本来找到最优的缓存服务器。这个脚本可以向不同的缓存服务器发送测试包并计算往返时间,然后将请求发送到往返时间最短的一台缓存服务器,这样就可以判断出对于客户端最优的缓存服务器,并让客户端去访问该服务器。 - 一种方法是让Web服务器在原始数据发生更新时,立即通知缓存服务器,使得缓存服务器上的数据一直保持最新状态,这样就不需要每次确认原始数据是否有变化了,而且从第一次访问就可以发挥缓存的效果。内容分发服务采用的缓存服务器就具备这样的功能。 ## 6.1 服务器概览 - 服务器需要同时和多个客户端通信,但一个程序来处理多个客户端的请求是很难的,因为服务器必须把握每一个客户端的操作状态[插图]。因此一般的做法是,每有一个客户端连接进来,就启动一个新的服务器程序,确保服务器程序和客户端是一对一的状态。 - 每次客户端发起连接时都需要启动新的程序,这个过程比较耗时,响应时间也会相应增加。因此,还有一种方法是事先启动几个客户端通信模块,当客户端发起连接时,从空闲的模块中挑选一个出来将套接字移交给它来处理。 - ,一般来说服务器端都是处于等待包到达的状态,这时应用程序会暂停运行。在这个状态下,一旦客户端的包到达,就会返回响应包并开始接受连接操作。 - 接受新的连接之后,和刚才一样,协议栈会为这个等待连接的套接字复制一个新的副本,然后让客户端连接到这个新的副本套接字上。像这样每次为新的连接创建新的套接字就是这一步操作的一个关键点。如果不创建新副本,而是直接让客户端连接到等待连接的套接字上,那么就没有套接字在等待连接了,这时如果有其他客户端发起连接就会遇到问题。为了避免出现这样的情况,协议栈采用了这种创建套接字的新副本,并让客户端连接到这个新副本上的方法。 - 端口号是用来识别套接字的,因此我们以前说不同的套接字应该对应不同的端口号,但如果这样做,这里就会出现问题。因为在接受连接的时候,新创建的套接字副本就必须和原来的等待连接的套接字具有不同的端口号才行。 - 服务器上可能存在多个端口号相同的套接字,但客户端的套接字都是对应不同端口号的,因此我们可以通过客户端的端口号来确定服务器上的某个套接字。不过,使用不同端口号的规则仅限一台客户端的内部,当有多个客户端进行连接时,它们之间的端口号是可以重复的。


评论:0条


返回列表

返回主页