计算机网络 基础面试第二弹

1. TCP三次握手和四次挥手

TCP三次握手的过程如下:

  1. 第一步(SYN):客户端向服务器发送一个带有SYN(同步)标志的TCP包,指示客户端希望建立连接。这个包包含一个随机的初始序列号(ISN)。

  2. 第二步(SYN-ACK):服务器收到客户端的SYN包后,会发送一个带有SYN和ACK(确认)标志的TCP包作为回应。服务器也会为自己选择一个初始序列号,并将客户端的初始序列号加一作为确认号。

  3. 第三步(ACK):客户端收到服务器的SYN-ACK包后,会发送一个带有ACK标志的TCP包作为确认。客户端将服务器的初始序列号加一作为确认号。

TCP四次挥手的过程如下:

  1. 第一步(FIN):当客户端决定关闭连接时,它发送一个带有FIN(结束)标志的TCP包给服务器,表示客户端不再发送数据。

  2. 第二步(ACK):服务器收到客户端的FIN包后,发送一个带有ACK标志的TCP包作为确认。服务器仍然可以发送数据给客户端,因为这个ACK只是确认收到了客户端的FIN。

  3. 第三步(FIN):当服务器也决定关闭连接时,它发送一个带有FIN标志的TCP包给客户端,表示服务器不再发送数据。

  4. 第四步(ACK):客户端收到服务器的FIN包后,发送一个带有ACK标志的TCP包作为确认。这个ACK告诉服务器,客户端已经接收到了服务器的FIN,连接可以安全关闭。

2. 为什么TCP需要三次握手而不是二次

  1. 确认双方的发送和接收能力:在进行握手之前,无法确定双方的发送和接收能力是否正常。通过三次握手,客户端和服务器都能确保对方能够接收自己发送的数据。如果只有两次握手,那么无法确认对方是否能够正常接收数据。

  2. 防止已失效的连接请求被接受:考虑这样一种情况,客户端发送了一个连接请求,但由于某种原因在网络中滞留,导致服务器没有收到该请求。如果只有两次握手,那么客户端会以为连接已经建立,但实际上服务器并不知道这个连接,这样会导致资源的浪费。通过三次握手,服务器可以确认客户端的请求是有效的,并避免处理无效的连接请求。

  3. 防止已失效的连接请求被重复打开:考虑这样一种情况,客户端发送了一个连接请求,服务器接收到并发送了确认,但由于网络问题,客户端没有收到服务器的确认。如果只有两次握手,客户端会重新发送连接请求,然后连接就建立了。而实际上,之前的连接请求已经到达服务器并得到了确认,这样就会导致重复打开相同的连接。通过三次握手,可以确保之前的连接已经失效,并避免重复打开连接。

总而言之,通过三次握手,TCP协议能够确保连接的可靠性和一致性,同时避免了因网络问题或延迟而导致的连接建立错误。

3. GET请求和 POST 请求的区别

  1. 数据传输方式:

    • GET请求:通过URL参数传输数据。参数以键值对的形式附加在URL的末尾,例如:http://example.com/path?param1=value1&param2=value2。GET请求将数据作为URL的一部分,因此在请求中可以直接看到传输的数据。
    • POST请求:通过请求体传输数据。数据被封装在请求的消息体中发送给服务器,而不是作为URL的一部分。因此,在请求中无法直接看到传输的数据。
  2. 数据传输安全性:

    • GET请求:由于数据暴露在URL中,因此在传输过程中可能被拦截和截取。这意味着敏感信息(例如密码)不应该以明文形式出现在GET请求的URL中。
    • POST请求:由于数据传输在请求体中,并且在传输过程中不可见,相对来说比GET请求更安全,适合传输敏感信息。
  3. 数据长度限制:

    • GET请求:由于数据通过URL参数传输,URL的长度是有限制的。不同的浏览器和服务器对URL长度的限制不同,但通常存在长度限制,超过限制可能导致截断或请求失败。
    • POST请求:由于数据传输在请求体中,没有明确的长度限制。但是,服务器和应用程序可能有对请求体大小的限制。
  4. 数据语义:

    • GET请求:GET请求通常用于获取资源或从服务器获取数据。它是幂等的,即多次相同的GET请求应该返回相同的结果,不会对服务器产生副作用。
    • POST请求:POST请求通常用于向服务器提交数据,用于创建、更新或修改资源。它可能会对服务器产生副作用,例如在数据库中创建新的记录。
  5. 缓存:

    • GET请求:由于GET请求的幂等性,响应可以被缓存。浏览器或代理服务器可以缓存GET请求的响应,以提高性能和减少网络流量。
    • POST请求:POST请求的响应默认情况下不会被缓存,因为POST请求可能会对服务器产生副作用,每次请求的结果可能不同。

4. 浏览器输入URL处理过程

  1. URL解析:浏览器会解析输入的URL,将其分解成不同的组成部分。这些部分包括协议(如HTTP或HTTPS)、主机名(如example.com)、端口号(如果指定了特定端口,默认为80或443)、路径(如/page)和查询参数(如?param1=value1)等。

  2. DNS解析:浏览器将主机名(例如example.com)发送给DNS(域名系统)服务器,以获取对应的IP地址。DNS服务器会返回一个或多个IP地址,浏览器会选择其中一个作为目标服务器的IP地址。

  3. 建立TCP连接:使用目标服务器的IP地址和指定的端口号,浏览器尝试建立与服务器的TCP连接。这涉及到三次握手过程,确保客户端和服务器之间的可靠连接。

  4. 发起HTTP请求:一旦建立了TCP连接,浏览器会构建HTTP请求消息。该消息包括请求方法(如GET或POST)、路径、查询参数、请求头(如User-Agent、Accept等)和请求体(对于POST请求)。然后,浏览器将该请求消息发送给服务器。

  5. 服务器处理请求:服务器接收到浏览器的请求后,会根据请求的路径和参数执行相应的处理逻辑。这可能涉及到读取文件、调用后端API、查询数据库等操作。

  6. 服务器发送响应:服务器根据请求的处理结果生成HTTP响应消息。响应消息包括状态码(如200表示成功、404表示未找到等)、响应头(如Content-Type、Content-Length等)和响应体(包含实际的数据或HTML内容等)。服务器将响应消息发送回浏览器。

  7. 接收和解析响应:浏览器接收到服务器的响应后,会根据响应头中的信息进行处理。这可能包括处理Cookie、缓存响应、解压缩响应等操作。同时,浏览器会解析响应体中的数据,如HTML内容、CSS样式表、JavaScript代码等。

  8. 渲染页面:一旦浏览器解析完响应体中的HTML、CSS和JavaScript,它会开始渲染页面。这包括将HTML解析为DOM树、应用CSS样式、执行JavaScript代码、加载和显示图像等操作。

  9. 关闭TCP连接:当浏览器完成页面渲染后,它会关闭与服务器的TCP连接。这是通过四次挥手过程完成的,确保双方都知道连接已经关闭。

5. HTTPS 实现原理

HTTPS(HyperText Transfer Protocol Secure)是在传输层上基于TLS/SSL协议的安全版本的HTTP协议。它使用加密和身份验证机制,确保在客户端和服务器之间传输的数据的保密性和完整性。下面是HTTPS的实现原理:

  1. 客户端发起连接请求:当用户在浏览器中输入HTTPS的URL时,浏览器会向服务器发起连接请求。这个请求是通过默认的HTTPS端口(通常为443)发送的。

  2. 服务器证书:服务器在回应客户端的连接请求时,会将自己的公钥和数字证书一起发送给客户端。数字证书是由受信任的证书颁发机构(CA)颁发的,用于验证服务器的身份。

  3. 客户端验证证书:客户端收到服务器的证书后,会验证证书的合法性。它会检查证书的有效性、是否由受信任的CA签发、是否过期等。如果证书验证通过,客户端可以继续与服务器建立安全连接;否则,会出现警告或错误提示。

  4. 客户端生成会话密钥:如果服务器的证书验证通过,客户端会生成一个随机的会话密钥,用于后续的对称加密通信。会话密钥是一个对称密钥,意味着它在客户端和服务器之间共享。

  5. 客户端发送加密请求:客户端会使用服务器的公钥对会话密钥进行加密,然后将加密后的会话密钥发送给服务器。这样,只有服务器能够解密会话密钥,确保了会话密钥的安全传输。

  6. 服务器解密会话密钥:服务器收到客户端发送的加密会话密钥后,使用自己的私钥对其进行解密,恢复得到原始的会话密钥。

  7. 客户端和服务器建立加密通信:客户端和服务器现在都拥有相同的会话密钥,它们使用对称加密算法来加密和解密通过网络传输的数据。这样,客户端和服务器之间的通信就变得安全起来,第三方无法轻易地获取或篡改传输的数据。

通过以上步骤,HTTPS实现了数据的加密和服务器身份的验证。它提供了端到端的安全性,确保敏感信息在传输过程中不被窃取或篡改。同时,HTTPS还可以防止中间人攻击,因为第三方无法轻易地解密和篡改通过SSL/TLS协议加密的数据。

6. 对称加密和非对称加密区别

  1. 密钥数量:

    • 对称加密:对称加密使用相同的密钥进行加密和解密。这意味着加密和解密双方需要共享相同的密钥。因此,对称加密只需要一个密钥。
    • 非对称加密:非对称加密使用一对密钥,分别是公钥和私钥。公钥用于加密数据,私钥用于解密数据。这意味着加密和解密使用的是不同的密钥。因此,非对称加密需要两个密钥。
  2. 加密和解密速度:

    • 对称加密:对称加密算法通常比非对称加密算法更快速和高效,因为加密和解密使用相同的密钥,算法较为简单。
    • 非对称加密:非对称加密算法相对较慢,因为加密和解密使用不同的密钥,算法较为复杂。
  3. 密钥分发:

    • 对称加密:在对称加密中,密钥需要在加密和解密双方之间进行安全地分发。这可能存在安全性问题,因为如果密钥在传输过程中被窃取,加密的数据也将不再安全。
    • 非对称加密:非对称加密中,公钥可以公开分发,而私钥必须保持机密。这样,无需在加密和解密双方之间共享私钥,提供了更好的密钥管理和分发的安全性。
  4. 安全性:

    • 对称加密:对称加密算法在加密和解密过程中使用相同的密钥,因此,如果密钥被泄露,加密的数据将容易受到攻击。对称加密的安全性依赖于密钥的保密性。
    • 非对称加密:非对称加密使用不同的密钥进行加密和解密,并且私钥必须保持机密。即使公钥被泄露,攻击者也无法轻易获取私钥,因此非对称加密提供了更高的安全性。