计算机网络——自顶向下方法

计算机网络——自顶向下方法

author
Created
Feb 26, 2025 01:47 AM
Last edited time
Mar 19, 2025 09:25 AM
Tags
路线图:
  1. 计算机网络和因特网
  1. 应用层
    1. HTTP/SMTP/POP3/IMCP/DNS
      DNS通常是在請求主機到本地DNS递归查询,本地DNS服务器迭代查询根DNS服务器/TLD/权威DNS服务器直到找到对应IP,本地DNS服务器通常由ISP供应商提供。
      P2P文件分发/HTTP流媒体/DASH流媒体/CDN集群选择策略/套接字编程
  1. 运输层
    1. TCP/UDP,基础的UDP协议只提供必要的服务,不保证交付,也不保证时延拥塞控制能功能,但同时它可以以最大速率交付数据。TCP则提供了可靠的数据传送,包括连接管理,流量控制,往返时间估计以及可靠运输。TCP依赖慢启动和拥塞控制等策略来提供相对可靠的数据传输。此外除了TCP预计UDP还可以基于更底层的网络层协议实现更多的运输层功能。当网络层只提供最大努力交付的功能,所以对于数据包的可靠数据运输需要在运输层通过一些设定的策略来实现,这就引入了序号确认号,接收窗口,快速重传,超时时间加倍等概念,其中选择重传和回退N步,是两个比较基础的重传策略。重传的超时时间也根据RTT实现了动态设定。在TCP中,出去拥塞窗口以外,还包括了一个接收窗口,这是因为TCP的概念设计中我们提交包以后会发送到本地的一个接受缓存中,这个缓存的大小也可能影响发送速率。通常取这个接受窗口和拥塞窗口的较小值。
  1. 网络层:数据平面
    1. 数据层面包括路由器的转发功能,网络层通常分为两种类型一种为本地路由决定的网络拓扑,一种为软件定义的网路拓扑SDN。数据从进入路由的输入链路到解包到进入队列再查表→交换→进入出队列→进入输出链路,当排队的队列填满将发生丢包,丢包的选择也有多种策略,这种情况下网络发生拥塞。其中交换的位置有多种不同的实现。SDN的关键部分在于查表的这个过程,通常改为了匹配+动作。IPV4通常由32比特来标志,一个子网通常由一个IP+一个掩码定义,掩码的含义是通过IP前N位来查找这个子网的地址,并且查询的过程使用最长路径匹配以找到最准确的位置。子网中可以继续通过掩码划分子网,对于子网中的主机,通常使用DHCP来动态分配IP,过程是主机向网络(255.255.255.255中广播一个发现报文,再由多个DHCP响应,主机从接受到的广播报文中选择一个发送确认报文,被选择的DHCP发送ACK建立链接。多台主机也可以不通过每个端口分配一个IP的方式接入网络,NAT就提供了这样的一种方式,通过这种方式你可以对外界隐藏子网中的信息,所有外部的流量通过一个DHCP服务器转发到子网空间的每一台主机中,而区分的方式是通过一个10.0.0.1加一个端口号识别的,再NATDHCP服务器中就会保存这样一张转发表,其中记录了对应的内外部端口号。IPV6在IPV4的基础上使用了128比特的地址空间,并且对数据报设计了更加合理的项目空间,但是迁移的过程十分缓慢,IPV6的数据包需要通过隧道的方式来在仅支持IPV4的网络中传递。
  1. 网络层:控制平面
    1. BGP/ISFP?/SDN软件定义网络
      IP任播是个挺有意思的内容,通过将多个目标地址设置为一个IP,BGP路由则得到了一个位于不同物理地址但是相同IP的路径,此时BGP策略将会找到一个最优化的路径提供给请求者。链路状态路由选择算法通常包括两种,一种常见的就是DIJ原理实现的,,每个路由节点获取全链路信息并且计算出一颗最小生成树的路径图,这种情况下每次出现路径改变都需要把更新的信息不断地向周边的路由广播。另一种路由选择算法叫Distance VECTOR距离向量算法,这种算法的原理基本上基于bellman Ford,每个节点保存一张路由选择表,通过不断向周边的节点传递自己松弛过的边最后收敛到最短路。SDN通过一个基于所有路由控制器的抽象面提供了对互联网链路的路由控制。例如通过每个路由中的控制器向上层传递本机的路由信息即可在上层使用dij计算出合适的路由链路。SDN控制器通过openflow等协议和底层交互。ICMP网络报文协议通过一个位于IP层上层的数据包实现了主机和路由器彼此沟通网络层信息的功能,例如traceroute以及ping。通过使用这样的数据包我们可以确认目的地的网络状态。
  1. 链路层和局域网
    1. 交换机只使用链路层和物理层进行转发,因此它使用MAC地址而不处理IP地址,所以它的转发速度更快,但是因为丢失了IP层的抽象,无法处理一些应急的情况例如广播风暴,另外由于IP报文有一个特殊的首部字段来防止回环,所以使用路由进行转发的网络图可以是一个拓扑图而不被限制为一颗生成树。理论上来说交换机只用于局域网/局部网络,例如主机→路由→路由之间。每台路由器/主机中都保存了一张ARP表,用于储存IP和MAC对应地址,如果不存在则使用ARP广播来查询需要的MAC地址。以太网占有了现有的有线局域网市场,在交换机出现之前,以太网通过集线器来实现以太网络连接。但是交换机实现了无碰撞的数据交换,它使用一个交换机表,包括一个报废时间,一个MAC目的地址,一个通向这个目的地址的交换机接口号,这个表在每次结构接收到入帧时就会把源地址保存起来。最后虚拟局域网通常用于在逻辑上划分局域网,以实现可控的广播范围。多路访问协议通常在无线场景中应用(由于集线器式的局域网已经被取代。
  1. 无线网络和移动网络
    1. CDMA码分多址通过设定特定的CDMA编码,可以实现在相同的时间和空间的情况下划分出多个不同的编码空间,在不同的编码空间中传递信息还可以还原出原始的信息。802体系结构,多个主机和一个AP构成一个BSS基本服务集,主机通过主动扫描或者被动扫描的方式和AP建立链接,AP会周期性的发送信标帧,同时主机也可以主动向范围内的AP发送请求帧。802.11通常使用带碰撞避免的CSMA/CA来避免碰撞,当监听到信道空闲时会选择一个时间并不断递减,直到为0时发送,如果接收到确认则重新开始监听,如果失败则重新进入回退阶段并且设定一个更大范围的随机值。802.11使用了RTS和CTS来对AP发送一个请求发送控制帧和一个允许发送的控制帧来预约对信道的访问。以避免产生碰撞/终端隐藏。
      当一个主机在两个不同的BSS之间移动时可以通过关联后立刻向交换机发送广播帧使得其更新转发表,使得主机可以通过新的AP到达,而如果处于不同的LAN子网时,可以通过划分大的虚拟子网的方式来处理。802.11有一种自适应的速率调节能力,当SNR下降/一个节点连续收到两个帧没有收到确认,速率下降到前一个级别,如果连续收到10个确认则提升速度。802.11还有功率管理功能,一个节点会在睡眠和唤醒状态之间交替。AP在发送信标帧前刚好唤醒节点,并且进入全面活动状态,AP发送休眠时期缓存的帧。个人域网络,蓝牙和ZIGBEE都是提供了一种低速率小范围低功率的电缆替代技术,ZIGBEE则更为轻量。同时这两种网络也是无AP的(自组织)802.15。蜂窝网的体系结构,3G蜂窝网通过将2G蜂窝网的语音服务和数据服务在RNC上层区分开的方式,向2G蜂窝网中添加了数据流量传递的功能,4G则是在这基础上将语音和数据都承载在IP数据包中一同传递。移动节点间通常使用简介路由选择,即设定一个节点的外部代理和一个归属代理,每个移动节点有一个永久地址被保存在归属代理中,当移动到一个新的网络中时设置一个外部代理,并把外部代理注册到归属代理中,数据报由归属代理转发至外部代理至移动节点中。直接路由选择太复杂没看。
  1. 计算机网络中的安全
    1. 对称密码体制就是双边使用相同哦哦过的密码来进行加解密,但是问题出在如何安全的交换这个对称密钥。另外对称加密技术可以分为两种宽泛的类型1.流密码通常用于无线数据流加密2.块密码,通常用于链路数据报加密。块密码中,,我们将报文处理为k比特的块,同时生成一个随机的k比特掩码(类似掩码)的数R,通过Ci = Ks(Mi xor Ri)这种方式对原始数据块M进行加密最终得到的c为加密后的数据,KS为具有密钥S的块加密算法。接收方通过C和K以及传送过来的R还原M的值,但是这里有一个这里有一个问题就是传输的数据量由于R的原因会被表示为双倍,所以准备里采用一种叫CBC的技术,发送方通过一个初始向量与初始报文异或后的值作为下一个向量加密下一个块,这样接收方可以只通过一个初始向量解密所有的块。目前流行的块密码包括DES/AES等。
      不对称密码加密即通过一个公钥一个私钥进行加密,使用公钥或者私钥加密的密码可以用对应的另一半来解密,这样就可以通过一个对方公开的密钥来加密内容,接收方用自己的私钥解密。非对称加密算法最出名的就是RSA了,这里简单介绍一下RSA的原理,RSA有两个相互关联的部分,首先是公钥和私钥的选择。为了生成公钥和私钥,进行如下步骤,1.选择两个大素数p和q,这两个素数的乘积最好为1024比特数量级。2.计算n=pq和z=(p-1)(q-1) 3.选择一个小于n的数e,且使e和z互素,e表示这个值将用于加密。4.求一个数d使得ed mod z = 1,这样外界可用的公钥为n,e私钥为n,d。接下来是RSA加密解密算法的步骤,加密值:c = m^e mod n 解密值 m = c^d mod n。这其中的原理也很简单,从带入一下得到m = ((m^e) mod n)^d mod n,所以有(m ^ ed) mod n = m,再有这样一个数论结论,当p和q为素数,且z=(p-1)(q-1)则有m^ed mod n = m ^ (ed mod z) mod n。所以有m^1 mod n = m。成立。最神奇的是d和e是可以相互置换的,无论你用哪个值进行加密,都可以从另一个值进行解密。私钥推到公钥容易,公钥推导私钥困难。
      报文完整性和数字签名,在网络中如何验证一个报文的完整性和正当性是另一个重要的安全领域。通常验证一个报文完整性的方式是提供一个对报文段的哈希值,目前比较常用的散列算法有MD5和SHA-1,(MD5目前被认为是可伪造的。为了执行报文完整性,我们还需要引入一个发送接收方共享的密码S,用m+s得到要一个哈希值,这种策略被称为MAC。现在常用的标准是HMAC,他能够与MD5或者SHA-1一起使用。
      数字签名适用于网络中的签名,用于验证一个人的身份。数字签名在MAC的基础上,添加了一个使用私钥加密的过程,接收方通过发送方的公钥解密后,使用接收到的报文进行散列加密,验证是否与发过来的散列值一致。
      上面所有聊到的非对称加密过程中的一个关键点在于公钥认证。一个CA对不同的实体提供了保定身份和公钥的功能,ITU X509提供了整数的鉴别服务以及语法。
      应用层的一种 常见安全性提供手段其实就是对报文进行哈希,然后使用私钥对哈希值进行加密,在和原文一起使用对称加密,再将对称加密的密码用对方的公钥加密。这样就可以提供报文的机密性,发送方鉴别,以及报文完整性的确认了。其中对称加密的部分提供了机密性,哈希值和私钥加密的部分提供了发送方鉴别和报文完整性的确认。
      SSL提供了运输层的安全性,SSL全名安全套接字层,建立于TCP的上层,步骤通常是在TCP握手的三次确认以后发送一个SSL hello,然后接收方发送一个自己的证书,通过CA验证过后发送方发送一个使用这个公钥加密的主密钥过去。这个主密钥将被分段生成四个密钥,用来生成双方的单项会话加密密钥以及双方的MAC密钥。SSL将数据流分割成记录,对每个记录添加一个完整性检查,然后加密改记录+MAC,这个MAC包含了数据和MAC密钥Mb(上面主密钥分割出来的一个加密密钥)。注意双方使用主密钥分割出来的四个密钥是共享的。
      SSL在握手阶段,客户向服务器发送自己支持的算法列表,服务器从中选择一个对称算法,一个公私钥算法,一个MAC算法,他把他的选择和一个证书还有不重数返回给客户。客户验证证书,提取公钥生成一个前主密钥发送给服务器。客户和服务器独立的从前主密钥和不重数中计算出主密钥,然后切分成四个密码。选择的对称密钥应用于CBC,则两个初始向量也从主密钥中获得,这两个IV用于链接的两端,最后客户和服务器都发送关于握手报文的一个MAC用于验证握手阶段的正确性。SSL中不重数用于防御链接重放,而序号用于防御在一个进行的对话中的重放。
      网络层安全性IPSec和虚拟专用网,IPSec是应用于网络层的安全协议,这种协议的意义是在两个网络实体之间提供网络层报文的安全性。IPSec的数据包实际上是将原始IP数据报的载荷部分进行了加密,在接收端的IPsec中进行解密还原原始的IP数据报并将解密的载荷传递给上层协议。IPSec协议族中包含两个主要协议AH/ESP。IPSec数据报在网络实体之间发送,从源地址到目的地址之间的这段逻辑链路被称之为安全关联SA,一个SA通常是单向的,发送端维护一个关于SA的状态信息,包括一个识别SA的标识符,一个初始接口和目的接口,一个加密类型+加密密钥,一个完整性检查类型+鉴别密钥。IPSec的报文实际上是在初始数据报的后段加上一个ESP尾部,然后使用算法加密该结果,在加密后的数据段前面加一个ESP首部,尾部加上一个ESPMAC段。ESP尾部用于填充长度以及指明载荷数据类型。首部用于识别数据报属于哪个SA,并且SAD可以使用SPI识别使用的算法和密钥,以及序号用于防御重放攻击。最后在整个段的前端加上一个新的IP首部,指向SA的终端,等待SA解包。IPSec实体还包括一个SPD库保存那些目的地址和源地址的数据报将被IPSec处理。通过上面这个数据包中的所有字段可以让ipsec提供网络层之间的机密性,源鉴别,数据完整性和重放攻击保护。最后IPSec的一个问题是,如果提供了这种级别的机密性,是否还需要SSL的保护呢?最后IPSec中的密钥管理通过IKE来大量生成SA。
      无线WEB安全?
      防火墙可以过滤内部到外部之间的流量,通常分为三类1.传统分组过滤器2.状态过滤器3.应用程序网关。传统的过滤器通过源地址目的地址/IP中的协议类型/端口/标志比特/ICMP报文类型。基于状态的过滤器则是在上面的基础上还添加了一个核对链接,用于查询是否正处于链接表中的链接。应用程序网关则是利用一个应用层的网关和分组过滤器结合起来,通过某个端口传入这个应用程序,然后在这个应用程序中对传入的数据进行过滤,如果通过检测则向目的地进行转发。TOR匿名网络实际上就是通过这种转发的方式将你的IP向ISP隐藏起来。
      当我们决定让哪个分组进入防火墙时,我们通常是使用首部字段,还有另外一种手段可以通过匹配数据字段的特征值来检测攻击。
  1. 多媒体网络
    1. 多媒体网络可以分为三种类型:1.流式储存音频和视频2.会话式IP语音和视频3.流式实况音频和视频。其中流式储存视频和实况视频的处理方式很类似。所以我们先来讨论流式储存音频和视频,通常分为三种类型1.UDP流2.HTTP流3.适应性HTTP。总体来说,一个视频想要以流式的方式顺利播放,首先需要设定一个用户缓存,这个缓存可以抵消网络抖动,当网络延迟高的时候就消耗用户缓存中的流,所以流视频播放总体上来说是一个考虑吞吐量的应用,当接受的吞吐量大于消耗的吞吐量时就达成了播放的一个要求,当然他还需要尽可能均匀的接受,如果缓存中的数据量被消耗完,视频就还是会被卡住。UDP流使用了一种被称之为RTP的传输协议,但是UPD流的一种问题是带宽无法预测,需要对会话跟踪和交互状态需要额外的输出。第三个缺点是可能被防火墙阻塞UPD流量。
      由于上述的问题,实际中的流媒体通常使用HTTP流,它使用TCP所以不会被防火墙阻塞。HTTP流通常使用一个客户应用缓存和一个TCP缓存,TCP缓存位于应用缓存和网络之间。HTTP流通常使用字节范围首部来指定需要的字节范围,这对于重定位播放地址很有用,在重定位的同时之前的缓存大概率会被直接丢弃。所以很多流系统设定了缓存数据的大小以控制带宽消耗。适应性HTTP流则是将视频提供了多个版本并且分段,客户端根据本地测量的接收带宽选择不同的版本分块下载。对于流媒体有一个很有意思的观察,HUYA对自己平台的主播提供了屏蔽词语音层面的消音处理,这实际上是通过识别音频缓存中的对应屏蔽词进行替换实现的,由于直播需要先推流至服务器,所以在服务器端就可以做出这样的识别和替换。
      IP语音被称为英特网电话也被称为VoIP,实时语音和视频的区别很大,流视频可以接受相对较大的网络抖动和时延而主要保证固定时间段内的吞吐量大于消耗的吞吐量。而实时语音则不太能接受较大的网络抖动或者时延。而网络层的IP协议只提供了尽力而为的服务,所以缺乏对界限时间内的分组到达提供保证以及丢包百分比的限制提供承诺,所以我们需要在这种前提下尽可能保证语音的流畅性。
      首先我们来考虑接收方如何消除音频的时延抖动,在接收方可能出现随机时延抖动的情况下,我们通常为每个块预先计划一个时间戳,然后在接收方延迟播放,这个播放时延需要尽可能让大多数分组在它们的预定播放时间之前被接受到。播放时延有两种不同的设定策略,首先是可以设定固定的时延,通过这个实验接收方可以在块产生正好Qms后播放,这样只需要每个块在t+q的时刻接受到这个块就可以保障正确播放。但是这个时延如果太长则会影响通话体验,如果太小有可能会让很多分组错过播放时间。所以我们通常使用适应性的播放时延,我们通常通过测量一些播放时间接受时间来测量网络时延,并且根据这些时延来在话音突峰期的开始来选择设定一个分组的播放时延。这种调整可能会导致发送方静默期的压缩和拉长,但是静默期的少量压缩和拉长是不那么容易察觉的。
      由于IP协议不对交付做保证,所以一定会出现百分比丢包的情况,而在语音通话中丢包也是一个很关键的内容。通常对于丢包的情况有两种方案1.向前纠错2.交织3.差错掩盖。向前纠错的思想是发送n个块以后发送一个冗余编码的块通过异或n个初始块来获得,这样如果在n个块中出现一个丢包可以对缺失的块进行恢复。第二个机制是通过发送一个较低分辨率的音频流作为冗余信息,当丢失包则从较低分辨率的音频流中获取包,相对而言比丢包的情况就可以接受很多了,但是这两种方案都是在增加传输带宽和播放时延的前提下实现的。交织的方案则是通过把比包更小单位的音频单元的顺序打乱,以实现丢失包的音频单元能较为平均的分布在各个音频的顺序切块中,小范围的丢包与大间隙的丢包给人带来的体验相差很多。这种方案是以排序和恢复带来的时延为前提的,在实时语音中可能也不太可以接受。最后一种方案是通过前后报文来插入一个类似的分组来隐藏丢失,同样这也需要增加计算量。
      实时会话式的应用的协议通常使用RTP和SIP,SIP用于建立修改和停止会话,用于会话控制,RTP负责实际的数据传输。包括时间同步,数据报排序等功能,由于RTP基于UDP协议所以也不提供任何保证。SIP提供了一种在呼叫与被呼叫之间的机制,允许参与者约定媒体编码,提供了主叫者通过标识符确定被叫者IP的机制,提供了关于会话管理的功能。SIP会有一个类似TCP握手的步骤来约定用户编码以及端口,然后通过约定好的端口和编码相互传递数据。另外前面提过SIP可以通过标识符来获取IP地址,这事通过一个SIP代理来实现的,这个功能类似DNS服务器当任何用户在主机上发起SIP应用时都会向注册器发送一个SIP注册报文,而这些注册器和代理通常运行在同一台主机上。
      前面我们提到的多媒体网络都是基于IP网络层尽力而为的英特网的,而实际上这种简单的保证通过一些定制的设计可以很好的工作,但是南面的我们会思考是否可以通过在网络层为数据提供更加抽象的功能来实现更好的网络保障/媒体传输功能。现在对于网络层支持通常分为三个宽泛的额方法,1.尽可能利用尽力而为2.区分服务,对不同的流进行不同的处理3.每链接服务质量保证,这种方式对每个流的处理都有相应的处理,复杂性最高,同时可以实现的控制粒度最细。我们现在实际上对多媒体应用的支持都是基于尽力而为网络的,通常我们解决网络拥塞的最简单方法就是增加链路带宽。但是对于一个给定的网络拓扑多少容量才是充足的这给网络的设计者提出了一个复杂的问题,另外多个ISP会愿意合作以提供某条线路足够的端到端链路带宽吗?
      而在尽力交付的基础上,对网络进行区分服务是一个很自然的想法,我们对不同类型的流量进行区分,并且对这些不同的流量进行不同的链路带宽保证,通过流量隔离,分组标记等手段,可以实现更加合理的利用带宽的功能。通过不同的调度机制我们可以设计一种保证队列中最大时延的算法。通过配置一个流量配置文件对不同的分组进行分类和标记,最后在一个整形器/丢弃器中对分组进行不同的处理。这里实际上还有很多更复杂的概念,最后这个模型其实有一些问题,例如多个ISP必须协作才能提供真正的区分服务,第二如果网络的运行负载不大,对流量进行区分将没有意义,所以用户额外付出的增值费用也没有意义。
      最后QOS对不同的流量进行了更加细粒度的区分,一个QOS可以对某个链接提供硬保证,整个传输期间的带宽性能,但也是由于这样的设定,使得新的链接需要向网络中查询是否有足够的带宽提供新的链接建立,一旦提供了呼叫准入则需要为新的链接提供足够的资源预留。但最后这种每链接的服务质量保证也需要最大的复杂性以及管理部署网络的成本,所以现在存量很少。
      实际上现在使用简单的应用级机制,例如前面的VOIP以及流媒体的一些协议,加上适当的网络的定制,前面提过的指定网络拓扑的带宽设定就可以为多媒体应用提供足够好的尽力而为服务,以至于QOS这类服务所需要的成本高于了可预测的用户收入。