【1.9w字】彻底搞懂HTTP知识的面试题,建议精读收藏

2023-11-15

我很早之前写过一篇关于 HTTP 和 HTTPS 的文章,但对于 HTTPS 介绍还不够详细,只讲了比较基础的部分,所以这次我们再来深入一下 HTTPS,用实战抓包的方式,带大家再来窥探一次 HTTPS

如何理解 URI?

URI, 全称为(Uniform Resource Identifier), 也就是统一资源标识符,它的作用很简单,就是区分互联网上不同的资源。
但是,它并不是我们常说的网址, 网址指的是URL, 实际上URI包含了URN和URL两个部分,由于 URL 过于普及,就默认将 URI 视为 URL 了。

URI 的结构

URI 真正最完整的结构是这样的

可能你会有疑问,好像跟平时见到的不太一样啊!先别急,我们来一一拆解。
scheme 表示协议名,比如http, https, file等等。后面必须和://连在一起。
user:passwd@ 表示登录主机时的用户信息,不过很不安全,不推荐使用,也不常用。
host:port 表示主机名和端口。
path 表示请求路径,标记资源所在位置。
query 表示查询参数,为key=val这种形式,多个键值对之间用&隔开。
fragment 表示 URI 所定位的资源内的一个锚点,浏览器可以根据这个锚点跳转到对应的位置。

https://www.yuque.com/kenguba/upkpls/gisxr2/?word=1&name=kenguba#UrkH4

这个 URI 中

  • https 即scheme部分
  • www.yuque.com 为host:port部分(注意,http 和 https 的默认端口分别为80、443)
  • kenguba/upkpls/gisxr2 为path部分
  • word=1&name=kenguba 表示query部分
  • #UrkH4 就是锚点

image.png

URI 编码

URI 只能使用 ASCII , ASCII 之外的字符是不支持显示的,而且还有一部分符号是界定符,如果不加以处理就会导致解析出错。
因此,URI 引入了编码机制,将所有非 ASCII 码字符界定符转为十六进制字节值,然后在前面加个%

encodeURI("https://www.yuque.com/kenguba/upkpls/gisxr2?name=一缕清风")
"https://www.yuque.com/kenguba/upkpls/gisxr2?name=%E4%B8%80%E7%BC%95%E6%B8%85%E9%A3%8E"
decodeURI("https://www.yuque.com/kenguba/upkpls/gisxr2?name=%E4%B8%80%E7%BC%95%E6%B8%85%E9%A3%8E")

encodeURIComponent("https://www.yuque.com/kenguba/upkpls/gisxr2?name=一缕清风")
"https://www.yuque.com/kenguba/upkpls/gisxr2?name=%E4%B8%80%E7%BC%95%E6%B8%85%E9%A3%8E"
decodeURIComponent("https://www.yuque.com/kenguba/upkpls/gisxr2?name=%E4%B8%80%E7%BC%95%E6%B8%85%E9%A3%8E")

HTTP 超文本传输协议

HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。它可以拆成三个部分:

  • 超文本
  • 传输
  • 协议

协议

在生活中,我们也能随处可见「协议」,例如:

  • 刚毕业时会签一个「三方协议」
  • 找房子时会签一个「租房协议」


生活中的协议,本质上与计算机中的协议是相同的,协议的特点:

  •  字,代表的意思是必须有两个以上的参与者。例如三方协议里的参与者有三个:你、公司、学校三个;租房协议里的参与者有两个:你和房东。
  •  字,代表的意思是对参与者的一种行为约定和规范。例如三方协议里规定试用期期限、毁约金等;租房协议里规定租期期限、每月租金金额、违约如何处理等。

针对 HTTP 协议,我们可以这么理解。
HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范(两个以上的参与者),以及相关的各种控制和错误处理方式(行为约定和规范)

传输

所谓的「传输」,很好理解,就是把一堆东西从 A 点搬到 B 点,或者从 B 点 搬到 A 点。
别轻视了这个简单的动作,它至少包含两项重要的信息。
HTTP 协议是一个双向协议。
我们在上网冲浪时,浏览器是请求方 A ,百度网站就是应答方 B。双方约定用 HTTP 协议来通信,于是浏览器把请求数据发送给网站,网站再把一些数据返回给浏览器,最后由浏览器渲染在屏幕,就可以看到图片、视频了。

数据虽然是在 A 和 B 之间传输,但允许中间有中转或接力。
就好像第一排的同学想穿递纸条给最后一排的同学,那么传递的过程中就需要经过好多个同学(中间人),这样的传输方式就从「A < - > B」,变成了「A <-> N <-> M <-> B」。
而在 HTTP 里,需要中间人遵从 HTTP 协议,只要不打扰基本的数据传输,就可以添加任意额外的东西。
针对传输,我们可以进一步理解了 HTTP。
HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。

超文本

HTTP 传输的内容是「超文本」
我们先来理解「文本」,在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等,在 HTTP 眼里这些都算做「文本」。
再来理解「超文本」,它就是超越了普通文本的文本,它是文字、图片、视频等的混合体最关键有超链接,能从一个超文本跳转到另外一个超文本。
HTML 就是最常见的超文本了,它本身只是纯文字文件,但内部用很多标签定义了图片、视频等的链接,在经过浏览器的解释,呈现给我们的就是一个文字、有画面的网页了。
OK,经过了对 HTTP 里这三个名词的详细解释,就可以给出比「超文本传输协议」这七个字更准确更有技术含量的答案:
HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」
⚠️注意: HTTP 不是用于从互联网服务器传输超文本到本地浏览器的协议,也可以是服务器到服务器,所以采用两点之间的描述会更准确

HTTP 的特点?HTTP 有哪些缺点?

HTTP 的特点概括

  • 灵活可扩展 主要体现在两个方面。
    • 一个是语义上的自由,只规定了基本格式,比如空格分隔单词,换行分隔字段,其他的各个部分都没有严格的语法限制
    • 另一个是传输形式的多样性,不仅仅可以传输文本,还能传输图片、视频等任意数据,非常方便。
  • 可靠传输 HTTP 基于 TCP/IP,因此把这一特性继承了下来。这属于 TCP 的特性,不具体介绍了。
  • 请求-应答 也就是一发一收、有来有回, 当然这个请求方和应答方不单单指客户端和服务器之间,如果某台服务器作为代理来连接后端的服务端,那么这台服务器也会扮演请求方的角色。
  • 无状态 这里的状态是指通信过程的上下文信息,而每次 http 请求都是独立、无关的,默认不需要保留状态信息

HTTP 缺点

  • 无状态 所谓的优点和缺点还是要分场景来看的,对于 HTTP 而言,最具争议的地方在于它的无状态
    • 在需要长连接的场景中,需要保存大量的上下文信息,以免传输大量重复的信息,那么这时候无状态就是 http 的缺点了。
    • 但与此同时,另外一些应用仅仅只是为了获取一些数据,不需要保存连接上下文信息,无状态反而减少了网络开销,成为了 http 的优点。
  • 明文传输 即协议里的报文(主要指的是头部)不使用二进制数据,而是文本形式。这当然对于调试提供了便利,但同时也让 HTTP 的报文信息暴露给了外界,给攻击者也提供了便利。WIFI陷阱就是利用 HTTP 明文传输的缺点,诱导你连上热点,然后疯狂抓你所有的流量,从而拿到你的敏感信息。
  • 队头阻塞问题 当 http 开启长连接时,共用一个 TCP 连接,同一时刻只能处理一个请求,那么当前请求耗时过长的情况下,其它的请求只能处于阻塞状态,也就是著名的队头阻塞问题。接下来会有一小节讨论这个问题。

HTTP 报文结构是怎样的?

对于 TCP 而言,在传输的时候分为两个部分: **TCP头 **和 数据部分
而 HTTP 类似,也是 header + body 的结构,具体而言:

起始行 + 头部 + 空行 + 实体

由于 http 请求报文和响应报文是有一定区别,因此我们分开介绍
image.png

起始行

对于请求报文来说,起始行类似下面这样:

GET /home HTTP/1.1

也就是方法 + 路径 + http版本
对于响应报文来说,起始行一般张这个样:

HTTP/1.1 200 OK

响应报文的起始行也叫做状态行。由 http版本、状态码和原因 三部分组成。
⚠️
注意:在起始行中,每两个部分之间用空格
隔开,最后一个部分后面应该接一个换行,严格遵循 ABNF 语法规范

头部

展示一下请求头和响应头在报文中的位置:


不管是请求头还是响应头,其中的字段是相当多的,而且牵扯到http非常多的特性,这里就不一一列举的,重点看看这些头部字段的格式:

  • 字段名不区分大小写
  • 字段名不允许出现空格,不可以出现下划线 _
  • 字段名后面必须紧接着 :

空行

很重要,用来区分开头部和实体。
问: 如果说在头部中间故意加一个空行会怎么样?
那么空行后的内容全部被视为实体。

实体

就是具体的数据了,也就是 body 部分。请求报文对应请求体, 响应报文对应响应体。

如何理解 HTTP 的请求方法?

http/1.1 规定了以下请求方法(注意,都是大写):

  • GET 通常用来获取资源
  • HEAD 获取资源的元信息
  • POST 提交数据,即上传数据
  • PUT 修改数据
  • DELETE 删除资源(几乎用不到)
  • CONNECT 建立连接隧道,用于代理服务器
  • OPTIONS 列出可对资源实行的请求方法,预检请求,用来跨域请求
  • TRACE 追踪请求-响应的传输路径

GET 与 POST

说一下 GET 和 POST 的区别?

首先最直观的是语义上的区别。
而后又有这样一些具体的差别:

  • 从缓存的角度 GET 请求会被浏览器主动缓存下来,留下历史记录,而 POST 默认不会。
  • 从编码的角度 GET 只能进行 URL 编码,只能接收 ASCII 字符,而 POST 没有限制。
  • 从参数的角度 GET 一般放在 URL 中,因此不安全,POST 放在请求体中,更适合传输敏感信息。
  • 从幂等性的角度 GET是幂等的,而POST不是。(幂等表示执行相同的操作,结果也是相同的)
  • 从TCP的角度 GET 请求会把请求报文一次性发出去,而 POST 会分为两个 TCP 数据包,首先发 header 部分(预检请求),如果服务器响应 100(continue), 然后发 body 部分。(火狐浏览器除外,它的 POST 请求只发一个 TCP 包)

Get 方法的含义是请求从服务器获取资源,这个资源可以是静态的文本、页面、图片视频等
比如,你打开我的文章,浏览器就会发送 GET 请求给服务器,服务器就会返回文章的所有文字及资源

而POST 方法则是相反操作,它向 URI 指定的资源提交数据,数据就放在报文的 body 里,然后拼接好 POST 请求头,通过 TCP 协议发送给服务器。

⚠️注意: http协议并未get和post是没有字节限制的,但是服务端和浏览器是可以限制字节大小的

GET 和 POST 方法都是安全和幂等的吗?

先说明下安全和幂等的概念:

  • 在 HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源。
  • 所谓的「幂等」,意思是多次执行相同的操作,结果都是「相同」的。

那么很明显 GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。
POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。

HTTP 常见的状态码,有哪些?

查看更加详细请点击 了解常见HTTP状态码

1xx
类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少

200 OK
是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。

204 No Content
也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据

206 Partial Content
是应用于 HTTP 分块下载或断电续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。

301 Moved Permanently
表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。

302 Found
表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问
301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。

304 Not Modified
不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制。

400 Bad Request
表示客户端请求的报文有错误,但只是个笼统的错误。

403 Forbidden
表示服务器禁止访问资源,并不是客户端的请求出错。

404 Not Found
表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

500 Internal Server Error
与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道

501 Not Implemented
表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思

502 Bad Gateway
通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。

503 Service Unavailable
表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思。

http 常见字段有哪些?

Host

客户端发送请求时,用来指定服务器的域名

Host: www.A.com

有了 Host 字段,就可以将请求发往同一台服务器上的不同网站

Content-Length

服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据长度。

Content-Length: 1000

如上面则是告诉浏览器,本次服务器回应的数据长度是 1000 个字节,后面的字节就属于下一个回应了。

Connection

Connection 字段最常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用

HTTP/1.1 版本的默认连接都是持久连接,但为了兼容老版本的 HTTP,需要指定 Connection 首部字段的值为
Keep-Alive

Connection: keep-alive

一个可以复用的 TCP 连接就建立了,直到客户端或服务器主动关闭连接。但是,这不是标准字段。

Content-Encoding

Content-Encoding 字段说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式

Content-Encoding: gzip

上面表示服务器返回的数据采用了 gzip 方式压缩,告知客户端需要用此方式解压
客户端在请求时,用 Accept-Encoding 字段说明自己可以接受哪些压缩方法

Accept-Encoding: gzip, deflate

Content-Type

Content-Type 字段用于服务器回应时,告诉客户端,本次数据是什么格式

Content-Type: text/html; charset=utf-8

上面的类型表明,发送的是网页,而且编码是UTF-8。
客户端请求的时候,可以使用 Accept 字段声明自己可以接受哪些数据格式。

Accept: */*

上面代码中,客户端声明自己可以接受任何格式的数据

Accept 系列字段了解多少

对于 Accept 系列字段的介绍分为四个部分:数据格式压缩方式支持语言字符集

数据格式

HTTP 支持非常多的数据格式,那么这么多格式的数据一起到达客户端,客户端怎么知道它的格式呢?
当然,最低效的方式是直接猜,有没有更好的方式呢?直接指定可以吗?
答案是肯定的
不过首先需要介绍一个标准 —— MIME(Multipurpose Internet Mail Extensions, 多用途互联网邮件扩展)
它首先用在电子邮件系统中,让邮件可以发任意类型的数据,这对于 HTTP 来说也是通用的。
因此,HTTP 从 **MIME type **取了一部分来标记报文 body 部分的数据类型,这些类型体现在Content-Type这个字段,当然这是针对于发送端而言,接收端想要收到特定类型的数据,也可以用Accept字段。
具体而言,这两个字段的取值可以分为下面几类:

  • text text/html, text/plain, text/css 等
  • image image/gif, image/jpeg, image/png 等
  • audio/video audio/mpeg, video/mp4 等
  • application application/json, application/javascript, application/pdf, application/octet-stream
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【1.9w字】彻底搞懂HTTP知识的面试题,建议精读收藏 的相关文章

  • 确定元素是在页面折叠上方还是下方

    我有一些页面有多个输入框 用户可以在其中输入文本 在单击 下一步 按钮之前 需要填写其中一些内容 我弹出验证错误供用户查看 但是如果问题不在页面上 我希望页面滚动到它 而不是他们必须搜索丢失 错误的字段 我有一个滚动到位 但我无法确定要滚动
  • 如何以编程方式退出或关闭 Javascript UWP 应用程序? (Windows 10)

    我制作了一个游戏 它需要自己的退出按钮 我无法使用CoreApplication Exit https msdn microsoft com en us library windows apps windows applicationmod
  • 将文本大小调整为矩形 在 Canvas HTML5 中调整大小

    我是 Canvas 新手 我正在创建一个网站 以在调整矩形大小时增加文本 我尝试了很多 但没有任何效果 实际上 我希望如果我仅按其宽度调整矩形大小 向左拉伸 向右拉伸 则仅应增加文本宽度而不是字体大小 我已经完成了字体大小 但发现增加孤立文
  • 如何在 HTML / Javascript 页面中插入 PHP 下拉列表

    好吧 这是我的第二篇文章 请接受我是一个完全的新手 愿意学习 花了很多时间在各个网站上寻找答案 而且我几乎已经到达了我需要到达的地方 至少在这一点上 我有一个网页 其中有许多 javascript 函数 这些函数一起使用 google 地图
  • 使用文件 API 将资源加载到 Three.js 中

    我想创建导入 3D 模型以在浏览器中查看的功能 方法是使用File API http www html5rocks com en tutorials file dndfiles Three js 加载器在我托管的文件上运行良好 我的理解是加
  • 如何适应特定子元素的宽度?

    problem 我正在尝试创建一个技能表 我无法问下一个问题为什么 所以我创建了一个新帐户并询问 当前状态 我想将元素的宽度与 meter 也就是说 如何设定区块的标准 meter 子元素 在上面的 gif 中 img meter 我想要保
  • IE 中的 HR 标签 - 删除边框

    在除 IE7 及更低版本之外的其他浏览器中 hr 在 hr 标签周围显示边框 但我不希望它出现 我已经尝试过这个解决方案 但它周围似乎仍然有边框 它看起来像这样 我该如何摆脱它 See http webdesign about com od
  • jQM / jquery-collagePlus 使用问题

    我正在使用 jQM 构建应用程序 并且尝试使用 jquery collagePlus http ed lea github io jquery collagePlus http ed lea github io jquery collage
  • 淘汰赛绑定,每个都可进行自定义

    我这里有一个情况 用于淘汰每个带有定制的绑定 这是我的代码 div div table tbody tr td td td td tr tbody table div div
  • 在管道中重用变量的功能方式

    在 javascript 和 typescript 中与 Ramda 一起使用函数式编程 我经常发现自己编写如下代码 const myFun c gt const myId c id const value pipe getAnotherO
  • 获取点击的的DOM路径

    HTML div class lol a class rightArrow href a div 伪代码 rightArrow click function rightArrowParents this dom dom is the pse
  • 即使在包裹后也具有等宽的弹性项目

    是否可以制作一个像这样的纯 CSS 解决方案 物品有一些min width 它们应该动态增长以填充所有容器宽度 然后换行到新行 列表中的所有项目都应具有相同的宽度 现在看起来是这样的 这就是我希望它看起来像的样子 我已经手动管理这些底部项目
  • 如何处理requireJs超时错误?

    我正在使用 require js 作为加载框架编写一个移动混合应用程序 我遇到加载错误的问题 我想做的是在设备离线且无法下载在屏幕上显示地图所需的 google 地图 API 脚本时设置后备解决方案 我得到的只是 Uncaught Erro
  • Firebase 警告:使用 Firebase Cloud Function 搜索数据时使用未指定的索引

    我构建了一个 Firebase 云函数 用于查找 IsNotificationEnabled 值等于 true 的用户 我的部分职能 export const sendPushNotification functions https onR
  • RoR - Rails 中的大文件上传

    我有一个 Rails Web 应用程序 允许用户上传视频 视频存储在 NFS 安装的目录中 当前的设置适用于较小的文件 但我也需要支持大文件上传 最多 4GB 当我尝试上传 4GB 文件时 它最终会发生 但从用户体验的角度来看很糟糕 上传开
  • mozilla pdf.js 没有全视图

    我喜欢这个 pdf 查看器https github com mozilla pdf js https github com mozilla pdf js Demo http mozilla github com pdf js web vie
  • Node.js - 重载函数

    有没有一种方法可以重载node js中的函数 类似于 noSuchMethod https developer mozilla org en JavaScript Reference Global Objects Object noSuch
  • 如何使用 jQuery 或 JavaScript 聚焦 或 标签?

    for var i 0 i
  • Flowtype 属性“msg”缺失为 null 或未定义

    我发现 Flow 很难用 我明白那个Array find可以返回或未定义 因此 通过阅读以下内容 github Array find on Array 引发 https github com facebook flow issues 351
  • 从输入类型编号获取无效值

    我正在使用输入类型数字 当它无效时 我如何从中获取值 例如 使用类型编号并仅打印 e 这本身是无效的 我正在使用 React 但我认为这个问题非常普遍 onChange event console log event target valu

随机推荐

  • MySQL---创建表和连表、分组、排序等操作

    首先这里有两张表做测试用 代码均在命令提示符终端完成 创建部门表 create table department table department id int auto increment primary key department v
  • TCP三次握手如果使用二次握手代替则会出现的问题

    简述 第一次握手 发送SYN报文 传达信息 你好 我想建立连接 第二次握手 回传SYN ACK报文 传达信息 好的 可以建立链接 第三次握手 回传ACK报文 传到信息 好的 我知道了 那我们连接 然后就建立连接了 在发送报文之前各方都要确认
  • Java基础——Math类、Random类、System类

    目录 1 Math类 2 Random类 3 System类 1 Math类 Math 类包含用于执行基本数学运算的方法 如初等指数 对数 平方根和三角函数 成员变量 public static final double E 自然底数 pu
  • java设计模式——代理模式(Proxy Pattern)

    概述 在某些情况下 一个客户不想或者不能直接引用一个对 象 此时可以通过一个称之为 代理 的第三者来实现 间接引用 代理对象可以在客户端和目标对象之间起到 中介的作用 并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外
  • 在vscode中创建vue自定义模板

    首先找到用户代码片段的位置 https img blog csdnimg cn 20201105094443610 png pic center 在输入框中输入vue 然后选择vue json或vue 打开之后是这样的 这些注释就是介绍怎么
  • SQL拼接存在的误区

    这两天修复一个SQL拼接的问题 给自己挖了个坑 对于指定的字符串作为查询条件时 当在SQL语句中使用单引号包裹查询条件时 需要注意以下几点 1 SQL注入攻击 如果接受外部输入的值直接拼接到SQL语句中 在查询条件中包含特殊字符如单引号或双
  • Java内部类总结

    Java内部类其实在J2EE编程中使用较少 不过在窗口应用编程中特别常见 主要用来事件的处理 其实 做非GUI编程 内部类完全可以不用 内部类的声明 访问控制等于外部类有所不同 要灵活使用内部类来编写程序 还是有相当难度的 Java发明了这
  • Web后台快速开发框架

    Web后台快速开发框架 Coldairarrow 目录 目录 第1章 目录 1 第2章 简介 3 第3章 基础准备 4 3 1 开发环境要求 4 3 2 基础数据库构建 4 3 3 运行 5 第4章 详细教程 6 4 1 代码架构 6 4
  • PC: 市场寒冬剖析

    市场调研机构Canalys数据显示 今年一季度 中国市场整体PC出货量同比下降24 至890万台 已是连续第五个季度下跌 今年截至618结束 都没有一家主要的PC厂商愿意发战报 PC市场怎样走出寒冬 谈谈你的理解和看法 PC 一 2022年
  • Rxjava学习(一)简单分析Rxjava调用流程

    本篇以Rxjava最简短的调用流程为例来分析 下面是要分析的实例代码 Observable create new ObservableOnSubscribe
  • 1140 石子游戏 II

    题目描述 亚历克斯和李继续他们的石子游戏 许多堆石子 排成一行 每堆都有正整数颗石子 piles i 游戏以谁手中的石子最多来决出胜负 亚历克斯和李轮流进行 亚历克斯先开始 最初 M 1 在每个玩家的回合中 该玩家可以拿走剩下的 前 X 堆
  • C++中传送函数指针

    随时随地阅读更多技术实战干货 获取项目源码 学习资料 请关注源代码社区公众号 ydmsq666 函数指针是一种非常好的类型 因此 可以编写一个函数 它的一个参数是函数指针 然后 在 外部 函数使用其函数指针参数时 就间接地调用在调用函数时对
  • vue路由

    路由 理解 一个路由 route 就是一组映射关系 key value 多个路由需要路由器 router 进行管理 前端路由 key是路径 value是组件 路由标签
  • 基于共享内存 实现Python 和c++ 传输图片

    需求 c 将图片写入共享内存 python读取 将c 写的共享内存的操作封装为一个so库 c 和python共同调用这个库 便于双方的操作 省去信号量的管理操作 一 c 写入端 int main int argc char argv Sha
  • GDB的使用方法

    GDB的使用方法 一 GDB的静态调试启动方法 1 当需要在命令行通过gdb来启动可执行程序的时候 可使用一下命令 gdb lt 可执行程序名 gt 这个时候gdb会加载可执行程序的符号表和堆栈 并为启动程序作好准备 接下来 需要设置可执行
  • Knight Moves_dfs_2018_3_10

    A friend of you is doing research on the Traveling Knight Problem TKP where you are to find the shortest closed tour of
  • Golang 中实现注解功能的思路分析

    文章目录 注解的作用 一些实现注解的开源 Golang 工程 Golang 中实现注解的基本思路 第一步 源码词法分析 第二步 代码生成 第三步 自动执行 番外 Golang 中一种代替注解的方案 注解的作用 提到注解 需要短暂的说明其前世
  • 开源协议(OSS License)详解

    表1 各种协议代表软件 BSD 也称修正BSD FreeBSD NetBSD OpenBSD MPL Firefox Thunderbird GPL Linuxkernel GIMP LGPL GTK OpenOffice org 表2 许
  • Win10上配置Paddle的PARL运行环境

    安装是根据B站百度强化学习视频中的方法 在Windows10环境上配置PARL 由于版本不匹配问题掉过坑 耽误了些时间 在此记录下 避免后续入坑 配置过程中从CSDN上也找到了一些有参考意义的文章 一并记录 方便学习 推荐好文强化学习PAR
  • 【1.9w字】彻底搞懂HTTP知识的面试题,建议精读收藏

    我很早之前写过一篇关于 HTTP 和 HTTPS 的文章 但对于 HTTPS 介绍还不够详细 只讲了比较基础的部分 所以这次我们再来深入一下 HTTPS 用实战抓包的方式 带大家再来窥探一次 HTTPS 如何理解 URI URI 全称为 U