动态路由配置与TCP+UDP
路由配置
-
路由表中会有多条路由规则,至少包含以下信息:
- 目的网络:这个包想去哪
- 出口设备:将这个包送到哪去
- 下一跳网关:下一个路由器的地址
-
路由策略不仅可以根据目的ip地址来配置,还可以根据多个参数来配置,比如:源ip地址,入口设备,TOS等
ip rule add from 192.168.1.0/24 table 10 ip rule add from 192.168.2.0/24 table 20
表示从 192.168.1.10/24 这个网段来的,使用 table 10 中的路由表,而从 192.168.2.0/24 网段来的,使用 table20 的路由表。还可以根据权重来选择下一跳网关。
-
什么情况下会用到复杂的配置呢?
- 路由器连了外联了两个不同的运营商,速度不同,于是我们可以设置路由表,从IP1来的包走快的还是慢的,或者按权重来选择。
动态路由算法
-
距离矢量路由算法:每个路由器根据新收集的信息,计算和其他路由器的距离,比如自己的一个邻居距离目标路由器的距离是 M,而自己距离邻居是 x,则自己距离目标路由器是 x+M。
问题:好消息传得快,坏消息传得慢。原来的网络包括两个节点,B 和 C。A 加入了网络,它的邻居 B 很快就发现 A 启动起来了。于 是它将自己和 A 的距离设为 1,同样 C 也发现 A 起来了,将自己和 A 的距离设置为 2。但是如 果 A 挂掉,情况就不妙了。B 本来和 A 是邻居,发现连不上 A 了,但是 C 还是能够连上,只 不过距离远了点,是 2,于是将自己的距离设置为 3。殊不知 C 的距离 2 其实是基于原来自己 的距离为 1 计算出来的。C 发现自己也连不上 A,并且发现 B 设置为 3,于是自己改成距离4。依次类推,数越来越大,直到超过一个阈值,我们才能判定 A 真的挂了。
问题2:这种算法的第二个问题是,每次发送的时候,要发送整个全局路由表。网络大了,谁也受不了, 所以最早的路由协议 RIP 就是这个算法。它适用于小型网络(小于 15 跳)。当网络规模都小的时候,没有问题。现在一个数据中心内部路由器数目就很多,因而不适用了。
-
链路状态路由算法:
这种算法的基本思路是:当一个路由器启动的时候,首先是发现邻居,向邻居 say hello,邻居都回复。然后计算和邻居的距离,发送一个 echo,要求马上返回,除以二就是距离。然后将自 己和邻居之间的链路状态包广播出去,发送到整个网络的每个路由器。这样每个路由器都能够收 到它和邻居之间的关系的信息。因而,每个路由器都能在自己本地构建一个完整的图,然后针对 这个图使用 Dijkstra 算法,找到两点之间的最短路径。
不像距离距离矢量路由协议那样,更新时发送整个路由表。链路状态路由协议只广播更新的或改 变的网络拓扑,这使得更新信息更小,节省了带宽和 CPU 利用率。而且一旦一个路由器挂了,它的邻居都会广播这个消息,可以使得坏消息迅速收敛。
动态路由协议
-
基于链路状态算法的OSPFFOpen Shortest Path First,开放式最短路径优先)就是这样一个基于链路状态路由协议,广泛应用在数据中心中的协议。由于主要用在数据中心内部,用于路由决策,因而称为内部网关协议(Interior Gateway Protocol,简称IGP)。
内部网关协议的重点就是找到最短的路径。在一个组织内部,路径最短往往最优。当然有时候 OSPF 可以发现多个最短的路径,可以在这多个路径中进行负载均衡,这常常被称为等价路由。
-
基于距离矢量路由算法的BGP,外网路由协议(Border Gateway Protocol,简称BGP)。 对于网络包同样,每个数据中心都设置自己的 Policy。例如,哪些外部的 IP 可以让内部知晓, 哪些内部的 IP 可以让外部知晓,哪些可以通过,哪些不能通过。不是一律都是按距离近的路线来走。
TCP与UDP
-
建立连接:是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性。
-
TCP是面向连接的,可靠交付,无差错,不丢失,不重复,按序到达。
-
TCP是面向字节流的,发送的时候是一个流,没头没尾,IP 包可不是一个流,而是一个个的 IP 包。之所以变成了流,这也是 TCP 自己的状态维护做的事情。而UDP 继承了 IP 的特性,基于数据报的,一个一个地发,一个一个地收。
-
还有TCP 是可以有拥塞控制的。它意识到包丢弃了或者网络的环境不好了,就会根据情况调整 自己的行为,看看是不是发快了,要不要发慢点。UDP 就不会,应用让我发,我就发,不管拥堵。
-
通过在IP头里的8位协议,会存放数据是TCP还是UDP的。
-
UDP三大使用场景:
- 需要资源少,网络情况比较好的内网,或者对于丢包不敏感的应用,比如DHCP就是基于UDP协议的。
- 不需要一对一沟通,建立连接,而是可以广播的应用。
- 需要处理速度快,时延低,可以容忍少数丢包,但是要求即使阻塞也要正常发包。
-
例子:
- 网页或者app应用,QUIC(全称Quick UDP Internet Connections,快速 UDP 互联网连接)是 Google 提出的一种基于 UDP 改进的通信协议,其目的是降低网络通信的延迟,提供更好的用户互动体验。
- 流媒体协议:比如音视频直播。
- 实时游戏,如果出现一个数据包丢失,所有事情都需要停下来等待这个数据包重发。客户端会出现等待接收数据,然而玩家并不关心过期的数据,激战中卡 1 秒,等能动了都已经死了。
- 物联网和移动通信。
-
关于TCP的协议可以参考这篇:[tcp]: https://www.cnblogs.com/jimmyhe/p/10291283.html "http中的socket是怎么一回事"