计算机网络面试高频(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),允许多个请求复用同一连接,提升效率。
工作原理
- 建立连接:客户端通过TCP/IP(HTTP/3开始使用UDP)与服务器建立连接(默认端口80,HTTPS为443)。
- 发送请求:客户端发送请求报文(包含方法、URL、头部、正文等)。
- 处理请求:服务器解析请求并执行操作(如读取数据库、处理逻辑)。
- 返回响应:服务器发送响应报文(包含状态码、数据类型、正文等)。
- 关闭/复用连接:根据协议版本决定是否关闭或复用连接。
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响应报文的基本结构:
- 状态行(Status Line):包含了HTTP响应的状态码和对应的状态消息。状态行的格式为HTTP版本 状态码 状态消息,例如:HTTP/1.1 200 OK。常见的状态码包括:1xx:信息性状态码,表示请求正在处理2xx:成功状态码,表示请求已成功处理3xx:重定向状态码,表示需要进一步操作以完成请求4xx:客户端错误状态码,表示请求包含错误或无法完成请求5xx:服务器错误状态码,表示服务器无法完成请求
- 响应首部字段(Response Headers):包含了响应的附加信息,以键值对的形式出现。常见的响应首部字段包括:Content-Type:指定响应体的数据类型Content-Length:指定响应体的长度Server:指示响应的服务器软件信息Set-Cookie:设置响应的Cookie信息Cache-Control:指定响应的缓存控制策略Location:指示重定向的目标URLLast-Modified:指示资源的最后修改时间
- 空行:一个空行用于分隔响应首部字段和响应体。
- 响应体(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)** 指服务器在处理客户端请求时,不会保留与之前请求相关的任何上下文信息。每个请求都是独立的,服务器无法通过当前请求推断出客户端的历史操作或状态。例如:
- 用户首次访问网站时登录,服务器返回响应后关闭连接;
- 当用户再次发送请求时,服务器无法识别该用户是否已登录,需重新验证身份。
二、设计原因
- 简化协议无状态设计避免了服务器维护客户端状态的开销,降低了协议复杂度,使 HTTP 更易于实现和扩展。
- 提高效率服务器无需为每个客户端保存状态,可快速处理大量并发请求,减少内存占用和计算资源消耗。
- 适应分布式环境在分布式系统中,无状态特性允许请求被任意服务器节点处理,无需共享状态数据,提升了系统的灵活性和容错性。
三、无状态的表现
- 独立请求每次 HTTP 请求包含完整的上下文信息(如 URL、请求头、参数等),服务器仅根据当前请求内容处理,与之前的请求无关。
- 无连接记忆HTTP1.1 虽支持持久连接(Keep-Alive),但连接的保持仅优化传输效率,服务器仍不保存请求间的状态。
- 无用户识别服务器无法通过请求本身识别客户端身份,需依赖额外机制(如 Cookie、Session)实现用户跟踪。
四、无状态的问题与解决方案
问题
- 会话丢失:用户登录后跳转页面,服务器无法识别用户身份。
- 重复数据传输:相同信息需在多次请求中重复携带(如认证信息)。
解决方案
- Cookie客户端存储:服务器通过Set-Cookie响应头向客户端发送状态数据(如用户 ID),客户端在后续请求中通过Cookie请求头回传。适用场景:保存用户偏好、自动登录等轻量级状态。
- Session服务器端存储:服务器为每个客户端分配唯一的Session ID,并将状态数据(如用户登录信息)存储在服务器内存或数据库中。关联方式:Session ID通过 Cookie 或 URL 参数传递给客户端,服务器根据Session ID查找对应状态。
- 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 长连接的超时机制旨在释放闲置资源、避免网络阻塞,其触发条件通常由服务器、客户端或中间设备的配置以及网络状态共同决定。以下是常见的超时场景及原因:
一、服务器端配置触发超时
- Keep-Alive 超时服务器通过配置参数(如KeepAliveTimeout)控制长连接的存活时间。若连接在指定时间内无数据交互,服务器会主动断开连接。示例:Nginx 的keepalive_timeout默认值为75s,Apache 的KeepAliveTimeout默认值为5s。
- 空闲连接清理服务器定期扫描并关闭长时间未使用的连接(如数据库连接池、HTTP 连接池的空闲超时)。示例:阿里云 Tair(Redis 兼容)通过timeout参数设置空闲连接超时时间,默认无限期保持。
二、客户端或中间设备设置超时
- 客户端超时配置客户端通过设置连接超时(connectTimeout)、读取超时(readTimeout)等参数控制请求生命周期。示例:Spring 的RestTemplate默认连接超时为 30 秒,读取超时为 30 秒。
- 中间设备限制防火墙(如 WAF)、CDN 或负载均衡设备可能设置超时规则。示例:阿里云 WAF 默认长连接超时为 120 秒,无数据交互时断开连接;CDN 回源超时默认 30 秒。
三、网络或系统异常导致超时
- 网络中断网络故障、路由错误或 DNS 解析失败会导致连接无法维持,触发超时。
- TCP Keep-Alive 机制内核通过tcp_keepalive_time(空闲时间)、tcp_keepalive_intvl(探测间隔)和tcp_keepalive_probes(重试次数)参数检测并关闭失效连接。默认值:Linux 系统默认tcp_keepalive_time为 7200 秒(2 小时)。
四、应用层逻辑触发超时
- 业务处理超时服务器在处理请求时若耗时过长(如复杂计算、数据库查询),可能主动终止连接。
- 资源耗尽服务器过载或连接池满时,会拒绝新连接或关闭旧连接以释放资源。
五、典型超时场景总结
场景 |
触发条件 |
服务器主动断开 |
配置的 |
客户端请求超时 |
客户端设置的 |
中间设备断开连接 |
WAF、CDN 等设备检测到长时间无数据交互。 |
网络异常 |
物理链路中断、DNS 解析失败或 TCP 握手失败。 |
内核级 TCP 连接清理 |
系统检测到连接无响应(通过 |
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++,操作系统,ARM架构、RTOS、Linux基础、Linux驱动、Linux系统移植、计算机网络、数据结构与算法、数电基础、模电基础、5篇面试题目、HR面试常见问题汇总和嵌入式面试简历模板等文章。超全的嵌入式软件工程师面试题目和高频知识点总结! 另外,专栏分为两个部分,大家可以各取所好,为了有更好的阅读体验,后面会持续更新!!!