HTTP

1. 什么是 HTTP? HTTP 和 HTTPS 的区别?

HTTP 是超文本传输协议,是一种用于在计算机网络上传输数据的协议。

HTTPS 跟 HTTP 相比:

  • 端口不一样:https 默认端口是 443,http 默认端口是 80

  • HTTPS 更安全

https 相比 http 多了一层 tls,会对传输内容进行加密。 https 还使用了证书。客户端会通过证书来验证服务器身份。

2. 为什么说 HTTPS 比 HTTP 安全? HTTPS 是如何保证安全的?

https 主要通过两方面来保证安全:

  1. 加密

https 同时使用了对称加密和非对称加密。

非对称加密用来加密主密钥,对称加密(主密钥)用来加密传输内容。

之所以这样处理是为了兼顾安全和效率。

非对称加密有公钥和私钥。公钥加密,私钥解密,更安全。但是加密效率低,速度慢。

对称加密加密和解密都是同一个秘钥。加密效率高,但是不够安全。

  1. 证书

客户端会通过服务端发送的证书来验证服务端的身份,一定程度上避免了中间人攻击。

3. 如何理解 UDP 和 TCP? 区别? 应用场景?

UDP(User Datagram Protocol)和 TCP(Transmission Control Protocol)都是在网络上进行数据传输的协议,但它们有着不同的特点和应用场景。

  1. UDP 协议

UDP 是一种面向无连接的协议,它不需要在发送数据之前先建立一个连接。它只是简单地将数据包从一个端点发送到另一个端点。UDP 不保证数据传输的可靠性和顺序,因此传输数据的过程中可能会出现数据丢失、重复、顺序错乱等问题。UDP 的应用场景包括:

  • 实时传输:由于 UDP 没有重传机制,所以它适用于需要实时传输的应用,例如语音和视频流。
  • 游戏:游戏通常需要快速的数据传输和低延迟,因此 UDP 常用于游戏服务器和客户端之间的通信。
  • 广播和多播:UDP 支持广播和多播传输方式,适用于需要将相同数据发送给多个接收器的场景,例如视频会议、在线广播等。
  1. TCP 协议

TCP 是一种面向连接的协议,它在发送数据之前必须先建立一个连接,然后再进行数据传输。TCP 提供了可靠的数据传输和顺序保证,因此它可以保证数据的完整性和准确性。TCP 的应用场景包括:

  • 文件传输:TCP 适用于需要准确传输大量数据的场景,例如文件传输、邮件传输等。
  • Web 浏览器:由于 Web 浏览器使用 HTTP 协议进行数据传输,而 HTTP 协议基于 TCP 协议,因此 TCP 是 Web 浏览器中最常用的协议之一。
  • 邮件传输:SMTP、POP3 和 IMAP 协议都使用 TCP 协议进行数据传输。

总的来说,UDP 和 TCP 协议各自具有不同的特点和应用场景。UDP 适用于需要快速传输、实时性要求高的应用场景,而 TCP 适用于需要可靠传输和顺序保证的应用场景。

4. 如何理解 OSI 七层模型?

OSI 七层模型是一个概念性的框架,用于描述计算机网络中不同层次的协议和功能。该模型分为七层,每一层都有不同的功能和协议,它们共同工作以实现网络通信。

下面是对每一层的简要描述:

  1. 物理层(Physical Layer):这一层是计算机网络中最底层的层次,它定义了数据的物理传输方式,例如电缆、光纤等。

  2. 数据链路层(Data Link Layer):这一层负责将数据转换成适合物理层传输的形式,并提供了错误检测和纠正功能。

  3. 网络层(Network Layer):这一层负责为数据包选择最佳的路径,将数据包从发送方传输到接收方。

  4. 传输层(Transport Layer):这一层提供端到端的数据传输服务,并确保数据传输的可靠性和顺序。

  5. 会话层(Session Layer):这一层负责建立、管理和终止会话(或连接)。

  6. 表示层(Presentation Layer):这一层负责数据的格式化、编码和解码等操作,以确保数据在不同计算机之间的互通性。

  7. 应用层(Application Layer):这一层包含了用户最终访问的应用程序,例如 Web 浏览器、电子邮件客户端等。

在 OSI 七层模型中,每一层的功能都相对独立,并且可以被单独实现或替换。该模型有助于网络工程师更好地理解计算机网络的结构和工作方式,从而更好地设计、管理和维护网络。

5. 如何理解 TCP/IP 协议?

TCP/IP 协议是计算机网络中最重要的协议之一,它是 Internet 使用的基本协议。TCP/IP 协议提供了一种可靠的、端到端的数据传输方式,使得不同的计算机可以在网络上进行通信和数据交换。

TCP/IP 协议是由两个协议组成的:TCP(Transmission Control Protocol)和 IP(Internet Protocol)。TCP 协议提供了可靠的数据传输服务,确保数据的准确性、完整性和顺序性。IP 协议则负责将数据包从一个网络传输到另一个网络,它提供了一种简单的、无连接的服务。

TCP/IP 协议是一个分层协议,它由四个层次组成,分别是:

  1. 应用层(Application Layer):这一层包含了各种应用程序,例如 Web 浏览器、电子邮件客户端等。

  2. 传输层(Transport Layer):这一层负责提供可靠的数据传输服务,其中最重要的协议是 TCP 协议和 UDP 协议。

  3. 网络层(Network Layer):这一层负责将数据包从一个网络传输到另一个网络,其中最重要的协议是 IP 协议。

  4. 数据链路层(Data Link Layer):这一层负责将数据转换成适合物理层传输的形式,并提供了错误检测和纠正功能。

TCP/IP 协议的优点在于它是一种开放的、标准化的协议,被广泛地应用于 Internet 和各种局域网、广域网中。它不仅能够支持不同类型的计算机和操作系统,还可以支持各种不同的应用程序和服务。因此,理解和掌握 TCP/IP 协议对于计算机网络工程师和网络管理员来说是非常重要的。

6. DNS 协议 是什么?说说 DNS 完整的查询过程?

DNS(Domain Name System)是一种用于将域名转换为 IP 地址的协议。

DNS 查询过程的完整过程如下:

  • 首先查询浏览器的 dns 缓存,缓存中维护一张域名与 IP 地址的对应表
  • 如果没有命中,则查询操作系统的 dns 缓存
  • 如果没有命中,操作系统将域名发给本地域名服务器。本地域名服务器会递归查询自己的 dns 缓存。
  • 如果还是没有命中,本地域名服务器会向根域名服务器发送请求,根域名服务器会返回顶级域名服务器的地址给本地域名服务器
  • 本地域名服务器向顶级域名服务器发送请求,返回权限域名服务器的地址给本地域名服务器
  • 本地域名服务器根据权限域名服务器的地址发送请求,得到该域名对应的 ip 地址
  • 本地域名服务器把 ip 返回给操作系统,并自己存储起来
  • 操作系统把 ip 返回给浏览器,并自己存储起来
  • 浏览器把 ip 存储起来

7. 如何理解 CDN?说说实现原理?

CDN(Content Delivery Network)即内容分发网络,是一种通过在全球多个地点部署缓存服务器,将静态或动态内容快速传输给用户的技术。CDN 可以有效地减少网络延迟和提高访问速度,提供更快、更可靠的服务。

CDN 的实现原理如下:

  1. 首先,CDN 服务提供商将全球各地的服务器部署到一些重要的地点,这些服务器通常被称为边缘节点。

  2. 当用户请求访问某个网站时,请求会首先被发送到最近的边缘节点,而不是直接发送到源站点。

  3. 如果边缘节点上已经缓存了用户请求的内容,则直接将内容返回给用户,从而避免了从源站点获取内容的延迟和网络拥堵。

  4. 如果边缘节点上没有缓存用户请求的内容,则边缘节点会将请求转发到源站点,然后将内容缓存到本地服务器上,以便以后更快地响应用户请求。

  5. 在用户访问期间,CDN 会根据用户的位置和网络连接状况,选择最合适的边缘节点来提供服务。

  6. 当源站点上的内容发生更改时,CDN 服务提供商会自动更新所有缓存的内容,以确保用户获取最新的内容。

CDN 的实现原理使得用户可以从最近的边缘节点获取内容,从而减少了延迟和网络拥堵。同时,CDN 还提供了多种优化技术,例如压缩、缓存、负载均衡等,从而进一步提高了访问速度和可靠性。

8. 说说 HTTP1.0/1.1/2.0 的区别?

http1.0

  • 默认短连接

http1.1

  • 默认开启 keep-alive,长连接。

  • 管线化,tcp 复用,同一个域名最多建立 6 个 tcp 连接。也就是说,同一时刻最多有 6 个 http 请求(并发)。

http2

  • 多路复用,使用二进制帧发送。一个域名只有一个 tcp 连接。这个 tcp 连接理论上可以承接任意多个 http 请求。

二进制帧,就是以二进制流的形式发送,并行发送。每个二进制帧都有序号,最后会通过序号来合并。

  • 头部压缩,减小传输的开销

  • 流量控制,根据网络动态调整传输速率,从而避免网络拥塞和数据包丢失。

9. 说说 HTTP 常见的状态码有哪些,适用场景?

HTTP 状态码是 Web 服务器在处理客户端请求时返回的 3 位数字代码,用于表示请求的处理结果。常见的 HTTP 状态码有以下几种:

1xx:信息性状态码。表示客户端的请求已经被服务器成功接收,需要继续处理。

2xx:成功状态码。表示服务器成功接收、理解并处理了客户端的请求。

  • 200 OK:表示请求已成功处理。
  • 201 Created:表示请求已经被创建。
  • 204 No Content:表示请求已经成功处理,但没有返回任何内容。

3xx:重定向状态码。表示需要客户端进一步操作才能完成请求。

  • 301 Moved Permanently:请求的资源已经永久移动到新的 URL 地址。
  • 302 Found:请求的资源已经暂时移动到新的 URL 地址。
  • 304 Not Modified:表示客户端请求的资源已经存在并且未被修改,可以直接使用缓存。

4xx:客户端错误状态码。表示客户端请求有误或无法被处理。

  • 400 Bad Request:请求语法错误或请求参数不正确。
  • 401 Unauthorized:需要用户验证。
  • 403 Forbidden:服务器拒绝执行请求。
  • 404 Not Found:请求的资源不存在。

5xx:服务器错误状态码。表示服务器在处理客户端请求时发生了错误。

  • 500 Internal Server Error:服务器内部错误。
  • 502 Bad Gateway:服务器充当网关或代理时从上游服务器收到无效响应。
  • 503 Service Unavailable:服务器当前无法处理请求,可能是由于超载或维护。

根据不同的状态码,可以判断出请求的处理结果,从而进行后续的操作。不同的状态码适用于不同的场景,需要根据具体的应用需求进行选择。

10. 说一下 GET 和 POST 的区别?

GET 和 POST 是 HTTP 协议中两种常见的请求方法。它们的区别如下:

  1. GET 请求方法用于请求数据,而 POST 请求方法用于提交数据。一般来说,GET 方法用于获取数据,而 POST 方法用于提交数据。

  2. GET 请求方法将请求参数附加在 URL 的末尾,而 POST 请求方法将请求参数放在请求体中。因此,GET 请求方法的请求参数会被浏览器缓存下来,而 POST 请求方法的请求参数则不会。

  3. GET 请求方法通常用于查询操作,而 POST 请求方法通常用于更新操作。因为 GET 请求方法的请求参数暴露在 URL 中,容易被攻击者利用。而 POST 请求方法的请求参数则相对安全。

  4. GET 请求方法的请求参数有长度限制,一般为 2048 个字符,而 POST 请求方法的请求参数没有长度限制。

  5. GET 请求方法的请求是幂等的,也就是说,多次发送相同的 GET 请求,服务器的响应不会改变。而 POST 请求方法的请求不是幂等的,也就是说,多次发送相同的 POST 请求,服务器的响应可能会改变。

综上所述,GET 请求方法用于获取数据,适用于查询操作,而 POST 请求方法用于提交数据,适用于更新操作。需要注意的是,在使用 GET 和 POST 请求方法时,应该遵循 HTTP 协议的规范和安全要求。

11. 说说 HTTP 常见的请求头有哪些? 作用?

HTTP 请求头是在 HTTP 请求中发送的一些信息,用于告知服务器客户端的一些信息,包括客户端使用的浏览器、用户代理等等。常见的 HTTP 请求头及其作用如下:

  1. User-Agent:指定客户端使用的浏览器或其他应用程序的类型和版本号,以便服务器能够根据不同的浏览器或应用程序返回不同的内容。

  2. Accept:指定客户端能够接受的 MIME 类型(即文件类型)和文件压缩格式,以便服务器返回适合客户端的内容。

  3. Host:指定服务器的域名和端口号,以便服务器能够正确地处理请求。

  4. Cookie:指定客户端的 Cookie,以便服务器能够识别客户端。

  5. Authorization:指定客户端使用的身份验证方法和凭证,以便服务器验证客户端的身份。

  6. Referer:指定客户端从哪个 URL 发起的请求,以便服务器能够追踪客户端的行为。

  7. Content-Type:指定请求体中的数据类型,以便服务器正确解析数据。

  8. Content-Length:指定请求体中的数据长度,以便服务器正确接收数据。

  9. If-Modified-Since:指定客户端上次请求资源的修改时间,以便服务器判断资源是否被修改过。

  10. Connection:指定客户端和服务器之间的连接类型,以便服务器能够正确处理连接。

HTTP 请求头的作用是告诉服务器一些有关客户端的信息,使得服务器能够根据不同的客户端信息返回不同的响应内容。同时,它还能够帮助服务器更好地处理请求,提高 Web 应用程序的性能和安全性。

12. 说说地址栏输入 URL 敲下回车后发生了什么?

  1. DNS 解析:浏览器首先会对输入的 URL 进行解析,得到其中的域名部分。然后,浏览器会向本地 DNS 服务器发送 DNS 查询请求,查询该域名对应的 IP 地址。如果本地 DNS 服务器中没有该域名对应的缓存记录,则会向更高级别的 DNS 服务器查询,直到找到该域名对应的 IP 地址为止。

  2. 建立 TCP 连接:一旦浏览器获取到了目标服务器的 IP 地址,它会尝试与该服务器建立 TCP 连接。这个过程称为“三次握手”,具体地,浏览器会发送一个 SYN 报文给服务器,服务器回复一个 SYN-ACK 报文给浏览器,最后浏览器再回复一个 ACK 报文给服务器,从而建立了连接。

  3. 发送 HTTP 请求:一旦建立了 TCP 连接,浏览器就会向服务器发送一个 HTTP 请求报文,报文中包含了请求的方法、URL、协议版本、请求头等信息。

  4. 服务器处理请求并返回响应:一旦服务器接收到了浏览器发送的请求,它会根据请求报文中的信息进行处理,并生成一个 HTTP 响应报文,报文中包含了状态码、响应头、响应体等信息。

  5. 浏览器解析响应并渲染页面:一旦浏览器接收到了服务器返回的响应,它会对响应报文进行解析,并渲染出页面。具体地,浏览器会解析 HTML、CSS、JavaScript 等内容,并将它们组合起来呈现给用户。

总之,在地址栏中输入 URL 并按下回车后,浏览器会通过 DNS 解析、建立 TCP 连接、发送 HTTP 请求、服务器处理请求并返回响应、浏览器解析响应并渲染页面等一系列步骤,最终将网页展示给用户。

13. 说说 TCP 为什么需要三次握手和四次挥手?

TCP 作为一种面向连接的可靠传输协议,需要在建立连接和断开连接的过程中保证数据的可靠性和完整性。因此,TCP 协议需要进行三次握手和四次挥手来确保连接的可靠性。

三次握手的过程如下:

  1. 客户端向服务器发送一个 SYN 报文,表示请求建立连接,并随机生成一个初始序列号。
  2. 服务器接收到 SYN 报文后,发送一个 SYN-ACK 报文,表示收到请求并同意建立连接,同时也随机生成一个初始序列号。
  3. 客户端接收到 SYN-ACK 报文后,再发送一个 ACK 报文,表示确认收到服务器的响应,并将服务器的初始序列号加一作为自己的初始序列号。此时,连接建立成功,双方可以开始传输数据。

三次握手的目的是为了确保双方都具备发送和接收数据的能力,并且可以相互知道对方的初始序列号,从而确保数据的可靠传输。

四次挥手的过程如下:

  1. 客户端向服务器发送一个 FIN 报文,表示要关闭连接。
  2. 服务器接收到 FIN 报文后,发送一个 ACK 报文,表示收到请求并同意关闭连接。此时,服务器进入 CLOSE_WAIT 状态,等待可能存在的数据传输完成。
  3. 服务器数据传输完成后,向客户端发送一个 FIN 报文,表示服务器也要关闭连接。
  4. 客户端接收到 FIN 报文后,发送一个 ACK 报文,表示收到请求并同意关闭连接。此时,客户端进入 TIME_WAIT 状态,等待可能存在的数据传输完成。服务器接收到 ACK 报文后,关闭连接。

四次挥手的目的是为了确保双方都能够完整地传输数据并关闭连接。在挥手过程中,双方需要等待对方的响应,从而确保数据的可靠性和完整性。同时,双方需要在关闭连接之前等待一定的时间,以防止后续的数据包在传输过程中出现延迟或丢失,从而确保数据的可靠传输。

14. 说说对 WebSocket 的理解?应用场景?

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它允许客户端和服务器之间进行实时的双向数据传输,同时也提供了更加灵活的交互方式和更高效的数据传输方式。相比传统的 HTTP 协议,WebSocket 可以降低网络延迟和带宽占用,同时也更加容易实现推送和即时通信等功能。

在 WebSocket 中,客户端和服务器之间会建立一个长连接,通过该连接可以实时地传输数据,同时也可以进行双向通信。与 HTTP 协议不同,WebSocket 不需要经过多次握手和数据传输的过程,因此可以降低网络延迟和带宽占用。

WebSocket 的应用场景非常广泛,其中包括但不限于以下几个方面:

  1. 即时通讯:WebSocket 可以实现即时通讯的功能,如在线聊天、在线游戏等。

  2. 实时数据传输:WebSocket 可以实现实时数据传输的功能,如实时股票行情、实时天气等。

  3. 推送服务:WebSocket 可以实现推送服务的功能,如新闻推送、广告推送等。

  4. 远程协作:WebSocket 可以实现远程协作的功能,如远程控制、远程教育等。

总之,WebSocket 可以广泛应用于需要实时数据传输和双向通信的场景,为客户端和服务器之间的交互带来更高效和更灵活的方式。

cookie 里是一个个键值对,最大存储只有 4KB。并且是紧跟域名的。 我们可以通过设置请求的 credentials 为 true,来发送 cookie 到服务端。服务端也可以修改 cookie。 cookie 主要字段有键值对,domain,path,expires,max-age,secure,httpOnly.这些。

由于 cookie 是明文的,因此请求被截获存在安全问题。因此避免 token 中放置敏感信息。

session 也就是会话。一般是基于 cookie 来实现。登录成功后,服务器返回一个 sessionId,然后每次请求都通过 cookie 将 sessionId 传回服务器。问题就是如果是服务器集群,那么每个服务器都要保留有 sessionId 到用户的映射列表。浪费资源。

然后就有了 JWT。就是使用登录成功后,服务器返回一个 token,token 中是加密的用户信息。然后浏览器把 token 存储在本地(一般是通过 localStorage),让后每次请求把 token 塞到请求头里。这样服务器就能判断客户端身份。

虽然 JWT 加密了用户信息,但是如果截获了 token,就能够冒充用户进行操作。所以最好配合 https 使用。

使用 https 也不是绝对安全,因为还可能存在中间人攻击。中间人就类似中介,向服务器冒充用户,用户端冒充服务器。

16. web 常见的攻击方式有哪些?如何防御?

Web 应用程序常见的攻击方式包括:

  1. SQL 注入攻击:攻击者通过在输入框中注入恶意 SQL 代码,从而执行未经授权的数据库操作。

  2. XSS 攻击:攻击者通过在 Web 页面中注入恶意脚本代码,从而获取用户的敏感信息或者在用户浏览器中执行任意操作。

  3. CSRF 攻击:攻击者通过伪造用户的请求,从而利用用户的身份进行未经授权的操作。

  4. 文件上传漏洞:攻击者通过上传恶意文件,从而执行任意代码或者获取系统权限。

  5. 逻辑漏洞:攻击者通过利用程序逻辑错误,从而达到未经授权的访问或者操作。

防御这些攻击的方法包括:

  1. SQL 注入攻击:使用参数化查询或存储过程,避免直接拼接 SQL 语句;过滤用户输入,避免特殊字符注入。

  2. XSS 攻击:使用 HTML 编码或者转义用户输入,避免恶意脚本执行;设置 HttpOnly 标志,避免恶意脚本获取用户 Cookie。

  3. CSRF 攻击:使用随机 token 或者验证码,避免伪造用户请求;检查 Referer 头,避免跨站点请求伪造。

  4. 文件上传漏洞:限制上传文件的类型和大小,避免上传恶意文件;对上传文件进行恶意代码扫描,避免执行恶意代码。

  5. 逻辑漏洞:对程序逻辑进行安全审计,避免存在漏洞;使用访问控制和权限控制,避免未经授权的访问和操作。