Total Pageviews

Sunday 3 July 2016

计算机网络学习记录

分享个tip,在看到后面发现某个地方不懂的时候,一定要去看看之前讲的一些跟这有关的内容,因为这些疑问很可能与前面的一些没注意到的细节有关。在看书的过程中也要尽量注意到每个细节。

1 物理层、传输媒体


物理层解决的是在各种传输媒体上怎么传输数据,使用什么通信手段的问题。
物理层的东西有很多通信的内容,想要彻底搞明白不太容易,我也是有点看得意识模糊,只是知道了一些基本原理,很多细节还是不懂,不过这也不是计算机网络所要解决的问题,但是还是挺有意思的,想要搞懂还得去看一些通信的书。下面记录的是一些跟生活有关的问题。
Q: 为什么同轴电缆广泛用于有线电视?
A: 同轴电缆成本低,带宽大,非常适合有线模拟电视信号传输。但是由于后来双绞线的发展,双绞线成本更低,体积小,抗压,因此被广泛用于网络设备。不过同轴电缆的速度还是非常快的,比五类线快。
Q: 家用有线模拟电视是如何变成有线数字电视的?
A: 当时家里要换数字电视的时候,中广有线的人过来,拿了个机顶盒(里面有智能卡),把同轴电缆插到机顶盒上,电视机插到机顶盒的AV插口上(这机顶盒只支持AV信号)。然后他们把输出的模拟信号变成数字信号,这样同轴电缆上传输的信号就成了数字信号。
Q: 为什么有线电视看电视换台不需要缓冲?
A: 因为有线电视是单向传输,家家户户所需要的信号是一样的,所以可以把所有电视台信号放在一条线上在不同频段传输,只需要不断复制、增强信号即可。不过到后来,有线电视公司也开始利用这些电视信号线的空闲带宽提供上网服务了。
Q: 双绞线为什么要用一对线来发送/接收数据?
A: 因为双绞线在传输数据时,为了减少和抑制外接的干扰,用一对线扭在一起传输一路差分信号,也因此得名双绞线。所谓差分信号就是一路以正电平传输信号,另一路以负电平传输同一信号,这样当线路出现干扰时,两根线的影响是一样的,最后还原差分信号的时候会相互抵消,就提高了传输质量。
Q: 双绞线是怎么制作的?
A: 作者在释疑与习题解答中已经给出了详细过程。我买了一些超五类线,再加上学长送的压线钳和水晶头,这样就可以做网线了。如果有测线器就更好了,做完就能测试网线有没有问题。
不得不说发明双绞线及其制作工艺的人还是很厉害的,只用普通的铜线就可以传输数据,而且整个制作过程非常巧妙。具体制作过程就是:把外保护套管剥开,把4对双绞线按顺序排好(常用的568B的顺序就是橙绿蓝棕,也就是白橙、橙、白绿、蓝、白蓝、绿、白棕、棕),把线头剪齐,插入水晶头,用压线钳压实即可。
那水晶头是怎么固定和导出双绞线的呢?因为水晶头上有铜片,压水晶头的时候会把铜片压到线里,另外还有个塑料片,可以压住外保护套管。

2 数据链路层


数据链路层解决的主要问题是在一个局域网中,分组怎样从一个主机传送到另一个主机(不经过路由器)。在本章中,主要讲的是点对点的PPP协议、广播信道的CSMA/CD协议、使用CSMA/CD协议的以太网(即使后来的以太网已经不用该协议)、以太网的MAC帧。
以太网是什么呢?比如校园网就是个以太网。其实以太网就是个局域网,当然在后来以太网也已经扩展到广域网,不过把它理解成一个很大的局域网也是可以的。起初,以太网是使用同轴电缆,使用总线型的拓扑结构,在其上使用CSMA/CD协议进行半双工通信的。由于是在总线上通信,所以也就只能半双工通信,因为不能两台机器同时发送数据(会产生碰撞),也就不能有一台机器同时接收和发送消息。后来产生了集线器,它使用星型拓扑结构,但逻辑上仍然是总线型拓扑。在使用集线器的以太网上,适配器使用RJ-45插头(也就是现在常见的网线插头,另外电话线的那个插头叫RJ-11),使用双绞线作为传输介质,降低了价格。双绞线中发送和接收使用不同的线。由于集线器工作在物理层,只负责转发比特,即使发送和接收是分开的,也因不能两台机器同时发送数据(其他机器收到的信号会碰撞),所以这时的以太网仍然工作在半双工状态,需要使用CSMA/CD协议。再后来出现了网桥,它工作在物理层和数据链路层,可以将两个以太网连接起来,一个以太网中的碰撞不影响另一个以太网。再到后来,出现了交换机,也是我们现在使用的东西,它本名叫做交换式集线器,工作在物理层和数据链路层,实际上是个多接口的网桥,并且每个接口下面只接一台主机。这也就意味着,它可以以全双工方式工作,不需要CSMA/CD协议,因为每个交换机的接口之间不影响,而每个接口下面只接一台主机,这样每台主机之间就没有影响了。
值得一提的是,如果以太网工作在全双工,那么发送和接收互不影响。例如百兆以太网上发送和接收可同时为百兆。
在以太网中,在数据链路层传送的是MAC帧。使用帧中记录的MAC地址,决定发送到哪台机器上。
由于以太网的性能非常好,如果运营商想使用以太网将用户接入ISP,那如何识别用户、计费以及动态分配IP呢(MAC帧并没有此功能)?我们知道PPP协议有使用账号密码来鉴别用户身份的功能,所以我们可以将PPP帧封装在以太网中,当帧到达ISP后,可提取出PPP帧,实现上述功能。这种方式叫做PPPoE。以上是直接用以太网接入ISP,而如果是在家中使用调制解调器上网的话,过程是这样的(此处参考了此文):
  • 如果是以前的56K电话modem,用户计算机会直接把IP分组封装在PPP帧中,modem接收之后换一种调制解调方法通过电话线发送给ISP。
  • 如果是ADSL上网,用户计算机使用PPPoE的方法通过以太网传送PPP帧到modem,当modem接收之后会将以太网外壳去掉,把PPP帧进行调制后传给ISP。
Q: 既然交换机可以组局域网,那么只用交换机,组一个非常大的局域网可以吗?
A: 并不可以,因为太大的局域网会让交换机的MAC转发表非常大,而且常常会产生广播风暴(没有建立好转发表,找不到MAC时只能广播,广播通信开销太大)。

3 网络层


Q: 有了MAC地址,为什么还要用IP地址呢?
A: 首先,只使用低两层是否可以,这已在上个问题中说明了。关于这个问题作者在书上P126已经给出了解答。主要还是异构网络互连的问题,所以需要一个虚拟的IP网络来屏蔽这些差异。
Q: 有了IP地址,为什么还要用MAC地址呢?
A: 既然只用MAC而不用IP不可行,那反过来是否可行呢?
有人说IP工作在网络层,而MAC工作在数据链路层,两个的职责不一样,所以不能只用IP而不用MAC。但是这一解释恐怕有些欠缺说服力,它有点循环论证的意思。它的逻辑是因为现在分成了两层并分别用了IP和MAC,所以不能只能IP不用MAC。这显然不太对。我们现在讨论的就是为什么要这样分成两层并且分别使用了IP和MAC,跳过MAC而只使用IP到底行不行,在成本、效率等等方面上哪种更好。
还有人说MAC可以唯一确定一个设备,而IP不行,所以必须有MAC。这显然也不对。MAC也是不能唯一确定一个设备的,使用软件方法修改MAC地址是非常容易的。另外由于无良厂家的存在,甚至硬件里的MAC地址都不是唯一的。况且当两个内网(例如192.168.1.*)的设备进行通信时是使用NAT的,也不是使用MAC进行识别的。而IPv6甚至连NAT都不需要。
我还没有想出理由来证明它不可行。因为事实上它是可行的。不过我认为可能是出于以下的一些原因不这样搞:
  • 如果不用MAC,这意味着所有的二层交换机全都要改造成可以解析IP数据报的三层交换机/路由器才可以正常工作。而解析IP数据报是一件相对比较复杂的工作,很显然这样的网络设备的制造成本要比二层交换机要高。不仅如此,二层交换机的效率也更胜一筹,它只需要简简单单的转发即可。
  • 如果弃用MAC,从某种程度上说就是把网络层与数据链路层糅合在了一起,违背了互联网的设计原则,例如会让使用PPP协议的网络与以太网难以互连。
  • 以太网影响深远,历史地位不可撼动。
此处可以参考一下这里
Q: 路由器、交换机分别有多少个IP地址、MAC地址?
A: 先说IP地址。首先,普通家用路由器是有两个IP地址的,一个是公网IP,一个是内网IP(一个典型的IP例如192.168.1.1),这一点很好理解,因为家用路由器其实是在交换机上加装路由功能,那几个LAN口是交换产生的,分配内网IP通常是为了便于管理。也正是由于这一点,家用路由器如果不插WAN口而只用LAN口,这台路由器的功能就相当于交换机了。而标准路由器一般都是有几个接口就有几个IP地址,当然这也不是绝对的,比如书上P121所说的无编号接口的情况。对于二层交换机,通常是没有IP地址的,不过也有一些交换机配置了IP地址目的是便于连接到交换机进行配置。
再说MAC地址。我一开始以为一台设备只有一个MAC地址,学了之后才发现我太年轻了,MAC帧的转发是需要不断修改源MAC地址和目的MAC地址的。首先对于二层交换机,一般是没有MAC地址的,不过可以给它分配一个MAC地址以便于对交换机进行管理(MAC和IP都有才行)。对于标准路由器,通常是一个以太网口一个MAC。而对于家用路由器,一般是两个,WAN口一个,LAN口一个。给LAN口分配MAC是便于管理路由器(区分目标主机是内网主机还是路由器本身)。
Q: IP数据报首部的校验过程?
A: 校验过程使用的是反码和的方法。
首先,原码是二进制定点表示法,最高位表示符号位,0表示正,1表示负。 反码表示法规定正数的反码与其原码相同,负数的反码是对其原码逐位取反,但符号位除外。 在反码表示法中,一个想变成其相反数,逐位取反即可。 由反码定义可以得到反码运算规则是溢出位加到最低位。 发送方产生校验和的过程:先将校验和置为0,以16位为单位求首部反码和(均视为已按反码表示法表示),对结果取反存入校验和字段。 接收方校验的过程:以16位为单位求首部反码和,再取反,若结果为0则结果正确。
Q: IP数据报首部校验不用CRC且为什么使用反码和而不是补码和?
A: 验证过程没有采用复杂的CRC,一是计算效率更高,此外,路由器转发数据报时需要对TTL字段减一,此时路由器只需直接对校验和加一即可,不需要重新计算校验和。
至于为什么使用反码和而不是补码和,这是因为反码求和具有一个性质:运算结果不依赖于系统存储数据使用的是大端表示法还是小端表示法。
Q: IP数据报为什么只校验首部?
A: 由于路由器工作量大,不检验数据部分可以减少计算的工作量。而且这样也可以与其他层的工作进行分工。
Q: 既然在数据链路层已经有了对MAC帧的校验,为什么IP数据报及更上层的协议还需校验?
A:
  • 一是低层的校验未必可靠。
  • 二是为了适应不同的需求,也就是上一个问题中说的分工。例如上层的UDP并不需要高可靠性,若此时下层进行完全可靠的校验,则会浪费资源。
  • 三是TCP/UDP、IP不一定都必须属于同一个协议栈,而且也不一定在以太网链路中传输,因此不能只依赖于一层的检验。
  • 四是链路层的校验只能保证相邻节点间数据的完整性,不能保证起点到终点的完整性,例如数据包在某个节点处理时丢失了的情况。
  • 五是上层的数据在下层传输时可能会被分成多个包来传,因此可能会出现只是包的一部分没有问题的情况,若上层不进行检验,就无法知道这个包是有问题的。