首页 > 其他分享 >面试题01

面试题01

时间:2023-04-23 11:14:39浏览次数:45  
标签:面试题 01 HTTP 请求 报文 Content Range key

// websocket的协议体
/**
 * WebSocket协议使用HTTP握手,建立WebSocket连接后,数据传输就由HTTP协议切换为独立的WebSocket协议。
 *协议体结构如下:
 * 0                   1                   2                   3
 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 *+-+-+-+-+-------+-+-------------+-------------------------------+
 *|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
 *|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
 *|N|V|V|V|       |S|             |   (if payload len==126/127)   |
 *| |1|2|3|       |K|             |                               |
 *+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 *|     Extended payload length continued, if payload len == 127  |
 *+ - - - - - - - - - - - - - - - +-------------------------------+
 *|                     Payload Data continued ...                |
 *+---------------------------------------------------------------+
 *各字段意义如下:
 *- FIN: 1bit,表示报文是否为最后一帧。
 *- RSV1-RSV3: 各1bit,为扩展使用。
 *- Opcode: 4bit,定义报文类型,如0x1表示文本报文,0x2表示二进制报文。
 *- MASK: 1bit,表示Payload Data是否进行了掩码处理。客户端发出的报文为1,服务器发出的为0。
 *- Payload len: 7bit / 7+16bit / 7+64bit,表示有效载荷长度。
 *- Masking-key: 4字节,如果MASK为1,则该字段存在。用于解密Payload Data。
 *- Payload data: 有效载荷数据,由Opcode定义类型,长度由Payload len指定。
 *- Frame length: 报文总长度 = 2 + Payload len + 4(如果MASK = 1)
 *所以,WebSocket的协议体,从结构上主要包含是否位最后一帧、扩展位、报文类型、载荷长度、掩码密钥(如果有)和载荷数据等内容。服务器和客户端通过这些字段来解析WebSocket报文,进行通信
 */

// 断点续传的原理
/* 断点续传的原理是:当文件传输中断后,继续从中断点开始传输,而不是重新开始传输整个文件。
    实现断点续传需要解决几个关键问题:
    1. 记录中断点位置。传输文件前,需要记录文件总大小和已传输的大小,中断时记录已经传输的位置,以便续传使用。
    2. 恢复到中断点。续传时,需要将文件指针定位到中断点位置,接着读取文件并传输。
    3. 校验继续传输的文件内容。续传时,需要验证从中断点开始后续的内容是否与源文件相同,防止文件在两次传输中间被修改。常用的方法是记录源文件内容的hash或checksum值。
    一个简单的断点续传实现逻辑如下:
    1. 记录源文件总大小file_size和已传大小transferred。
    2. 计算源文件内容的hash值,记录为file_hash。
    3. 上传文件,当传输中断后,记录中断点位置为position。
    4. 续传时,将文件指针定位到position,读取后续内容。
    5. 计算从position读取的内容hash值为content_hash。
    6. 判断content_hash与file_hash是否相同。如果不同,表示文件被修改,重新开始上传。
    7. 如果相同,将transferred的值更新为position,并从position继续上传。
    8. 上传完成后,判断transferred值是否等于file_size,确认是否全部上传完成。
    该原理较简单直接。在实际应用中,我们还需要考虑断点信息的持久化存储,以 handle 网络异常中断等情况。也可以使用更复杂的校验机制,如基于分块的hash,而不仅校验续传内容。但核心原理仍是记录断点位置,验证续传内容完整性,并从中断点继续传输。
    综上,断点续传的关键在于智能地记录和管理传输的状态与进度。通过这些信息,我们可以将非正常中断的大文件传输,有效拼接成完整的文件,提供更好的用户体验。相比于重新开始整个上传,断点续传机制更高效和智能
 */

//  HTTP的断点续传
/* HTTP协议支持断点续传,主要是通过两个字段来实现:
    1. Range字段。客户端在请求时,通过Range指定需要请求的内容范围,格式为:
    Range: bytes=开始位置-结束位置
    例如,请求前100个字节,Range为:Range: bytes=0-99

    2. Content-Range字段。服务器在响应中通过Content-Range指定返回内容的范围及总长度,格式为:
    
    Content-Range: bytes 开始位置-结束位置/文件总大小
    例如,返回前100个字节,Content-Range为:Content-Range: bytes 0-99/1024
    基于Range字段,HTTP的断点续传实现流程如下:
    1. 客户端第一次请求文件,服务器正常返回整个文件内容。客户端记录接收到的最后一个字节位置last_byte_pos。
    2. 如果网络中断,客户端发现未接收完整文件。在再次请求时,通过Range字段指定从last_byte_pos+1的位置开始请求。
    3. 服务器接收到带Range字段的请求后,通过Content-Range在响应中指定返回内容的范围。并从last_byte_pos+1开始读取文件内容返回。
    4. 客户端接收到服务器响应后,将last_byte_pos更新为本次接收的最后一个字节位置。
    5. 客户端继续发送Range请求,服务器继续返回对应范围内容,直到整个文件传输完成。
    6. 如果 Range 请求范围不合法,服务器会返回416 Range Not Satisfiable 的响应。
    7. 完成了整个文件的续传后,服务器在响应体中会返回200 OK,而不是206 Partial Content。这标记着续传过程的结束。
    所以,HTTP实现断点续传,是通过Range / Content-Range字段指定请求和返回的内容范围来达到续传效果。客户端需要持续记录已接收内容的最后字节位置,以便下次发送恢复请求。而服务器需要支持Range的处理,才能正确续传文件内容。
    相比FTP等其他协议,HTTP的断点续传更为灵活和便捷。对于大文件分块传输,提高网络利用率和传输速度,实现更好的用户体验,HTTP断点续传机制发挥着重要作用
 */

//  HTTP的header,request,response
/* HTTP报文分为请求报文(request)和响应报文(response)两种。它们都包含两部分:
    1. 首部(Header):描述报文相关的元信息,包括方法、 url、协议版本、内容长度、 cookie 等。
    2. 主体(Body):包含请求或者响应的内容信息,可以是网页内容、文件、图片等。
    请求行包含请求方法、URL、HTTP版本
    请求首部包含Host、User-Agent、Content-Type等信息。主体可选,包含POST请求提交的数据。
    HTTP响应报文:
    状态行包含HTTP版本、状态码、原因短语,如:
    HTTP/1.1 200 OK  
    响应首部包含Content-Type、Content-Length、Set-Cookie等信息。主体包含响应内容,如网页HTML源码、图片、视频等。
    常见的HTTP请求方法有:
    - GET:请求获取资源
    - POST:请求提交资源   
    - PUT:请求更新资源
    - DELETE:请求删除资源
    常见的HTTP状态码有:
    - 200:请求成功
    - 301:资源已永久移动
    - 404:未找到资源
    - 500:服务器内部错误
    所以,HTTP报文通过请求/响应行定义报文类型、协议及状态。通过首部提供报文元信息。通过可选的主体包含资源内容。这些元素共同定义了HTTP的基本交互过程和机制
 */

//  content-type,content-length
/* Content-Type和Content-Length都是HTTP首部字段,它们的作用分别是:
    Content-Type:定义实体主体的MIME类型和编码格式。
    格式为:Content-Type: MIME类型; 参数=值
    例如:
    Content-Type: text/html; charset=utf-8
    Content-Type: image/png
    Content-Type: application/json
    常见的MIME类型有:
    - text/html: HTML格式
    - text/plain:纯文本格式 
    - image/png:PNG图片
    - image/jpeg:JPG图片 
    - application/json:JSON格式
    - application/xml:XML格式 等等
    Content-Length:定义实体主体的长度,即字节数。
    格式为:Content-Length: 字节数
    例如:Content-Length: 2048
    Content-Type和Content-Length的作用是告知客户端实体主体的类型、编码、长度等信息。这样客户端在接收实体主体前,就可以根据这些元信息来决定如何处理主体内容,例如:
    - 根据Content-Type选择解析器解析内容
    - 根据Content-Length读取完整主体内容
    - 预留Content-Length指定的缓存空间等
    如果没有这两个首部,客户端将无法预知主体内容的具体格式和长度,无法正确解析和处理主体。
    所以,Content-Type和Content-Length作为主体相关的重要元信息首部,在HTTP协议中发挥着关键作用。服务端在返回响应报文时,应当根据主体内容正确添加这两个首部。同样,客户端在接收响应报文时,也需要根据这两个首部正确解析和处理主体内容。
    综上,Content-Type定义主体类型,Content-Length定义主体长度。它们为请求和响应的主体提供格式与长度信息,使得内容可以正确编码、传输与解析。这是HTTP作为应用层协议,成功交换和处理数据信息的关键所在
 */

//  redis设计,key应该怎么设置
/* 在Redis中设置key时,需要考虑以下几个方面:
    1. 业务相关性:key应该跟所存储的数据有一定的业务关联性,便于理解和管理。例如可以设置为用户ID,商品ID加其他修饰词等。
    2. 鉴权考虑:如果Redis被多个系统或应用使用,key应该包含系统/应用身份信息,用于鉴权和区分数据所有权。
    3. Hash tag:对于非字符串的key,可以使用{}包裹,以便Redis正确识别。例如key可以是user:{uid}形式。
    4. 简洁性:key应该尽可能简洁,避免过长的key。可以采用一定的分隔规则或缩略表示法。
    5. 全局唯一:对于需要全局唯一的key,可以使用namespace加唯一ID的方式。例如app1:{uid},app2:{tid}。
    6. 过期策略:如果key需要设置过期时间,应该在key上做一定的标记,便于查找和管理。例如:app1:{uid}:1m 代表1分钟后过期。
    7. 前缀法:可以为不同类型的数据设置不同的前缀,用于区分。例如:user:列表、 tweet:微博内容、product:商品等。
    除此之外,也要考虑key的命名问题,例如:
    - 避免使用{}和()等特殊字符(如果不是 must 的话)
    - 不要使用空格,可以使用-或_分隔
    - 同义词使用一致的命名,不能混用
    - 数字不要单独出现在首位
    - 尽量使用连词线连接而非下划线
    综上,Redis key的设计需要考虑业务相关性、鉴权、简洁性、全局唯一性和过期策略等方面。合理的key可以使Redis更易管理和维护。确保鉴权、避免过期不当删除等也关乎系统安全。
    另外,key的命名规则也需要一定的约定,让所有使用Redis的系统和工程师可以一致理解,这样可以增强可读性并避免一些问题。所以,Redis key的设计既是技术考量,也有管理与协作的因素,系统设计者和开发者都应在意。
 */

 

标签:面试题,01,HTTP,请求,报文,Content,Range,key
From: https://www.cnblogs.com/LF-place/p/17345874.html

相关文章

  • JOISC2019 题解
    通信题还没做。JOISC19D1T1試験(Examination)双log很简单。但是单log才是这题的本质。我们进行一些补集转换。我们能算的是什么?我们能算一条边在边界上的直角边平行于坐标轴的直角三角形数点,我们能算长方形数点。我们要算1的点数,那相当于2的点数减去3的点数再加......
  • 从0开始写三维“软”引擎.part1 - 2013.7.13 - David Rousset
    I’dtoliketosharewithyouhowI’velearnedtobuildwhat’sknownasa“3Dsoftengine”throughaseriesoftutorials.“Softwareengine”meansthatwewilluseonlytheCPUtobuilda3Dengineinanoldschoolway(rememberDoomonyour80386?).I......
  • 【HMS Core】视频编辑服务报错method not allowed 20124、Parameter error. Error: ap
    【关键字】视频编辑服务、报错 【问题背景】问题1:集成视频剪辑服务,在原子能力SDK的素材管理时,提示Parametererror.Error:appIdisinvalid.问题2:视频编辑sdkdemo的所有功能提示methodnotallowed20124,后台已申请动态照片、一键微笑、AI着色、一键动效、一键染发的功能......
  • 2010年湖南省对口高考真题
    一、选择题1、下列不是C语言合法标识符的是__________。A._124            B.124abc          C.sum124          D.a_124 2、若有如图1所示存储结构,且变量定义为structnode{intdata;structnode*next;}p,q,r;若要实现图2所示的存储结......
  • 【IT老齐001】单体架构升级问题
    【IT老齐001】单体架构升级问题不谈场景的架构设计都是耍流氓架构没有对不对,只有合不合适架构是宏观设计的标准框架是具体实现的规则架构是取舍的艺术场景举例系统面临大量文件读写影响服务器磁盘IO导致数据库查询高延迟初级解决方案Redis通过在内存中的高吞吐完......
  • SpringDay01-入门基础知识、Bean的配置(一)
    Spring(黑马)一、基础知识1.1传统JavaWeb的缺点传统的JavaWeb在实现某个主要的业务逻辑时需要做的事情:new一个实现类对象,然后通过对象调用某个主要的方法;开启事务、提交事务、回滚事务;在日志中记录修改数据;在日志中记录异常数据等。以上传统方法带来的问题:实现类与接......
  • #yyds干货盘点# LeetCode面试题:柱状图中最大的矩形
    1.简述:给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例1:输入:heights=[2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为10示例2:输入:heights=[2,4]输出:42.代码实现:classSolut......
  • VBA学习笔记901_代码留存
    只是为了记录一些跑过的代码,尽量加上注释,但有些非常简单,只是为了以后快速熟悉代码结构条件选择`最基本If逻辑表达式Then'如果逻辑表达式为真,则执行这里的语句Endif`加强版If逻辑表达式Then'如果逻辑表达式为真,则执行这里的语句Else'否则(即逻辑表达......
  • Succinctly 中文系列教程(二) 20220109 更新
    Succinctly.NET本地化教程零、简介一、从本地化开始二、日期和时间三、周数四、时区五、数字六、货币七、文本八、附录SuccinctlyLinux教程一、简介二、Linux目录结构三、命令行界面四、目录五、查看文件和目录详情六、权限七、查看和编辑文件八、删除、移动和重命名文件和目......
  • Succinctly 中文系列教程 20220109 更新
    Succinctly会计教程一、会计简明指南二、收入和费用三、收入确认四、组织账目五、会计原则六、会计制度报告七、固定资产八、应收账款九、应付账款十、库存十一、工资单十二、总结十三、附录Succinctly安卓编程教程一、设置二、你好,安卓三、活动生命周期四、用户界面布局五、用户......