S'S ALGORITHM

网络基础知识学习笔记(构架,应用层,HTTP,DNS)

由于东西比较多,分为几篇来记录学习笔记。

网络的本质是什么,什么是互联网

我们深处网络之中,以至于太熟悉了而忽视了它到底是什么,就像我们忽视了最好喝的水和最珍贵的空气,反而去追求了更低级的乐趣和看似优越的东西。稀松平常,最容易得到的东西,才是滋养我们的东西。说多了,言归正传。

网络在不同的领域有不同的含义,但在计算机科学和通信领域中,网络通常指的是多个节点(计算机、设备或者其他终端)通过连接和通信协议相互之间进行数据交换和通信的结构。这种结构可以是物理上的连接,也可以是逻辑上的连接,通常以图形的形式来表示,其中节点表示网络中的终端,边表示节点之间的连接或通信链路。

网络的本质可以概括为以下几个方面:

  1. 连接性:网络的本质是连接多个节点,使它们能够相互之间进行通信和数据交换。这种连接性可以是物理上的连接,比如通过电缆、光纤等物理媒介连接,也可以是逻辑上的连接,比如通过路由器、交换机等设备进行数据转发。

  2. 通信协议:网络中的节点之间进行通信需要遵循一定的规则和约定,这些规则和约定通常被称为通信协议。通信协议定义了数据传输的格式、数据交换的方式、错误处理机制等,确保网络中的数据能够正确、可靠地传输和接收。

  3. 数据交换:网络的主要目的是实现数据的交换和共享。通过网络,用户可以将数据从一个节点发送到另一个节点,实现信息的传递和共享。数据交换可以是点对点的,也可以是多对多的,可以是实时的,也可以是异步的。

  4. 信息传递:网络提供了一种高效、便捷的信息传递方式。通过网络,用户可以随时随地与他人进行沟通和交流,分享信息和资源,获取所需的信息和服务。

网络的分层构架和协议栈

当我们谈论网络架构时,可以将其比作发送信件的过程来解释。我觉得这种比喻让我更容易理解。

我们有发送者和接收者。发送者是指发送数据或信息的源头,而接收者则是目标,他们将接收发送者传输的信息。我们都以为自己和对方是直接沟通的,但是下面经历了邮筒,邮箱,邮局,快递员等,还有大型的货运车站和机场,这些在网络的世界也同样存在。

正是因为网络看起来各种分层的复杂性,才保证了网络的秩序。如果我们每个人都直接和对方通信,世界可能会很乱网络可能极其拥堵。个人信息四处横流。

在邮寄信件中,信封是承载信件的外部容器。地址则是确定信件传递目的地的关键信息。在网络中,数据包就像邮件一样,有一个外部容器和目的地地址。这个地址可以是IP地址或URL。

邮局和邮递员负责处理和传递信件。他们根据地址将信件从发送者传递到接收者。在网络中,路由器和交换机扮演了类似的角色。它们根据数据包的目的地地址将数据从一个地方传输到另一个地方。

传输协议,就是我们送信,信息交换的共同规定,在邮寄信件中,邮递员需要遵循一定的规则和程序来确保信件安全地传递。在网络中,有许多传输协议,如TCP/IP,它们规定了数据如何被分割、传输和重组,以确保数据安全和可靠地到达目的地。

邮件可以通过不同的邮寄服务发送,例如普通邮件、快递服务等。在网络中,也有多种服务提供商和网络运营商,用户可以选择不同的服务来满足其需求。

这整个邮寄信件的过程,可以帮助理解网络架构中的基本概念和运作原理。发送者、接收者、地址、传输过程、网络设备等概念在两者之间有着惊人的相似性,帮助我们更好地理解网络世界的运作。

网络的分层构架和协议栈是一种组织和管理网络通信的方式,它将网络通信划分为多个层次,并在每个层次上定义一组特定功能的协议集合。这种分层结构有助于提高网络的可管理性、可靠性和可扩展性,同时也使不同厂商和组织可以独立开发和实现不同层次的协议,从而促进了网络的发展和标准化。

网络的分层构架通常由多个层次组成,每个层次负责不同的功能,各层之间通过接口进行交互和通信。常见的网络分层构架包括 OSI(Open Systems Interconnection)参考模型和 TCP/IP(Transmission Control Protocol/Internet Protocol)协议栈。

OSI参考模型将网络通信划分为七个层次,从物理层到应用层依次为:

一个便于记忆的方法是:请不要扔掉香肠披萨,从下到上:Please do not throw sausage pizza away.

每个层级负责特定的功能,而且每个层级都认为它在与同一层级的设备进行通信。然而,在实际的通信中,数据传输需要经过各个层级的处理,从而实现端到端的通信。每一层级对上一层级提供服务,并使用下一层级的服务,因此数据在从上层传输到底层的过程中会逐渐被抽象化,从而实现了网络通信的可靠性、灵活性和可扩展性。在最底层,通过物理层的时候,我们的信息就只是二进制的数字了,而应用层则是丰富多彩的世界。

网络世界和机器学习张量世界一样,一切都是数字。

TCP/IP协议栈是互联网使用的网络分层构架,它将网络通信划分为四个层次,从网络接口层到应用层依次为:

由于底层负责从上层收集消息并传递到目的地,并移交发往上层的消息,因此它为应用层服务。此外,应用层进行抽象,因此不关心下面各层的任何实现细节。

下面的部分细说这个重要协议。

网络构架的发展

网络架构的发展经历了多个阶段,从早期的简单网络到今天的复杂、高度互联的网络。说什么早期,整个算下来,其实就在非常短的时间内,网路就进化到了这样的规模,只是因我们很多人刚生下来就已经有网络,所以觉得理所当然,但是用更远的眼光去看,其实在很短的时间,世界就发生了翻天覆地的变化。技术爆炸太可怕了。

TCP/IP协议栈

OSI 模型定义了七个层级,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,它是一个参考的框架,更加的抽象,但是很少有设备按照这个框架实现。TCP/IP 模型则将网络通信划分为四个层级,分别是网络接口层(或称链路层)、网络层、传输层和应用层。这个模型更加简洁,适用于实际的互联网协议栈。

TCP/IP 模型则直接对应了一系列具体的协议,如以太网、IP、TCP 和 HTTP 等,这些协议构成了现代互联网的基础。

这些东西很重要,下面一个一个展开。

应用层 application layer

在网络架构中,应用层是网络协议栈中的最顶层,它在我们的终端里。负责处理应用程序之间的通信和数据交换。应用层包括了各种各样的协议和服务,用于支持不同类型的应用程序,例如电子邮件、网页浏览、文件传输等。在应用层,数据被格式化和解析成适合特定应用程序使用的格式,然后通过下层协议(传输层和网络层)进行传输。常见的应用层协议包括HTTP、FTP、SMTP、POP3、IMAP、DNS等。应用层的功能包括数据编码、加密、压缩、会话管理、用户认证等。

我们平常说的,应用开发通常指的是在应用层开发软件。这涵盖了开发各种类型的应用程序,包括桌面应用程序、移动应用程序、Web 应用程序等。在应用层开发软件时,开发人员利用应用层协议和服务来实现特定的功能和业务逻辑,以满足用户的需求。因此,应用开发是在网络协议栈的应用层进行的软件开发活动。

软件工程师这种最热门的职业,就是干开发应用,大多数人认为用户应用程序才是互联网的真正目的。如果不存在有用的应用程序,互联网就不会是今天的样子。

应用程序就像是在自己家里进行装修,为房间布置各种功能和装饰。

以下是关于这一层的很多重要概念。

应用程序构架

程序Program vs. 进程Process vs. 线程Thread:简单来说,程序就是你的一个执行文件,比如你的微软word软件。进程是一个程序的实例,比如你打开了多个word窗口,他们每个都是进程。线程是一种轻量级的进程,比如你在word中进行了一个save的操作。他们是从上到下包含的关系。

套接字 Sockets:套接字与程序密切相关,是程序和计算机网络的接口。在网络编程中,程序可以使用套接字来建立连接、发送和接收数据以及错误对应,并处理与网络通信相关的各种任务。开发者可以使用编程语言提供的套接字库(如Python中的socket模块)来创建套接字,并在程序中实现网络通信功能。它是一种软件接口,和硬件无关。

寻址 Addressing:如何在浩如烟海的网络中找到你的消息目的地,这里就是IPs and Ports登场的地方了。如果将你的邮件寄信的比喻的目的地比做一栋大楼,那么IP就是大楼的地址,而Ports就是大楼中的房间号码。每个房间都是一个可以运行的应用程序。比如Http和Https等。

临时端口 Ephemeral Ports:是计算机网络中用于临时通信的端口。在通信中,临时端口通常由客户端动态分配,并且在通信结束后会被释放,以便其他客户端可以使用。它们通常用于客户端向服务器发起连接时临时使用,而不是固定的端口号。临时端口号范围通常在特定范围内,例如在Unix/Linux系统中,临时端口号范围为1024到65535,而在Windows系统中通常为49152到65535。使用临时端口的好处是可以避免端口冲突和提高系统的安全性。由于临时端口是动态分配的,所以它们不会长期占用系统资源,也不会暴露系统的固定端口给外部网络。这样可以有效地减少恶意攻击和网络嗅探的风险。再次进行比喻,这个临时端口,就像是大楼中的临时房间,可以做各种事,你用房间要提前申请,用完了还要把房间归置好了还回去钥匙。

HTTP

协议 HTTP:全名超文本传输协议,反正网页这个东西就是各种文件作为对象而已,URL其实就是服务器上的文件的地址,那一串网址包括的是:协议,主机名称,文件位置,和参数。仅此而已。HTTP是刚刚说的构架中的客户端-服务器构架中的协议。它是一种无状态协议,这意味着,你对服务器发了很多次请求,服务端也不知道是你发的。

在网络通信中,HTTP(Hypertext Transfer Protocol)是一种应用层协议,用于在客户端和服务器之间传输超文本数据。HTTP是建立在传输层协议 UDP(User Datagram Protocol)和 TCP(Transmission Control Protocol)之上的。

TCP 和 UDP 是传输层协议,它们负责在网络中传输数据。TCP 提供了可靠的数据传输服务,它确保消息始终被传递,并且以发送的顺序进行传递。UDP 则不保证消息的传递,这意味着有些消息可能会丢失,从而导致接收方无法接收到这些消息。

HTTP 使用 TCP 作为其底层传输协议,这意味着消息在传输过程中是被保证被传递的,并且按照发送的顺序进行传递。这使得应用程序无需构建额外的可靠性机制,因为 TCP 已经为其提供了这种可靠性。

TCP 是面向连接的,这意味着在与服务器进行通信之前,客户端必须通过一系列的起始消息来建立连接。一旦连接建立成功,客户端和服务器之间就会交换消息,直到连接被正式关闭为止。在关闭连接之前,会发送一些结束消息来进行通知。

因此,HTTP 之所以依赖于 TCP,是因为 TCP 提供了可靠的数据传输服务,确保了 HTTP 消息的可靠性和顺序性。这种对其他层的依赖是分层架构的一个关键优势之一,它使得应用层能够专注于提供更高层次的功能,而无需处理底层细节。

HTTP连接类型可以分为持久连接(Persistent Connection)和非持久连接(Non-Persistent Connection)两种。

  1. 持久连接(Persistent Connection):

持久连接允许客户端和服务器在单个 TCP 连接上发送和接收多个 HTTP 请求和响应。在持久连接中,客户端在发送完一个请求后保持连接打开状态,以便可以在同一连接上发送后续的请求,而无需重新建立连接。这种方式可以减少连接建立和关闭的开销,提高通信效率,并且可以避免因频繁建立连接而造成的资源浪费。

  1. 非持久连接(Non-Persistent Connection): 非持久连接是指在每次 HTTP 请求和响应之间都会建立一个新的 TCP 连接。在非持久连接中,每个 HTTP 请求都会创建一个新的连接,请求完成后连接立即关闭。这种方式导致了频繁的连接建立和关闭操作,增加了通信的开销和延迟,降低了通信效率。

持久连接通常用于现代的 Web 应用中,它可以提高 Web 页面的加载速度和用户体验。相比之下,非持久连接由于连接建立和关闭的开销较大,通常在一些特定场景下使用,如对于单个页面的简单请求和响应,或者对于一次性的短期通信。

Http request messages

HTTP 请求消息是客户端(例如浏览器)发送给服务器的数据包,用于请求特定资源或执行特定操作。它由两个主要部分组成:请求行、消息头部和消息体。

假设我们有一个网页,地址是 https://www.example.com/index.html,现在浏览器需要获取这个网页,它会发送一个 HTTP 请求消息给服务器。

这个请求消息通常包括以下内容:

通过自己的浏览器就可以进行查看以上的内部请求代码,浏览器右边inspect,选择network选项卡后随便选择一个cell就可以看到上面类似的请求内容了。

Http response messages

HTTP 响应消息是服务器向客户端(例如浏览器)发送的数据包,用于响应客户端的请求。它也由三个主要部分组成:状态行、消息头部和消息体。

继续使用之前的示例来说明:

假设客户端发送了一个 GET 请求来获取 https://www.example.com/index.html 这个网页,服务器会返回一个 HTTP 响应消息。

这个响应消息通常包括以下内容:

HTTP 响应状态码与我们调用 API 时接收到的响应状态码是相似的,都是用来表示请求处理的结果,只不过 HTTP 协议中规定了一组标准的状态码,而 API 接口的状态码可能由具体的应用程序或服务定义。

http响应和API响应的区别

HTTP 响应和 API 响应在概念上是相似的,都是指服务器对客户端请求的处理结果。然而,它们之间存在一些区别,主要体现在以下几个方面:

  1. 协议和用途:
    • HTTP 响应是基于 HTTP 协议的,用于在 Web 浏览器和 Web 服务器之间传输数据,以呈现网页或执行其他 Web 相关操作。
    • API 响应是指 API 服务端对客户端请求的响应,用于在不同系统之间进行数据交互,通常用于实现应用程序之间的通信或对外提供服务接口。
  2. 规范和定制:
    • HTTP 响应遵循 HTTP 协议的规范,状态码和头部信息都遵循一定的标准。
    • API 响应通常由具体的应用程序或服务定义,可以根据需求定制响应内容的格式、结构和状态码。
  3. 数据内容:
    • HTTP 响应中的数据内容通常是 Web 页面的 HTML、CSS、JavaScript 等内容,用于在浏览器上渲染页面。
    • API 响应中的数据内容通常是结构化的数据,如 JSON 或 XML 格式,用于在应用程序中进行数据处理和交互。
  4. 用途和场景:
    • HTTP 响应主要用于 Web 开发中,用于处理网页的展示和交互。
    • API 响应主要用于软件开发中,用于实现系统之间的数据交换和服务调用。

虽然 HTTP 响应和 API 响应在某些方面有所重叠,但它们的应用场景和特点不完全相同,需要根据具体的需求和情况选择合适的响应方式。

curl命令

curl是一个命令行工具和库,用于传输数据,支持多种协议,包括HTTP、HTTPS、FTP等。它可以通过命令行发送网络请求并接收响应,是一个非常强大和灵活的工具,常用于调试和测试网络服务。可以使用curl来查看响应内容,是因为curl支持HTTP协议,可以向服务器发送HTTP请求,并获取服务器返回的响应数据。通过在命令行中输入curl命令,并指定要请求的URL,curl会发送请求并将服务器返回的响应内容显示在命令行中,包括响应头和响应体等信息。

例如,可以使用以下命令来发送一个HTTP GET请求,并查看服务器返回的响应内容:

curl https://example.com

这将向对应网址发送一个GET请求,并在命令行中显示服务器返回的响应内容。

Cookies

Cookies是存储在用户计算机上的小型文本文件,用于跟踪用户在网站上的活动和状态信息。它们是由网站发送到用户浏览器中的,并由浏览器存储和管理。当用户访问网站时,浏览器会将与该网站相关的Cookie信息发送回服务器,以便服务器能够识别用户并提供个性化的体验。

工作原理:

可能的风险:

第三方Cookies:

第三方Cookies是由不同于用户当前正在访问的网站的域名下的服务器设置的Cookies。它们通常用于广告跟踪和分析,允许广告商和分析服务提供商跟踪用户在不同网站上的活动。第三方Cookies经常引发隐私和安全问题,因为它们可以被用来跟踪用户的浏览历史和行为习惯,而用户可能对此并不知情或同意。

DNS

DNS(域名系统)用一句话概括是互联网的目录,理论上是一种客户端服务端应用层协议。同时是一种域名到IP映射的分布式名称数据库。

先打个比方,假设每个domain域名都是一个人的名字,真正的IP是他的电话号码。你要联系到这个人,单知道这个人的名字是不够的,需要知道他的电话号码,这时候就是DNS在发挥作用。

在DNS的巨大分布式数据库系统中,每个服务器都有部分的数据库。服务器存在于一种层次,层级结构中。最顶层的服务器是根服务器(root dns servers)

这些就像是一个人的姓名,顶级域名是家族代号,二级域名就是名字,子域名就像是小名儿(有些网站就没有)。国际化域名可以比喻成英文名字。

本地DNS缓存和本地DNS服务器:缓存是为了节省网页访问的时间,避免重复查找。通过本地解析器库local resolver library完成,它管理本地的DNS缓存,是操作系统的一部分。如果本地缓存没找到答案,首先去的是本地DNS服务器(local DNS serve)。

本地 DNS 服务器通常是客户端检查其本地缓存后的第一个联系点。这些服务器通常托管在 ISP (网络供应商)处,并包含一些基于用户访问的网站的映射。

安全警告:ISP 拥有分配给哪些客户的 IP 地址的记录。此外,他们的 DNS 服务器还拥有与其联系的 IP 地址以及他们试图解析的主机名。因此,从技术上讲,你的 ISP 拥有你访问的所有网站的记录。哎呀! PS如果这让你感到不舒服,你可以将您的DNS服务器更改为任何开放的公共DNS服务器。

在本地DNS服务器上也找不到答案的时候,就回去root dns服务器找答案了。然后就是一层一层的IP查找。

DNS记录Records和消息Messages

在DNS中,记录(Records)和消息(Messages)是两个关键概念,它们在整个DNS解析过程中起着重要作用。

DNS Records(DNS记录)

DNS记录是DNS数据库中的条目,用于存储特定域名的各种类型的信息。常见的DNS记录类型包括:

  1. A记录(Address Record):将域名映射到IPv4地址。
  2. AAAA记录(IPv6 Address Record):将域名映射到IPv6地址。
  3. CNAME记录(Canonical Name Record):将域名指向另一个域名,用于域名的别名设置。
  4. MX记录(Mail Exchange Record):指定接收域名电子邮件的邮件服务器。
  5. TXT记录(Text Record):存储与域名相关的任意文本信息,通常用于验证域名所有权或配置其他服务。
  6. NS记录(Name Server Record):指定域名的权威DNS服务器。

这些记录类型及其组合允许DNS系统执行域名解析和其他相关任务。

DNS Messages(DNS消息)

DNS消息是在DNS客户端和DNS服务器之间交换的信息单元,用于执行域名解析。DNS消息采用特定的格式,通常包含以下部分:

  1. Header Section:包含标识消息的标识符、DNS消息的类型(查询或响应)、查询数量和响应数量等信息。
  2. Question Section:包含域名查询请求的信息,包括要解析的域名和查询类型(如A记录、CNAME记录等)。
  3. Answer Section:包含DNS服务器返回的域名解析结果,即查询的域名对应的IP地址或其他记录信息。
  4. Authority Section:包含权威DNS服务器的信息,用于指示响应的可靠性和来源。
  5. Additional Section:包含与查询相关的其他信息,如权威DNS服务器的IP地址等。

DNS消息通过UDP或TCP协议在DNS客户端和服务器之间传输。查询消息由DNS客户端发送到DNS服务器,响应消息由DNS服务器发送回DNS客户端,完成域名解析过程。

总之,DNS记录存储了域名与其相关信息之间的映射关系,而DNS消息则是在域名解析过程中传输这些信息的载体。