系统设计常用的方法(系统设计基础知识)

今天,我将分享系统设计的基础知识。

如果你喜欢这篇文章,请分享并点赞。

  1. Client-Server 模型C/S是一种软件系统架构,通过它可以充分发挥两端硬件环境的优势,将任务合理分配到客户端和服务器端来实现这一点,从而减少系统的通信开销。目前,大多数应用软件系统都采用Client/Server形式的两层结构。由于当前的软件应用系统正在向分布式Web应用发展,Web和Client/Server应用都可以进行相同的业务处理,应用不同的模块。共享逻辑组件;因此,内部和外部用户可以访问新的和现有的应用系统,并且可以通过现有应用系统的逻辑来扩展新的应用系统。

一个完整的HTTP请求流程

当你按下输入https://www.baidu.com。浏览器收到此消息后,会根据自己的算法识别出你要访问的网址,并为你显示搜索页面。那么这些经历了怎样的过程呢?

一般流程如下:

  • 1)浏览器查询DNS获取域名对应的IP地址;具体过程包括浏览器搜索自己的DNS缓存、搜索操作系统的DNS缓存、读取本地主机文件、查询本地DNS服务器。
  • 2)浏览器获取到域名对应的IP地址后,向服务器请求建立链接,并发起三次握手;
  • 3) TCP/IP链接建立后,浏览器向服务器发送HTTP请求;
  • 4)服务器接收到这个请求,根据path参数映射到特定的请求处理器进行处理,并将处理结果和对应的视图返回给浏览器;
  • 5) 浏览器解析并渲染视图。如果遇到对js文件、CSS文件、图片等静态资源的引用,重复上述步骤,向服务器请求这些资源;
  • 6) 浏览器根据请求的资源和数据来渲染页面,最终向用户展示一个完整的页面。

系统设计常用的方法(系统设计基础知识)(1)

网络协议

系统设计常用的方法(系统设计基础知识)(2)

  • 用户只使用应用层,根本不知道其他层。要了解互联网,我们必须从底层开始,了解每一层的功能
  • 每一层都是为了完成一个功能。为了实现这些功能,每个人都需要遵守共同的规则,称为协议。许多协议被称为“互联网协议套件”,作为互联网的核心。
  • 物理层:电脑需要先联网。它是光缆、双绞线、无线电波等。所以,物理层意味着连接计算机。它主要规定了网络的一些电特性,负责传输0和1的电信号。简单的0和1没有任何意义,必须明确解释方法:多少个电信号算作一个组?每个信号位的含义是什么?
  • 数据链路层:它决定了 0 和 1 的分组
  • 以太网层/网络层:以太网从一个数据包中规定了一组电信号,称为“帧”。每帧分为两部分:头部和数据。“Header”包含数据包的一些描述项,如发送方、接收方、数据类型等;“数据”是数据包的具体内容。“标头”的长度固定为 18 个字节。“数据”的长度最短为 46 字节,最长为 1500 字节。因此,最短的“帧”是 64 字节,最长的是 1518 字节。如果数据很长,就必须分成多帧进行传输。以太网数据包的“标头”包含有关发送方和接收方的信息。那么,如何识别发送者和接收者呢?以太网规定所有连接到网络的设备都必须有一个“网卡”接口。数据包必须从一个网卡传输到另一个网卡。网卡的地址是数据包的发送地址和接收地址,称为MAC地址。每张网卡出厂时都有一个全球唯一的MAC地址,长度为48位二进制,通常用12位十六进制数表示。前6位十六进制数字是厂商的序列号,后6位是厂商网卡的序列号。通过MAC地址可以定位网卡和数据包的路径。
  • 广播:一张网卡如何知道另一张网卡的MAC地址?答案是有一个ARP协议可以解决这个问题。你只需要知道以太网数据包必须知道接收方的 MAC 地址后才能发送。其次,即使有了MAC地址,系统如何才能准确地将数据包传递给接收方?答案是以太网使用了一种非常“原始”的方法。它不是将数据包准确地发送给接收者,而是将其发送给网络中的所有计算机,让每台计算机确定自己是否是接收者。

系统设计常用的方法(系统设计基础知识)(3)

上图中,1 号计算机向 2 号计算机发送一个数据包,同一子网中的 3 号、4 号和 5 号计算机都会收到这个数据包。他们读取数据包的“标头”,找到接收方的 MAC 地址,并将其与自己的 MAC 地址进行比较。如果两者相同,则接受该数据包进行进一步处理,否则丢弃该数据包。这种发送方式称为“广播”。有了数据包的定义、网卡的MAC地址、广播的发送方式,“链路层”就可以在多台计算机之间传输数据

  • 以太网协议依靠 MAC 地址来发送数据。理论上,上海网卡仅靠MAC地址就可以找到北京网卡,这在技术上是可以实现的。然而,这有一个主要缺点。以太网使用广播发送数据包,所有成员手头有一个“包”,不仅效率低,而且仅限于发送者所在的子网。也就是说,如果两台计算机不在同一个子网中,广播就不会通过。这种设计是合理的,否则互联网上的每台计算机都会收到所有的数据包,这将造成灾难。互联网是一个由无数子网组成的巨型网络。这就像想象上海和北京的计算机将在同一个子网络上。这几乎是不可能的。
  • 因此,必须找到一种方法来区分哪些 MAC 地址属于同一子网,哪些不属于同一子网。如果是同一个子网,则以广播方式发送,否则以“路由”方式发送。(“路由”的意思是指如何将数据包分发到不同的子网。这是一个很大的话题,本文不做介绍。)不幸的是,MAC地址本身无法做到这一点。仅与厂商有关,与网络无关。这导致了“以太网/网络层”的诞生。它的作用是引入一组新的地址,以便我们区分不同的计算机是否属于同一个子网。这组地址称为“网络地址”,简称“网址”
  • 因此,“网络层”出现后,每台计算机都有两种地址,一种是MAC地址,另一种是网络地址。这两种地址之间没有联系。MAC地址与网卡绑定,网络地址由管理员分配。它们只是随机组合。
  • 网络地址帮助我们确定计算机所在的子网,MAC地址将数据包发送到子网中的目标网卡。因此,从逻辑上可以推断,必须先处理网络地址,再处理MAC地址。
  • IP 协议/TCP:这指定网络地址。它定义的地址称为 IP 地址。目前,IP 协议的第四版,称为 IPv4,被广泛采用。该版本规定网络地址由 32 个二进制位组成。传统上,我们使用分成四段的十进制数字来表示 IP 地址,从 0.0.0.0 到 255.255.255.255。

系统设计常用的方法(系统设计基础知识)(4)

  • 互联网上的每台计算机都分配有一个 IP 地址。这个地址分为两部分,第一部分代表网络,第二部分代表主机。比如IP地址172.16.254.1,是一个32位的地址,假设它的网络部分是前24位(172.16.254),那么主机部分是后8位(后1位)。同一子网中的计算机的 IP 地址必须具有相同的网络部分,这意味着 172.16.254.2 应该与 172.16.254.1 在同一子网上。
  • 但是,问题是我们不能仅从IP地址来判断网络部分。我们以 172.16.254.1 为例。它的网络部分是前 24 位、前 16 位,还是前 28 位,你无法从 IP 地址中分辨出来。那么,如何从IP地址判断两台电脑是否属于同一个子网呢?这需要另一个参数“子网掩码”(subnet mask)。所谓“子网掩码”,就是表示子网特性的参数。相当于形式上的IP地址,也是一个32位的二进制数。它的网络部分全为1,主机部分全为0。比如IP地址172.16.254.1,如果知道网络部分是前24位,主机部分是后8位,那么子网掩码就是11111111.11111111.11111111。00000000,即 255。255.255.0 十进制。知道了“子网掩码”,我们就可以判断任意两个 IP 地址是否在同一个子网上。方法是分别对两个IP地址和子网掩码进行AND运算(两位数为1,运算结果为1,否则为0),然后比较结果是否相同。如果是这样,则意味着它们在同一个子网中。在网络中,否则,它不是。
  • 比如已知IP地址172.16.254.1和172.16.254.233的子网掩码都是255.255.255.0,是不是在同一个子网?两者和子网掩码分别进行AND运算,结果是172.16.254.0,所以它们在同一个子网中。综上所述,IP协议有两个主要功能。一种是为每台计算机分配一个IP地址,另一种是确定哪些地址在同一个子网上。
  • IP数据包:按照IP协议发送的数据称为IP包。不难想象,它必须包含IP地址信息。但如前所述,以太网数据包只包含MAC地址,没有IP地址字段。那么我需要修改数据定义并添加另一个字段吗?答案是否定的,我们可以将IP数据包直接放入以太网数据包的“数据”部分,完全不需要修改以太网规范。这就是互联网分层结构的好处:上层的变化根本不涉及下层的结构。具体来说,IP数据包也分为“头”和“数据”两部分。“header”部分主要包括版本、长度、IP地址等信息,而“数据”部分则是IP数据包的具体内容。放入以太网数据包后,以太网数据包变成如下。

系统设计常用的方法(系统设计基础知识)(5)

  • IP数据包的“头”部分的长度为20到60字节,整个数据包的总长度最大为65,535字节。因此,理论上,IP 数据包的“数据”部分最长可达 65,515 字节。如前所述,以太网数据包的“数据”部分只有 1500 字节长。因此,如果IP数据包超过1500字节,就需要分成几个以太网数据包,分别发送。
  • ARP协议:因为IP数据包是在以太网数据包中发送的,所以我们必须同时知道两个地址,一个是对方的MAC地址,另一个是对方的IP地址。通常情况下,对方的IP地址是已知的(后面会解释),但我们不知道它的MAC地址。因此,我们需要一种机制来从 IP 地址中获取 MAC 地址。这可以分为两种情况。第一种情况,如果两台主机不在同一个子网中,则无法获取对方的MAC地址。唯一的方法是将数据包发送到两个子网连接的“网关”,让网关处理。第二种情况,如果两台主机在同一个子网上,那么我们可以使用ARP协议来获取对方的MAC地址。ARP 协议还发出一个数据包(包含在以太网数据包中),其中包含它要查询的主机的 IP 地址。在对方的MAC地址字段中,填写FF:FF:FF:FF:FF:FF,表示这是一个“广播”地址。其子网中的每台主机都会收到这个数据包,从中取出IP地址,并与自己的IP地址进行比较。如果两者相同,则都回复并上报自己的MAC地址给对方,否则报文将被丢弃。总之,通过ARP协议,我们可以获得同一子网内主机的MAC地址,可以将数据包发送到任意主机。其子网中的每台主机都会收到这个数据包,从中取出IP地址,并与自己的IP地址进行比较。如果两者相同,则都回复并上报自己的MAC地址给对方,否则报文将被丢弃。总之,通过ARP协议,我们可以获得同一子网内主机的MAC地址,可以将数据包发送到任意主机。其子网中的每台主机都会收到这个数据包,从中取出IP地址,并与自己的IP地址进行比较。如果两者相同,则都回复并上报自己的MAC地址给对方,否则报文将被丢弃。总之,通过ARP协议,我们可以获得同一子网内主机的MAC地址,可以将数据包发送到任意主机。
  • 传输层:有了 MAC 地址和 IP 地址,我们已经可以在 Internet 上的任意两台主机之间建立通信。下一个问题是同一台主机上有很多程序需要使用互联网。例如,您在与朋友在线聊天时浏览网页。当一个数据包从 Internet 发送过来时,如何知道它代表的是网页的内容还是在线聊天的内容?也就是说,我们还需要一个参数来表示这个数据包使用的是哪个程序(进程)。这个参数叫做“端口”,其实就是每个程序使用网卡的编号。每个数据包都被发送到主机的特定端口,因此不同的程序可以得到它们需要的数据。“端口”是 0 到 65535 之间的整数,正好是 16 个二进制位。0到1023的端口被系统占用,
  • “传输层”的作用是建立“端口到端口”的通信。相比之下,“网络层”的作用是建立“主机到主机”的通信。只要确定了主机和端口,我们就可以实现程序之间的通信。因此,Unix系统将主机 端口称为“套接字”。有了它,就可以进行Web应用程序的开发。
  • UDP协议/会话层:我们必须在数据包中添加端口信息,这需要一个新的协议。最简单的实现叫做UDP协议,它的格式几乎在数据前面,加上端口号。UDP数据包也是由“header”和“data”两部分组成。“header”部分主要定义发送端口和接收端口,“data”部分是具体内容。然后,将整个UDP数据包放入IP数据包的“数据”部分。UDP数据包很简单,“header”部分总共只有8个字节,总长度不超过65535个字节,适合一个IP数据包。前面说过,IP数据包是放在以太网数据包里面的,所以整个以太网数据包现在变成了下面这样:

系统设计常用的方法(系统设计基础知识)(6)

  • TCP协议/表示层:UDP协议的优点是比较简单,易于实现,缺点是可靠性较差。数据包一旦发送出去,就无法知道对方是否收到了。为了解决这个问题,提高网络可靠性,TCP协议应运而生。这个协议很复杂,但可以近似为一个带有确认机制的UDP协议,每次发送一个数据包都需要确认。如果数据包丢失,则无法收到确认,发送方知道需要重新发送数据包。因此,TCP协议可以保证数据不会丢失。其缺点是流程复杂,难以实现,消耗资源较多。TCP 数据包,如 UDP 数据包,嵌入在 IP 数据包的“数据”部分。TCP数据包的长度没有限制,理论上可以无限长。但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以保证单个TCP数据包不需要拆分。
  • 应用层:应用程序接收“传输层”数据,然后必须对其进行解释。由于互联网是开放架构,数据来源多样,格式必须提前指定,否则根本无法解释。例如,TCP 协议可以为各种程序传输数据,例如 Email、WWW、FTP 等。那么,必须有不同的协议来指定电子邮件、网页和FTP数据的格式,而这些应用协议构成了“应用层”。这是最高级别,直接面向用户。它的数据放在 TCP 数据包的“数据”部分。

现在,我们要切换到用户的视角,看看用户如何与这些协议进行交互。我们已经知道网络通信是数据包的交换。计算机A向计算机B发送一个数据包,后者接收并回复一个数据包,从而实现了两台计算机之间的通信。

要发送此数据包,你必须知道 2 个地址:1. 对方的 MAC 地址

2.对方的IP地址

  • 有了这两个地址,数据包就可以准确地传递给接收方。但是,如前所述,MAC 地址有局限性。如果两台计算机不在同一个子网中,它们就无法知道对方的 MAC 地址,必须通过网关转发。

系统设计常用的方法(系统设计基础知识)(7)

  • 上图中,1 号计算机要向 4 号计算机发送一个数据包。它先判断4号计算机是否在同一个子网,结果不是(判断方法后面会讲),于是把这个数据包发给网关A。通过路由协议,网关A发现4 号计算机位于子网 B 中,将数据包发送到网关 B,网关 B 将其转发给 4 号计算机。
  • 1号计算机将数据包发送到网关A,它必须知道网关A的MAC地址。因此,数据包的目的地址实际上分为两种情况:
  • 对方MAC地址、对方IP地址:不在同一个子网
  • 在发送数据包之前,计算机必须先判断对方是否在同一个子网中,然后选择对应的MAC地址。接下来,我们来看看这个过程在实际使用中是如何完成的。
  • 静态IP地址:当你买了一台新电脑时,插上网线,然后开机。这时候电脑能上网吗?通常,您必须进行一些互联网设置。有时候,ISP/管理员会告诉你以下4个参数,让电脑可以上网:1)本地IP地址2)子网掩码3)网关IP地址4)DNS IP地址
  • 这四个参数缺一不可,我会解释为什么你需要知道它们才能上网。因为是给定的,电脑每次开机都会被分配相同的IP地址,所以这种情况称为“静态IP地址上网”。但是这样的设置很专业,普通用户望而却步,如果一台电脑的IP地址不变,其他电脑就无法使用这个地址,不够灵活。由于这两个原因,大多数用户使用“动态IP地址上网”。
  • 动态IP地址:所谓“动态IP地址”是指电脑开机后会自动分配一个IP地址,无需手动设置。它使用的协议称为 DHCP 协议。该协议规定,在每个子网中,都有一台计算机负责管理该网络的所有IP地址,称为“DHCP服务器”。新电脑加入网络时,必须向“DHCP服务器”发送“DHCP请求”包,申请IP地址和相关网络参数。如前所述,如果两台计算机在同一个子网上,它们必须知道对方的MAC地址和IP地址,才能发送数据包。但是,新添加的计算机不知道这两个地址,它怎么能发送数据包呢?DHCP 协议做了一些巧妙的规定。
  • DHCP协议:(1) 在“Ethernet header”顶部,设置发送方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者是本地网卡的MAC地址,后者此时不知道,只填一个广播地址:FF-FF-FF-FF-FF-FF。(2) 在后面的“IP header”中,设置发送方的IP地址和接收方的IP地址。此时,机器不知道两者。因此,发送方的 IP 地址设置为 0.0.0.0,接收方的 IP 地址设置为 255.255.255.255。(3) 在最后一个“UDP header”中,设置发送方端口和接收方端口。这部分是DHCP协议规定的,发送方为68端口,接收方为67端口。
  • 数据包构造完成后,就可以发送出去了。以太网是广播传输,同一子网上的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,所以并不清楚发给谁,所以每台收到这个包的电脑也必须分析这个包的IP地址来确定。不是为了自己。当你看到发送者的IP地址是0.0.0.0,接收者是255.255.255.255时,DHCP服务器就知道“这个包是发给我的”,其他电脑可以丢弃这个包。
  • 接下来,DHCP服务器读取这个包的数据内容,分配一个IP地址,并返回一个“DHCP响应”包。这个响应包的结构类似。以太网头的MAC地址是双方的网卡地址,IP头的IP地址是DHCP服务器(发送方)和255.255.255.255(接收方)的IP地址,UDP头的端口是67(发件人)和 68(收件人)。分配给请求者的 IP 地址和网络的具体参数包含在数据部分中。
  • 新添加的计算机接收到这个响应包,所以它知道自己的IP地址、子网掩码、网关地址、DNS服务器等参数。

访问网页

  • 本地参数:我们假设经过上一节的步骤,用户已经设置了自己的网络参数
  • 本机IP地址:192.168.1.100子网掩码:255.255.255.0网关IP地址:192.168.1.1DNS IP地址:8.8.8.8
  • DNS协议:我们知道要发送一个数据包,就必须知道对方的IP地址。但是,现在我们只知道网站www.baidu.com,而不知道它的 IP 地址。DNS 协议可以帮助我们将这个 URL 转换为 IP 地址。已知的 DNS 服务器是 8.8.8.8,所以我们向这个地址发送一个 DNS 数据包(端口 53)。然后,DNS 服务器响应,告诉我们 Google 的 IP 地址是 172.194.72.105。这样,我们就知道了对方的IP地址。
  • 子网掩码:接下来我们要判断这个IP地址是否在同一个子网,这就需要子网掩码。已知的子网掩码是 255.255.255.0。本机用它对其IP地址192.168.1.100进行二进制与运算(两位数为1,结果为1,否则为0),计算结果为192.168 .1.0;然后对百度的IP地址172.194.72.105也进行AND运算,结果为172.194.72.0。两个结果不相等,所以得出的结论是百度和这台机器不在同一个子网。因此,如果我们要向Google发送一个数据包,就必须通过网关192.168.1.1进行转发,也就是说接收方的MAC地址就是网关的MAC地址。
  • 应用层协议: HTTP协议用于浏览网页,其整个数据包结构是这样的:

系统设计常用的方法(系统设计基础知识)(8)

  • 我们假设这部分的长度是4960字节,它会嵌入到TCP包中。
  • TCP协议: TCP数据包需要设置端口。接收方(百度)的HTTP端口默认为80,发送方(本机)的端口为1024-65535之间随机生成的整数,假设为51775。TCP数据包的头部长度为20字节,加上嵌入的HTTP数据包,总长度变成4980字节。
  • IP协议:然后,将TCP数据包嵌入IP数据包中。IP数据包需要设置双方的IP地址,已知,发送方为192.168.1.100(本机),接收方为172.194.72.105(百度)。IP包的头部长度为20字节,加上嵌入的TCP包,总长度变成5000字节。
  • 以太网协议:最后将IP数据包嵌入到以太网数据包中。以太网数据包需要设置双方的MAC地址,发送方为本机网卡的MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议获取)。以太网数据包的数据部分最大长度为1500字节,而当前IP数据包长度为5000字节。因此,IP数据包必须分成四个包。因为每个数据包都有自己的IP头(20字节),所以四个数据包的IP数据包长度分别为1500、1500、1500和560。
  • 服务器端响应:经过多个网关转发后,百度的服务器172.194.72.105收到了这四个以太网数据包。百度根据IP头的序号把四个包放在一起,取出完整的TCP数据包,然后读取里面的“HTTP请求”,然后做出“HTTP响应”,然后使用TCP发回协议。
  • 机器收到HTTP响应后,可以显示网页,完成一次网络通信。这个例子到此结束。虽然有所简化,但大致反映了互联网协议的整个通信过程。

如果你发现我的任何文章有帮助或有用,麻烦点赞或者转发。 谢谢!

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页