前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >程序员必须掌握的HTTP基本知识

程序员必须掌握的HTTP基本知识

作者头像
努力的Greatiga
发布于 2022-07-25 02:16:49
发布于 2022-07-25 02:16:49
23400
代码可运行
举报
运行总次数:0
代码可运行

HTTP

请求报文的构成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(GET/POST..) (/index) HTTP/1.1  
 协议       资源地址  http版本  
(HOST: tzwlink.xyz)  
 域名  
  
(userName=gre&age=21)  
 请求内容  

例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /blogart HTTP/1.1  
HOST: tzwlink.xyz  
Connection: keep-alive  
  
name=great&age=21  

响应报文的构成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(HTTP/1.1) (200) (OK)  
 http版本  状态码 状态码解释原因  
(Date: Tue, 10 Jul 2020 15:37:34 GMT)  
 创建响应的时间  
(Content-Length: 600)  
 字节大小  
(Content-Type: text/html)  
  
(<html\>...)  
 响应内容  
  
例如  
  
HTTP/1.1 200 OK  
Date: Tue, 10 Jul 2020 15:37:34 GMT  
Content-Length: 600  
Content-Type: text/html
<html\>....</html\>  

HTTP的请求响应方法

GET

指定服务器并发送请求,一般返回文本内容

POST

向服务器发送数据,服务器返回处理结果

PUT

上传文本内容,类似 FTP 协议上传文件,但是不太安全,一般不使用

HEAD

用来获取服务器的头部相关信息、资源更新时间等,服务器只返回头部信息,不返回主体内容

DELETE

用来请求服务器删除某项资源

OPTIONS

用来查询服务器支持哪些方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
OPTIONS \* HTTP/1.1  
HOST: tzwlink.xyz  
  
//响应  
  
HTTP/1.1 200 OK  
Allow: GET,POST,PUT,HEAD  

CONNECT

使用隧道连接,比如 SSL 安全套层

持久连接和Cookie

原始问题

原本的 http 中,一旦传输完成报文主体,那么 tcp 就断了,但是如果 html 文档里还有图片、数据也需要请求时,还要在建立 tcp 连接再次请求。这样的话太浪费,我们完全可以让 tcp 继续连接,把文档中需要请求的地方请求完,然后如果一段时间都没请求时在断开。

所以引入了 Content: keep-alive,要求就是只要任何一方不提出断开,那么就一直连接

管线化

以往,请求需要得到回应后才能继续下一条请求,这样其实一点也不高效。因为服务器端是可以同时处理大量请求的。

管线化技术实现了可以同时发送多个请求,然后依次响应,无需等待每一次的响应结束。这样一来 web 页面效率大大提高

使用 Cookie 进行状态管理

以往的 http 传输完成后并不会保存信息,通过 Cookie 会在初次请求之后保存部分信息(比如用户登录信息),然后再次请求时可以将 Cookie 加入请求报文中

报文信息

报文格式

前面大概讲过

例子

编码传输

某些时候文件内容较多可以采用编码压缩的方式,但是解压时会增大服务器负担

  • gzip
  • compress

分块传输

当文件较大时,可以分割为多个部分分时传送,让浏览器一块一块的显示页面

获取部分内容 "获取部分内容")获取部分内容

当某个内容下载到一半失败时,重新下载往往从头开始,所以引入可以指定范围,比如重新加载时可以从后面一半开始。返回成功状态码 206

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /great.png HTTP/1.1  
HOST: www.tzwlink.xyz  
Range: bytes = 5000\-10000  
  
//响应  
  
HTTP/1.1 200 OK  
Date: Tue, 10 Jul 2020 15:37:34 GMT  
Content-Range: bytes 5000\-10000/10000  
Content-Length: 5000  
Content-Type: image/jpeg

常见状态码

2XX

  • 200 表示成功处理请求,并且返回了响应报文内容
  • 204 表示成功处理请求,但是并没有什么资源可以返回,利用这个可以做一些数据修改,添加数据的请求
  • 206 表示成功处理部分内容的请求,返回请求所指定的报文内容

3XX

  • 301 永久重定向,将请求的 URI 资源永久重定向到某个指定资源位置
  • 302 临时重定向,可能重定向的资源还会再次改变
  • 303 上面两种状态码明文上规定重定向时不允许改变请求方法,但是实际使用时大家都不怎么遵守,所以增加 303 表示允许重定向时修改请求方法
  • 304 允许在特定条件下从缓存获取资源,因为如果重复的请求都要依靠服务端查询那么工作量太大,所以可以从缓存中获取,无需再从数据库查询

比如某个页面初次打开返回 200 OK ,因为第一次需要的数据需要服务端查询数据库生成,这时客服端会在缓存文件中保存 Last Modified;在相同的第二次请求发生时,客服端会在请求中加入 If Modified Since,服务端收到后会根据更新时间判断是该重新查询?返回 200,还是就让客服端用之前的缓存?返回 304

动态页面一般不会保存这些信息,所以不主动添加的话那么每次请求都是 200,如果要做缓存加速就需要添加 Last Modified

  • 307 禁止 POST 变成 GET

4XX

  • 400 请求报文出现语法错误,服务端无法解析请求,但是浏览器会像对待 200 那样对待这个状态码
  • 401 请求认证,在请求资源之前需要认证,需要包含 Authorization 请求证书信息,一般像远程连接数据库就会有这个
  • 403 拒绝请求,服务端可以无理由拒绝对指定资源的请求
  • 404 服务端找不到指定资源

5XX

  • 500 服务端内部程序出现 bug,运行错误
  • 503 服务端关闭服务维护了,请求超时

HTTPS

https-http-加密-认证-完整性保护 "https=http+加密+认证+完整性保护")https=http+加密+认证+完整性保护

原始的http协议内容都是以明文发送,容易被盗取,并且通信时无法确认收到的信息是否完整,或者被篡改。也不知道通信双方是否真实;由此引入 https,事实上是在 http 上做了一些处理。

通过与 SSL 层合用,达到安全通信的效果。SSL 会先建立安全隧道才会通信的

  • 确认通信双方身份 : 通过证书认证*来确认双方身份的真实性
  • 加密处理 : 由发送方按照一定规则对 http 报文进行加密发送
  • 完整性验证 : 例如通过 MD5 和 SHA-1 散列值检验完整性

https 在 tcp 建立的基础上,还需要建立 SSL 连接,之后进行普通的经过加密的 http 请求

加密解密都需要秘钥,一般发送方使用对方提供的公共秘钥进行加密。接受方接受到了之后又使用自己的私有密钥进行解密

通信过程 "通信过程")通信过程

  1. 客户端发送打招呼报文 client Hello给服务器,里面包含了 ssl 版本,加密组件等等信息,告诉服务端要干什么。
  2. 服务端收到了客户端打的招呼,就已 Server Hello 报文进行回复,告诉客服端服务器可以进行 ssl 通信。
  3. 紧接着服务端把自己的公开密钥证书发给客服端,客服端对发送的信息要依此进行加密,该报文叫做 Certificate 报文。
  4. 服务端还会在发一条报文 Server Hello Done,告诉客服端第一次握手(协商)结束,确认了需要用的密钥。
  5. 之后客服端作为回应发送 Client Key Exchange 报文,并且还发送了名为 Pre-master secret 的随机密码串。当然这条信息已经经过第三步的加密处理。
  6. 客户端又继续发送 Change Cipher Spec 报文,告诉服务端从这里开始以后我发送报文就要按照刚刚的 Pre-master secret 随机密码串进行加密。当然这之前还是按照第三步服务端给的密钥加密。
  7. 客服端最后发送 Finshed 报文表示结束。
  8. 服务端必须正确解析上一步客服端发送的 Finshed 报文,因为里面包含了从连接开始到这一步之前所有报文的整体校验值,如果服务端成功解析说明密钥交换成功,服务端就会发送 Change Cipher Spec 报文
  9. 最后服务端也发送 Finshed 报文表示整个 ssl 连接成功可以进行 http 加密通信了
  • 断开连接时客服端会发送 close_notify 报文表示断开。在这后 tcp 连接也断开。

图片来自图解HTTP

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
网络编程-http&https
http 最初的版本(1.1之前), 是简单的请求-应答的方式,http是建立在tcp/ip的基础上,所以每次请求都要建立连接,请求拿到数据之后,就要断开连接。如果请求获取一个字符的数据,但是还需要建立连接,断开连接这些报文,带宽利用率不高,而且往返的时间增加了很多。
Check King
2021/08/09
3900
HTTP应知应会知识点复习手册(上)
上篇主要内容: 状态码、Http1.0/1.1/2.0、Https、GET和POST
蛮三刀酱
2019/03/26
5100
HTTP应知应会知识点复习手册(上)
【黄啊码】什么是HTTP?HTTP是如何演变的?
超文本传输协议。HTTP是在计算机中用于两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
黄啊码
2022/06/10
1.5K0
HTTP你需要知道的
HTTPS是在处于应用层的HTTP协议与处于传输层的TCP协议之间,增加了一层SSL。HTTPS对传输数据进行了加密,并且HTTPS需要CA机构wosign的颁发的SSL证书。
Oceanlong
2019/01/03
5390
http与https区别和联系
(1) 简单快速:客户端向服务端发送请求时,只是简单的填写请求路径和请求方法即可,然后就可以通过浏览器或其他方式将请求发送就行了
逍遥子大表哥
2021/12/17
1K0
《图解HTTP》读书笔记
  目前国内讲解HTTP协议的书是在太少了,记忆中有两本被誉为经典的书《HTTP权威指南》与《TCP/IP详解,卷1》,但内容晦涩难懂,学习难度较大。其实,HTTP协议并不复杂,理解起来也不会花费太多学习成本,这本书的出现就及时缓解了该问题。对基础及核心部分的深入学习是成为一名专业技术人员的前提,以不变应万变才是立足之本。此外,这本书也是我的2016年度读书计划中的一本,它和《图解TCP/IP》一起作为计算机网络基础部分为我温故知新了一把,谢谢作者和译者,画了这么多图解让我们理解。
Edison Zhou
2018/08/20
7750
《图解HTTP》读书笔记
面试问你HTTP知识点?这篇搞懂秒杀90%知识点!
由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
乔戈里
2019/07/10
9920
面试问你HTTP知识点?这篇搞懂秒杀90%知识点!
《图解 HTTP》 阅读摘要
这次做了一些笔记,方便自己和其他人翻阅和复习,因为这本书是 2014 年出的初版,所以有一些不怎么常用的技术,笔记中就省略了,只记一些比较常用的 ~
前端下午茶
2019/06/27
6500
HTTP超详细总结
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
说故事的五公子
2019/12/26
8040
HTTP超详细总结
《图解HTTP》(笔记)
IP 地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定地址,ARP 根据通信方的 IP 地址就可以反查出对应的 MAC 地址。
爱学习的程序媛
2022/10/27
5440
《图解HTTP》(笔记)
http协议理解
对于HTTP协议,想必大家都不陌生,在工作中经常用到,特别是针对移动端和前端开发人员来说,要获取服务端数据,基本走的网络请求都是基于HTTP协议,特别是RESTFUL + JSON 这种搭配特别主流。那如果让大家具体讲讲HTTP协议背后的历史、原理、交互流程、与HTTPS区别、身份认证、Web攻防技术等等信息,大家能讲的出来吗,反正我讲的也是一知半解,虽然会经常看这方面的文章,但也只是在具体项目进行开发过程中碰到对某个概念不清楚,才会去特意看下,却没有特意去总结归纳为一直知识点,没有完整的表达描述过,其实对这个知识点还是没掌握好的,所以用写作方式来进行阐述是很好一个方式,目前也正在践行着。
心跳包
2020/08/31
5490
http协议理解
【面试题】HTTP知识点整理(附答案)
HTTP/1 的几种优化可以弃用: 合并文件、内联资源、雪碧图、域名分片对于 HTTP/2 来说是不必要的,使用 h2 尽可能将资源细粒化,文件分解地尽可能散,不用担心请求数多
木子星兮
2020/07/17
1.4K0
【面试题】HTTP知识点整理(附答案)
HTTP就是这么简单
为什么要学HTTP? 我们绝大多数的Web应用都是基于HTTP来进行开发的。我们对Web的操作都是通过HTTP协议来进行传输数据的。 简单来说,HTTP协议就是客户端和服务器交互的一种通迅的格式。 HTTP的诞生主要是为了能够让文档之间相互关联,形成超文本可以互相传阅 可以说,Http就是Web通信的基础,这是我们必学的。 HTTP基础概念 我们学计算机网络的时候就知道,我们把计算机网络分层了5层,一般我们现在用的都是TCP/IP这么一个分层结构。 虽然官方的是ISO 提出的7层结构,但是仅仅是理论基础,在
Java3y
2018/03/15
6170
HTTP就是这么简单
一文带你深入理解 HTTP
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,“超文本”即不仅仅是文本,还可以传输HTML 文件, 图片文件等。
杰哥的IT之旅
2020/06/18
3.2K0
一文带你深入理解 HTTP
终、《图解HTTP》读书笔记 - 汇总篇(总结)
又一本网络基础的书啃完了,这本书建议结合[[《网络是怎么样连接的》读书笔记 - 汇总篇]]这一篇读书笔记食用(当然也可以直接看原书)。
阿东
2022/12/06
6620
终、《图解HTTP》读书笔记 - 汇总篇(总结)
HTTP协议的基础
http://t66y.com/ => URL 统一资源定位符(Uniform Resource Locator)
全栈程序员站长
2022/09/12
1.3K0
HTTP协议的基础
五千来字小作文,是的,我们是有个HTTP。
因为这个属性JSESSIONID比较重要,存储的是sessionId,这个要是被别人拿到的话,别人就可以冒充我在网站上做某些事情了,像我自己一样请求某些数据了
java小杰要加油
2021/05/13
4430
五千来字小作文,是的,我们是有个HTTP。
深入了解HTTP(已完结)
在学习网络之前,了解它的历史能够帮助我明白为何它会发展为如今这个样子,能让我有探究它的兴趣。下面的这张图片就展示了“互联网”诞生至今的发展历程
yutingbai
2022/08/18
3130
深入了解HTTP(已完结)
程序员必须要了解的网络协议HTTP,也许你只了解其中一部分
获取报文首部 和GET 方法类似,但是不返回报文实体主体部分。主要用于确认 URL 的有效性以及资源更新的日期时间等。
IT大咖说
2019/08/06
6870
HTTP常见面试题
HTTP常见面试题 Http与Https的区别: Http与Https的区别: HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头 HTTP 是不安全的,而 HTTPS 是安全的 HTTP 标准端口是80 ,而 HTTPS 的标准端口是443 在OSI 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层 HTTP 无法加密,而HTTPS 对传输的数据进行加密 HTTP无需证书,而HTTPS 需要CA机构wosign的颁发的SSL证书 什么是H
Java3y
2018/03/15
1.7K0
HTTP常见面试题
相关推荐
网络编程-http&https
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验