网络协议一

一、流程案例

接下来揭秘我要说的大事情,"双十一"。这和我们要讲的网络协议有什么关系呢?

在经济学领域,有个伦纳德·里德(Leonard E. Read)创作的《铅笔的故事》。这个故事通过一个铅笔的诞生过程,来讲述复杂的经济学理论。这里,我也用一个下单的过程,看看互联网世界的运行过程中,都使用了哪些网络协议。

你先在浏览器里面输入 https://www.kaola.com ,这是一个URL。浏览器只知道名字是"www.kaola.com",但是不知道具体的地点,所以不知道应该如何访问。于是,它打开地址簿去查找。可以使用一般的地址簿协议DNS去查找,还可以使用另一种更加精准的地址簿查找协议HTTPDNS。

无论用哪一种方法查找,最终都会得到这个地址:106.114.138.24。这个是IP地址,是互联网世界的"门牌号"。

知道了目标地址,浏览器就开始打包它的请求。对于普通的浏览请求,往往会使用HTTP协议;但是对于购物的请求,往往需要进行加密传输,因而会使用HTTPS协议。无论是什么协议,里面都会写明"你要买什么和买多少"。

DNS、HTTP、HTTPS 所在的层我们称为应用层。经过应用层封装后,浏览器会将应用层的包交给下一层去完成,通过 socket 编程来实现。下一层是传输层。传输层有两种协议,一种是无连接的协议UDP,一种是面向连接的协议TCP。对于支付来讲,往往使用 TCP 协议。所谓的面向连接就是,TCP 会保证这个包能够到达目的地。如果不能到达,就会重新发送,直至到达。

TCP 协议里面会有两个端口,一个是浏览器监听的端口,一个是电商的服务器监听的端口。操作系统往往通过端口来判断,它得到的包应该给哪个进程。

传输层封装完毕后,浏览器会将包交给操作系统的网络层。网络层的协议是 IP 协议。在 IP 协议里面会有源 IP 地址,即浏览器所在机器的 IP 地址和目标 IP 地址,也即电商网站所在服务器的 IP 地址。

操作系统既然知道了目标 IP 地址,就开始想如何根据这个门牌号找到目标机器。操作系统往往会判断,这个目标 IP 地址是本地人,还是外地人。如果是本地人,从门牌号就能看出来,但是显然电商网站不在本地,而在遥远的地方。

操作系统知道要离开本地去远方。虽然不知道远方在何处,但是可以这样类比一下:如果去国外要去海关,去外地就要去网关。而操作系统启动的时候,就会被 DHCP 协议配置 IP 地址,以及默认的网关的 IP 地址 192.168.1.1。

操作系统如何将 IP 地址发给网关呢?在本地通信基本靠吼,于是操作系统大吼一声,谁是 192.168.1.1 啊?网关会回答它,我就是,我的本地地址在村东头。这个本地地址就是MAC地址,而大吼的那一声是ARP协议。

于是操作系统将 IP 包交给了下一层,也就是MAC 层。网卡再将包发出去。由于这个包里面是有 MAC 地址的,因而它能够到达网关。

网关收到包之后,会根据自己的知识,判断下一步应该怎么走。网关往往是一个路由器,到某个 IP 地址应该怎么走,这个叫作路由表。

路由器有点像玄奘西行路过的一个个国家的一个个城关。每个城关都连着两个国家,每个国家相当于一个局域网,在每个国家内部,都可以使用本地的地址 MAC 进行通信。

一旦跨越城关,就需要拿出 IP 头来,里面写着贫僧来自东土大唐(就是源 IP 地址),欲往西天拜佛求经(指的是目标 IP 地址)。路过宝地,借宿一晚,明日启行,请问接下来该怎么走啊?

城关往往是知道这些"知识"的,因为城关和临近的城关也会经常沟通。到哪里应该怎么走,这种沟通的协议称为路由协议,常用的有OSPF和BGP。

城关与城关之间是一个国家,当网络包知道了下一步去哪个城关,还是要使用国家内部的 MAC 地址,通过下一个城关的 MAC 地址,找到下一个城关,然后再问下一步的路怎么走,一直到走出最后一个城关。

最后一个城关知道这个网络包要去的地方。于是,对着这个国家吼一声,谁是目标 IP 啊?目标服务器就会回复一个 MAC 地址。网络包过关后,通过这个 MAC 地址就能找到目标服务器。

目标服务器发现 MAC 地址对上了,取下 MAC 头来,发送给操作系统的网络层。发现 IP 也对上了,就取下 IP 头。IP 头里会写上一层封装的是 TCP 协议,然后将其交给传输层,即TCP 层。

在这一层里,对于收到的每个包,都会有一个回复的包说明收到了。这个回复的包绝非这次下单请求的结果,例如购物是否成功,扣了多少钱等,而仅仅是 TCP 层的一个说明,即收到之后的回复。当然这个回复,会沿着刚才来的方向走回去,报个平安。

因为一旦出了国门,西行路上千难万险,如果在这个过程中,网络包走丢了,例如进了大沙漠,或者被强盗抢劫杀害怎么办呢?因而到了要报个平安。

如果过一段时间还是没到,发送端的 TCP 层会重新发送这个包,还是上面的过程,直到有一天收到平安到达的回复。这个重试绝非你的浏览器重新将下单这个动作重新请求一次。对于浏览器来讲,就发送了一次下单请求,TCP 层不断自己闷头重试。除非 TCP 这一层出了问题,例如连接断了,才轮到浏览器的应用层重新发送下单请求。

当网络包平安到达 TCP 层之后,TCP 头中有目标端口号,通过这个端口号,可以找到电商网站的进程正在监听这个端口号,假设一个 Tomcat,将这个包发给电商网站。

电商网站的进程得到 HTTP 请求的内容,知道了要买东西,买多少。往往一个电商网站最初接待请求的这个 Tomcat 只是个接待员,负责统筹处理这个请求,而不是所有的事情都自己做。例如,这个接待员要告诉专门管理订单的进程,登记要买某个商品,买多少,要告诉管理库存的进程,库存要减少多少,要告诉支付的进程,应该付多少钱,等等。

如何告诉相关的进程呢?往往通过 RPC 调用,即远程过程调用的方式来实现。远程过程调用就是当告诉管理订单进程的时候,接待员不用关心中间的网络互连问题,会由 RPC 框架统一处理。RPC 框架有很多种,有基于 HTTP 协议放在 HTTP 的报文里面的,有直接封装在 TCP 报文里面的。

当接待员发现相应的部门都处理完毕,就回复一个 HTTPS 的包,告知下单成功。这个 HTTPS 的包,会像来的时候一样,经过千难万险到达你的个人电脑,最终进入浏览器,显示支付成功。

二、网络分层

假设你要在网上购买一本书:

  1. 应用层:你打开浏览器,访问网上书店,选择一本书并下订单。
  2. 表示层:你的订单信息可能会被加密,以确保传输过程中的安全。
  3. 会话层:你的浏览器与书店服务器建立一个会话,确保在整个购物过程中保持连接。
  4. 传输层 :你的订单信息被分成多个数据包,每个数据包都会被编号,确保所有数据包能完整地送达书店服务器。负责端到端的通信和数据完整性,常用协议有TCP和UDP
  5. 网络层 :这些数据包通过互联网,使用IP地址找到书店服务器。
  6. 数据链路层 :在本地网络中,这些数据包通过交换机和路由器,使用MAC地址进行传输。
  7. 物理层:最终,这些数据包通过物理介质(如网线、光纤或无线信号)传输到书店服务器。

三、ifconfig

CIDR(Classless Inter-Domain Routing,无类域间路由) 表示法使用IP地址和一个斜杠后面的数字来表示网络前缀的长度,例如,192.168.1.0/24表示一个网络前缀,其中前24位为网络部分,剩下的8位为主机部分。

10.100.122.2/24,这个 IP 地址中有一个斜杠,斜杠后面有个数字 24。这种地址表示形式,就是 CIDR。后面 24 的意思是,32 位中,前 24 位是网络号,后 8 位是主机号。

伴随着 CIDR 存在的,一个是广播地址 ,10.100.122.255。如果发送这个地址,所有 10.100.122 网络里面的机器都可以收到。另一个是子网掩码,255.255.255.0。

将子网掩码和 IP 地址进行 AND 计算。前面三个 255,转成二进制都是 1。1 和任何数值取 AND,都是原来数值,因而前三个数不变,为 10.100.122。后面一个 0,转换成二进制是 0,0 和任何数值取 AND,都是 0,因而最后一个数变为 0,合起来就是 10.100.122.0。这就是网络号。将子网掩码和 IP 地址按位计算 AND,就可得到网络号。

net-tools和iproute2都是用于管理Linux网络配置的工具集。

net-tools是一个传统的网络工具集,包含一些常见的网络命令行工具,比如ifconfig, route, netstat等。这些工具在过去被广泛使用来配置和查看网络接口、路由表以及网络状态信息。例如,使用ifconfig可以查看和配置网络接口的信息,使用route可以添加和删除路由条目,使用netstat可以显示网络状态和连接信息。

而iproute2则是一个更新的网络工具集,它提供了更多现代化的网络管理工具,比如ip, ss, tc等。其中最常用的是ip命令,它可以用来替代ifconfig和route命令,提供更灵活和强大的网络配置功能。例如,使用ip命令可以轻松地配置网络接口、管理路由表、设置策略路由等。

总的来说,iproute2提供了更加灵活和强大的网络管理工具,推荐在新的Linux系统中使用,而net-tools则是传统的工具集,逐渐被iproute2取代。

MAC

在 IP 地址的上一行是 link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff,这个被称为MAC 地址,是一个网卡的物理地址,用十六进制,6 个 byte 表示。

MAC地址更像是身份证,是一个唯一的标识。

MAC 地址是有一定定位功能的,只不过范围非常有限。你可以根据 IP 地址,找到杭州市网商路 599 号 B 楼 6 层,但是依然找不到我,你就可以靠吼了,大声喊身份证 XXXX 的是哪位?我听到了,我就会站起来说,是我啊。但是如果你在上海,到处喊身份证 XXXX 的是哪位,我不在现场,当然不会回答,因为我在杭州不在上海。

网络设备状态标识

<BROADCAST,MULTICAST,UP,LOWER_UP>

UP 表示网卡处于启动的状态;BROADCAST 表示这个网卡有广播地址,可以发送广播包;MULTICAST 表示网卡可以发送多播包;LOWER_UP 表示 L1 是启动的,也即网线插着呢

四、DHCP与PXE

Linux 首先会判断,要去的这个地址和我是一个网段的吗,或者和我的一个网卡是同一网段的吗?只有是一个网段的,它才会发送 ARP 请求,获取 MAC 地址。

如果发现不是呢?
Linux 默认的逻辑是,如果这是一个跨网段的调用,它便不会直接将包发送到网络上,而是企图将包发送到网关。

DHCP 就是租ip地址

在这个广播包里面,新人大声喊:我是新来的(Boot request),我的 MAC 地址是这个,我还没有 IP,谁能给租给我个 IP 地址!

如果一个网络管理员在网络里面配置了DHCP Server的话,他就相当于这些 IP 的管理员。他立刻能知道来了一个"新人"。这个时候,我们可以体会 MAC 地址唯一的重要性了。当一台机器带着自己的 MAC 地址加入一个网络的时候,MAC 是它唯一的身份,如果连这个都重复了,就没办法配置了。

只有 MAC 唯一,IP 管理员才能知道这是一个新人,需要租给它一个 IP 地址,这个过程我们称为DHCP Offer。同时,DHCP Server 为此客户保留为它提供的 IP 地址,从而不会为其他 DHCP 客户分配此 IP 地址,这有一个租用期的。

预启动执行环境(PXE)自动安装操作系统

首先,启动 BIOS。这是一个特别小的小系统,只能干特别小的一件事情。其实就是读取硬盘的 MBR 启动扇区,将 GRUB 启动起来;然后将权力交给 GRUB,GRUB 加载内核、加载作为根文件系统的 initramfs 文件;然后将权力交给内核;最后内核启动,初始化整个操作系统。

PXE 协议分为客户端和服务器端,由于还没有操作系统,只能先把客户端放在 BIOS 里面。当计算机启动时,BIOS 把 PXE 客户端调入内存里面,就可以连接到服务端做一些操作了。

PXE的工作过程

PXE 服务器上,往往还有一个 TFTP 服务器

什么是initramfs

initramfs(Initial RAM Filesystem,初始内存文件系统)是系统启动时使用的一个小型的临时文件系统。它被加载到内存中,并在系统启动的早期阶段提供一些基本的工具和驱动程序,以帮助系统找到并挂载实际的根文件系统(通常是在硬盘上)。

为什么需要initramfs

想象一下,系统启动过程就像是一个人在黑暗中找东西。initramfs就像是一把手电筒,帮助系统在一开始的时候找到并准备好实际要使用的文件系统。

工作流程

  1. 启动加载程序

    • 当你打开计算机时,启动加载程序(比如GRUB)会从硬盘上加载Linux内核和initramfs到内存中。
  2. 解压initramfs

    • 内核启动后,会解压这个临时文件系统到内存中,里面包含了一些基本的工具和驱动程序。
  3. 运行初始化脚本

    • initramfs里有一些初始化脚本,这些脚本会运行并做一些准备工作,比如加载必要的驱动程序,让系统能够识别硬盘和其他设备。
  4. 挂载实际的根文件系统

    • 初始化脚本会找到硬盘上的实际根文件系统(就是平时你操作系统所在的地方),然后把这个根文件系统挂载起来。
  5. 切换到实际根文件系统

    • 一旦实际的根文件系统准备好,系统会把控制权交给这个根文件系统,继续启动剩下的操作系统。

总结

initramfs在系统启动时提供了一个临时的、最基本的环境,帮助系统加载需要的驱动程序和工具,以便能够找到并挂载实际的根文件系统,让操作系统顺利启动起来。

五、从物理层到MAC层

ARP 协议 ,也就是已知 IP 地址,求 MAC 地址的协议。在一个局域网里面,当知道了 IP 地址,不知道 MAC 怎么办呢?靠"吼"。

交换机 是有 MAC 地址学习能力的,学完了它就知道谁在哪儿了,不用广播了。
Hub:不具备MAC地址学习能力,将接收到的数据帧广播到所有端口,导致不必要的网络流量,效率低下

六、交换机与VLAN

在家里接入百兆宽带的情况下,通过交换机连接10个设备,具体情况会取决于交换机和宽带路由器的配置。这里有几个关键点需要注意:

宽带的总带宽

家里的宽带接入是100 Mbps的情况下,这个带宽是整个家庭网络与互联网之间的最大带宽。连接到交换机的设备共享这100 Mbps的互联网带宽。这意味着:

  1. 共享带宽

    • 所有设备共享同一个100 Mbps的互联网连接。因此,如果有多个设备同时访问互联网,总带宽会被这些设备分摊。
    • 例如,如果两个设备同时下载数据,每个设备的可用带宽可能会接近50 Mbps。
  2. 局域网内通信

    • 如果设备之间在局域网内传输数据,速度取决于交换机的带宽能力。即使是百兆宽带,千兆交换机在局域网内设备之间的通信速度仍然会是千兆(1 Gbps),不受宽带总带宽的限制。

环路问题

不能有两台交换机连在 LAN1 和 LAN2 之间

VLAN

我们可以设置交换机每个口所属的 VLAN。如果某个口坐的是程序员,他们属于 VLAN 10;如果某个口坐的是人事,他们属于 VLAN 20;如果某个口坐的是财务,他们属于 VLAN 30。这样,财务发的包,交换机只会转发到 VLAN 30 的口上。程序员啊,你就监听 VLAN 10 吧,里面除了代码,啥都没有。

而且对于交换机来讲,每个 VLAN 的口都是可以重新设置的。一个财务走了,把他所在的作为的口从 VLAN 30 移除掉,来了一个程序员,坐在财务的位置上,就把这个口设置为 VLAN 10,十分灵活。

有人会问交换机之间怎么连接呢?将两个交换机连接起来的口应该设置成什么 VLAN 呢?对于支持 VLAN 的交换机,有一种口叫作Trunk 口 。它可以转发属于任何 VLAN 的口。交换机之间可以通过这种口相互连接。

15175665209

七、网关

好的,让我来举一个简单的例子来说明转发网关和NAT网关的区别。

转发网关(Forwarding Gateway)

转发网关的工作原理是将数据包从一个网络传输到另一个网络,而不改变数据包的源IP地址和目标IP地址。

例子流程:

  1. 设备 A(IP地址:192.168.1.10)想要访问互联网上的一个服务器,服务器的IP地址是8.8.8.8。
  2. 设备 A 发送一个数据包,数据包的源IP是192.168.1.10,目标IP是8.8.8.8。
  3. 数据包到达了 转发网关(IP地址:192.168.1.1),转发网关只是把这个数据包转发到外部网络(比如互联网),而不改变数据包的IP地址。
  4. 服务器(IP地址:8.8.8.8)收到这个数据包后,将回复数据包,回复数据包的源IP是8.8.8.8,目标IP是192.168.1.10。
  5. 回复的数据包通过网络到达转发网关,转发网关又将数据包转发给设备 A。

在整个过程中,数据包的源IP和目标IP没有被改变。

NAT 网关(Network Address Translation Gateway)

NAT网关的工作原理是将数据包从一个网络传输到另一个网络时,改变数据包的源IP地址(通常是从私有IP地址改为公有IP地址),从而隐藏内部网络的IP地址。

例子流程:

  1. 设备 B(IP地址:192.168.1.20)想要访问互联网上的一个服务器,服务器的IP地址是8.8.8.8。
  2. 设备 B 发送一个数据包,数据包的源IP是192.168.1.20,目标IP是8.8.8.8。
  3. 数据包到达了 NAT网关(IP地址:192.168.1.1)。NAT网关会将数据包的源IP地址从192.168.1.20改为NAT网关的公有IP地址,比如203.0.113.1,然后将数据包发送到互联网。
  4. 服务器(IP地址:8.8.8.8)收到这个数据包后,将回复数据包,回复数据包的源IP是8.8.8.8,目标IP是203.0.113.1。
  5. 回复的数据包通过网络到达NAT网关,NAT网关会将数据包的目标IP地址从203.0.113.1改回192.168.1.20,然后将数据包发送给设备 B。

在这个过程中,NAT网关改变了数据包的源IP地址,从而实现了地址转换,隐藏了内部网络的真实IP地址。

总结

  • 转发网关:只转发数据包,不改变IP地址。
  • NAT网关:转发数据包,同时改变数据包的源或目标IP地址,通常用于隐藏内部网络的IP地址。

静态路由

静态路由是一种手动配置的路由方法,管理员需要手动输入路由信息并且维护这些信息。通过配置静态路由,管理员可以告诉网络设备如何到达特定目的地。与之相对的是动态路由,它是设备之间根据网络情况自动学习和交换路由信息。

举个通俗易懂的例子来解释静态路由:假设你在城市A,想要开车去城市B。你可以选择手动规划并设置一条固定的路线(静态路由),比如沿着高速公路直接前往城市B。这样无论其他道路的状况如何,你都会按照你设定的路线前往城市B。

在网络中,静态路由的流程类似:管理员手动指定了数据包应该经过哪些网关或路径来到达目的地。通过这种方式,管理员可以有针对性地控制数据包的传输路径,适用于小型网络或者需要特定路由策略的场景。然而,随着网络规模增大或者网络拓扑频繁变化,管理成本较高,因此在大型网络中更常使用动态路由。

八、路由协议

策略路由

举个通俗易懂的例子:假设你有两条道路可以到达目的地,一条风景秀丽但路况较差,另一条风景一般但路况良好。如果你是骑自行车的,你可能会选择风景秀丽的路线;但如果你是开车的,可能会更看重路况。在这个例子中,你根据不同的条件(交通工具)选择了不同的路线,这就类似于策略路由。

策略路由(Policy Routing)是一种根据特定策略而不是仅仅根据目的地IP地址来决定数据包路由路径的技术。策略路由可以基于多种条件,如源IP地址、协议类型、端口号等,来决定数据包的路由路径。

策略路由的工作原理

策略路由使用"路由策略"来确定数据包的路径,这些策略可以基于多种条件进行定义。例如,可以设置策略,使得来自特定网络的流量通过特定的路由器或接口传输,而不是默认路由。

例子流程说明

假设我们有一个公司网络,使用两条互联网连接(ISP 1 和 ISP 2)提供的两条不同的路径。公司有两个部门:开发部门和销售部门。我们希望开发部门的流量通过 ISP 1,而销售部门的流量通过 ISP 2。

  1. 网络架构:

    • 开发部门的网络:192.168.1.0/24
    • 销售部门的网络:192.168.2.0/24
    • ISP 1 网关:203.0.113.1
    • ISP 2 网关:203.0.113.2
  2. 策略定义:

    • 来自开发部门(192.168.1.0/24)的流量通过 ISP 1(203.0.113.1)。
    • 来自销售部门(192.168.2.0/24)的流量通过 ISP 2(203.0.113.2)。
  3. 策略路由配置:

    • 在公司的路由器上配置策略路由。
    • 创建一个策略,匹配源地址为192.168.1.0/24的流量,指定下一跳为203.0.113.1。
    • 创建另一个策略,匹配源地址为192.168.2.0/24的流量,指定下一跳为203.0.113.2。
  4. 数据包处理流程:

    • 开发部门设备 A(IP地址:192.168.1.10)想要访问互联网。设备 A 发送一个数据包到路由器。

    • 路由器根据策略路由表,识别到这个数据包的源IP地址属于192.168.1.0/24子网,因此将数据包发送到ISP 1的网关(203.0.113.1)。

    • 数据包通过ISP 1到达互联网。

    • 销售部门设备 B(IP地址:192.168.2.20)想要访问互联网。设备 B 发送一个数据包到路由器。

    • 路由器根据策略路由表,识别到这个数据包的源IP地址属于192.168.2.0/24子网,因此将数据包发送到ISP 2的网关(203.0.113.2)。

    • 数据包通过ISP 2到达互联网。

总结

策略路由允许根据数据包的源地址、协议类型等多种条件来决定数据包的路由路径,而不是仅仅依赖目的地IP地址。这种灵活性使得网络管理员能够优化网络流量,满足不同部门或应用的需求。

动态路由

动态路由(Dynamic Routing)

动态路由是一种网络路由方式,它允许路由器自动发现和维护网络路径。这与静态路由不同,后者需要手动配置和维护每条路径。动态路由协议(如RIP、OSPF和BGP)使得路由器能够自动学习网络拓扑的变化,选择最优路径,并在网络发生变化时自动调整。

动态路由的工作原理

动态路由协议通过路由更新消息在网络设备之间交换路由信息。这些更新消息包含可用路径的信息,路由器根据这些信息构建并维护自己的路由表。路由表决定了数据包的传输路径。

例子流程说明

假设我们有一个小型公司网络,网络中有三个路由器:R1、R2和R3,它们使用OSPF(开放最短路径优先)动态路由协议。

  1. 网络架构:

    • 路由器 R1 连接到子网 192.168.1.0/24
    • 路由器 R2 连接到子网 192.168.2.0/24
    • 路由器 R3 连接到子网 192.168.3.0/24
    • R1、R2 和 R3 通过一个中间网络(比如10.0.0.0/24)相互连接
  2. 动态路由协议配置:

    • 所有路由器都配置使用OSPF协议。
    • 路由器定期发送OSPF路由更新消息,包含它们直接连接的网络信息。
  3. 初始路由表生成:

    • R1 广播其连接到的网络192.168.1.0/24。
    • R2 广播其连接到的网络192.168.2.0/24。
    • R3 广播其连接到的网络192.168.3.0/24。

    通过这些路由更新消息,每个路由器学习到所有连接网络的可用路径,并将这些路径信息添加到自己的路由表中。

  4. 数据包传输流程:

    • 设备 A (IP地址:192.168.1.10)连接到路由器R1,想要访问设备 B(IP地址:192.168.3.20),连接到路由器R3。
    • 设备 A 发送一个数据包到R1,目标地址是192.168.3.20。
    • R1 检查其路由表,找到到达192.168.3.0/24子网的最佳路径(通过R2和R3)。
    • 数据包通过R2转发到R3,然后到达192.168.3.20(设备 B)。
  5. 网络变化处理:

    • 假设R2与R3之间的连接中断。
    • R2 和 R3 更新OSPF路由表,通告该路径不可用。
    • R1、R2和R3接收到更新后重新计算最佳路径。
    • 由于直接路径不可用,数据包可能会通过另一条路径(例如通过一个备用路由器)到达目的地。

总结

动态路由通过使用路由协议(如OSPF)使路由器能够自动发现和维护网络路径。它提高了网络的弹性和可扩展性,减少了手动配置的需求,使网络更能适应拓扑结构的变化。

BGP(Border Gateway Protocol)和OSPF(Open Shortest Path First)

都是常用的路由协议,但它们在应用场景、工作原理和功能上有显著的差异。以下是BGP和OSPF的详细比较:

1. 应用场景

  • BGP

    • 用于互联网中的自治系统(AS)之间的路由选择。
    • 适用于大规模的网络,如ISP之间的连接和大型企业的广域网(WAN)连接。
    • BGP是路径向量协议,适用于跨域路由,提供了复杂的路由策略和控制功能。
  • OSPF

    • 用于单一自治系统内部的路由选择。
    • 适用于企业内部网络(LAN)和中小型网络。
    • OSPF是链路状态协议,提供快速收敛和精确的最短路径选择。

2. 工作原理

  • BGP

    • 通过TCP建立邻居关系(peers)。
    • 交换完整的路由路径信息,包括每个路径经过的AS序列。
    • 使用路径属性(如AS路径、下一跳、MED等)来选择最优路径。
    • 比较路径时,更关注路由策略和控制,而不仅仅是路径长度。
  • OSPF

    • 通过直接连接的链路建立邻居关系。
    • 交换链路状态信息(LSA),每个路由器维护整个网络的拓扑图。
    • 使用Dijkstra算法计算从自身到所有目的地的最短路径。
    • 比较路径时,基于链路的成本(如带宽、延迟等)来选择最优路径。

3. 路由更新和收敛

  • BGP

    • 路由更新比较慢,主要因为它通常处理的是大规模的路由表。
    • 不频繁发送路由更新,只在路由发生变化时才更新,减少带宽消耗。
    • 收敛速度较慢,但可以通过路径属性进行精细控制和策略应用。
  • OSPF

    • 路由更新迅速,通过周期性发送链路状态更新保持网络拓扑最新。
    • 收敛速度快,适合需要快速响应网络变化的环境。
    • 使用分区域设计(area)减少路由表大小和更新开销。

4. 复杂性和配置

  • BGP

    • 配置复杂,需要详细的路由策略和控制。
    • 适合需要复杂路由策略和跨域控制的大规模网络。
    • 管理和故障排除需要更高的专业知识。
  • OSPF

    • 配置相对简单,主要关注链路成本和区域划分。
    • 适合需要快速收敛和精确路径选择的中小型网络。
    • 管理和故障排除相对简单,易于理解和操作。

5. 典型使用场景

  • BGP

    • ISP之间的边界路由。
    • 企业连接多个ISP以实现冗余和负载均衡。
    • 需要复杂路由策略和跨域控制的网络。
  • OSPF

    • 企业内部局域网(LAN)和广域网(WAN)。
    • 单一自治系统内部的路由。
    • 需要快速收敛和精确路径选择的网络。

总结

  • BGP主要用于自治系统之间的路由选择,适合大规模网络,提供复杂的路由策略和控制功能。
  • OSPF主要用于单一自治系统内部的路由选择,适合中小型网络,提供快速收敛和精确的最短路径选择。

这两种协议在各自的应用场景中发挥着重要作用,根据具体网络需求选择合适的协议至关重要。

九、传输层: TCP 和 UDP协议

TCP提供不丢失,按顺序到达

UDP不保证这些

TCP(传输控制协议)

面向字节流的传输
  • TCP发送的是一个流:想象你在写一封长信,信的内容是一个连续的字节流。TCP负责把这封长信拆成一个个小段,然后按顺序发送出去。接收方收到这些小段后,会把它们按顺序拼起来,还原成原始的长信。
  • 状态维护:TCP要确保每一个小段都被正确收到并按顺序拼起来,所以它需要维护一些状态信息,比如哪些段已经发出,哪些段需要重发等。这就好比邮递员记下哪些信件已经送达,哪些还在路上。
  • 可靠传输:如果某一段没有到达,TCP会重发直到接收方确认收到。这保证了数据的可靠性和顺序。
举个例子:
  • 你用TCP发送一个大文件给朋友。TCP会把这个文件拆成很多小包(比如每个包1000字节),每个包都会有一个序号。
  • TCP确保每个包按顺序到达。如果第3个包丢失了,TCP会重发这个包直到朋友确认收到。
  • 最终,朋友会把这些包按序号拼起来,得到完整的大文件。

UDP(用户数据报协议)

基于数据报的传输
  • UDP发送的是一个个独立的数据报:想象你在发明信片,每张明信片上都有独立的信息,发送的时候不需要按顺序,接收的时候也不管顺序。每张明信片(数据报)都是一个完整的信息单元。
  • 无状态连接:UDP发送数据报时,不需要记住哪些已经发了,哪些没发。它不关心这些数据报是否按顺序到达,也不关心是否有数据报丢失。
  • 不可靠传输:如果某个数据报在网络中丢失了,UDP不会重发,接收方也不知道丢失了什么。这使得UDP更快,但不可靠。
举个例子:
  • 你用UDP发送一个视频流给朋友。每个视频帧被作为一个独立的数据报发送。
  • 如果某个视频帧丢失了,UDP不会重发这个帧。朋友在播放视频时可能会看到一瞬间的卡顿,但视频流会继续进行。
  • 这种方式适用于实时应用,比如视频会议和在线游戏,因为它们需要快速传输数据,而不一定需要每个数据报都到达。

总结

  • TCP:面向连接、可靠、按顺序传输数据流,适用于需要高可靠性的数据传输(如文件传输、网页浏览)。
  • UDP:无连接、不可靠、独立数据报传输,适用于需要快速传输且对可靠性要求不高的应用(如视频流、在线游戏)。

处理完传输层的事情,内核的事情基本就干完了,里面的数据应该交给应用程序自己去处理,可是一台机器上跑着这么多的应用程序,应该给谁呢?

无论应用程序写的使用 TCP 传数据,还是 UDP 传数据,都要监听一个端口。正是这个端口,用来区分应用程序,要不说端口不能冲突呢。两个应用监听一个端口,到时候包给谁呀?所以,按理说,无论是 TCP 还是 UDP 包头里面应该有端口号,根据端口号,将数据交给相应的应用程序。

网络传输的基本概念

  1. MAC层(数据链路层)

    • 负责本地局域网内的数据传输。
    • 数据在这一层被称为"帧"。
    • 帧在局域网内传输,比如通过以太网在两个相邻设备之间传输。
  2. IP层(网络层)

    • 负责跨越多个网络的数据传输,提供端到端的传输。
    • 数据在这一层被称为"包"。
    • 包从一个网络通过路由器传输到另一个网络,最终到达目的地。
  3. 传输层

    • 负责应用程序之间的数据传输。
    • 数据在这一层被称为"段"。
    • 传输层有两个主要协议:TCP和UDP。

更通俗的比喻

假设我们有一系列信件要通过不同的邮递员从一个城市送到另一个城市:

  1. MAC层就像城市内部的邮递员,他们负责将信件从一个街区送到另一个街区。信件在这里被称为"帧"。
  2. IP层就像跨城市的邮递员,他们负责将信件从一个城市送到另一个城市。信件在这里被称为"包"。
  3. 传输层(例如UDP)就像一个快递公司,他们只负责快速送达信件,不关心信件是否按顺序到达,也不保证每封信都能送到。信件在这里被称为"段"。

广播(Broadcast)和多播(Multicast)

广播(Broadcast)

定义

广播是指网络中的一个设备向网络中所有其他设备发送数据的方式。

工作方式
  • 当一台设备发送广播消息时,这条消息会被发送到网络中的每一个设备。
  • 广播消息的目标地址是一个特殊的广播地址,通常是子网的最后一个地址(比如,192.168.1.255在子网192.168.1.0/24中)。
  • 所有设备都会接收并处理这条消息。
举例
  • 想象一个教室里有一位老师向所有学生宣布一条消息。老师说出这条消息后,教室里的每一个学生都能听到并接收到这个消息。这就是广播。
  • 典型应用:ARP(地址解析协议)请求。当一台设备需要知道另一台设备的MAC地址时,会发送一个ARP广播请求,所有设备都会收到这个请求,但只有目标设备会回复。
优缺点
  • 优点:简单、易于实现。
  • 缺点:效率低,尤其是在大型网络中,广播会占用大量带宽,因为所有设备都要处理广播消息。

多播(Multicast)

定义

多播是指网络中的一个设备向一组特定的设备发送数据的方式。

工作方式
  • 当一台设备发送多播消息时,这条消息会被发送到加入了特定多播组的设备。
  • 多播消息的目标地址是一个特殊的多播地址,通常在224.0.0.0到239.255.255.255范围内。
  • 只有加入了相应多播组的设备会接收到并处理这条消息。
举例
  • 想象一个教室里有一位老师向参加特定兴趣小组的学生宣布一条消息。老师说出这条消息后,只有那些加入了这个兴趣小组的学生才能听到并接收到这个消息。这就是多播。
  • 典型应用:视频会议、网络电视(IPTV)等需要向多个特定用户发送相同数据的应用。

十、TCP

A 要告诉 B,我这面发起的包的序号起始是从哪个号开始的,B 同样也要告诉 A,B 发起的包的序号起始是从哪个号开始的。为什么序号不能都从 1 开始呢?因为这样往往会出现冲突。

例如,A 连上 B 之后,发送了 1、2、3 三个包,但是发送 3 的时候,中间丢了,或者绕路了,于是重新发送,后来 A 掉线了,重新连上 B 后,序号又从 1 开始,然后发送 2,但是压根没想发送 3,但是上次绕路的那个 3 又回来了,发给了 B,B 自然认为,这就是下一个包,于是发生了错误。

因而,每个连接都要有不同的序号。这个序号的起始序号是随着时间变化的,可以看成一个 32 位的计数器,每 4ms 加一,如果计算一下,如果到重复,需要 4 个多小时,那个绕路的包早就死翘翘了,因为我们都知道 IP 包头里面有个 TTL,也即生存时间。

三次握手

TCP(传输控制协议)的三次握手是建立可靠连接的过程,这个过程确保了通信双方都准备好进行数据传输。让我们用一个简单的日常生活比喻来通俗易懂地解释这个过程。

比喻:打电话

假设你想打电话给你的朋友并确保他在电话另一端准备好进行对话。

1. 第一次握手:SYN

你(客户端)拿起电话拨打朋友的号码,并听到拨号音。这相当于发送一个"SYN"(同步)消息,表示你想要建立连接。

  • 客户端发送一个SYN消息给服务器,表示"我想和你建立连接"。
2. 第二次握手:SYN-ACK

你的朋友听到了电话铃声,拿起电话并说:"喂,我听到了,你想说什么?" 这相当于朋友(服务器)发送一个"SYN-ACK"(同步-确认)消息,表示他接收到你的请求,并且也准备好建立连接。

  • 服务器收到SYN消息,回复一个SYN-ACK消息,表示"我收到了你的请求,并且我也准备好了"。
3. 第三次握手:ACK

你听到朋友的回应后,说:"太好了,现在我们可以开始对话了。" 这相当于你发送一个"ACK"(确认)消息,表示你也收到了朋友的回应,连接正式建立。

  • 客户端收到SYN-ACK消息,回复一个ACK消息,表示"我收到了你的确认,现在我们可以通信了"。

一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态。然后客户端主动发起连接 SYN,之后处于 SYN-SENT 状态。服务端收到发起的连接,返回 SYN,并且 ACK 客户端的 SYN,之后处于 SYN-RCVD 状态。客户端收到服务端发送的 SYN 和 ACK 之后,发送 ACK 的 ACK,之后处于 ESTABLISHED 状态,因为它一发一收成功了。服务端收到 ACK 的 ACK 之后,处于 ESTABLISHED 状态,因为它也一发一收了。

四次挥手

TCP的四次挥手(四次握手)是用来关闭连接的过程,确保双方都能优雅地结束通信。为了更好地理解这个过程,我们可以用一个简单的日常生活比喻来解释。

比喻:结束电话通话

假设你和朋友正在进行电话通话,现在你们要结束这次通话。

1. 第一次挥手:FIN

你(客户端)告诉朋友,"我说完了,现在我要挂电话了。" 这相当于你发送一个"FIN"(结束)消息,表示你不再有数据要发送了。

  • 客户端发送一个FIN消息给服务器,表示"我不再发送数据了"。
2. 第二次挥手:ACK

你的朋友听到你的话后,回应说,"好的,我知道你要挂电话了。" 这相当于朋友(服务器)发送一个"ACK"(确认)消息,表示他收到了你的请求。

  • 服务器收到FIN消息,回复一个ACK消息,表示"我知道你不再发送数据了"。
3. 第三次挥手:FIN

过了一会儿,你的朋友也说,"我也说完了,我也要挂电话了。" 这相当于朋友(服务器)发送一个FIN消息,表示他也不再有数据要发送了。

  • 服务器发送一个FIN消息给客户端,表示"我也不再发送数据了"。
4. 第四次挥手:ACK

你听到朋友的话后,回应说,"好的,我知道你也要挂电话了。" 这相当于你发送一个ACK消息,表示你收到了他的请求,双方都可以挂电话了。

  • 客户端收到FIN消息,回复一个ACK消息,表示"我知道你也不再发送数据了"。

总结

  • 第一次挥手(FIN):客户端 -> 服务器,表示"我不再发送数据了"。
  • 第二次挥手(ACK):服务器 -> 客户端,表示"我知道你不再发送数据了"。
  • 第三次挥手(FIN):服务器 -> 客户端,表示"我也不再发送数据了"。
  • 第四次挥手(ACK):客户端 -> 服务器,表示"我知道你也不再发送数据了"。

通过这个四次挥手的过程,双方都能确认对方已经准备好结束连接,确保没有数据丢失或未处理。

图中两侧的状态熟悉下

顺序问题、丢包问题、流量控制都是通过滑动窗口来解决的,这其实就相当于你领导和你的工作备忘录,布置过的工作要有编号,干完了有反馈,活不能派太多,也不能太少;

拥塞控制是通过拥塞窗口来解决的,相当于往管道里面倒水,快了容易溢出,慢了浪费带宽,要摸着石头过河,找到最优值。

相关推荐
Canon_YK21 分钟前
源代码防泄漏的制胜法宝——沙箱
网络·安全·web安全
yoloGina35 分钟前
机器人外呼相比人工外呼优势有哪些
网络·人工智能·机器人·软件构建·软件需求
xiandong201 小时前
240701_昇思学习打卡-Day13-Vision Transformer图像分类
网络·图像处理·人工智能·深度学习·学习·分类·transformer
阿猿收手吧!1 小时前
【Linux】TCP协议【下二】{流量控制/滑动窗口/延迟应答/捎带应答/拥塞控制}
linux·网络·网络协议·tcp/ip
我要成为C++领域大神1 小时前
【高性能服务器】select模型
linux·服务器·c语言·开发语言·网络·tcp·io多路复用
xiaoniuxqq2 小时前
自己生成一个https的证书
网络协议·http·https
炫酷的伊莉娜2 小时前
【计算机网络】物理层(作业)
网络·计算机网络·物理层
Heart_to_Yang2 小时前
华为OceanStor磁盘阵列存储恢复出厂设置命令 LUN不处于在线状态,不能执行此操作解决方案
网络·经验分享
千殃sama2 小时前
Linux高并发服务器开发(十一)UDP通信和本地socket通信
linux·服务器·网络·笔记·学习·udp
聪明的小脑袋瓜儿3 小时前
网络安全设备——探针
网络·网络安全·探针·安全设备