计算机网络面试高频(HTTP和HTTPS)

HTTP和HTTPS

1 什么是Http协议⭐⭐⭐⭐

HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于在互联网上传输数据的‌应用层协议‌,主要用于浏览器与服务器之间的通信。它是万维网(WWW)的基础,定义了客户端(如浏览器)和服务器之间交换信息的格式和规则。

核心特点

‌1 无状态(Stateless)‌

每个HTTP请求都是独立的,服务器不会记录之前的请求信息。这种设计简化了服务器的处理逻辑,但需要通过额外的机制(如Cookie、Session)来实现用户状态的跟踪。

2‌ 基于请求-响应模型(Request-Response)‌‌

客户端发起请求‌:例如,浏览器输入网址后发送HTTP请求。‌

服务器返回响应‌:服务器处理请求后返回数据(如HTML页面、图片、JSON等)。

3 灵活可扩展‌

支持多种数据传输格式(文本、图片、视频等),可通过HTTP头部(Headers)扩展功能(如缓存控制、认证)。

‌4 无连接(早期)‌

早期的HTTP/1.0每次请求需建立新连接,完成后关闭。现代HTTP/1.1及以上版本支持‌持久连接(Keep-Alive)‌,允许多个请求复用同一连接,提升效率。

工作原理

  1. 建立连接‌:客户端通过TCP/IP(HTTP/3开始使用UDP)与服务器建立连接(默认端口80,HTTPS为443)。
  2. 发送请求‌:客户端发送请求报文(包含方法、URL、头部、正文等)。
  3. 处理请求‌:服务器解析请求并执行操作(如读取数据库、处理逻辑)。
  4. 返回响应‌:服务器发送响应报文(包含状态码、数据类型、正文等)。
  5. 关闭/复用连接‌:根据协议版本决定是否关闭或复用连接。

2 一次完整的HTTP请求所经历几个步骤?⭐⭐⭐⭐⭐

一次完整的 HTTP 请求,一般会历经以下五个关键步骤:

1. 建立 TCP 连接

  • DNS 解析:在浏览器输入网址后,第一步是进行 DNS 解析。这就好比我们要去一个地方,得先知道它的具体地址一样。浏览器会把像www.example.com这样的域名,通过 DNS 服务器转换成对应的 IP 地址。
  • 三次握手:接着,客户端(比如浏览器)会和服务器通过 TCP 协议来建立连接。这个过程就像是客户端和服务器在互相确认是否可以通信。客户端先发送一个 SYN 请求,服务器收到后回复 SYN + ACK,最后客户端再发送 ACK 确认。通过这三次 “对话”,连接就建立起来了。

2. 发送 HTTP 请求

  • 请求行:客户端会发送一个 HTTP 请求。请求行里包含了请求方法,常见的有 GET、POST 等,还有目标 URL 以及使用的 HTTP 版本,例如 HTTP/1.1。
  • 请求头:除了请求行,还有请求头。请求头里包含了一些额外的信息,比如 User - Agent,它能告诉服务器客户端的类型,像是什么浏览器;还有 Cookie,用于存储用户的会话信息等。
  • 请求体:如果是 POST 请求,还会有请求体。请求体里装的是要发送给服务器的数据。

3. 服务器处理请求

  • 路由匹配:服务器在接收到请求后,会对请求进行处理。首先会根据请求的 URL 来匹配对应的路由,找到相应的处理程序。
  • 逻辑处理:然后,服务器会执行相关的业务逻辑。比如查询数据库,获取用户需要的数据;或者进行文件读写操作等。
  • 生成响应:处理完业务逻辑后,服务器会生成 HTTP 响应。响应里包含了状态码,比如 200 表示请求成功,404 表示页面未找到;还有响应头,例如 Content - Type,它说明了响应内容的类型,是 HTML 还是 JSON 等;另外还有响应体,也就是实际返回的数据。

4. 返回 HTTP 响应

  • 状态行:服务器会把生成的响应返回给客户端。状态行里包含了 HTTP 版本、状态码以及状态描述,比如 “200 OK”。
  • 响应头:响应头同样包含一些重要信息,比如 Content - Length,它告诉客户端响应体的大小;还有 Set - Cookie,用于设置新的 Cookie。
  • 响应体:响应体就是客户端最终收到的数据,比如 HTML 页面、图片或者 JSON 数据等。

5. 关闭 TCP 连接

  • 四次挥手:在数据传输完成后,客户端和服务器会通过四次挥手来释放 TCP 连接。第一次挥手,客户端发送 FIN 请求关闭连接;第二次挥手,服务器回复 ACK 确认;第三次挥手,服务器发送 FIN 请求关闭连接;第四次挥手,客户端回复 ACK 确认。通过这四次操作,连接就关闭了。不过,在 HTTP/1.1 协议中,默认是开启 Keep - Alive 功能的,它允许在同一个 TCP 连接上进行多次请求,这样可以减少连接建立和关闭的开销。

整个过程可以用一个形象的比喻来理解,就像去餐厅点餐一样。客户端就像是顾客,服务器则像是餐厅。建立 TCP 连接就如同顾客找到餐厅并坐下;发送 HTTP 请求就好比顾客告诉服务员要点什么菜;服务器处理请求就像厨房开始做菜;返回 HTTP 响应就是服务员把做好的菜端给顾客;而关闭 TCP 连接就如同顾客吃完饭后离开餐厅。

3 Socket和http的区别和应用场景⭐⭐⭐

Socket(套接字): Socket是一种通用的网络编程接口,它提供了一种在计算机网络上进行通信的方式。Socket允许不同计算机之间的进程通过网络进行数据传输和交流。它提供了底层的数据传输功能,可以实现点对点的数据传输。

Socket的特点:

  • 基于传输层协议,如TCP或UDP。
  • 提供了底层的数据传输接口,可以直接读写数据。
  • 可以实现实时的双向数据传输。
  • 灵活性高,可以自定义通信协议。

Socket的应用场景: Socket适用于需要实时、双向通信的场景,例如实时聊天、实时游戏、视频流传输等。它可以在网络上直接传输数据,可以自定义通信协议,适用于各种特定需求的应用。

HTTP(超文本传输协议): HTTP是一种应用层协议,它建立在Socket之上,用于在Web上进行数据传输。HTTP是一种无状态、请求-响应的协议,客户端发送请求,服务器返回响应。HTTP通常使用TCP作为传输层协议。

HTTP的特点:

  • 基于请求-响应模型,客户端发送请求,服务器返回响应。
  • 使用URL来标识资源。
  • 无状态,每个请求都是独立的,服务器不会保留客户端的状态信息。
  • 支持多种请求方法,如GET、POST、PUT、DELETE等。

HTTP的应用场景: HTTP适用于客户端与服务器之间的通信,特别是在Web应用中。它用于在浏览器和服务器之间传输HTML页面、图像、视频、音频等资源。HTTP还广泛应用于RESTful API,用于实现不同系统之间的数据交换和通信。

4 HTTP协议的特点?⭐⭐⭐⭐⭐

  • HTTP允许传输任意类型的数据。传输的类型由Content-Type加以标记。
  • 无状态。对于客户端每次发送的请求,服务器都认为是一个新的请求,上一次会话和下一次会话之间没有联系。
  • 支持客户端/服务器模式。

5 什么是http的请求体?⭐⭐⭐⭐

HTTP的请求体(‌Request Body‌)是HTTP请求中用于携带客户端向服务器发送数据的部分,通常出现在需要传输数据的请求方法(如POST、PUT、PATCH等)中。它是HTTP报文的重要组成部分,位于请求头部(Headers)之后,与请求行(Request Line)和头部共同构成完整的请求。

请求体的核心作用

  • 传输数据‌:客户端通过请求体将数据发送给服务器,例如表单提交、上传文件、发送JSON数据等。
  • 支持复杂操作‌:用于创建、更新资源(如提交用户注册信息、修改数据库记录)。
  • 灵活的数据格式‌:支持多种数据格式(如JSON、XML、表单数据、二进制文件等)。

6 http的响应报文有哪些?⭐⭐⭐⭐

HTTP的响应报文由状态行(Status Line)、响应首部字段(Response Headers)、空行和响应体(Response Body)组成。

以下是HTTP响应报文的基本结构:

  1. 状态行(Status Line):包含了HTTP响应的状态码和对应的状态消息。状态行的格式为HTTP版本 状态码 状态消息,例如:HTTP/1.1 200 OK。常见的状态码包括:1xx:信息性状态码,表示请求正在处理2xx:成功状态码,表示请求已成功处理3xx:重定向状态码,表示需要进一步操作以完成请求4xx:客户端错误状态码,表示请求包含错误或无法完成请求5xx:服务器错误状态码,表示服务器无法完成请求
  2. 响应首部字段(Response Headers):包含了响应的附加信息,以键值对的形式出现。常见的响应首部字段包括:Content-Type:指定响应体的数据类型Content-Length:指定响应体的长度Server:指示响应的服务器软件信息Set-Cookie:设置响应的Cookie信息Cache-Control:指定响应的缓存控制策略Location:指示重定向的目标URLLast-Modified:指示资源的最后修改时间
  3. 空行:一个空行用于分隔响应首部字段和响应体。
  4. 响应体(Response Body):包含了服务器返回的实际数据内容。响应体的格式和内容取决于响应首部字段中的Content-Type以及服务器返回的数据。

7 HTTP报文格式⭐⭐⭐

HTTP请求由请求行、请求头部、空行和请求体四个部分组成。

  • 请求行:包括请求方法,访问的资源URL,使用的HTTP版本。GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
  • 请求头:格式为“属性名:属性值”,服务端根据请求头获取客户端的信息,主要有cookie、host、connection、accept-language、accept-encoding、user-agent。
  • 请求体:用户的请求数据如用户名,密码等。

8 HTTP 协议包括哪些请求?⭐⭐⭐⭐

HTTP协议中共定义了八种方法来表示对Request-URI指定的资源的不同操作方式,具体如下:

  • GET:向特定的资源发出请求。
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
  • OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
  • HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
  • PUT:向指定资源位置上传其最新内容。
  • DELETE:请求服务器删除Request-URI所标识的资源。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。
  • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

9 如何理解HTTP协议是无状态的⭐⭐⭐

HTTP 协议的无状态性是其核心设计特性之一,具体可从以下几个方面理解:

一、无状态的定义

** 无状态(Stateless)** 指服务器在处理客户端请求时,不会保留与之前请求相关的任何上下文信息。每个请求都是独立的,服务器无法通过当前请求推断出客户端的历史操作或状态。例如:

  • 用户首次访问网站时登录,服务器返回响应后关闭连接;
  • 当用户再次发送请求时,服务器无法识别该用户是否已登录,需重新验证身份。

二、设计原因

  1. 简化协议无状态设计避免了服务器维护客户端状态的开销,降低了协议复杂度,使 HTTP 更易于实现和扩展。
  2. 提高效率服务器无需为每个客户端保存状态,可快速处理大量并发请求,减少内存占用和计算资源消耗。
  3. 适应分布式环境在分布式系统中,无状态特性允许请求被任意服务器节点处理,无需共享状态数据,提升了系统的灵活性和容错性。

三、无状态的表现

  1. 独立请求每次 HTTP 请求包含完整的上下文信息(如 URL、请求头、参数等),服务器仅根据当前请求内容处理,与之前的请求无关。
  2. 无连接记忆HTTP1.1 虽支持持久连接(Keep-Alive),但连接的保持仅优化传输效率,服务器仍不保存请求间的状态。
  3. 无用户识别服务器无法通过请求本身识别客户端身份,需依赖额外机制(如 Cookie、Session)实现用户跟踪。

四、无状态的问题与解决方案

问题

  • 会话丢失:用户登录后跳转页面,服务器无法识别用户身份。
  • 重复数据传输:相同信息需在多次请求中重复携带(如认证信息)。

解决方案

  1. Cookie客户端存储:服务器通过Set-Cookie响应头向客户端发送状态数据(如用户 ID),客户端在后续请求中通过Cookie请求头回传。适用场景:保存用户偏好、自动登录等轻量级状态。
  2. Session服务器端存储:服务器为每个客户端分配唯一的Session ID,并将状态数据(如用户登录信息)存储在服务器内存或数据库中。关联方式:Session ID通过 Cookie 或 URL 参数传递给客户端,服务器根据Session ID查找对应状态。
  3. Token(如 JWT)无状态会话:客户端携带加密的 Token(包含用户信息),服务器通过验证 Token 实现状态识别,无需存储会话数据。

五、总结

  • 无状态的优势:协议简单、扩展性强、适合高并发场景。
  • 无状态的局限:需依赖额外机制(如 Cookie/Session)实现状态管理。
  • 实际应用:在 Web 开发中,无状态性与状态管理机制(如 Cookie+Session)结合,既保证了协议效率,又满足了业务需求。

10 HTTP长连接和短连接?⭐⭐⭐

HTTP短连接:浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。HTTP1.0默认使用的是短连接。

HTTP长连接:指的是复用TCP连接。多个HTTP请求可以复用同一个TCP连接,这就节省了TCP连接建立和断开的消耗。

HTTP/1.1起,默认使用长连接。要使用长连接,客户端和服务器的HTTP首部的Connection都要设置为keep-alive,才能支持长连接。

11 HTTP 如何实现长连接?⭐⭐⭐

HTTP分为长连接和短连接,本质上说的是TCP的长短连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才具有真正的长连接和短连接这一说法哈。

TCP长连接可以复用一个TCP连接,来发起多次的HTTP请求,这样就可以减少资源消耗,比如一次请求HTML,如果是短连接的话,可能还需要请求后续的JS/CSS。

如何设置长连接?

通过在头部(请求和响应头)设置Connection字段指定为keep-alive,HTTP/1.0协议支持,但是是默认关闭的,从HTTP/1.1以后,连接默认都是长连接。

12 HTTP长连接在什么时候会超时?⭐⭐⭐⭐

HTTP 长连接的超时机制旨在释放闲置资源、避免网络阻塞,其触发条件通常由服务器、客户端或中间设备的配置以及网络状态共同决定。以下是常见的超时场景及原因:

一、服务器端配置触发超时

  1. Keep-Alive 超时服务器通过配置参数(如KeepAliveTimeout)控制长连接的存活时间。若连接在指定时间内无数据交互,服务器会主动断开连接。示例:Nginx 的keepalive_timeout默认值为75s,Apache 的KeepAliveTimeout默认值为5s。
  2. 空闲连接清理服务器定期扫描并关闭长时间未使用的连接(如数据库连接池、HTTP 连接池的空闲超时)。示例:阿里云 Tair(Redis 兼容)通过timeout参数设置空闲连接超时时间,默认无限期保持。

二、客户端或中间设备设置超时

  1. 客户端超时配置客户端通过设置连接超时(connectTimeout)、读取超时(readTimeout)等参数控制请求生命周期。示例:Spring 的RestTemplate默认连接超时为 30 秒,读取超时为 30 秒。
  2. 中间设备限制防火墙(如 WAF)、CDN 或负载均衡设备可能设置超时规则。示例:阿里云 WAF 默认长连接超时为 120 秒,无数据交互时断开连接;CDN 回源超时默认 30 秒。

三、网络或系统异常导致超时

  1. 网络中断网络故障、路由错误或 DNS 解析失败会导致连接无法维持,触发超时。
  2. TCP Keep-Alive 机制内核通过tcp_keepalive_time(空闲时间)、tcp_keepalive_intvl(探测间隔)和tcp_keepalive_probes(重试次数)参数检测并关闭失效连接。默认值:Linux 系统默认tcp_keepalive_time为 7200 秒(2 小时)。

四、应用层逻辑触发超时

  1. 业务处理超时服务器在处理请求时若耗时过长(如复杂计算、数据库查询),可能主动终止连接。
  2. 资源耗尽服务器过载或连接池满时,会拒绝新连接或关闭旧连接以释放资源。

五、典型超时场景总结

场景

触发条件

服务器主动断开

配置的Keep-Alive超时或空闲连接清理策略生效。

客户端请求超时

客户端设置的connectTimeoutreadTimeout到期。

中间设备断开连接

WAF、CDN 等设备检测到长时间无数据交互。

网络异常

物理链路中断、DNS 解析失败或 TCP 握手失败。

内核级 TCP 连接清理

系统检测到连接无响应(通过tcp_keepalive机制)。

13 HTTP1.1和 HTTP2.0的区别?⭐⭐⭐

区别

HTTP 1.0

HTTP 1.1

持久连接

默认情况下,每个请求/响应都需要建立和关闭一个单独的连接

引入了持久连接,允许多个请求/响应复用同一个连接

流水线化

不支持

支持通过同时发送多个请求来提高效率

响应方式

响应无序,无法确定响应与请求的对应关系

引入了序号,以确保每个响应与其对应的请求一一对应

压缩

不支持

引入了gzip等压缩算法,以减少传输的数据量

缓存

有限的支持,靠Expires和Last-Modified字段来进行缓存控制

引入了更强大的缓存处理机制,包括Cache-Control和ETag字段等

Host字段

不支持

引入了Host字段,支持一台服务器上的多个虚拟主机,提供更好的多站点管理能力

错误处理

错误处理机制简单,主要通过响应状态码进行处理

引入了更多的状态码和错误处理机制,包括重定向、范围请求、条件请求等

安全性

不支持

引入了更强的安全机制,如基本认证、摘要认证、SSL/TLS等

14 常用HTTP状态码是怎么分类的,有哪些常见的状态码?⭐⭐⭐

100

Continue

服务器已接收到请求的初始部分,并且客户端应继续发送剩余的请求。

101

Switching Protocols

服务器已理解客户端的请求,并将通过Upgrade消息头通知客户端切换协议。

201

Created

请求已成功,并在服务器上创建了新资源。

204

No Content

服务器成功处理了请求,但没有返回任何实体内容。

206

Partial Content

服务器成功处理了部分GET请求,返回指定范围的实体内容。

301

Moved Permanently

被请求的资源已永久移动到新位置,新的URL在Location头中给出,浏览器应该自动地访问新的URL。301为永久重定向。

302

Found

请求的资源现在临时从不同的URL响应请求。302为临时重定向。

304

Not Modified

告诉浏览器可以从缓存中获取所请求的资源,没有发生改变。

400

Bad Request

请求报文存在语法错误,服务器无法理解。

401

Unauthorized

请求要求身份验证,客户端需要提供有效的身份凭据。

403

Forbidden

表示对请求资源的访问被服务器拒绝,客户端没有权限访问。

404

Not Found

表示在服务器上没有找到请求的资源,请求的URL不存在或者已删除。

500

Internal Server Error

表示服务器端在执行请求时发生了错误,可能是服务器程序出错或配置错误。

502

Bad Gateway

作为网关或代理服务器的服务器,从上游服务器接收到无效的响应。

503

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式/C++面试八股文 文章被收录于专栏

该专栏面向嵌入式开发工程师、C++开发工程师,包括C语言、C++,操作系统,ARM架构、RTOS、Linux基础、Linux驱动、Linux系统移植、计算机网络、数据结构与算法、数电基础、模电基础、5篇面试题目、HR面试常见问题汇总和嵌入式面试简历模板等文章。超全的嵌入式软件工程师面试题目和高频知识点总结! 另外,专栏分为两个部分,大家可以各取所好,为了有更好的阅读体验,后面会持续更新!!!

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务