iOS 网络相关的知识点

67 阅读22分钟

总结来源于网络和自己的理解,若有不正确的地方欢迎大家指出。

1.HTTP的请求方式都有哪些?

1). GET

-   用途:用于从服务器获取数据。通常用于请求获取资源的操作,如获取文章、图像等。
-   参数:参数通常附加在 URL 的查询字符串中,如 `http://example.com/api/resource?param1=value1&param2=value2`
-   安全性:GET 请求是幂等的,不应该对服务器资源产生影响。

2). POST

-   用途:用于向服务器提交数据,如表单数据、JSON 数据等。通常用于创建资源、提交评论等操作。
-   参数:数据放在请求体中,可以包含多种数据格式,如表单、JSON 等。
-   安全性:POST 请求可能对服务器资源进行修改,不是幂等的。

3). PUT

-   用途:用于更新服务器上的资源,通常是替换整个资源。客户端需要提供完整的资源数据。
-   参数:类似于 POST 请求,数据放在请求体中。
-   安全性:PUT 请求是幂等的,多次请求相同数据不会产生副作用。

4). DELETE

-   用途:用于删除服务器上的资源。
-   参数:通常通过 URL 指定要删除的资源,如 `http://example.com/api/resource/123`.
-   安全性:DELETE 请求通常不是幂等的,因为多次请求可能会导致不同结果。

5). PATCH

-   用途:用于对服务器上的资源进行部分更新。通常用于只更新资源的某些字段。
-   参数:类似于 POST 和 PUT 请求,数据放在请求体中,但只包含要更新的字段。
-   安全性:PATCH 请求通常不是幂等的。

6). HEAD

-   用途:类似于 GET 请求,但服务器只返回头部信息,用于检查资源是否存在以及获取头部信息,而不获取实际数据。
-   参数:类似于 GET 请求,参数附加在 URL 的查询字符串中。
-   安全性:HEAD 请求是幂等的。

7). OPTIONS

-   用途:获取服务器支持的HTTP方法列表,用于询问服务器对特定资源支持哪些方法。
-   参数:通常不需要参数,服务器返回支持的方法列表。
-   安全性:OPTIONS 请求是幂等的。

8). CONNECT

-   用途:用于与服务器建立网络连接,通常用于代理服务器等场景。
-   参数:通常不需要参数,仅建立连接。
-   安全性:CONNECT 请求通常不是幂等的。

9). TRACE

-   用途:用于追踪请求-响应的传输路径,用于诊断和调试。
-   参数:通常不需要参数,服务器返回请求的元数据。
-   安全性:TRACE 请求是幂等的。

2.网络请求 GET与POST的区别?

简单总结:

  • GET:获取资源。

  • 安全的、幂等的、可缓存的。

  • POST:处理资源。

  • 非安全的、  非幂等的、  非可缓存的。

具体分析如下:

  1. 数据传输方式

    • GET:在 GET 请求中,数据会附加在 URL 的查询参数中。这意味着请求的数据会暴露在 URL 中,可以被轻易地看到,不适合传输敏感信息。
    • POST:在 POST 请求中,数据被放置在请求体中。这使得请求的数据在传输过程中不会暴露在 URL 中,因此适合传输敏感信息。
  2. 数据长度

    • GET:由于数据附加在 URL 上,GET 请求的数据长度受到 URL 长度的限制,不适合传输大量数据。
    • POST:POST 请求的数据放在请求体中,数据长度理论上可以更大,适用于传输较大的数据。
  3. 安全性

    • GET:由于数据暴露在 URL 中,GET 请求不适合传输敏感信息,因为 URL 可能会被浏览器历史、服务器日志等记录下来。
    • POST:POST 请求的数据放在请求体中,相对更安全,适合传输敏感信息。
  4. 幂等性

    • GET:GET 请求是幂等的,多次请求同一个 URL 返回的结果应该是相同的,不会对服务器端数据产生影响。
    • POST:POST 请求通常不是幂等的,多次请求可能会对服务器端数据产生不同的影响,因为它可能导致数据的创建或修改。
  5. 缓存

    • GET:GET 请求通常会被浏览器或网络层进行缓存,以便更快地响应重复请求。
    • POST:POST 请求不会被缓存,因为它可能会对服务器端数据产生影响,所以每次请求都需要实际发送到服务器。

总之,GET 和 POST 请求适用于不同的场景。GET 适合获取数据,对服务器没有修改作用,而 POST 适合传输较大或敏感的数据,可能对服务器产生修改或创建作用。在选择使用哪种请求方法时,需要根据具体需求和安全性考虑来做决定。

3.HTTP建立链接是怎样的一个流程?

参考博客链接

在HTTP中,建立连接的过程通常遵循以下步骤:

  1. DNS解析:客户端首先需要将主机名(如www.example.com)解析为IP地址,以确定服务器的位置。这涉及到DNS解析,将主机名映射到一个或多个IP地址。

  2. 建立TCP连接:使用解析得到的服务器IP地址,客户端开始建立TCP连接。这是通过三次握手完成的,分为以下步骤:

    • 客户端发送一个带有SYN标志(同步请求)的数据包给服务器。
    • 服务器收到后,回复一个带有SYN和ACK标志(确认请求)的数据包给客户端。
    • 客户端再回复一个带有ACK标志(确认请求)的数据包给服务器。此时,TCP连接建立完成。
  3. 发送HTTP请求:一旦TCP连接建立,客户端会构建一个HTTP请求,包括请求行(如GET /index.html HTTP/1.1)、请求头部和请求主体(如果有)。然后将请求发送到服务器。

  4. 服务器响应:服务器收到请求后,会解析请求并根据请求内容生成HTTP响应。响应包括响应行(如HTTP/1.1 200 OK)、响应头部和响应主体(如果有)。

  5. 传输数据:服务器将响应数据分成小块(通常称为数据包),并通过TCP连接发送给客户端。

  6. 关闭连接:在服务器发送完响应后,根据HTTP版本和Connection头部的设置,连接可能会被保持(用于HTTP/1.1的默认行为)或者关闭(在HTTP/1.0中通常是非持久连接)。客户端和服务器都可以选择在合适的时机关闭连接,以便资源释放。

  • 需要特别注意:在关闭连接的时候要经历四次挥手。在四次挥手完成后,客户端和服务器都知道对方不会再发送数据,连接被彻底关闭。这个过程确保数据在连接关闭之前都被正确传输,以避免数据丢失或不完整。

    • 客户端发送FIN(终止) :客户端决定不再发送数据,它发送一个带有FIN标志的数据包给服务器,表示客户端已完成数据发送。
    • 服务器发送ACK:服务器收到客户端的FIN后,发送一个带有ACK标志的数据包作为确认。服务器此时可能还有数据要发送给客户端。
    • 服务器发送FIN:服务器完成数据发送后,它发送一个带有FIN标志的数据包给客户端,表示服务器也不再发送数据。
    • 客户端发送ACK:客户端收到服务器的FIN后,发送一个带有ACK标志的数据包作为确认。这个阶段完成后,连接正式关闭。

4.为什么HTTP断开连接的是四次挥手,改成三次或者两次不行吗?

TCP连接的四次挥手是为了确保数据的可靠传输和连接的正确关闭。虽然理论上可以使用更少的步骤来关闭连接,但四次挥手的设计是为了解决以下几个重要的问题:

  1. 数据可靠性:TCP协议是一种面向连接、可靠的协议,其设计目标之一是确保数据的正确传输。在关闭连接之前,双方可能还有未传输的数据,为了确保这些数据都被成功发送和接收,需要使用四次挥手来逐步确认数据传输和关闭。
  2. 保证对方的数据接收:在三次握手中,当客户端发送最后一个ACK确认后,可能由于网络延迟等原因,服务器未能及时收到这个ACK。如果只有三次挥手,服务器就会错误地认为连接已经关闭,这可能导致服务器未成功接收客户端的数据。
  3. 防止连接复用问题:TCP连接在一方发送FIN后,可能还有一段时间内未关闭。如果使用三次挥手并直接关闭连接,可能会出现连接复用问题,即之前关闭的连接再次被重用,这可能导致数据混乱或安全问题。

综上所述,四次挥手是为了确保数据的完整传输、确认对方的数据接收,以及避免连接复用问题。虽然增加了一定的步骤,但这些步骤是为了保障TCP连接的可靠性和稳定性,确保在关闭连接时不会出现数据丢失或混乱的情况。

5.为什么HTTP建立连接是三次握手,改成一次或者两次不行吗?

TCP的三次握手是为了确保建立连接时的可靠性和安全性。虽然理论上可以使用更少的步骤来建立连接,但三次握手的设计是为了解决以下重要的问题:

  1. 建立可靠连接:在建立连接时,客户端和服务器需要确保双方都愿意建立连接,并且双方的初始序列号(sequence number)被正确初始化。第一次握手由客户端发送SYN请求,第二次握手由服务器回复SYN和ACK确认,第三次握手由客户端发送ACK确认。这样确保了双方都有了正确的初始序列号,并且双方都认可建立连接。
  2. 防止过期的连接请求:如果只有两次握手,客户端发送一个连接请求后,如果在网络中发生延迟,服务器收到连接请求后可能会发送确认。但如果这个确认在网络中也遭受延迟,客户端将无法知道连接是否成功建立,可能会导致连接在服务器端过期,浪费资源。通过第三次握手,服务器可以确认客户端的意图,并建立连接。
  3. 防止连接劫持:如果只有一次握手,客户端发送连接请求后,可能被恶意主机劫持并发送一个伪造的确认,这会导致恶意主机与服务器建立连接,而客户端却不知情。通过三次握手,服务器可以等待客户端的确认,从而避免连接被劫持。

总之,虽然一次或两次握手理论上可以建立连接,但这样做会引入不稳定性、不可靠性和安全性问题。三次握手通过确保双方都同意建立连接,避免了上述问题,从而使得建立的TCP连接更加可靠和安全。

6.HTTP与HTTPS的区别是什么?

HTTP(Hypertext Transfer Protocol)和HTTPS(Hypertext Transfer Protocol Secure)是两种不同的协议,用于在客户端和服务器之间传输数据。它们之间的主要区别在于安全性:

  1. 安全性:

    • HTTP:HTTP是一种不安全的协议,数据在传输过程中是以明文形式发送的,容易被中间人窃听和篡改。这意味着敏感信息(如密码、个人信息)在传输时可能会被恶意用户截获。
    • HTTPS:HTTPS是通过SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议加密的HTTP协议。它使用加密技术对传输的数据进行加密和解密,确保数据在传输过程中的机密性和完整性。因此,HTTPS更加安全,适用于保护敏感信息的传输。
  2. 协议标识:

    • HTTP:URL中使用的是http://作为协议标识。
    • HTTPS:URL中使用的是https://作为协议标识。
  3. 端口:

    • HTTP:默认使用端口80进行通信。
    • HTTPS:默认使用端口443进行通信。
  4. 证书和身份验证:

    • HTTP:不涉及证书和身份验证。任何人都可以发送HTTP请求。
    • HTTPS:在使用HTTPS时,服务器需要一个SSL证书,这个证书由认证机构(CA)颁发,用于证明服务器的身份。客户端在连接时会验证服务器的证书,确保连接到合法的服务器。
  5. 性能:

    • HTTP:由于不涉及加密和解密的过程,通常比HTTPS稍微快一些。
    • HTTPS:由于数据加密和解密的额外处理,可能会稍微降低一些性能。

总之,HTTP和HTTPS之间的主要区别在于数据传输的安全性。HTTPS通过加密技术提供了更高的安全性,适用于保护敏感信息的传输,而HTTP在不涉及敏感信息的场景下可以用于普通的数据传输。在现代互联网中,为了保护用户隐私和数据安全,推荐使用HTTPS来加密数据传输。

7.HTTPS连接建立流程是怎样的呢?

简单描述: 客户端给服务端发送报文,报文内容包含:协议TLS版本号,支持的加密算法,random number C,服务端返回商定的加密算法,随机数、 服务器证书,客户端收到服务端的响应信息会对sever证书进行验证,通过验证的话会进行组装会话秘钥,客户端通过sever的公钥对预主秘钥进行加密传输,通过私钥解密得到预主秘钥,最后组装会话秘钥,之后客户端给服务端发送加密的握手消息。

当客户端与服务器建立HTTPS连接时,会经过以下步骤来完成握手和建立安全通信:

  1. 客户端请求服务器建立安全连接

    • 客户端发送一条消息(例如消息为:ClientHello)给服务器,消息内容包含支持的TLS/SSL版本、加密算法列表、一个随机数C(Client Random)以及支持的压缩方法。这表示客户端希望建立一个安全连接。
  2. 服务器响应客户端的请求

    • 服务器接收到客户端的消息后,服务器会从客户端发送的加密算法列表中选择一个加密算法,以确保服务器和客户端都支持并能够协商建立连接【服务器选择的加密算法将在之后的通信中用于加密和解密数据。这个选择通常是根据服务器的配置、安全性要求和双方支持的算法来做出的。】,接着服务器发送消息(例如:消息名为:ServerHello)消息回应客户端。该消息包含服务器选择的TLS/SSL版本、选定的加密算法、服务器生成的随机数S(Server Random)以及压缩方法。
  3. 服务器证书和公钥交换

    • 服务器将自己的数字证书发送给客户端,其中包含服务器的公钥和证书信息。这个证书由认证机构(CA)颁发,用于验证服务器的身份。客户端验证证书的有效性,同时提取服务器的公钥。客户端会验证证书的有效性,确保服务器身份的合法性。
  4. 密钥交换(可选)

    • 如果服务器要求客户端发送密钥交换信息(主要在Diffie-Hellman密钥交换中使用),客户端会生成一个随机的预主密钥(Pre-Master Secret),然后使用服务器的公钥进行加密,将加密后的预主密钥发送给服务器
  5. 预主秘钥生成

    • 客户端和服务器都使用Client Random、Server Random以及Diffie-Hellman密钥交换等信息生成预主密钥。
  6. 主密钥生成

    • 客户端和服务器独立地使用预主密钥生成主密钥,确保主密钥不会在网络上传输。
  7. 会话密钥生成

    • 客户端和服务器使用主密钥生成会话密钥,该会话密钥将用于后续的对称加密通信。
  8. 握手完成

    • 客户端和服务器都有了客户端随机数C、服务器随机数S以及可能的预主密钥。使用这些信息,客户端和服务器生成主密钥。
    • 客户端使用服务器的公钥对预主密钥进行加密传输,以确保只有服务器能够解密获得预主密钥。
  9. 加密通信

    • 握手完成后,客户端和服务器都有了共享的会话密钥,用于加密和解密后续的通信数据。这个会话密钥是通过主密钥协商生成的。

整个过程确保了通信的安全性、数据的保密性和完整性。这种加密通信方式使得敏感信息在传输过程中得到了保护,同时有效地防止了中间人攻击等安全威胁。

8.什么是公钥,什么是私钥?

公钥和私钥是在加密和数字签名领域中使用的密钥对,用于实现安全的通信、数据加密和身份验证。它们是非对称加密体系的基础组成部分。

  1. 公钥(Public Key)

    • 公钥是密钥对中的一部分,用于加密数据和验证数字签名。它可以公开分享给任何人,用于加密数据,以便只有持有与之配对的私钥的人才能解密。
    • 公钥通常用于加密与持有者之间的通信。其他人可以使用公钥加密数据,但只有持有对应的私钥的人才能解密和读取这些数据。
  2. 私钥(Private Key)

    • 私钥是与公钥配对的一部分,用于解密加密的数据和生成数字签名。私钥必须严格保密,只有持有者自己能够访问。
    • 私钥通常用于解密接收到的加密数据,或者生成数字签名以证明数据的来源和完整性。

在加密和数字签名场景中,公钥和私钥一起构成了非对称加密的基础。信息可以使用公钥加密,只有持有对应私钥的人才能解密。数字签名则用于验证数据的来源和完整性,私钥用于生成数字签名,而公钥用于验证签名。这种非对称加密的体系提供了更高的安全性,因为公钥可以公开分享,但私钥必须保持机密。

9.什么是对称加密,什么是非对称加密?

对称加密和非对称加密是两种常见的加密算法体系,用于保护数据的机密性和安全性。

  1. 对称加密(Symmetric Encryption)

    • 对称加密使用相同的密钥来进行加密和解密数据。也就是说,加密和解密过程都使用同一个密钥。
    • 加密和解密的速度相对较快,因为使用的是单一密钥,但存在一个问题:如何在通信双方之间安全地交换密钥,以免被中间人窃取。
    • 常见的对称加密算法包括AES(Advanced Encryption Standard)、DES(Data Encryption Standard)、3DES(Triple DES)等。
  2. 非对称加密(Asymmetric Encryption)

    • 非对称加密使用一对密钥:公钥和私钥。公钥用于加密数据,而私钥用于解密数据或生成数字签名。
    • 公钥可以公开分享,任何人都可以使用公钥来加密数据,但只有持有对应私钥的人才能解密数据或生成可验证的数字签名。
    • 非对称加密解决了密钥交换的问题,因为公钥可以安全地传输。然而,由于加密和解密过程需要使用不同的密钥,所以非对称加密的速度相对较慢。
    • 常见的非对称加密算法包括RSA(Rivest-Shamir-Adleman)、Diffie-Hellman、ECC(Elliptic Curve Cryptography)等。

总结:

  • 对称加密使用相同的密钥进行加密和解密,速度快但存在密钥交换的问题。
  • 非对称加密使用公钥和私钥进行加密和解密,解决了密钥交换问题,但速度相对较慢。

通常,对称加密用于加密大量数据,而非对称加密用于密钥交换、数字签名和身份验证等安全操作。

10.请分别列举一些对称加密和非对称加密,简述下原理?

1)、对称加密

  1. AES(Advanced Encryption Standard)

    • 对称加密算法,使用相同的密钥进行加密和解密。
    • 原理基于替换、代换和排列操作,将数据块与密钥进行混合变换,产生加密/解密结果。
  2. DES(Data Encryption Standard)

    • 对称加密算法,使用子密钥进行轮函数迭代。
    • 数据块被分为两半,通过轮函数进行一系列置换、替换和异或操作。
  3. 3DES(Triple DES)

    • 对称加密算法,是DES的变种,使用三次DES操作。
    • 原理是将数据块经过三次DES加密和解密,提高了安全性。

2)、非对称加密

  1. RSA(Rivest-Shamir-Adleman)

    • 非对称加密算法,使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据或生成数字签名。
    • 原理基于大数分解问题,选择两个大质数生成一对密钥。公钥用于加密,私钥用于解密。数字签名中,私钥用于生成签名,公钥用于验证签名。
  2. ECC(Elliptic Curve Cryptography)

    • 非对称加密算法,相比RSA使用更短的密钥长度来实现相同的安全性,提供更高的效率和性能。
    • 原理基于椭圆曲线数学,选择一个椭圆曲线和基点,生成一对密钥。公钥用于加密和验证,私钥用于解密和签名。
  3. DSA(Digital Signature Algorithm)

    • 非对称加密算法,用于数字签名。
    • 基于大数分解问题,用于生成和验证数字签名。

11.MD5哈希算法和SHA-256哈希算法哪一个更安全?

1.MD5(Message Digest Algorithm 5)

是一个哈希算法,用于将任意长度的输入数据转换为固定长度的128位(16字节)哈希值。MD5被用于校验数据的完整性,但不适用于加密或数字签名。

  • 主要用途:

是生成数据的校验和,以便在传输数据时验证数据是否被篡改。然而,由于MD5存在安全性弱点,容易受到碰撞(Collision)攻击,即不同的输入可能产生相同的哈希值,从而不再能够可靠地确保数据的完整性。因此,在安全性要求较高的场景下,MD5不再被推荐使用。

数字签名和加密算法通常使用更强大且安全性更高的哈希函数(如SHA-256)来确保数据的完整性和安全性。数字签名涉及使用私钥对数据的哈希值进行加密,以便验证数据的来源和完整性,而加密则是将数据转换为不可读的形式,只有持有相应私钥的人才能解密并获取原始数据。

2.SHA-256(Secure Hash Algorithm 256)

是一种密码学哈希函数,用于将输入数据转换为固定长度的哈希值。它在许多应用中用于验证数据的完整性和生成数字签名。以下是SHA-256加密的基本原理:

  1. 数据预处理

    • 首先,将输入数据进行填充,使其长度满足一定的要求。SHA-256使用的是Merkle-Damgård构造,数据被分成512位的块(64字节),每个块再分成16个32位字。如果数据的位数不是512的倍数,就需要进行填充。
  2. 初始化参数

    • 定义一组初始的256位(32字节)常数,作为算法的初始状态。这些常数是预先定义好的,用于初始化哈希计算的中间状态。
  3. 消息调度

    • 将数据块划分为64个字,每个字占32位。每次处理一个数据块时,会对这64个字进行操作。
  4. 消息扩展

    • 对消息调度的数据进行扩展,生成64个扩展字。这个过程涉及逻辑函数(逻辑运算:位运算和逻辑运算符)的使用,用于混淆和扩展数据。
  5. 迭代压缩

    • 使用64个扩展字和初始状态,进行64轮的迭代计算。每轮都涉及不同的逻辑运算,包括位运算、逻辑运算和条件运算。每轮的输出作为下一轮的输入。
  6. 输出

    • 在所有数据块都被处理完毕后,最后的迭代计算结果被合并,形成一个256位的哈希值(32字节)。这个哈希值就是SHA-256算法对输入数据的加密结果。

SHA-256的安全性基于其散列函数的复杂性,即使对于微小的输入变化,也会导致完全不同的哈希结果。这种性质使得SHA-256适用于验证数据的完整性,生成数字签名以及密码学等领域。然而,需要注意的是,SHA-256并不是加密算法,它是一个哈希函数,不可逆的转换数据,无法通过哈希值还原出原始数据。