四、计算机网络专栏

122 阅读59分钟

1. 说说 HTTP 常用的状态码及其含义

HTTP 状态码是一个三位数字,它由 HTTP 协议返回,用来表示 web 浏览器请求的网页的状态。下面是一些常见的 HTTP 状态码和他们的含义:

  • 1XX(信息):这一类状态码表示请求已被接受,需要继续处理。
  • 2XX(成功):这一类状态码表示请求已成功被服务器接收,理解并接受。
    1. 200 OK:请求成功。请求所希望的响应头和数据体将随此响应返回。
    2. 204 No Content:服务器成功处理了请求,但未返回任何内容。
  • 3XX(重定向):这类状态码表示需要客户端采取进一步的操作才能完成请求。
    1. 301 Moved Permanently:请求的 URL 已永久移动到新的位置。
    2. 302 Found:请求的资源现在临时从不同的 URL 响应请求。
  • 4XX(客户端错误):这类的状态码表示请求包含错误语法或者不能正确执行。
    1. 400 Bad Request:服务器无法理解请求的格式,客户端不应该重新提交相同的请求。
    2. 403 Forbidden:服务器理解客户端的请求,但拒绝执行此请求。
    3. 404 Not Found:服务器找不到请求的资源。
  • 5XX(服务器错误):这类状态码表示服务器在尝试处理请求时发生内部错误。
    1. 500 Internal Server Error:服务器遇到错误,无法完成请求。
    2. 502 Bad Gateway:服务器作为网关或代理,从上有服务器收到无效响应。
    3. 503 Service Unavailable:服务器目前无法使用(由于过载或者停机维护)。

以上只是部分常见的 HTTP 状态码,实际上还有很多其他的状态码用来表示其它类型的信息。

2. HTTP 常用的请求方式,区别和用途?

HTTP 定义了一组请求方法,也就是所谓的 “HTTP 谓词”,用于指定对给定资源的不同操作。以下是最常用的 HTTP 请求方法:

  • GET:请求指定的页面信息,并返回实体主体。GET 请求应该只用于获取数据,它们是安全且幂等的,以为这无论进行多少次操作,结果都是一样的。
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立或者已有资源的修改。
  • PUT:从客户端向服务器传递的数据取代指定的文档内容。与 POST 不同的是,PUT 是幂等的,意味着无论操作多少次,结果都是一样的,一般用户更新操作。
  • DELETE:请求服务器删除指定的页面,这个方法也是幂等的。
  • HEAD:与 GET 方法一样,都是向服务器发出获取指定资源的请求。只不过服务器将不回传资源的文本部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取该资源的元信息或者元数据。
  • PATCH:对资源进行部分修改,比如说有一个产品信息,只需要更新产品的价格,就可以使用 PATCH。
  • OPTIONS:返回服务器针对特定资源所支持的 HTTP 请求方法。也可以利用它向 web 服务器发送“*”的请求来测试服务器的功能性。

请注意,虽然这些请求方法的语义已经被标准化,但实际应用中可能会有所不同,因为服务器可能不会按照标准的方式实现他们。

3. 简单说下了解的端口及对应的服务?

端口是计算机网络中,为了区分不同的服务或者应用程序而设定的一种标识。下面是一些常见的端口号及其对应的服务:

  • 20/21:FTP(File Transfer Protocol)传输协议用来传输文件,其中 20 用于数据传输,21 用于控制。
  • 22:SSH(Secure Shell)用于安全登录远程主机的协议。
  • 23:Telnet,不安全的文本通信协议,主要用于远程登录。
  • 25:SMTP(Simple Mail Transfer Protocol)简单邮件传输协议,用于邮件发送。
  • 53:DNS(Domain Name System)域名系统服务,用于解析域名到 IP 或者反向解析。
  • 80:HTTP(HyperText Transfer Protocol) 超文本传输协议,用于传输万维网文档。
  • 110:POP3(Post Office Protocol) 邮局协议,用于接收邮件。
  • 143:IMAP(Internet Message Access Protocol) 互联网消息访问协议,用于接收邮件。
  • 443:HTTPS(HTTP Secure),安全的 HTTP,用于安全的万维网文档传输。
  • 1080:Sockets。
  • 1521:Oracle 数据库默认端口。
  • 3306:MySQL 数据库系统默认端口。
  • 3389:Microsoft 的 RDP(Remote Desktop Protocol) 远程桌面协议。
  • 5432:PostgreSQL 数据库系统默认端口。
  • 6379:Redis 缓存系统默认端口。
  • 27107:MongoDB 的默认端口。

这些都是相对标准的端口分配,但是在实际应用中,服务可以配置在任何开放的端口上。只要不冲突,并且满足服务的网络需求就可以。

4. 说一下计算机网络体系架构

计算机网络体系架构通常指的是 TCP/IP 模型或 OSI 模型。

TCP/IP 模型是 Internet 协议的基础,包括四个层次:

  1. 网络接口层:这一层主要处理所有与网络硬件和驱动程序相关的问题。它涵盖了 OSI 模型的物理层和数据链路层。
  2. 网络层:这一层处理数据包的传输,包括路由选择,IP 地址处理等,对应 OSI 模型中的网络层。
  3. 传输层:在这一层,TCP 和 UDP 协议负责向用户提供可靠和不可靠的传输服务,对应 OSI 模型中的传输层。
  4. 应用层:这一层涵盖了 OSI 模型的会话层、表示层和应用层。它处理特定应用程序的细节,包括文件传输,电子邮件,远程登录等。

OSI 模型是开放系统互联模型,由七个层次组成:

  1. 物理层:负责处理与电缆或其他任何传输媒介的接口细节。
  2. 数据链路层:负责提供从一个节点到另一个节点的数据传输。
  3. 网络层:控制子网的操作,包括路由选择,IP 地址处理等。
  4. 传输层:接收来自上一层的数据,并将其转换为适合传输的数据。这一层可能会提供错误检查和纠正。
  5. 会话层:使用传输层的函数,提供两个计算机之间的通信会话。
  6. 表示层:确保一个系统上的应用程序可以读取另一个系统上的应用程序信息。
  7. 应用层:为特定应用程序提供了网络服务。

这两种模型都用于描述网络通信的不同方面,其中 TCP/IP 模型在实际的互联网设计和实现中使用得更广泛。

5. 如何理解 HTTP 协议的无状态

HTTP 协议的“无状态”是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,在 HTTP 协议中,每一次请求都是独立的,都是新的请求,服务器无法知道当前请求和之前请求之间的关系。

举个简单的例子,当你在网上购物时,可能是先浏览商品,然后添加到购物车,最后进行结账。这些步骤看似是连续的一系列操作,但对于 HTTP 服务来说,每一步都是一个独立的请求,服务器并不知道它们之间的关系。每一次请求之后,服务器不会记住你是谁,你做了什么,即 HTTP 协议是“无状态”的。

然而,要实现类似购物这种连续性操作,就需要一些机制来“保持状态”,这就是为什么会有“Cookie”和“Session”机制的原因。通过在客户端 Cookie 或服务端 Session 中保存一些信息,可以让服务器知道连续的请求是否来自同一用户,以及该用户在之前的请求中做了什么,从而创造出连续的用户体验。

6. 从浏览器地址栏输入 URL 到显示主页的过程

当在浏览器地址栏输入 URL 并回车后,浏览器将进行以下步骤来显示主页:

  1. DNS解析:浏览器首先要找到服务器的 IP 地址。浏览器首先检查缓存中是否有这个 URL 的 IP 地址。如果没有就会向 DNS(域名系统)发出请求,将域名解析为对应的 IP 地址。
  2. 建立 TCP 链接:一旦浏览器获得 IP 地址,它会向服务器发出一个 TCP 连接请求。这通常是一个三次握手的过程:首先,客户端发送一个有 SYN 标志的数据包到服务器;然后,服务器应答一个有 SYN 和 ACK 标志的数据包;最后,客户端再发送一个带有 ACK 标志的数据包,一旦服务器接收到这个包,就建立了 TCP 连接。
  3. 发送 HTTP 请求:TCP 连接建立后,浏览器就会通过这个连接向服务器发送一个 HTTP GET 请求。请求头包含了很多信息,如用户代理,支持的语言,连接类型等。
  4. 服务器处理请求并返回 HTTP 响应:服务器接收到 HTTP 请求后,会处理这个请求,然后返回一个 HTTP 响应。响应头包含了响应的状态码、内容类型、编码方式等信息,响应体包含了请求的实际数据(如 HTML 文件,JSON 报文等)。
  5. 浏览器渲染页面:浏览器接收到 HTTP 响应后,就开始解析 HTML 代码并渲染页面。在这个过程中,浏览器可能还会发送额外的 GET 请求,获取如 CSS,JavaScript,图片等资源。
  6. 关闭 TCP 连接:如果在 HTTP 头部的链接字段中设定位 close,则浏览器和服务器将关闭 TCP 连接。然后,现代的网页浏览通常使用持久连接,也就是说连接在发送完所有的请求后才会被关闭。

这个过程可能会因为各种因素而有所不同,例如使用协议(HTTP/1.1,HTTP/2,HTTPS)、缓存机制、代理服务器等,但上述流程是一个基本的概述。

7. 说下 HTTP1.0,1.1,2.0 的区别

HTTP/1.0、HTTP/1.1、HTTP/2 是 HTTP 协议的三个主要版本,每个版本都对协议进行了重要的更新和改进。下面是这三个版本的主要区别:

  • HTTP1.0:

是 HTTP 协议的第一个正式版本,规定了许多现在广为使用的 HTTP 特性,但它有一些重要的限制,其中最主要的是每次请求/响应都需要新的 TCP 连接,这使得页面加载效率低下,因为建立 TCP 连接需要时间。

  • HTTP1.1:

HTTP1.1 是为了解决 HTTP1.0 中存在的问题而引入的。主要改进有:

长连接:在 HTTP/1.1 中,默认所有连接都是持久连接,可以重复使用 TCP 连接处理多个 HTTP 请求/响应,减少了 TCP 连接建立和关闭的开销。
管线化:客户端可以同时发送多个请求,不用等待每个响应就地接收。
增加了更多的缓存控制策略,如 Entity tag。
引入了更多的 HTTP 方法,如 OPTIONS,PUT,DELETE 等。
引入 Host 头部,这使得一个服务器可以承载多个域名。

但是,尽管 HTTP/1.1 做出了这些改进,但是仍然存在一些问题,比如队头阻塞问题(Head-of-line blocking),即同一个 TCP 连接上的 HTTP 请求必须依次回应,不能并行处理。

  • HTTP/2:

HTTP/2 带来了更多的改进,主要包括:

多路复用:在一个 TCP 连接中,可以并发多个请求和响应,消除了 HTTP/1.1 中的队头阻塞问题。
二进制协议:与 HTTP/1.x 的文本协议不同,HTTP/2 是一个二进制协议。更易于解析,更高效,更小的错误可能性。
头信息压缩:HTTP/2 引入了 HPACK 算法对 header 的信息进行压缩,这样就可以降低需要传输的数据量。
服务器推送:HTTP/2 的服务器可以对一个客户端请求发送多个响应。例如,除了回应一 HTML 文件外,服务器还可以额外推送 CSS 和 JavaScript 文件,这样可以更快的加载页面。

从 HTTP/1.0 到 HTTP/2,HTTP 协议经历了大量的优化和改进,以适应网络发展的需求。

8. POST 和 GET 有哪些区别?

HTTP 协议定义了多种请求方法,但最常见的可能是 GET 和 POST,这两种方法有几个主要的区别:

  • 数据在请求中的位置:GET 请求中的数据被添加的 URL 中,以参数的形式附在 URL 后面。POST 请求的数据则放在 HTTP 请求主体 body 中。
  • 数据大小:由于 GET 请求的数据被放在 URL 中,因此数据的大小通常受限于 URL 长度的限制;而 POST 请求的数据在 body 中,理论上不受大小限制(实际上可能会受限于服务器的配置以及浏览器的限制)。
  • 数据类型:GET 请求的数据类型只能是 ASCII 字符,而 POST 请求支持多种数据类型,包括二进制数据。
  • 安全性:POST 比 GET 稍微安全一些,因为数据在 body 中,不会在 URL 中显示,也不会被保存在浏览器的历史记录或 web 服务器的日志文件中。然而,要注意的是,HTTP 的 GET 和 POST 请求都是明文传输的,除非使用 HTTPS,否则都可以被拦截查看。
  • 缓存和书签:默认情况下,GET 请求可以被缓存,也可以被添加到书签,而 POST 请求则不行。
  • 幂等性:GET 请求是幂等的,意味着无论进行多少次操作,结果都是一样的。而 POST 通常用于提交数据,多次提交结果可能会不同。
  • 服务器行为:按照规范,GET 用来获取资源,POST 用来提交资源。因此,在使用这两种方法时,服务器可能会根据请求的类型来决定如何处理请求。

这些只是 GET 和 POST 的基本区别,实际使用中可能会有更多的细节需要考虑。

9. 在 HTTP 交互过程中,如果数据传输完了,还不想断开连接,怎么做?

在 HTTP 交互过程中,如果数据传输完毕后不希望断开连接,可以使用“持久连接”(Persistent Connection)或者叫“Keep-Alive”连接。这是自 HTTP/1.1 起默认的连接模式。

持久连接的意思是,一个 TCP 连接在完成一次 HTTP 请求/响应后,不会立即被断开,而是可以被用来传输后续的 HTTP 请求和响应。只有在一段时间内没有活动,连接才会被关闭。这减少了频繁的建立和关闭 TCP 连接的开销。

在 HTTP/1.1 中,默认所有的连接都是持久连接。也可以在 HTTP 请求或响应的头部明确指定“Connection: keep-alive”来请求一个持久连接。如果服务器同意,它会在响应头中包含同样的“Connection: keep-alive”头部。

要注意的是,持久连接不是永久的,它还是会在一段时间内没有活动后被关闭,这个时间通常可以通过“Keep-Alive”头部的“timeout”参数来设置。例如,“Keep-Alive: timeout=5, max=1000”就表示连接空闲 5 秒后被关闭,而且这个连接最多可以被用来传输 1000 个请求。

另外,虽然 HTTP/2 也使用了持久连接,但由于其支持多路复用(即在一个 TCP 连接上并行传输多个 HTTP 请求/响应),所以没有必要像 HTTP/1.x 那样使用“Connection: keep-alive”和“Keep-Alive”头部来管理连接的生命周期。

10. HTTP 与 HTTPS 的区别?

HTTP 和 HTTPS 主要的区别在于安全性和数据传输方式上。它们都是用于传输超文本的协议,但 HTTPS 提供了对数据传输的加密保护。以下是它们的主要区别:

  • 安全性:HTTP 是不安全的,数据在传输过程中如果被拦截,拦截者可以直接查看数据内容。而 HTTPS 使用 SSL/TLS 协议提供了对数据的加密保护,即使数据被拦截,拦截者也无法查看原始的数据内容。
  • 端口:HTTP 默认使用 80 端口,而 HTTPS 默认使用 443 端口。
  • URL:在浏览器中,HTTPS URL 以 “https://” 开头,而 HTTP URL 以 “http://” 开头。
  • 证书:HTTPS 需要使用由证书颁发机构(CA)签发的证书。如果服务器的证书不被浏览器信任,用户可能会看到一个安全警告。
  • 性能:由于 HTTPS 的加密解密过程,HTTPS 的数据传输可能比 HTTP 稍微慢一些,但随着现代硬件性能的提高和 HTTP/2 的普及,这个影响已经非常小。
  • 搜索引擎优化(SEO):Google 的搜索引擎已经将 HTTPS 作为排名的一个因素,使用 HTTPS 可能有助于提高网站的搜索排名。
  • HTTP/2:尽管 HTTP/2 协议本身并不要求使用 HTTPS,但大多数浏览器只在 HTTPS 网站上支持 HTTP/2。

总的来说,虽然 HTTPS 在一些方面比 HTTP 更复杂,但由于其提供的安全保障,越来越多的网站正在采用 HTTPS。

11. HTTPS 的流程是怎么样的?

HTTPS 的通信流程主要是在客户端和服务器之间建立安全连接的过程,涉及到 SSL/TLS握手,以下是一个简化的 HTTPS 握手过程:

  1. 客户端发送”Client Hello“消息:客户端首先发送一个”Client Hello“消息给服务器。这个消息中包含了客户端支持的SSL/TLS版本,支持的加密算法,以及一个客户端生成的随机数。
  2. 服务器发送”Server Hello“消息:服务器收到”Client Hello“消息后,会选择一个客户端和服务器都支持的 SSL/TLS 版本和加密算法,然后生成一个自己的随机数,然后发送一个“Server Hello”消息给客户端。这个消息中包含了选择的 SSL/TLS 版本,加密算法以及服务器生成的随机数。
  3. 服务器发送证书:服务器发送其 SSL 证书给客户端。这个证书中包含了服务器的公钥和一些身份信息。这个证书是由证书颁发机构(CA)签发的,客户端会验证这个证书的有效性。
  4. 客户端验证证书:客户端收到证书后,会验证证书的有效性。这包括检查证书是否是被信任的 CA 机构签发,是否在有效期内,以及证书中的域名是否和服务器的域名一致。
  5. 客户端生成预主密钥:如果证书验证成功,客户端会生成一个预主密钥(Pre-Master Secret)。然后使用服务器的公钥加密这个预主密钥,然后发送给服务器。
  6. 服务器解密预主密钥:服务器收到客户端发送的预主密钥后,使用自己的私钥解密这个预主密钥。
  7. 生成主密钥:客户端和服务器都有了相同的预主密钥和随机数,它们各自独立计算出一个相同的主密钥(Master Secret)。这个主密钥将用于后续的数据加密和解密。
  8. 发送“Finished”消息:客户端和服务器都发送一个“Finished”消息,这个消息是用主密钥加密的,对方收到“Finished”消息后,双方都验证这个消息,如果验证成功,就说明主密钥正确。
  9. 加密通信:握手成功后,客户端和服务器就可以开始使用相同的主密钥进行加密通信了。

以上就是一个简化的 HTTPS 握手过程,实际的过程可能更复杂一些,因为 SSL/TLS 支持多种握手方式和加密算法。

12. 说说什么是数字签名,什么是数字证书?

  • 数字签名

数字签名是一种用于验证消息完整性、认证消息来源以及抗否认性的技术。简单来说,数字签名就是使用发送方的私钥对消息的哈希值进行加密,得到的结果就是数字签名。接收方在接收到消息后,可以使用发送方的公钥对数字签名进行解密,得到消息的哈希值,然后与自己对原始消息计算的哈希值进行比对,如果一致,就说明消息是完整的,并且确实来自于发送方。

数字签名的主要用途是确保消息在传输过程中没有被篡改,证实消息的来源,并防止发送方在发送消息后否认发送过消息。由于私钥是只有发送方才知道的,因此,除非私钥被泄露,否则无法伪造数字签名。

  • 数字证书

数字证书(或称为公钥证书)是由证书颁发机构(CA)签发的,用于证明公钥所属实体的身份信息。一个数字证书包含了证书所有者的公钥,证书所有者的信息(如名字,电子邮件地址,使用者证书的权限等)、签发证书的证书颁发机构、有效期等。

数字证书在网络中的一个重要应用是 TLS(Transport Layer Security)协议中,用于 HTTPS(HTTP Secure)。在这个场景中,数字证书用于验证服务器的身份,以防止中间人攻击。

当客户端(如一个 web 浏览器)连接到一个使用 HTTPS 的服务器时,服务器会提供其数字证书。客户端会检查这个证书是否由一个可信任的证书颁发机构签发、是否在有效期内、证书中的域名和服务器的域名是否一致。只有当这些检查都通过时,客户端才会信任这个服务器,然后建立一个加密的链接。

13. 对称加密和非对称加密的区别

对称加密和非对称加密是两种主要的加密方式,它们主要的区别在于秘钥的使用方式。

  • 对称加密

在对称加密中,加密和解密使用的是同一个秘钥,这就是为什么称为”对称“的原因。对称加密的主要优点是效率高,加密和解密的速度快,适合大量数据的加密。但它也有一个明显的缺点,就是秘钥的分发和管理问题。因为加密和解密使用的是同一个秘钥,所以这个秘钥必须在通信双方之间共享,如果这个秘钥在传输过程中被拦截,那么数据的安全性就会被破坏。常见的对称加密算法有 DES,3DES,AES,RC4等。

  • 非对称加密

非对称加密是使用一对秘钥,一个公钥和一个私钥。公钥用于加密,私钥用于解密。或者反过来,私钥由于签名,公钥用于验证签名。非对称加密的主要优点是解决了秘钥的分发问题,因为公钥可以公开,只要保护好私钥,就可以保证数据的安全性。但非对称加密的缺点是效率低,加密和解密的速度慢,不适合大量数据的加密。常见的非对称加密算法有 RSA,DSA,ECC 等。

实际上,在很多情况下,对称加密和非对称加密是结合起来使用的,比如在 HTTPS 协议中,就使用非对称加密来交换对称秘钥,然后使用这个对称秘钥来加密数据,这样既解决了秘钥分发的问题,又可以高效地加密数据。

14. 说说 DNS 的解析过程

DNS(Domain Name System)是用于将域名解析为 IP 地址的系统。下面是一个简化的 DNS 解析过程:

  1. 浏览器缓存:浏览器首先检查自己的缓存中是否含有目标域名对应的 IP 地址,如果有,就直接使用这个 IP 地址进行通信。
  2. 操作系统缓存:如果浏览器缓存中没有,那么就查看操作系统的 DNS 缓存是否有对应的 IP 地址。
  3. 路由器缓存:如果操作系统缓存中也没有,那么会查看路由器的 DNS 缓存。
  4. ISP DNS缓存:如果上述都没有找到,那么请求就会被发送到你的 Intenet 服务提供商(ISP)的 DNS 服务器。大多数 ISP 都有自己的 DNS 服务器,并且这些服务器会缓存 DNS 记录,以提高解析的速度和效率。
  5. 递归查询:如果 ISP 的 DNS 服务器中也没有缓存的记录,那么就会进行一个递归查询。首先,请求会被发送到根 DNS 服务器。根服务器不会直接解析域名,但会返回负责顶级域(如 .com,.net,.org 等)的 DNS 服务器地址。然后,请求会被发送到顶级域的 DNS 服务器,这个服务器也不会直接解析域名,但是会返回负责二级域(如 .google.com,baidu.com 等)的 DNS 服务器地址。最后,请求会被发送到负责二级域的 DNS 服务器,这个服务器会返回对应的 IP 地址。
  6. 返回结果:ISP 的 DNS 服务器收到 IP 地址后,会将这个 IP 地址返回给你的计算机,并且将这个记录缓存起来,以便下次解析同一个域名时可以直接调用。计算机也会将这个 IP 地址缓存起来,然后使用这个 IP 地址和服务器进行通信。

这是一个简化的 DNS 解析过程,实际的过程可能更复杂一些。因为还可能涉及到一些其他的 DNS 记录,如 CNAME 记录,MX 记录等。

15. 什么是 CSRF 攻击?如何避免?还有 Xss 攻击,SQL 注入,DDos 攻击等。

CSRF(Cross-Site Request Forgery)是一种网络攻击方式,攻击者利用用户在浏览器中的认证凭证,以用户的名义发送恶意请求到服务器,从而执行一些非预期的操作。。

例如,假设一个银行网站有一个用于转账的 URL,如

http://bank.com/transfer?amount=1000&to=attacker

用户在登录银行网站后,另一个标签页中打开了一个包含以下代码的恶意网页:

<img src="http://bank.com/transfer?amount=1000&to=attacker">

由于用户已经登录了银行网站,所以这个请求会带上用户的 cookie,银行服务器会认为其是一个正常的用户请求,从而进行转账操作。

防御 CSRF 攻击的常见方式包括:

  1. 使用 CSRF Token:在用户提交表单时,服务器生成一个随机的 CSRF Token,并且在表单中添加一个隐藏字段来存储这个 CSRF Token。然后服务器验证每个请求是否包含正确的 CSRF Token。
  2. 检查 Referer:服务器检查每个请求的 HTTP Referer,如果 Referer 不是预期的值,那么拒绝这个请求。
  3. 使用 SameSite Cookie:设置 cookie 的 SameSite 属性为 Strict 或 Lax,这样浏览器在跨站请求是不会发送 cookie。
  4. 在关键操作上添加二次确认:例如一些关键操作(如修改密码,转账等)上添加二次确认,比如短信验证码,邮箱确认等。

以上都是 CSRF 攻击的常见方法,实际应用时,可以根据实际情况选择合适的防御策略。

16. 聊聊五层计算机网络体系结构中,每一层对应的网络协议有哪些?

计算机网络常常使用五层模型来描述网络的工作原理,这五层包括:物理层、数据链路层、网络层、传输层和应用层。每一层都有对应的网络协议,这些协议用于规定在该层中数据的传输方式和处理方法。以下是每一层中常见的网络协议:

  1. 物理层:物理层主要负责将二进制数据转换为电信号,并通过网络进行传输。物理层的协议主要关注硬件设备、电缆、卡、电压、结构规格、引脚、线路规格、光和射频等物理特性。例如 Ethernet(以太网)、DSL(数字用户线路)、ISDN(综合业务数字网络)等。
  2. 数据链路层:数据链路层的主要任务是在网络实体之间建立并维持数据链路。这一层常见的协议有 Ethernet(以太网),PPP(点对点协议)、ATM(异步传输模式)等。
  3. 网络层:网络层的主要目的是完成数据的路由和转发。在这一层中最主要的协议是 IP(Internet Protocol),此外还有 ICMP(Internet Control Message Protocol),IGMP(Internet Group Management Protocol)等。
  4. 传输层:传输层的主要任务是提供端到端的通信服务。在这一层中,最主要的协议有 TCP(Transmission Control Protocol) 和 UDP(User Datagram Protocol)。
  5. 应用层:应用层的目的是为应用程序提供网络服务,使得应用程序能够进行通信。在这一层中,常见的协议有 HTTP(Hypertext Transfer Protocol),FTP(File Transfer Protocol),SMTP(Simple Mail Transfer Protocol),DNS(Domain Name System)等。

以上是每一层的简单介绍以及常见的协议,实际上,每一层都有很多其它的协议,并且有些协议可能会跨越多个层次。

17. 什么是 DoS,DDoS, RDDoS 攻击?

DoS(Denial of Service,服务拒绝攻击)是一种常见的网络攻击方式,攻击者通过大量的恶意请求来占用服务器资源,使得服务器无法正常提供服务。Dos 攻击的一个常见方式是 SYN Flood,攻击者不断地向服务器发送 TCP 连接请求,但是不完成三次握手,这样就会消耗服务器的资源。

DDoS(Distributed Denial of Service,分布式服务拒绝攻击)是 DoS 攻击的一种形式。在 DDoS攻击中,攻击者使用多个(可能是成千上万)的被控制的机器(通常被称为“僵尸网络”)来同时进行攻击,这样可以使得攻击的力量更大,更难以防御。

RDDoS(Reflected Distributed Denial of Service,反射式分布式服务拒绝攻击)是 DDoS攻击的一种形式。在 RDDos 攻击中,攻击者首先发送小量的请求到反射服务器,并伪装成目标服务器的 IP 地址。反射服务器收到请求后,会发送大量的响应到目标服务器。由于反射服务器的数量可能非常大,所以这样的攻击可以非常有效地消耗目标服务器的资源。

以上都是这些攻击方式的简单介绍,实际上这些攻击方式的原理和具体形式可能更为复杂,而且防御这些攻击也是网络安全中的重要问题。

18. HTTP 请求的过程和原理

HTTP,全称 HyperText Transfer Protocol(超文本传输协议),是用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。这是一个应用层协议,基于 TCP/IP 通信协议来传输数据。

HTTP 请求的过程与原理可以分为一下几个步骤:

  1. 客户端连接服务器:这通常涉及到 DNS 解析(将域名转为IP地址),然后客户端通过 TCP 协议发起连接到服务器的特定端口(通常是 80 端口,对于 HTTPS 则是 443 端口)。
  2. 发送 HTTP 请求:客户端向服务器发送一个 HTTP 请求,这个请求通常由请求行(包括 HTTP 方法,如 GET 或 POST,URL,HTTP 版本),请求头部(包含如内容类型,连接类型等信息),以及可选的请求体组成。
  3. 服务器处理请求并返回 HTTP 响应:服务器接收到请求后,将其解析并进行相应的处理,如读取,写入数据库,或这些其他服务端逻辑等。然后服务器会构建一个 HTTP 响应发送回客户端。这个响应通常由状态行(包括 HTTP 版本,状态码和状态信息),响应头部,以及响应体(通常是请求的资源,如 HTML 文档、图像等)组成
  4. 解析 HTTP 响应:客户端接收到响应后,会解析响应,如果状态码指示请求成功(HTTPCODE 为 200),则客户端通常会呈现响应体的内容。如果状态码指示错误(如 404),则客户端可能会显示错误信息。
  5. 关闭连接:在响应结束后,根据 HTTP 头部的 Connection 字段,客户端和服务器会决定是否关闭 TCP 连接。如果 Connection 字段的值是“keep-alive”,那么连接将被保持,可以被后续的请求复用,否则,连接将被关闭。

以上是 HTTP 请求的基本过程。请注意,HTTP 是一个无状态的协议,这意味着每个请求都是独立的,服务器不会记住之前的请求。然后,如 cookies 和 sessions 这样的技术,可以在客户端或服务器端存储状态信息,使得跨请求的状态管理成为可能。

19. forward 和 redirect 的区别

forward(转发)和redirect(重定向)是Web应用程序中常见的两种导航技术,它们在处理HTTP请求时起着重要的作用。以下是这两者的主要区别:

  • 服务器端行为
    • Forward:当服务器接收到一个请求,它可以转发该请求到另一个资源(如一个servlet,JSP页面或者另一个Web应用程序中的资源)进行处理。这种情况下,URL地址栏不会改变,因为整个过程是在服务器端进行的。一旦转发完成,对客户端来说,它接触到的还是原始请求的URL。
    • Redirect:当服务器接收到一个请求,它可以发送一个重定向响应给客户端,这个响应包含了一个新的URL。客户端收到响应后会向新的URL发送一个新的请求。因此,URL地址栏会显示新的URL地址。这种情况下,重定向是在客户端进行的。
  • 浏览器历史记录
    • Forward:因为转发过程是在服务器端完成的,所以不会在浏览器的历史记录中留下记录。
    • Redirect:因为重定向会导致客户端向新的URL发送新的请求,所以新的URL会被添加到浏览器的历史记录中。
  • 性能和资源消耗
    • Forward:转发通常更快,因为它在服务器端内部完成,而不需要发送额外的客户端请求。
    • Redirect:重定向涉及到额外的客户端请求,所以它通常比转发稍慢,并且会消耗更多的资源。
  • 使用场景:
    • Forward:通常用于内部操作,例如根据特定逻辑将请求路由到不同的处理器或资源。
    • Redirect:常用于外部导航,例如用户登录后重定向到主页,或者在完成一个操作后重定向到另一个页面。

注意:forward和redirect的行为可能会因不同的Web框架或应用程序服务器而有所不同。以上解释基于通用的Web开发概念和行为。

20. 描述以下 TCP 的三次握手

TCP 是一种可靠的,面向连接的网络通信协议。TCP 通信在开始传输数据之前,会通过一种被称为“三次握手”的过程来建立连接。下面是这个过程的具体步骤:

  1. SYN(同步):客户端发送一个带有 SYN 标志的 TCP 数据包给服务器,以请求建立连接。数据包头部包含一个序列号,用于表示这个会话中的客户端发送的数据包顺序。
  2. SYN + ACK(同步确认):服务器接收到客户端的 SYN 数据包后,会返回一个带有 SYN 和 ACK 标志的数据包给客户端。这个数据包的序列号是一个新的随机值,而确认好是客户端的序列号 + 1,表示服务器已经准备好接收客户端的下一个数据包。
  3. ACK(确认):客户端收到服务器的 SYN + ACK 数据包后,会发送一个带有 ACK 标志的数据包给服务器。这个数据包的确认号是服务器的序列号 + 1,表示客户端已经准备好接收服务器下一个数据包。一旦服务器收到这个数据包,TCP 连接就建立成功,双方可以开始传输数据了。

TCP 的三次握手主要用途是同步双发的序列号,并确认双方都准备好接收数据。这个过程可以有效防止旧的链接初始化请求突然在网络中出现并导致错误,也可以防止一些网络攻击等。

21. TCP 握手为什么是三次,不能是两次或者四次呢?

TCP 握手涉及为三次主要是为了满足两个关键目标:一是双方各自确认自己的发送和接收功能正常;而是同步双方的初始序列号,使得后续的数据通信可以正确、有序地进行。

那为什么不能是两次或者四次握手?

  • 为什么不能是两次握手?

如果只有两次握手,那么服务端就没有办法确认自己的通信能力是否被客户端正确接收。例如,假设客户端发送了 SYN 给服务端,服务端回复了 SYN + ACK,但这个过程结束后,服务端并不能确保客户端有能力接收自己的消息,因为没有收到客户端的确认消息。如果此时网络出现问题,或者客户端出现故障无法处理服务端的 ACK,那么服务端将不会意识到这一点,可能导致数据的错误发送。

  • 为什么不能是四次握手?

理论上讲,四次握手或者更多次握手是可能的,但是并没有带来更多的好处,反而会使得连接建立的过程更复杂,延长了连接建立的时间,浪费了更多的资源。TCP 的涉及原则之一就是尽可能的简单有效,只要能满足通信的基本需求(两个关键目标),就不需要进行额外的操作。

因此,三次握手是 TCP 握手涉及的最佳平衡点,能够在保证通信的可靠性的同时,又保持了有效的通信效率。

22. TCP 的四次挥手是什么?为什么需要四次挥手

在 TCP 通信结束时,需要进行一种被称为“四次挥手”的过程来终止连接。以下是这个过程的详细步骤:

  1. FIN(结束):当传输结束时,需要终止连接的一方(通常称为客户端,但实际上任何一方都可以开始这个过程)发送一个带有 FIN(Finish)的标志的数据包给另一方(通常称为服务器)。这表示发送者已经没有数据要发送了,希望关闭连接。
  2. ACK(确认):服务器收到 FIN 数据包后,会发送一个 ACK 确认标志的数据包给客户端,表示已经收到了关闭连接的请求,但可能还有一些数据需要处理和发送。
  3. FIN(结束):当服务器发送完所有的数据后,会发送另一个带有 FIN 标志的数据包给客户端,表示服务器也已经没有数据要发送,同样希望关闭连接。
  4. ACK(确认):客户端收到服务器的 FIN 数据包后,会发送一个 ACK 数据包给服务器,表示已经知道服务器也想关闭连接了。

在第四步完成后,如果服务器接受到 ACK,连接就被成功关闭了。

那么为什么需要四次挥手呢?这是因为 TCP 是一个全双工协议,这意味着数据可以在两个方向上独立地传输。当一方完成出具发送并希望关闭连接时,另一方可能仍然有数据需要处理和发送。因此需要分开确认“我已经完成发送(FIN)”和“我知道你已经完成发送(ACK)”,这样可以确保双方都已经完成数据的发送和接收,才关闭连接。

23. TCP 如何确保可靠性

TCP使用了几种关键技术来确保数据的可靠传输:

  1. 序列号和确认号:每一个发送出去的数据包都有一个唯一的序列号,接收端在收到数据包后需要发送带有确认号(确认号就是接收到的数据包中的序列号 + 1)的 ACK 数据包给发送端,表示已经正确接收到了这个数据包。如果发送端没有收到确认,会重新发送数据包。
  2. 超时重传:如果发送端在一定时间内没有接收到接收端的数据包确认,会认为数据包在传输过程中丢失,然后会重新发送这个数据包。超时的时间会自动调整,以适应网络状态的变化。
  3. 滑动窗口控制:滑动窗口控制不仅可以控制数据流量,保证接收端的处理能力不被淹没,还可以用来处理丢包。如果中间的某个包丢失,接收端将不会确认后续的包,发送端在超时后会从丢失的包开始重传。
  4. 校验和:每一个 TCP 数据包都包含一个校验和,这个校验和是根据数据包的内容计算出来的。接收端在接收数据包后,会根据同样的方法计算校验和,如果计算的结果和数据包中的结果不一致,说明数据包在传输过程中被修改了,这时接收端不会发送确认,发送端在超时后会重传数据包。
  5. 拥塞控制:当网络出现拥塞时,TCP 会减少发送窗口的大小,降低发送的速度,从而避免因为网络拥塞导致的数据丢失。

通过这些技术,TCP 可以确保数据的可靠传输。当然,这些措施并不能保证 100% 的可靠性,因为网络的情况可能非常复杂,但它们已经可以在大部分情况下确保数据的正确、有序和完整地传输。

24. 说说 TCP 报文首部都有哪些字段,其作用又分别是什么?

TCP 报文头部包含一系列字段,这些字段用于控制 TCP 连接和数据传输。以下是 TCP 报文头部的主要字段和它们的作用:

  1. 源端口号(Source Port)和目的端口号(Destination Port):这两个字段各占 16 位,用于标识发送方和接收方的端口号。端口号是用来在同一台计算机上区分不同的应用程序的。
  2. 序列号(Sequence Number):这个 32 位的字段用于标识发送的数据包的顺序,以便接收方可以将接收到的数据包重新组合成正确的顺序。
  3. 确认号(Acknowledgement Number):这个 32 位的字段用于确认已经接收到的数据。它的值是接收方期望收到的下一个数据包的序列号。
  4. 数据偏移(Data Offset):这个 4 位的字段表示 TCP 报文头部的长度。因为 TCP 报文头部可能包含一些可选字段,索引报文头部的长度是可变的。
  5. 保留(Reserved):这个 6 位的字段为了将来的扩展保留,现在总是设置为 0。
  6. 控制位(Control Bits 或 Flags):这个 6 位的字段包含一些标志位,如 SYN、ACK、FIN、RST、RSH 和 USG,用于控制 TCP 的一些特殊操作。
  7. 窗口大小(Window Size):这个 16 位的字段表示接收方的接收窗口大小,用于流量控制。
  8. 校验和(Checksum):这个 16 位的字段用于检查数据包在传输过程中是否出错。
  9. 紧急指针(Ugrent Pointer):这个 16 位的字段用于支持紧急数据传输的服务。
  10. 可选字段(Options):这部分字段并不总是存在,它可能包含一些额外的参数,如最大报文长度(MSS)、窗口扩大因子等。

以上就是 TCP 报文头部的主要字段和其作用,它们共同工作以实现 TCP 的各种功能,如建立连接、结束连接、流量控制、拥塞控制等。

25. 简述 TCP 和 UDP 的区别

TCP 和 UDP 都是互联网协议的核心部分,它们位于 OSI 模型的传输层,用于在网络中传输数据。但是 TCP 和 UDP 是基于完全不同的理念设计的,各自有各自的优点和缺点。以下是 TCP 和 UDP 的主要区别:

  • 连接方式:
    • TCP 是一种面向连接的协议。在传输数据之前,必须先建立连接,数据传输结束后要断开连接。这个过程过程被称为“三次握手”和“四次挥手”。
    • UDP 是一种无连接的协议。发送数据时,不需要建立连接,也不需要断开连接,只需要知道接收者的地址就可以直接发送。
  • 可靠性:
    • TCP 提供了可靠的数据传输。它有错误检测和错误恢复的功能,如果数据包在传输过程中丢失或损坏,TCP 会自动重发数据包,直到接收者正确接收。
    • UDP 不保证数据包一定能正确无误地达到目的地。如果数据包在传输过程中丢失或损坏,UDP 不会进行重发。
  • 数据传输的顺序:
    • TCP 保证数据的顺序。如果数据包在传输过程中顺序被打乱,TCP 会在接收端重新排序,确保数据以正确的顺序传送给应用程序。
    • UDP 不保证数据的顺序。数据包以任何顺序达到接收端,并且直接传送给应用程序。
  • 速度和资源需求:
    • TCP 的速度比 UDP 慢,因为 TCP 需要进行连接管理和错误恢复。TCP 也需要更多的系统资源。
    • UDP 的速度比 TCP 快,因为 UDP 没有复杂的错误恢复和连接管理的功能。UDP 需要较少的系统资源。
  • 使用场景:
    • TCP 通常用于需要高可靠性的应用,如 Web 浏览,电子邮件,文件传输等。
    • UDP 通常用于对实时性要求高,可以接收一定的丢包的应用,如视频流,VOIP,在线游戏等。

这就是 TCP 和 UDP 的主要区别。总的来说,两种协议提供了网络编程的基础,是我们能够根据不同的需求和场景来选择合适的协议。

26. 说说 TCP 的重传机制

TCP 为了保证数据的可靠性传输,设计了一套成熟的重传机制。当网络通信过程中数据包丢失时,这个机制可以使发送端重新发送丢失的数据包。这个机制主要依赖于 TCP 的 ACK 确认机制和超时重传机制:

  1. ACK 确认机制:每当接收端成功接收一个数据包,它就会发送一个带有 ACK 的确认包回去。确认号是接收端期望收到的下一个数据包的序列号,这就意味着所有前面的数据包都已经被接收。
  2. 超时重传机制:每当发送端发送一个数据包,它就会设置一个计时器,等待接收端的确认。如果在超时时间内没有收到确认,发送端就会重新发送这个数据包。超时时间的设置需要考虑网络状况,以避免过早或过晚的重传。

TCP 还有一些更为高级的重传技术,如快速重传和快速恢复:

  1. 快速重传:当接收端接收到一个乱序的数据包,也就是说这个数据包的序列号大于接收端希望的序列号,接收端会立即发送一个重复的确认包。当发送端连续收到三个重复的确认包时,它会立即重新发送最后一个被确认的数据包的下一个数据包,而不是等待超时。这种机制叫做快速重传。
  2. 快速恢复:当发送端进入快速重传模式后,它不会像一般的超市重传那样把发送窗口设置为 1,而是把发送窗口减半,然后开始线性增长。这样做可以更快的恢复传输速度,这种机制叫做快速恢复。

通过这些机制,TCP 可以在复杂的网络状况下保证数据的可靠传输。然而,这也增加了 TCP 的复杂性,并可能导致网络拥塞,所以 TCP 还需要配合拥塞控制机制来使用。

27. 说说 TCP 的滑动窗口

TCP 的滑动窗口是一个逻辑上的概念,是一种流量控制技术,是一个抽象的机制或策略,用于管理 TCP 流量和控制数据的发送和接收。它能够在保证网络稳定性的前提下提高数据的传输效率。滑动窗口有两个主要的作用:

  1. 流量控制:通过动态调整窗口大小,发送方可以控制发送给接收方的数据量,使得接收方不会因为接收到过多的数据而处理不过来。
  2. 可靠传输:当接收方接收到数据后,它会发送一个确认消息,告诉发送方它已经接收到了哪些数据。如果发送方没有接收到确认,说明数据可能在传输过程中丢失,那么发送方就会重传这部分数据。

这个“窗口”是在数据流中维护的一段连续的空间,它的大小表示了发送方在没有接收到确认的情况下发送的最大数据量。当发送方收到确认后,窗口就会“滑动”,从而释放出新的空间用于发送更多的数据。

发送窗口的大小可能会根据网络状况动态调整。例如,如果网络拥塞,发送窗口的大小可能会减小,以降低发送速度;如果网络条件良好,发送窗口的大小可能会增大,以提高传输效率。

这就是 TCP 滑动窗口的基本概念。它是 TCP 可靠性和效率的关键因素之一,通过合理地调整滑动窗口的大小,可以在保证数据可靠传输的同时,最大限度的提高网络的利用率。

28. 说说 TCP 的流量控制

TCP 的流量控制是一种防止发送者发送过多的数据而导致接收者处理不过来的机制。这个机制主要通过滑动窗口来实现。

在 TCP 连接建立时,接收端会告诉发送端一个窗口大小,这个大小表示接收端缓冲区的可用空间,也就是接收端现在能接收的最大数据量。发送端在发送数据时,需要检查未确认的数据量是否超过这个窗口大小,如果超过,就需要等待接收端的确认来“打开”更多的窗口空间。

在数据传输过程中,接收端会根据自己的接收能力和当前的网络情况动态的调整窗口的大小,并通过 ACK 报文通知发送端。如果接收端的处理速度跟不上发送速度,它会减小窗口大小,甚至将窗口大小设置为 0,这样发送端就不能再发送新的数据了。

发送端在收到窗口大小为 0 的通知后,会启动一个持续计时器,每隔一段时间就发送一个探测报文给接收端,询问窗口是否有空闲空间。当接收端处理完一部分数据后,它就会增大窗口大小,并通过 ACK 报文通知发送端,然后发送端就可以继续发送数据了。

总的来说,TCP 的流量控制通过动态调整窗口大小,使得发送速度能够适应接收速度,避免因为发送过快导致的网络拥塞和数据丢失,保证了数据的可靠传输。

29. 说说 TCP 的拥塞控制

TCP 的拥塞控制是一种避免网络拥塞的机制。网络拥塞通常发生在许多主机在同一时间向网络发送大量数据,超过了网络的处理能力。为了解决这个问题,TCP 设计了一套拥塞控制策略,包括慢开始(Slow Start)、拥塞避免( CongestionAvoidance)、快速重传( FastRetransmit)和快速恢复(Fast Recovery)四个主要阶段。

  1. 慢开始:当一个 TCP 连接刚刚建立时,发送端的拥塞窗口大小(cwnd)被设置为一个比较小的值(通常为 1 或 2 个 MSS,MSS 为最大段大小)。然后每收到一个 ACK,拥塞窗口就加倍,这样发送速度回呈指数级增长,直到拥塞窗口大小达到一个阈值(ssthresh,慢开始阈值)或者发送了丢包事件。
  2. 拥塞避免:当拥塞窗口达到慢开始阈值后,发送端会进入拥塞避免阶段。在这个阶段,每收到一个 ACK,拥塞窗口只增加 1/MSS,也就是说每个 RTT(往返时延)拥塞窗口只增加 1 个 MSS,这样发送速度会呈线性增长,直到发生了丢包事件。
  3. 快速重传:当发送端连续收到三个重复的 ACK 时,它会认为有一个包被丢失,然后立即重传这个包,而不需要等待超时,这就是快速重传机制。
  4. 快速恢复:快速重传后,发送端会进入快速恢复阶段,这个阶段的目标是尽快从丢包中恢复过来。发送端会把慢开始阈值设置为当前的拥塞窗口大小的一半,并把拥塞窗口大小设置为慢开始阈值,然后重新进入拥塞避免阶段。

这就是 TCP 的拥塞控制策略,它的目标是尽可能地利用网络的传输能力,同时避免网络的过载。通过这种机制,TCP 可以适应各种网络环境,提供可靠的数据传输服务。

30. 说说半连接队列和 SYN Flood 攻击的关系

当客户端发起一个到服务器的 TCP 连接请求时,它会发送一个带有 SYN 标志的包,这个 TCP 的三次握手过程的第一步。收到这个 SYN 包的服务器会在一个叫做半连接队列的地方存储这个连接请求。

这个半连接队列的大小是有限的,当队列满了后,新的连接请求就会被拒绝,直到队列中有空位为止。在正常情况下,这个队列中的空位会在很短的时间内被释放出来,因为服务器会很快的处理这个队列中的连接请求,然后把它们从半连接队列中移动到全连接队列。

然而,如果有恶意的客户端连续发送大量的 SYN 包,并且不响应服务器的连接确认,或者故意发送伪造的源 IP 地址的 SYN 包,那么服务器的半连接队列可能会被迅速填满,使得新的合法的连接请求无法被接受,这就是所谓的 SYN Flood 攻击,它是一种常见的拒绝服务攻击(Denial of Service,Dos)。

为了抵御 SYN Flood 攻击,人们设计了一种叫做 SYN cookies 的技术。当半连接队列满了后,服务器不再存储连接请求,而是根据请求计算一个特殊的 cookie,并把它作为连接确认的序列号发送回去。当客户端回应这个确认时,服务器可以根据这个 cookie 恢复出原来的连接请求。这样,即使在受到 SYN Flood 攻击的情况下,服务器也能继续接收新的连接请求。

31. 说说 TCP 的粘包和拆包

TCP 是一个基于字节流的协议,它会把要发送的数据看做是一个无结构的字节流,而不是分离的数据包。因此,在 TCP 通信中,可能会出现所谓的“粘包”和“拆包”问题。

粘包(Packet Stick):粘包是指发送方发送的若干个包被 TCP 接收方当做是一个包进行接收。这是因为在 TCP 层,数据包的边界并不会被保留,所有发送的数据被接收方看做是一个连续的字节流。如果发送方连续发送了两个数据包,接收方可能会一次性的收到这两个包的全部内容,而无法分辨出这两个数据包的边界,这就是所谓的粘包。

拆包( Packet Split):拆包是指发送方发送的一个包被 TCP 接收方分成了两个或者多个包进行接收。这可能是由于网络的各种原因,如网络拥塞、路由策略等,导致一个数据包在传输过程中被拆分成多个小包。

处理粘包和拆包的常用方法是在应用层增加一个数据包边界。例如,可以在每个数据包前面加上一个长度字段,表示这个数据包的长度。接收方在接收数据时,先读取长度字段,然后再根据这个长度字段读取相应的数据,这样就可以知道每个数据包的边界,避免粘包和拆包问题。

需要注意的是,粘包和拆包是 TCP 协议的正常现象,不是错误或者问题。在设计 TCP/IP 协议时,设计者认为应用程序应该更关心数据是否可靠地到达,而不是数据如何到达。因此,TCP 保证了数据的可靠性,但不保证数据包的边界。那么需要保留数据包的边界,需要在应用层自行处理。

32. IP 地址有哪些分类

互联网协议(IP)地址用于标识互联网上的设备,其在 IPv4 版本中通常是一个 32 位的数值,由四个 8 位的字段组成,每个字段用一个点分隔。比如 192.168.1.1 就是一个典型的 IP 地址,原始的 IP 地址被划分为几个不同的类别,分别是 A、B、C、D、E,这被称为类别网络(Classful Networking)。

  1. A 类地址:第一个 8 位字段(即最左边的字段)用于网络标识,剩下的 24 位用于主机标识。A 类地址的第一个字段的第一位必须是 0,这样 A 类地址的范围就是 1.0.0.0 到 126.0.0.0。每个 A 类网络可以容纳约 1600 万个主机。
  2. B 类地址:前两个 8 位字段用于网络标识,后两个字段用于主机标识。B 类地址的第一个字段的前两位必须是 10,这样 B 类地址的范围就是 128.0.0.0 到 191.255.255.255。每个 B 类网络可以容纳约 6.5 万个主机。
  3. C 类地址:前三个 8 位字段用于网络标识,最后一个字段用于主机标识。C 类地址的第一个字段必须是 110,这样 C 类地址的范围就是 192.0.0.0 到 239.255.255.255。每个 C 类网络可以容纳 256 个主机。
  4. D 类地址:用于多播服务,也就是一次向多个主机发送数据。D 类地址的第一个字段的前四位必须是 1110,这样 D 类地址的范围就是 224.0.0.0 到 239.255.255.255。
  5. E 类地址:保留地址,用于实验和研究。E 类地址的第一个字段的前四位必须是 1111,这样 E 类地址的范围就是 240.0.0.0.0 到 255.255.255.255。

需要注意的是,这种类别网络的划分方式在现代互联网中已经被无类别域间路由(CIDR)所取代,因为 CIDR 可以更有效地利用 IP 地址空间,避免地址浪费。

33. 说下 ARP 协议的工作原理

ARP(地址解析协议)的主要任务是将网络层的 IP 地址映射到链路层的物理地址(MAC 地址)。当一个主机需要发送数据给另一个主机时,发送方需要知道接收方的 MAC 地址才能将数据帧发送到网络上。如果发送方只知道接收方的 IP 地址,那么它就会使用 ARP 来查询接收方的 MAC 地址。ARP 的工作原理如下:

  1. ARP 请求:发送方向网络上广播一个 ARP 请求包,这个请求包中包含了发送方的 IP 和 MAC 地址,以及接收方的 IP 地址。因为这是一个广播,所以所有的同一局域网内的设备都会收到这个请求。
  2. ARP 响应:当接收 ARP 请求的设备看到接收方的 IP 地址与自己的 IP 地址相匹配时,就知道这个 ARP 请求是发给自己的,然后就会发送一个 ARP 响应包给发送方。这个响应包中包含了接收方的 IP 和 MAC 地址。
  3. ARP 缓存:当发送方收到 ARP 响应后,就会把接收方的 IP 和 MAC 地址存入一个表中,这个表被称为 ARP 缓存。当发送方再需要给同一接收方发送数据时,就可以直接从 ARP 缓存中查找接收方的 MAC 地址,而不需要再发送 ARP 请求。为了保持 ARP 缓存的新鲜度,每个条目在一定时间(通常是几分钟)后会被删除。

ARP 是局域网中实现 IP 地址与 MAC 地址之间映射的重要协议,对于网络数据的传输起着关键作用。

34. 有了 IP 地址为什么还要用 MAC 地址

IP 地址和 MAC 地址都是用来表示网络中的设备的,但它们在网络通信中的作用是不同的。

IP 地址是网络层的地址,主要用于在互联网这样的大型网络中识别设备。因为互联网是一个全球范围的网络,所以需要一种全局唯一的地址来标识每一个设备,这就是 IP 地址的作用。IP 地址是动态的,可以根据需求改变。

MAC 地址是链路层的地址,主要用于在同一局域网内识别设备。局域网是一个小范围的网络,例如家庭网络、公司网络等。在局域网内,设备之间的通信是通过物理媒体(如以太网、Wi-Fi)直接进行的,所以需要一种物理地址来标识每一个设备,这就是 MAC 地址的作用。MAC 地址是固定的,它是在设备生产时写入硬件的,通常不会改变。

在实际的网络通信中,通常是先用 IP 地址找到目标设备所在的网络,然后再用 MAC 地址找到目标设备。例如,当从家庭网络访问一个网站时,数据首先通过 IP 地址找到网站服务器所在的网络,然后再通过 ARP 协议获取服务器的 MAC 地址,最后通过 MAC 地址将数据发送到服务器。这就是我们既需要 IP 地址,又需要 MAC 地址的原因。

35. TCP 和 UDP 分别对应的常见应用层协议有哪些?

TCP(传输控制协议)和 UDP(用户数据协议)是两种主要的传输层协议,它们分别对应了一些常见的应用层协议:

  • 基于 TCP 的应用层协议:
  1. HTTP(HyperText Transfer Protocol):万维网的核心协议,用于在 Web 浏览器和 Web 服务器之间传输 HTML 文档、图像的 Web 内容。
  2. HTTPS(HTTP Secure):HTTP 的安全版本,通过 SSL/TLS 协议加密数据。
  3. FTP(File Transfer Protocol):用于在客户端和服务器之间传输文件的协议。
  4. SMTP(Simple Mail Transfer Protocol):用于发送电子邮件的协议。
  5. POP3(Post Office Protocol version3)和 IMAP(Internet Message Access Protocol):用于接收电子邮件的协议。
  6. Telnet:一种远程终端协议,用于在 Internet 上进行远程登录。
  • 基于 UDP 的应用层协议:
  1. DNS(Domain Name System):用于将域名解析为 IP 地址的协议。
  2. DHCP(Dynamic Host Configuration Protocol):用于自动配置网络设备的 IP 地址的协议。
  3. SNMP(Simple Network Management Protocol):用于管理和监控网络设备的协议。
  4. RTP(Real-time Transport Protocol):用于传输实时数据,如 VoIP 电话和识别会议。
  5. NTP(Network Time Protocol):用于同步网络中计算机的系统时间。

这些协议选择使用 TCP 还是 UDP,主要取决于它们的需求。例如,如果需要可靠的数据传输,就会选择 TCP,因为 TCP 提供了数据重传、流量控制、拥塞控制等可靠性机制。如果需要低延迟或实时性,就会选择 UDP,因为 UDP 是无连接的,不需要进行握手、重传等操作,可以更快地发送数据。

36. 说说 URI 和 URL 的区别

URI 和 URL 都是用于标识资源的字符串,但它们的含义和作用是有所不同的。

URI(Uniform Resource Identifier):统一资源标识符,用于唯一地表示互联网上的资源。URI 是一个广义的概念,它包括两种形式的标识符:URL 和 URN。

URL(Uniform Resource Locator):统一资源定位符,是 URI 的一种。URL 不仅标识了资源,而且提供了一种方法来定位和访问这个资源,也就是说,URL 包含了获取资源的具体地址信息。例如

http://www.example.com/path/to/resource

就是一个 URL,它标识了一个网页,并提供了访问这个网页的方法(通过 HTTP 协议)和地址。

URN(Uniform Resource Name):统一资源名称,也是 URI 的一种。URN 仅标识资源的名称,但并不提供获取资源的地址和方法。URN 主要用在资源的命名和解析服务中。

总结一下:URL 和 URN 是 URI 的子集,也就是说,所有的 URL 和 URN 都是 URI,但并非所有的 URI 都是 URL 或 URN。在实际的使用中,最常用的还是 URL,因为它不仅标识了资源,而且提供了访问资源的方法和地址。

37. Session 和 Cookie 的区别

Session 和 Cookie 都是用于在 HTTP 中维护状态的技术,因为 HTTP 协议是无状态的,即服务器并不知道用户前后两次请求的关联性。

Cookie

Cookie 是一种小型数据文件,由服务器发送到用户的浏览器,并保存到用户的设备上,每次用户访问相同的服务器时,浏览器都会自动将存储的 Cookie 发送回服务器,一次来让服务器“记住”用户的状态信息,比如用户的登录状态,购物车等。

Cookie 具有以下特点:

  • Cookie 存在在客户端里(用户的浏览器)。
  • Cookie 可用于跨会话(session)记住信息。
  • 服务器可以设置 Cookie 的过期时间。如果没有设置过期时间,那么当浏览器关闭时,Cookie 就会被删除。
  • Cookie 的大小有限制(通常为 4KB)。

Session

Session 是服务器为每个用户创建的一种临时的数据结构。当用户访问一个网站时,服务器会为用户创建一个 Session,并生成一个与之关联的唯一 ID(称为 Session ID),然后将这个 Session ID 发送给用户的浏览器,通常是通过 Cookie 或 URL 的参数。

Session 具有以下特点:

  • Session 存储在服务端。
  • Session 在用户关闭浏览器或者退出登录时会被销毁。
  • 通过 Session,服务器可以存储大量的用户数据。
  • Session 更加安全,因为它的数据不会被用户看到。

总结一下,Cookie 和 Session 都是用于在 HTTP 中维护状态的技术,但它们的存储位置,生命周期,数据容量和安全性都有所不同。在实际使用中,它们通常会结合使用,不如将 Session ID 存储在 Cookie 中,一次来关联用户的请求和服务器的 Session。