【计网】01.分层模型、HTTP
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
计算机网络
与【Linux应用编程中Linux网络编程】部分一起看
分层模型
01.画出OSI和TCP/IP协议栈的对应关系
对应关系记忆2113
02.什么是OSI七层模型?每层列举2个协议。
-
物理层:
-
传输单位为bit
-
功能:通过物理媒介透明的传输比特流,确定机械及电气规范
-
主要包括的协议为:IEE802.3 CLOCK RJ45
-
-
数据链路层:
- 传输单位为帧
- 功能:将网络层传来的IP数据包封装成帧,标识网络中各主机。功能概括为封装成帧、差错检测、流量控制和传输管理
- 主要包括的协议为:MAC VLAN PPP ARP协议、RARP协议
-
网络层:
- 传输单位为数据报
- 功能:负责数据包从源端到目的端的传递和网际互连。关键问题是网络和主机的编址问题和对分组进行路由选择,实现流量控制、拥塞控制、差错控制和网际互联。
- 主要包括的协议为:IP协议、ICMP协议
-
传输层:
-
传输单位为报文
-
功能:负责主机中两个进程间的通信,提供端到端的可靠报文传递和错误恢复。为端到端连接提供流量控制、差错控制、服务质量和数据传输管理。
-
主要包括的协议为:TCP UDP
-
-
会话层:
-
传输单位为SPDU
-
功能:建立、管理和终止会话,运行不同主机的各个进程之间进行会话。
-
主要包括的协议为:RPC NFS
-
-
表示层:
-
传输单位为PPDU
-
功能:处理在两个通信系统中交换信息的表示方式,对数据进行翻译、加密和压缩。
-
主要包括的协议为:JPEG ASII
-
-
应用层:
- 传输单位为APDU,
- 功能:为特定类型的网络应用提供访问允许访问OSI环境的手段
- 主要包括的协议为:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议。
记忆:物链网,传话实用
03.ARP协议在哪层?
ARP协议负责将IP地址解析为MAC地址,以便在局域网上进行通信。
- 在OSI模型中ARP协议属于第二层数据链路层。ARP协议将IP地址解析为物理地址(如MAC地址),以便在局域网上进行直接通信。
- 而在TCP/IP模型中,ARP协议属于第三层网络层。ARP协议将IP地址解析为下一跳路由器的物理地址,以便将数据包路由到目的地。
04.OSI七层模型中表示层和会话层功能是什么?
表示层(Presentation Layer):
表示层主要负责数据的编码和格式化,以确保不同系统间的数据传输能够正确地进行解释和使用。表示层的主要任务包括以下几个方面:
- 数据格式转换:将数据从一种格式转换为另一种格式,例如将ASCII码转换为EBCDIC码,视频编码解。
- 数据加密和解密:在数据传输过程中,表示层可以对数据进行加密和解密,以保证数据的安全性。
- 数据压缩和解压缩:表示层可以对数据进行压缩和解压缩,以减少数据传输的带宽和传输时间。
- 数据描述:表示层可以对数据进行描述,例如定义数据的结构、数据类型和编码方式等。
会话层(Session Layer):
会话层负责建立、管理和终止两个系统之间的会话。会话层的主要任务包括以下几个方面:
- 建立会话:会话层可以建立会话,并确定会话的类型、时长和规则。session认证、断点续传等。
- 管理会话:会话层可以管理会话的过程,例如控制数据传输的方向和流量、检测错误和恢复传输等。
- 终止会话:会话层可以正常或异常地终止会话,例如在完成数据传输后或发生错误时终止会话。
05.为何需要把 TCP/IP 协议栈分成 5 层(或7层)?
- 更好的可维护性:将协议栈按照不同的层次进行分层,可以使每一层的功能更加清晰明确,从而更容易进行维护和管理。
- 更好的可扩展性:分层的协议栈可以更容易地进行扩展和改进。如果需要增加新的协议或修改现有的协议,只需要在相应的层次进行修改即可,而不会影响到其他层次的功能。
- 更好的可移植性:按照层次进行分层,可以使不同的协议栈在不同的平台上进行移植更加容易。例如,在不同的操作系统或硬件平台上,只需要实现相应的层次,而不需要重写整个协议栈。
- 更好的互操作性:分层的协议栈可以更容易地与其他协议栈进行互操作。因为每个层次都有明确的功能和接口,所以不同的协议栈可以通过相应的接口进行交互,从而实现互操作。
06.应用层常见协议?
HTTP | 超文本传输协议 | 80 | TCP |
HTTPS | 超文本传输安全协议 | 443 | TCP |
Telnet | 远程登录服务的标准协议 | 23 | TCP |
FTP | 文件传输协议 | 20传输和21连接 | TCP |
SMTP | 简单邮件传输协议(发送用) | 25 | TCP |
POP3 | 邮局协议(接收用) | 110 | TCP |
DNS | 域名解析服务 | 53 | 服务器间进行域传输的时候用TCP,客户端查询DNS服务器时用 UDP |
TFTP | 简单文件传输协议 | 69 | UDP |
SNMP | 简单网络管理协议 | 161 | UDP |
07.传输层常见协议
TCP | 传输控制协议(Transmission Control Protocol) | 是一种面向连接的、可靠的、基于字节流的传输层通信协议。 |
UDP | 用户数据报协议(User Datagram Protocol) | 是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 |
08.网络层常见协议?
IP | 网际协议 | IP协议不但定义了数据传输时的基本单元和格式,还定义了数据报的递交方法和路由选择 |
ICMP | 网络控制报文协议 | ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性,是ping和traceroute的工作协议 |
RIP | 路由信息协议 | 使用“跳数”(即metric)来衡量到达目标地址的路由距离 |
IGMP | 网络组管理协议 | 用于实现组播、广播等通信 |
09.数据链路层常见协议?
ARP | 地址解析协议 | 根据IP地址获取物理地址 |
RARP | 反向地址转换协议 | 根据物理地址获取IP地址 |
PPP | 点对点协议 | 主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案 |
MAC | Media Access Control Address,直译为媒体存取控制位址,也称为局域网地址、以太网地址或物理地址 | MAC 地址作为数据链路设备的地址标识符,需要保证网络中的每个 MAC 地址都是唯一的,才能正确识别到数据链路上的设备 |
10.路由器、交换机、集线器的区别?
-
路由器工作在网络层,根据网络层提供的信息(IP地址)来选择路由。
-
交换机工作在数据链路层,通过数据链路层提供的信息(MAC地址)来选择端口。
-
集线器工作在物理层,只对信号进行整形、放大后再重发(广播给其他所有端口)。
应用层HTTP
协议名词释义 协议(protocol):通信双方需要遵守的统⼀规则。 HTTP: Hyper Text Transfer Protocol:超文本传输协议 HTTPS: Hyper Text Transfer Protocol Secure:超文本安全传输协议 SSL: Secure Socket Layer 安全套接字 TSL: Transport Layer Security 安全传输层协议 HTTPS = HTTP+SSL/TSL
session、token和cookie概念 Session:会话,浏览器与服务器的一次会话,不同的用户对服务器发起的会话不是同一个会话。同一用户在会话结束后,重新发起的会话也不是同一个会话
Token:令牌,是服务器对用户的身份校验。用户将Token信息发送到服务器上,与服务器计算生成的结果吻合,代表用户是合法用户
Cookie:保存在用户主机上的浏览器信息,用户某次访问若保存了一些信息(一般以KV形式保存),下次再访问同一个网站时,浏览器就会将保存的Cookie一同发送过去
URL:uniform resolution locator,统⼀资源定位符,定位互联网上资源(俗称网址) DNS:domain name system/server,域名解析服务器 IP:internet protocol address,互联网上的每个网络和每台主机分配一个逻辑地址
HTTP
11.什么是http协议?
HTTP(Hypertext Transfer Protocol)超文本传输协议是一种应用层协议,它是用于在计算机网络之间传输超文本(HTML 文件,图片文件,查询结果等)的标准。
HTTP协议的作用是定义了客户端(如浏览器)和服务器之间交换的数据格式和方式。当用户在浏览器中输入URL时,浏览器会使用HTTP协议向服务器发送请求,服务器会根据请求返回相应的数据,浏览器再将数据展示给用户。
HTTP协议的数据格式基于请求-响应模型。客户端向服务器发送请求,请求包含了要访问的资源的URL以及其他的一些信息,服务器则返回响应,响应包含了请求的资源和其他的一些信息。HTTP协议还支持一些其他的功能,如缓存、认证、安全等。
12.http请求报文与响应报文格式
http报文由三个部分组成:
-
对报文进行描述的起始行(start line)
-
包含属性的首部(header)块,
-
可选的、包含数据的主体(body)部分。
起始行和首部就是由行分隔的 ASCII 文本。每行都以一个由两个字符组成的行终止序列作为结束,其中包括一个回车符(ASCII 码 13)和一个换行符(ASCII 码 10)。这个行终止序列可以写做 CRLF。需要指出的是,尽管 HTTP 规范中说明应该用CRLF 来表示行终止,但稳健的应用程序也应该接受单个换行符作为行的终止。有些老的,或不完整的 HTTP 应用程序并不总是既发送回车符,又发送换行符。
一、请求报文
HTTP请求报文分为三部分,有请求行、请求头部、请求数据。
1.请求行(HTTP请求报文的第一行)
请求行包括了方法,url,以及http协议版本。这三个字段之间由空格符分隔。例如:
POST /api/post HTTP/1.1
其中,方法字段严格区分大小写,当前HTTP协议中的方法都是大写,方法字段介绍如下:
- 【方法字段】
①GET:请求获取Request-URI(URI:通用资源标识符,URL是其子集,URI注重的是标识,而URL强调的是位置,可以将URL看成原始的URI),所标识的资源
②POST:在Request-URI所标识的资源后附加新的数据;支持HTML表单提交,表单中有用户添入的数据,这些数据会发送到服务器端,由服务器存储至某位置(例如发送处理程序)
③HEAD:请求Request-URI所标识的资源响应消息报头,HEAD方法可以在响应时不返回消息体。
④PUT:与GET相反,请求服务器存储一个资源,并用Request-URI做为其标识;例如发布系统。
⑤DELETE:请求删除URL指向的资源
⑥OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项
⑦TRACE:跟踪请求要经过的防火墙、代理或网关等,主要用于测试或诊断
⑧CONNECT保留将来使用
- 【URL】
一个完整的包括类型、主机名和可选路径名的统一资源引用名,如:http://www.example.com/path/to/file.html
- 【版本】
报文使用的HTTP协议版本
2.请求头部:位于请求行的下面
请求报文中常见的标头有:
Connetion标头(连接管理)、Host标头(指定请求资源的主机)、Range标头(请求实体的字节范围)、User-Agent标头(包含发出请求的用户信息)、Accept标头(首选的媒体类型)、Accept-Language(首选的自然语言)
- 【通用首部:请求和响应都可以使用的】;
这些是客户端和服务器都可以使用的通用首部。可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能。
Connection:允许客户端和服务器指定与请求 / 响应连接有关的选项,Connection: keep-alive
Date5:提供日期和时间标志,说明报文是什么时间创建的
Via: 显示了报文经过的中间节点
Cache-Control: 缓存指示
- 【请求首部】:
从名字中就可以看出,请求首部是请求报文特有的。它们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据。
Host: 请求的主机名和端口号,虚拟主机环境下用于不同的虚拟主机
Referer:指明了请求当前资源的原始资源的URL
User-Agent: 用户代理,使用什么工具发出的请求
1、Accept首部:用户标明客户自己更倾向于支持的能力
Accept: 指明服务器能发送的媒体类型
Accept-Charset: 支持使用的字符集
Accept-Encoding: 支持使用的编码方式
Accept-Language: 支持使用语言
2、条件请求首部:
Expect: 告诉服务器能够发送来哪些媒体类型
If-Modified-Since: 是否在指定时间以来修改过此资源
If-None-Match:如果提供的实体标记与当前文档的实体标记不符,就获取此文档
跟安全相关的请求首部:
Authorization: 客户端提交给服务端的认证数据,如帐号和密码
Cookie: 客户端发送给服务器端身份标识。客户端用它向服务器传送一个令牌——它并不是真正的安全首部,但确实隐含了安全功能
Cookie2:用来说明请求端支持的 cookie 版本
- 【实体首部:用于指定实体属性】
实体首部指的是用于应对实体主体部分的首部。比如,可以用实体首部来说明实体主体部分的数据类型。实体首部提供了有关实体及其内容的大量信息,从有关对象类型的信息,到能够对资源使用的各种有效的请求方法。总之,实体首部可以告知报文的接收者它在对什么进行处理。
实体主体用于POST方法中。用户向Web服务器提交表单数据的时候,需要使用POST方法,此时主体中包含用户添写在表单的各个属性字段的值,当Web服务器收到POST方法的HTTP请求报文后,可以从实体中取出需要的属性字段的值。
也就是说,当用户通过Web浏览器向Web服务器发送请求时,Web浏览器会根据用户的具体请求来选择不同的HTTP请求方法,再将相应的URL和HTTP协议版本及相关的标头填入头部行中,若是POST方法,还会将相关的表单数据填入实体主体中,产生一个HTTP请求报文,然后将这个报文发送给Web服务器。
Location: 资源的新位置
Allow: 允许对此资源使用的请求方法
1、内容首部:
Content-Encoding:支持的编码
Content-Language:支持的自然语言
Content-Length:文本长度
Content-Location:资源所在位置
Content-Range:在整个资源中此实体表示的字节范围
Content-Type:主体的对象类型
2、缓存首部:
ETag: 实体标签
Expires: 过期期限
Last-Modified: 上一次的修改时间
3.请求数据
报文的主体(或者就称为主体)是一个可选的数据块。与起始行和首部不同的是,主体中可以包含文本或二进制数据,也可以为空。
二、响应报文
HTTP响应报文同样也分为三部分,有状态行、首部行、实体。
1.状态行(HTTP响应报文的第一行)
响应行包括了http协议版本,响应状态码以及原因短语。这三个字段之间由空格符分隔,例如:
HTTP/1.1 200 OK
- 【状态码】:
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 客户端错误,服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器错误,处理请求出错 |
2.首部行(响应首部)(位于响应报文状态行之后)
响应报文有自己的响应首部集。响应首部为客户端提供了一些额外信息,比如谁在发送响应、响应者的功能,甚至与响应相关的一些特殊指令。这些首部有助于客户端处理响应,并在将来发起更好的请求。
Date标头:消息产生的时间
Age标头:(从最初创建开始)响应持续时间
Server标头: 向客户端标明服务器程序名称和版本
ETage标头:不透明验证者
Location标头:URL备用的位置
Content-Length标头:实体的长度
Content-Tyep标头:实体的媒体类型
协商首部:
Accept-Ranges: 对当前资源来讲,服务器所能够接受的范围类型
Vary: 首部列表,服务器会根据列表中的内容挑选出最适合的版本发送给客户端
跟安全相关的响应首部:
Set-Cookie: 服务器端在某客户端第一次请求时发给令牌
WWW-Authentication: 质询,即要求客户提供帐号和密码
3.实体(位于首部行之后)
实体包含了Web客户端请求的对象。Content-Length标头及Content-Type标头用于计算实体的位置、数据类型和数据长度。当Web服务器接收到Web客户端的请求报文后,对HTTP请求报文进行解析,并将Web客户端的请求的对象取出打包,通过HTTP响应报文将数据传回给Web客户端,如果出现错误则返回包含对应错误的错误代码和错误原因的HTTP响应报文。
13.HTTP请求和响应报文有哪些主要字段?
请求报文
- 请求行:Request Line
- 请求头:Request Headers
- 请求体:Request Body
响应报文
- 状态行:Status Line
- 响应头:Response Headers
- 响应体:Response Body
14.http协议版本http1.1和http1.0的区别?
HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而 HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议。 主要区别主要体现在:
-
缓存机制不同
HTTP 1.1 引入了缓存控制机制,使得客户端和服务器可以更好地控制缓存的使用。HTTP 1.1 中的缓存控制机制包括强缓存和协商缓存两种,而 HTTP 1.0 中只有简单的过期时间控制。
-
持久连接
HTTP 1.1 支持持久连接(也称为 HTTP keep-alive),即客户端与服务器之间的 TCP 连接可以被重用,从而避免了每个请求都要建立新的连接的开销。HTTP 1.0 中则默认不支持持久连接。
-
分块传输编码
HTTP 1.1 引入了分块传输编码,使得服务器可以动态地生成响应内容,而不需要事先知道响应数据的大小。HTTP 1.0 中则只能使用 Content-Length 头部来指定响应数据的大小。
-
范围请求
HTTP 1.1 支持范围请求,使得客户端可以请求服务器发送指定范围的数据。HTTP 1.0 中则不支持范围请求。
-
Host 头部
HTTP 1.1 中的每个请求和响应都必须包含 Host 头部,这个头部用来指示服务器的主机名和端口号。HTTP 1.0 中没有 Host 头部。
15.http2.0与http1.1和http1.0的区别
-
传输方式
HTTP/1.0 和 HTTP/1.1 使用的是文本格式的传输方式,即通过文本协议来传输数据,而 HTTP/2.0 使用的是二进制格式的传输方式。
-
多路复用
HTTP/1.0 和 HTTP/1.1 只能同时处理一个请求,需要等待前一个请求完成后才能处理下一个请求。而 HTTP/2.0 引入了多路复用的概念,可以同时处理多个请求,提高了传输效率。
-
请求优先级
HTTP/1.0 和 HTTP/1.1 没有提供请求优先级的机制,所有请求都是平等的。而 HTTP/2.0 可以通过设置请求的优先级,使得服务器优先处理重要的请求。
-
压缩方式
HTTP/1.0 和 HTTP/1.1 使用的是 gzip 压缩格式,而 HTTP/2.0 引入了 HPACK 压缩格式,可以更好地压缩请求和响应头部。
-
服务器推送
HTTP/1.0 和 HTTP/1.1 不能主动向客户端推送资源,需要客户端发送请求才能获取资源。而 HTTP/2.0 可以通过服务器推送机制,主动向客户端推送资源,提高了加载速度。
16.举例HTTP2.0并发传输的例子
假设我们有一个 Web 应用程序,页面中包含了 5 个资源,每个资源的大小为 1MB,服务器支持 HTTP/2 协议。现在我们使用浏览器访问该页面,HTTP/2 协议会建立一个连接,并同时发送 5 个请求,每个请求对应一个资源。由于 HTTP/2 支持多路复用,因此这 5 个请求可以在同一个连接上并行传输。
当这 5 个请求到达服务器时,服务器会对这些请求进行处理,并将这些资源打包成一个 HTTP/2 的数据帧(Frame)并发送回客户端。由于 HTTP/2 使用了头部压缩和二进制协议,因此传输效率更高,数据传输速度更快。客户端接收到这些数据帧后,会对这些数据进行解析,并显示在页面中。
通过 HTTP/2 的并发传输特性,我们可以在一个连接上同时传输多个资源,减少了建立连接的开销,提高了数据传输的效率,从而提升了 Web 应用程序的性能和用户体验。
17.HTTP怎么传输图片?
在HTTP中,图片通常以二进制数据的形式传输。以下是一种常见的方法来传输图片:
-
首先,将图片文件读取为二进制数据。这可以通过使用编程语言的文件读取功能来完成。例如,在Python中,你可以使用
open()
函数以二进制模式打开图片文件,并使用read()
方法读取文件内容。with open('image.jpg', 'rb') as file: image_data = file.read()
-
在HTTP请求中,将图片数据作为请求的正文内容。你可以使用POST方法将图片数据发送到服务器。在请求头中,需要指定适当的Content-Type来表示请求正文的数据类型。对于图片,通常使用"image/jpeg"、"image/png"等类型。
POST /upload HTTP/1.1 Host: example.com Content-Type: image/jpeg Content-Length: <length_of_image_data> <image_data>
其中,
<length_of_image_data>
是图片数据的字节长度,<image_data>
是二进制图片数据。 -
在服务器端,根据接收到的请求处理图片数据。具体的处理方式取决于服务器的实现。服务器可以将接收到的图片数据保存到磁盘上的文件,或者进行进一步的处理,如图像处理、存储到数据库等。
实际应用中,可能会有其他需求,例如对图片进行压缩、进行身份验证等。此外,还可以使用更高级的图像传输协议如WebSocket、Base64编码等来满足特定的需求。
18.常见的HTTP状态码有哪些?
请你说一说http返回码是什么?
大概的见上面响应报文的状态码,具体的一些看下面
常见状态代码、状态描述的详细说明如下。
200 | OK | 客户端请求成功 |
201 | Created | 请求已经被实现,而且有一个新的资源已经依据请求的需要而创建,且其URI已经随Location头信息返回。 |
206 | partial content | 服务器已经正确处理部分GET请求,实现断点续传或同时分片下载,该请求必须包 含Range请求头来指示客户端期望得到的范围 |
300 | multiple choices(可选重定向) | 被请求的资源有一系列可供选择的反馈信息,由浏览器/用户自行选择其中一个。 |
301 | Moved Permanently(永久重定向) | 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一 |
302 | move temporarily(临时重定向) | 在响应报文中使用首部“Location: URL”指定临时资源位置 |
304 | Not Modified | 条件式请求中,使用如果客户端发送一个待条件的GET请求并且该请求以经被允许,而文档内容未被改变,则返回304,该响应不包含包体(即可直接使用缓存)。 |
403 | Forbidden | 请求被服务器拒绝 |
404 | Not Found | 服务器无法找到请求的URL |
405 | Method Not Allowed | 不允许使用此方法请求相应的URL |
500 | Internal Server Error | 服务器内部错误 |
502 | Bad Gateway | 代理服务器从上游收到了一条伪响应 |
503 | Service Unavailable | 服务器此时无法提供服务,但将来可能可用 |
505 | HTTP Version Not Supported | 服务器不支持,或者拒绝支持在请求中使用的HTTP版本。这暗示着服务器不能或不愿使用与客户端相同的版本。响应中应当包含一个描述了为何版本不被支持以及服务器支持哪些协议的实体。 |
19.http协议有什么特点?
- 支持多种数据格式:HTTP 协议支持多种数据格式,包括文本、图片、音频、视频等,可以通过不同的 Content-Type 头部字段来指定数据格式。
- 无状态性:HTTP 协议是无状态的,即每个请求与响应之间都是独立的,服务器不会保存请求或响应的状态信息。这种无状态性有利于提高服务器的并发处理能力,但也意味着服务器无法直接识别同一用户发出的不同请求。
- 明文传输:HTTP 协议传输的数据是明文的,不具有加密和认证功能,因此容易受到攻击,不适合传输敏感信息。为了解决这个问题,可以使用 HTTPS 协议来加密和认证数据传输。
- 基于TCP协议
- 默认端口80
多无明T8
20.HTTP的缺点有哪些?
- 安全性差:HTTP 协议传输的数据是明文的,容易被中间人攻击、窃听、篡改等,不适合传输敏感信息。为了提高安全性,可以使用 HTTPS 协议进行加密和认证。
- 单路传输:HTTP 1.0/1.1协议在处理大量请求时容易出现性能瓶颈,每个请求都需要建立和关闭连接,导致网络资源浪费和传输效率低下。为了解决这个问题,HTTP/2.0 引入了多路复用的机制。
- 无状态:HTTP 协议是无状态的,服务器不能保存客户端的状态信息,每次请求都需要重新验证用户身份和权限,这样会增加服务器的负担和响应时间。为了解决这个问题,可以使用 Cookie、Session、Token 等机制来管理客户端状态。
21.一次完整的HTTP请求过程包括哪些内容?
- 建立连接:客户端向服务器发起连接请求,如果连接请求被服务器接受,客户端和服务器就会建立起一条连接。HTTP 协议使用 TCP 协议作为传输层协议,因此在建立连接之前需要进行三次握手以确保连接的可靠性。
- 发送请求:客户端向服务器发送请求消息,请求消息包括请求方法、请求 URL、请求头部、请求正文等内容。请求方法包括 GET、POST、PUT、DELETE 等,用于指定客户端要执行的操作。请求 URL 是要访问的资源的地址。请求头部包括客户端的一些信息、请求正文的格式等内容。请求正文是可选的,如果请求方法不需要请求正文,则可以省略。
- 接收请求:服务器接收到客户端发送的请求消息,解析请求消息中的内容,根据请求方法和请求 URL 等信息来确定要执行的操作。
- 处理请求:服务器根据客户端的请求执行相应的操作,例如查询数据库、读取文件、计算等操作。在处理请求的过程中,服务器可能需要对请求进行验证、授权、过滤等操作,以确保请求的安全性和合法性。
- 发送响应:服务器处理完请求后,将响应消息发送给客户端,响应消息包括响应头部、响应正文等内容。响应头部包括服务器的一些信息、响应正文的格式等内容。响应正文是服务器要返回给客户端的内容,可以是 HTML 页面、JSON 数据、图片等各种格式。
- 接收响应:客户端接收到服务器发送的响应消息,解析响应消息中的内容,根据响应状态码等信息来确定响应是否成功。
- 断开连接:客户端和服务器之间的连接在请求响应结束后会自动断开,释放网络资源。
22.http协议会话结束标志怎么截出来?
HTTP 协议并没有像 TCP 协议一样定义显式的会话结束标志,所以无法通过截取特定的标志来判断 HTTP 会话的结束。不过,HTTP 协议的请求和响应消息都包含了一个长度字段 Content-Length,用来指示消息体的长度。因此,可以根据 Content-Length 字段的值来判断 HTTP 请求和响应消息是否已经结束。
具体地,当客户端发送一个 HTTP 请求时,它需要在请求头部中指定 Content-Length 字段的值,表示请求正文的长度。服务器在接收到请求消息后,根据 Content-Length 字段的值来确定请求消息是否已经接收完整。同样地,当服务器发送一个 HTTP 响应时,它也需要在响应头部中指定 Content-Length 字段的值,表示响应正文的长度。客户端在接收到响应消息后,也是根据 Content-Length 字段的值来确定响应消息是否已经接收完整。
23.HTTP长连接和短连接的区别
短连接:客户端向服务器发送一次请求后,服务器响应后立即关闭连接。也就是说,每次请求都需要重新建立一条连接。这样会造成一定的网络开销,尤其是在请求频繁的情况下,建立和关闭连接的开销会成为网络瓶颈。
长连接:客户端向服务器发送一次请求后,服务器响应后并不关闭连接,可以继续利用这条连接发送其他请求。在长连接下,多次请求和响应可以复用同一条连接,这样可以减少连接建立和关闭的开销,提高了网络性能和效率。HTTP 1.1 引入了 Keep-Alive 模式来支持长连接。
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。
在长连接下,需要注意以下几点:
1.客户端在发送请求后,需要在请求头中加入 Connection: keep-alive 字段,表示请求使用长连接。
2.服务器在响应客户端请求时,需要在响应头中加入 Connection: keep-alive 字段,表示服务器愿意使用长连接。
3.客户端和服务器都可以通过发送 Connection: close 字段来关闭连接,即使使用了长连接。
24.HTTP中缓存的私有和共有字段?
HTTP中缓存的私有和共有字段指的是在HTTP响应头中用来控制缓存的字段。私有字段只对特定用户或用户组有效,而共有字段则对所有用户都有效。
以下是常见的HTTP缓存控制字段:
私有字段:
- Cache-Control: private:指定响应只能被单个用户缓存,不能被共享缓存。
- Cache-Control: no-store:指定响应不能被缓存,每次请求都要重新获取。
- Cache-Control: no-cache:指定响应可以被缓存,但需要经过重新验证才能使用缓存。
共有字段:
- Cache-Control: public:指定响应可以被共享缓存。
- Cache-Control: max-age:指定响应可以被缓存的最长时间,单位是秒。
- Cache-Control: must-revalidate:指定缓存过期后必须重新验证资源的有效性。
- Expires:指定响应的过期时间,是一个GMT时间。但由于一些缺陷,该字段已被Cache-Control: max-age取代。
25.HTTP如何禁用缓存?如何确认缓存?
要禁用HTTP缓存,可以使用以下方法之一:
- 在HTTP响应头中添加"Cache-Control"标头并设置为"no-cache"或"max-age=0"。no-cache 表示可以缓存资源,但每次使用缓存之前都需要向服务器验证资源是否过期,而 max-age=0 则表示资源已经过期,需要重新请求资源。
- 在HTTP响应头中添加"Expires"标头并将其设置为过去的日期和时间,例如:"Expires: Tue, 01 Jan 1980 00:00:00 GMT"。这将告诉客户端响应已经过期,并且不应该缓存。
要确认一个资源是否被缓存,可以使用浏览器的开发者工具。打开开发者工具,切换到“网络”标签页,并刷新页面。如果资源被缓存了,它将显示一个状态代码为“200 OK”的条目,并且在“Size”列中显示缓存的文件大小。如果资源未被缓存,它将显示一个状态代码为“304 Not Modified”的条目,表示浏览器从缓存中获取了该资源的副本。
26.HTTP中缓存机制如何保证缓存是最新的?(缓存过期机制)
HTTP 缓存机制是为了提高网站的访问速度和降低服务器的负担而设计的,但在一些特殊的情况下,如网站更新频繁、网站数据敏感等情况下,可能需要保证缓存的数据是最新的,可以采取以下措施:
- 使用 Cache-Control: no-cache 或 max-age=0:这两个字段可以禁用缓存,每次使用缓存之前都需要向服务器验证资源是否过期,确保使用的是最新的资源。
- 使用 Cache-Control: must-revalidate:这个字段表示在缓存的资源过期后必须向服务器验证资源是否更新,如果更新了则需要重新请求资源,确保使用的是最新的资源。
- 使用 Cache-Control: no-store:这个字段表示响应不能被缓存,每次使用都需要重新请求资源,确保使用的是最新的资源。
- 使用 Last-Modified 和 ETag:这两个字段可以用来判断资源是否被修改过,如果资源被修改过则需要重新请求资源,确保使用的是最新的资源。
- Expires 首部字段也可以用于告知缓存服务器该资源什么时候会过期。
- 使用版本号控制缓存:在网站更新时,可以在请求的 URL 中加入版本号等参数,这样每次更新时版本号都会发生变化,从而可以保证缓存的数据是最新的。
27.http断点续传
HTTP 断点续传(HTTP Range)是一种通过 HTTP 协议支持从已经下载部分开始继续下载的机制。它允许客户端在下载大型文件时,可以在中途中断下载,并在下次下载时从上次中断的位置继续下载,而不必重新下载整个文件。可以节省时间,提高速度。这对于大文件的下载和网络不稳定的情况下很有用。
在 HTTP/1.1 中,客户端可以使用 Range 请求头部来请求文件的某一部分,服务器在响应中返回 206 Partial Content 状态码,并且在 Content-Range 响应头中指定该部分的开始和结束字节位置。客户端可以通过在 Range 请求头部中指定字节范围,来请求文件的多个部分。
Range
用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:
Range:(unit=first byte pos)-[last byte pos]
Range 头部的格式有以下几种情况:
Range: bytes=0-499 表示第 0-499 字节范围的内容 Range: bytes=500-999 表示第 500-999 字节范围的内容 Range: bytes=-500 表示最后 500 字节的内容 Range: bytes=500- 表示从第 500 字节开始到文件结束部分的内容 Range: bytes=0-0,-1 表示第一个和最后一个字节 Range: bytes=500-600,601-999 同时指定几个范围
Content-Range
用于响应头中,在发出带 Range 的请求后,服务器会在 Content-Range 头部返回当前接受的范围和文件总大小。一般格式:
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
例如:
Content-Range: bytes 0-499/22400
0-499 是指当前发送的数据的范围,而 22400 则是文件的总大小。
而在响应完成后,返回的响应头内容也不同:
HTTP/1.1 200 Ok(不使用断点续传方式) HTTP/1.1 206 Partial Content(使用断点续传方式)
例如,以下是一个 HTTP 断点续传的示例:
客户端发送以下请求:
GET /file.zip HTTP/1.1
Host: example.com
Range: bytes=500000-999999
服务器返回以下响应:
HTTP/1.1 206 Partial Content
Content-Type: application/zip
Content-Length: 499999
Content-Range: bytes 500000-999999/2000000
<499999 bytes of the file>
在这个示例中,客户端请求文件的第 500000 到第 999999 个字节,服务器返回了这个字节范围内的数据,并在 Content-Range 响应头中指定了这个范围的开始和结束位置。
#C++##嵌入式##校招##面试##八股#查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础【本专栏】 3.硬件篇 4.嵌入式Linux (建议PC端查看)