计算机网络总结|青训营笔记

226 阅读14分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记。

路由接入

在同网段中,早期会通过接线器实现互联,后期在使用路由上,只需要将目的mac地址改为自己的mac地址即可。(交换机内部维护一张 MAC 地址表,记录着每一个 MAC 地址的设备,连接在其哪一个端口上。)

在不同网段中,通过一个中间设备路由实现转发,路由的配置规则可以设置将某个ip地址进行对应的转发,路由选择的过程中按照最长匹配前缀规则进行选择,若无对应匹配则使用网关进行转发。

  • 问:路由是对称的吗?

  • 不一定,由于网络中是以网状结构进行互联的,相反的方向对称过来不一定通,有可能选择其他路径。

  • 路由是工作在ip层的协议,包含对下一跳的查询

  • 源IP地址和⽬标IP地址在传输过程中是不会变化的,只有源MAC地址(在每次跳的时候会改变源地址)和⽬标MAC地址⼀直在变化。

为什么用ip不用mac寻址?

  1. ip地址是逻辑上的概念,mac地址是物理上的概念,对ip地址进行逻辑上的划分有利于ip寻址。
  2. mac地址是唯一的,ip地址是可变的,如果机器加入到了另一个网段,寻找mac地址会变得很麻烦。同一个网段内使用了mac地址表进行对应的转发,mac地址太多后,肯定没办法全部记录下来了。
  3. ip地址工作在网络层,mac地址工作在传输层,因此路由器之间使用ip地址进行寻址,网段内使用mac地址进行寻址。

路由过程总结:

image.png A发送包到F的过程如下:

  1. 首先A根据子网掩码判断和F是否在同一个网段中,不在同一个网段则通过arp获得默认网关的MAC地址,将源ip+目标ip放入网络层头部,将源MAC地址和目标MAC地址放在链路层头部,发包出去。
  2. 交换机1收到该包后,提取出其MAC地址查询MAC地址表,然后从对应的端口发出包。
  3. 路由器1收到包后,查询路由表获取其下一跳的IP地址,以及通过arp(包括arp缓存表)获得对应的MAC地址,同样将其装入数据链路层头部以及网络层头部发出。
  4. 路由器2收到包后,根据目的ip地址获得对应的端口号,再从对应端口号发出(并且修改源MAC和目标MAC)。
  5. 交换机3收到包后,查询MAC地址表发送给对应的F机器完成转发。
  • MAC地址表中无缓存则发出广播并将其结果(根据端口号的反应信息,ARP请求广播和ARP应答单播)记录到MAC地址表中。
  • 只有在路由器中进行下一跳的时候(通过路由器查询下一跳的ip地址及其端口号)会更改mac地址,根据的是arp缓存表,当然每个机器也有一个arp缓存表
  • 每个机器都有一个默认网关,默认将包发到默认网关mac地址上。
  • 路由发现算法选择下一跳的时候可以是静态配置的,也可以是动态发现的。

动态路由协议

路由协议分为动态和静态两种,动态路由就是说路由器能建立自己的路由表,同时当网络出现故障时,路由器能够自行检测链路,选择最优的路径进行转发。

所有的路由协议在TCP/IP协议栈中都属于应用层协议,但是不同的路由协议使用的底层协议不同。

RIP协议-路由信息协议

RIP采用了周期性广播的方式更新整张路由表,即通过交互路由表学习自己不知道的网段,直到内部网关全网可达为止,路由器在完成收敛之前无法正常工作,而且只适用于小型网络。

但是RIP会出现环路缺陷: 当某个网段Down掉的时候,某个路由器会从其路由表中去掉该网段的信息,但是当下个周期更新时,又会从相邻的周期更新到自己的路由表中,则该网段的路由会被各个路由表不断地学习,从而形成环路

RIP防环机制:

  • 规定最大跳数为16,凡是达到16跳为不可达路由。
  • 水平分割:收到广播信息的端口不进行广播,路由器应该选择性地发送路由信息,绝不能包含从该路由得到的信息。
  • 路由器毒化或者毒性反转:如果某个网段挂掉了,立即将目标的距离设置为16不可达,并泛洪告诉其他路由,其他路由器会将该网段进行隐藏,若在抑制计时器有效期时间内恢复则可重新回到路由表中。

OSPF协议-开放最短路径优先协议

OSPF解决了RIP的缺点,OSPF是基于链路状态自治系统内部路由协议

OSPF的流程一般为:

image.png OSPF接口发送Hello包,建立邻居关系,之后学习链路状态信息形成链路状态数据库,再通过最短路径算法(dj算法)计算得到最短路径后放入路由表中,

ISIS协议-中间系统到中间系统协议

传输网/运营商网络使用的协议:该算法和OSPF类似,收敛快,安全性高,但是其异常处理资料不如OSPF丰富。

BGP协议-边界网关协议

一个简单的应用比如BGP可以用于网通和电信之间路由的相互传递,如果使用其他协议的话由于路由数量太多,无法计算出来路由,或者计算非常慢;而且同时网通和电信之间网络放在一起使用内部网关协议是不安全的。

  • 从技术上来讲,BGP是处在相邻的自治系统(AS)之间的协议,可以用于相互的AG之间交换网络可达信息即AS的信息;BGP是基于TCP的路由协议,只要能建立TCP就能建立BGP,而且也有keep alive的探活机制。
  • BGP按照运行方式分为EBGP和IBGP:EBGP表示运行在不同As之间的BGP,IBGP表示在同一个AS内的BGP;为了防止网络产生路由环路,则BGP规定IBGP只会向EBGP宣告路由信息。

免费ARP和ARP代理

免费ARP通常在以下场景中进行使用:

  1. 在网段中新加入一台机器时,由于其他机器都没有对应的arp缓存,所以新机器会发出一个广播将自己的ip地址和mac地址发送出去。
  2. 还可以用于IP冲突检测,在发出免费ARP报文后,如果收到了ARP响应这表示该IP冲突,已经存在该IP的主机。

代理ARP的作用是用本设备的MAC地址代替目标主机的MAC地址响应ARP的请求,可以解决同一网段的主机在不同的广播域不能通信的问题。

IPV4不够用该怎么办?

  1. IPV4+NAT:由于IPV4地址短缺的问题,通常使用IPV4将内部的私有地址转换为能和外界互连的外部地址
  • 使用NAT后可以保证内网的安全性,此外对于来自于外部的数据包可以查看其NAT映射记录,如果没有相应记录的数据包则会拒绝,能够提高网络的安全性。
  • 由于NAT设备会对数据包进行相应的编辑修改,这样就降低了传送的效率,而且根据协议的各不相同,有的协议是不支持NAT的,此时就需要穿透技术来解决。
  1. 使用IPV6

DNS解析请求(基于UDP)

发出一个域名后,首先会有递归解析器去解析根域名,然后是顶级域服务器和权威服务器,通过对每个服务器的访问客户端都可以获得一个对应的地址,直到获得给定域的IP地址为止。

MTU和MSS

MTU表示的是最大传输单元,它是链路层的一个特性,如果要转发的包的大小超过了MTU,则需要在IP层进行分片再进行传输。因此IP协议除了进行路由寻址外,另一个重要的功能就是IP数据报的分片处理

路径MTU(PMTU)表示的是在选择的传输路径中最小的MTU值,PMTUD的设置方法是在传输过程中将DF值设置为1(表示大于MTU则进行丢弃),然后会返回下一跳的MTU大小,由此进行重新分片。

MSS是在TCP中,在双方三次握手后决定了通信双方的最小MTU值,减去20字节的网络层头部以及20字节的链路层头部大小,剩下的就是MSS大小,表示ip协议分片支持的最大数据长度。具体在三次握手过程中双方会读取TCP option字段中的MSS值,取得最小的表示为双方的MSS值。

TCP连接

在拔掉网线后,TCP连接还会保持吗?

  1. 在拔掉网线后有数据传输时,由于无法接受ACK信息,会进行超时重传,这段时间连接还是建立的,经过最大超时重传时间后,依然无法收到ACK,则TCP连接就会断开。
  2. 在拔掉网线后没有数据传输时,如果没有使用TCP探活机制,连接会一直建立;如果加入了TCP探活机制,在累计发送探活心跳包却没有接收到回复达到最大探活次数后,就会断开连接。

三次握手中的Seq,ACK是如何计算的呢

  1. Seq:表示发送放发送的数据起始地址在整个data stream中的位置。
  2. ACK:表示下一次接受消息时希望对方发送的序列号地址,注意SYN/FIN的时候虽然没有数据传输,仍然会让ACK+1;但是ACK的传输不会让下一次传输的位置+1

image.png

网络优化

HTTP网络传输(协议优化)

为什么不直接使用TCP传输而要使用HTTP呢?

TCP通过三次握手建立连接后两者可以互相发送字节流,而HTTP在TCP之上进行了封装,由于TCP传输并没有应用层的参与,会导致两端对传输的内容无法进行识别,HTTP指定了应用层协议,从而降低了编程的复杂性,能够专注于业务中。

HTTP1.1的优化

  1. 长连接:如果每次连接都去建立一个新的连接这样消耗时间会很长,因此1.1中使用了长连接,增加了心跳包去检测连接是否通畅,每次传输完成后并没有关闭对应连接而是继续等待后续传输。
  2. 部分传输:1.1中可以根据范围获取数据,这样就实现了断点传输的功能。
  3. 缓存处理:引入额外的缓存控制机制。

HTTPS加密

HTTPS的加密过程包括对称加密和非对称加密,双方进行TLS握手,协商TLS版本、加密套件、第一第二随机号。

  1. 由客户端发送自己支持的TLS版本、加密套件以及生成的第一随机号。
  2. 服务器端返回确认支持的TLS版本、加密套件以及生成的第二随机号。
  3. 然后服务器发送证书和公钥给客户端,发送完毕后通知客户端。
  4. 客户端生成第三个随机号为预主密钥,然后使用刚收到的公钥加密后发送给服务器端。
  5. 服务器端使用自己的私钥解密获得预主密钥。
  6. 双方使用第一随机数、第二随机数以及预主密钥计算出会话密钥,然后通过对称加密进行传输。

HTTP2.0的优化

在HTTP1.1中由于其解析方式是文本解析,直到读到分隔符才能结束,结束之前无法停止解析,而且服务端无法预知分配的资源数;而2.0中采用了二进制“帧”传输,在传输的包中服务端可以获得流的大小,通过标识Stream ID实现对流的控制,因此可以实现多路复用机制。

  1. 多路复用:在2.0中通过多路复用技术可以在发送完请求后接着发送后面的请求,只需要将最后的结果进行对应即可。但是多路复用有一个显著的对头阻塞问题,如果对头传输不成功则会阻塞队列中的数据传送,在TCP option里面增加了SACK字段表示了需要重传的包,但是仍无法根本解决队头阻塞问题。
  2. 头部压缩:在2.0中使用二进制框架对头部信息和数据信息进行了压缩,提高了传输效率。
  3. 流量控制:在2.0中客户端可以通过发送Window_update帧来告诉发送方自己想要接受的字节数,从而进行流量控制。
  4. 服务端推送:当页面还没开始请求的时候,就可以将部分资源推送到客户端了,这样在页面渲染的时候部分资源已经在缓存中,提高了页面打开的速度。

QUIC协议

  1. 针对队头阻塞问题,TCP的对头阻塞问题主要是由于数据包超时确认或丢失所以阻塞了当前窗口的滑动,QUIC使用了Packet Number代替了Sequence Number来确认数据的有序到达,Packet Number区别于Sequence Number是严格递增的,相当于就算Packet N数据包丢失了接下来重传的依然是后面的包。
  2. 数据完整性问题:QUIC使用Packet Number可以不像TCP那样有序确认,QUIC支持乱序确认,发送方会将没有传输成功的数据包放在待发送队列中,通过Stream ID设置流编号,以及Stream Offset字段设置偏移量组装完整的资源。
  3. QUIC的0RTT连接:在TCP中会通过三次握手确认双方的接收和发送是否正常以及数据开始序列号的确认,由于在第三次握手后不需要回复就能发送消息了,因此首次建立连接会花费1RTT的时间。QUIC采用了TLS简短握手过程,将首次协商的信息记录下来,以Session Ticket的形式传给客户端,如果想恢复之前的连接,可以将Session Ticket发送给服务器,这样就节省了连接建立的RTT开销。
  4. 降低数据包重传的概率:通过采用单向递增的Packet Number降低TCP重传的歧义性,从而降低重传概率。

网络路径优化

  • 数据中心分布包括核心机房、边缘机房等。
  • 通运营商访问(电信访问电信...),由于运营商跨网传输质量较差,因此优先选择同运营商访问。
  • CDN路径优化:针对静态资源,从边缘机房、汇聚机房到核心机房依次访问缓存,如果有的话就直接返回。
  • DSA路径优化:针对动态资源,通过路径探测确认路径,以及路径优化算法选择最优路径。