《一篇就够系列》之HTTP详解,覆盖高频面试考点!
一、写在开头
前几篇博文大概介绍了什么是网络编程,以及网络编程的实战作用,今日起,我们将针对里面涉及到的重要知识点,进行详细的梳理与学习!
在整个WEB编程中,有个应用层的协议是我们无法跳过的,那就是HTTP
,一个超文本传输协议
我们浏览网页的时候,它总是第一个出现,我们今天就来学习了解一下它。
二、HTTP
2.1 HTTP的定义
HTTP是应用层的一个重要协议,中文译为超文本传输协议,是基于TCP协议之上的,主要为WEB浏览器和WEB服务器通讯所设计,可传输超文本和多媒体内容,当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP/HTTPS 请求进行加载的。
2.2 HTTP 响应状态码
HTTP状态码是描述HTTP请求结果的一个特定码值,通过它我们可以快速定位到本次请求的问题出现在了哪里。
状态码中,基本上以阿拉伯数字1-5作为开头,分别代表不同含义,其中1XX我们很少看到,它表示服务端正在处理接收到的请求:
100 Continue:客户端可以继续请求。通常在客户端已发送请求的初始部分后使用,表示伺服器已接收请求的初步部分,客户端应继续发送其余部分。 101 Switching Protocols:伺服器正在切换到客户端请求的协议。这在客户端请求更改协议(如从 HTTP/1.1 切换到 HTTP/2)时使用。
2XX(成功状态码)
200(成功) 服务器已成功处理了请求。这个状态码对servlet是缺省的,如果没有调用setStatus方法的话,就会得到 200; 201 Created:请求被成功处理并且在服务端创建了一个或多个新的资源。例如,通过 POST 请求创建一个新的用户。 204(无内容) 服务器成功处理了请求,未返回任何内容; 205(重置内容) 服务器成功处理了请求,未返回任何内容,重置文档视图,如清除表单内容; 206(部分内容) 服务器成功处理了部分 GET 请求。
3XX(重定向状态码)
300(多种选择) 服务器根据请求可执行多种操作。服务器可根据请求者 来选择一项操作,或提供操作列表供其选择; 301(永久移动) 请求的网页已被永久移动到新位置。服务器返回此响应时,会自动将请求者转到新位置; 302(临时移动) 服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。会自动将请求者转到新位置; 304(未修改) 自从上次请求后,请求的网页未被修改过,不会返回网页内容; 305(使用代理) 请求者只能使用指定的代理访问请求的网页。
4XX(客户端错误状态码)
400(错误请求) 服务器不理解请求的语法 ; 401(身份验证错误) 此页要求授权; 403(禁止) 服务器直接拒绝 HTTP 请求,不处理。一般用来针对非法请求; 404你请求的资源未在服务端找到。比如你请求某个用户的信息,服务端并没有找到指定的用户; 406(不接受) 无法使用请求的内容特性响应请求的网页; 408(请求超时) 服务器等候请求时发生超时; 414(请求的 URI 过长) 请求的 URI 过长,服务器无法处理。
5XX(服务器错误状态码)
500(服务器内部错误) 服务器遇到错误,无法完成请求; 503(服务不可用) 目前无法使用服务器(由于超载或进行停机维护)。通常,这只是一种暂时的状态; 504(网关超时) 服务器作为网关或代理,未及时从上游服务器接收请求; 505(HTTP 版本不受支持) 服务器不支持请求中所使用的 HTTP 协议版本。
2.2 HTTP请求报文
根据如下报文案例,我们看一下,其中①,②和③属于请求行;④属于请求头;⑤属于报文体。
① 是请求方法,HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的两种GET和POST; ② 为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL; ③ 是协议名称及版本号; ④ 是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。 ⑤ 是报文体,它将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1¶m2=value2”的方式传递请求参数。
2.3 HTTP VS HTTPS
我们从下图四个方面,对比分析HTTP与HTTPS。
端口号: HTTP的端口号是80,而HTTPS的端口号是443; URL前缀: HTTP 的 URL 前缀是 http://,HTTPS 的 URL 前缀是 https://; 安全性和资源消耗: HTTP是运行在TCP之上的协议,传输皆为明文,客户端和服务端无法验证对方身份,而HTTPS是运行在SSL/TLS之上的,传输内容经过了对称加密,并且堆成加密的秘钥,又在服务器端进行了非对称加密,相对HTTP安全很多,不过因为这一系列的操作,也让HTTPS耗费了更多的服务器资源; SEO: 搜索引擎通常会更青睐使用 HTTPS 协议的网站,因为 HTTPS 能够提供更高的安全性和用户隐私保护。使用 HTTPS 协议的网站在搜索结果中可能会被优先显示,从而对 SEO 产生影响。
2.4 HTTP不同版本
自1996年5月公布的HTTP1.0版本开始,经历了几十年时间,HTTP已经诞生了1.0,1.1,2.0,3.0等诸多版本,顺势时代发展,不断向前进步!
2.4.1 HTTP1.0 VS HTTP1.1
连接方式:HTTP1.0 为短连接,需要使用 keep-alive 参数建立长连接,HTTP1.1 默认支持keep-alive长连接。 状态响应码:HTTP1.1在原有的基础上增加了很多的响应码,光是错误响应状态码就新增了 24 种,如100、204、409、410等。 缓存机制:在 HTTP1.0 中主要使用 Header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。 带宽:HTTP1.0无法请求部分对象内容,不能断点续传,在HTTP1.1在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。 Host头处理:HTTP1.1 引入了 Host 头字段,允许在同一 IP 地址上托管多个域名,从而支持虚拟主机的功能。而 HTTP1.0 没有 Host 头字段,无法实现虚拟主机。
2.4.2 HTTP1.1 VS HTTP2.0
多路复用:HTTP2.0在同一个连接中允许同时传输多个请求和响应,互不干扰。而HTTP1.1中则采用的是串行方式,每个请求和响应都需要一个连接来处理,由于浏览器为了资源损耗控制在了6-8个TCP连接数限制,这样HTPP1.1的处理速度大大受限。
二进制帧:HTTP2.0 使用二进制帧进行数据传输,而 HTTP1.1 则使用文本格式的报文。二进制帧更加紧凑和高效,减少了传输的数据量和带宽消耗。
头部压缩:HTTP1.1 支持Body压缩,Header不支持压缩。HTTP2.0 支持对Header压缩,使用了专门为Header压缩而设计的 HPACK 算法,减少了网络开销。
2.4.3 HTTP2.0 VS HTTP3.0
传输协议:HTTP2.0 是基于 TCP 协议实现的,HTTP3.0 新增了 QUIC(Quick UDP Internet Connections) 协议来实现可靠的传输,提供与 TLS/SSL 相当的安全性,具有较低的连接和传输延迟。你可以将 QUIC 看作是 UDP 的升级版本,在其基础上新增了很多功能比如加密、重传等等。HTTP3.0 之前名为 HTTP-over-QUIC,从这个名字中我们也可以发现,HTTP3.0 最大的改造就是使用了 QUIC。 建立连接: HTTP2.0 需要经过经典的 TCP 三次握手过程(由于安全的 HTTPS 连接建立还需要 TLS 握手,共需要大约 3 个 RTT)。由于 QUIC 协议的特性(TLS 1.3,TLS 1.3 除了支持 1 个 RTT 的握手,还支持 0 个 RTT 的握手)连接建立仅需 0-RTT 或者 1-RTT。这意味着 QUIC 在最佳情况下不需要任何的额外往返时间就可以建立新连接。 头部压缩:HTTP2.0 使用 HPACK 算法进行头部压缩,而 HTTP3.0 使用更高效的 QPACK 头压缩算法。 容错性:HTTP3.0 具有更好的错误恢复机制,当出现丢包、延迟等网络问题时,可以更快地进行恢复和重传。而 HTTP2.0 则需要依赖于 TCP 的错误恢复机制。 安全性:在 HTTP2.0 中,TLS 用于加密和认证整个 HTTP 会话,包括所有的 HTTP 头部和数据负载。TLS 的工作是在 TCP 层之上,它加密的是在 TCP 连接中传输的应用层的数据,并不会对 TCP 头部以及 TLS 记录层头部进行加密,所以在传输的过程中 TCP 头部可能会被攻击者篡改来干扰通信。而 HTTP3.0 的 QUIC 对整个数据包(包括报文头和报文体)进行了加密与认证处理,保障安全性。 连接迁移:HTTP3.0 支持连接迁移,因为 QUIC 使用 64 位 ID 标识连接,只要 ID 不变就不会中断,网络环境改变时(如从 Wi-Fi 切换到移动数据)也能保持连接。而 TCP 连接是由(源 IP,源端口,目的 IP,目的端口)组成,这个四元组中一旦有一项值发生改变,这个连接也就不能用了。
三、总结
好啦,今天的HTTP学习就到这里啦,其实对于java开发工程师而言,对于HTPP的了解程度,到此也就结束了,但对于网络工程师来说,HTPP是一个至关重要的知识,需要更深层次的去探究,推荐看《图解 HTTP》这本书。
《一篇就够系列》之HTTP详解,覆盖高频面试考点!的更多相关文章
- Mysql高手系列 - 第20篇:异常捕获及处理详解(实战经验)
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第20篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- nginx高性能WEB服务器系列之四配置文件详解
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- mongo 3.4分片集群系列之六:详解配置数据库
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之五:详解平衡器
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- Kotlin——初级篇(四):控制语句详解
在前面 的章节中讲解了Kotlin语言中的数据类型.变量与常量的定义.不了解请参见前面的内容: Kotlin--初级篇(三):数据类型详解. Kotlin--初级篇(二)常量.变量.注释. 下面详细为 ...
- Hexo系列(二) 配置文件详解
Hexo 是一款优秀的博客框架,在使用 Hexo 搭建一个属于自己的博客网站后,我们还需要对其进行配置,使得 Hexo 更能满足自己的需求 这里所说的配置文件,是位于站点根目录下的 _config.y ...
- css3系列之transform详解translate
translate translate这个参数的,是transform 身上的,那么它有什么用呢? 其实他的作用很简单,就是平移,参考自己的位置来平移 translate() translateX() ...
- ThreeJS系列1_CinematicCameraJS插件详解
ThreeJS系列1_CinematicCameraJS插件详解 接着上篇 ThreeJS系列1_CinematicCameraJS插件介绍 看属性的来龙去脉 看方法作用 通过调整属性查看效果 总结 ...
- http协议详解及htt面试题目,常见的http状态码
http协议详解及htt面试题目,常见的http状态码 HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文. HTTP ...
- Maven系列第6篇:生命周期和插件详解,此篇看过之后在maven的理解上可以超越同级别90%的人!
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能. 这是maven系列第6篇. 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部 ...
随机推荐
- DRM:清华提出无偏差的新类发现与定位新方法 | CVPR 2024
论文分析了现有的新类别发现和定位(NCDL)方法并确定了核心问题:目标检测器往往偏向已知的目标,忽略未知的目标.为了解决这个问题,论文提出了去偏差区域挖掘(DRM)方法,以互补的方式结合类无关RPN和 ...
- 瑞芯微|如何让拥有双网口的Linux设备实现数据包转发?【超实用】
本文主要讲解如何,解决基于3568实现双网口互通问题. 一.组网 如下图所示: rk3568自带2个千兆以太口,对应网卡名称为:eth0.eth1 pc1和pc2分别连接这2个网口 pc1与eth0连 ...
- 使用Kiota工具生成WebApi的代理类,以及接口调用的简单体验
前言 当前.NET环境下,生成WebApi代理类的工具已经有很多选择了,比如OpenApi Generator,NSwag和Refitter等,不同的工具生成的代码风格以及实现方式略有不同,比如Ref ...
- WPF:MVVM的由来与属性绑定的过程
WPF:MVVM的由来与属性绑定的过程 1.MVVM (1)MVVM是什么? MVVM(Model-View-ViewModel)是一种软件架构设计模式MVVM模式.有助于分离应用程序的业务逻辑和 ...
- QTreeWidget绑定QTabWidget
QTreeWidget绑定QTabWidget 本文仅供本人知识总结使用,所以内容会比较浅显,不喜勿喷. 文章目录 QTreeWidget绑定QTabWidget 一.通过treeWidget路径配合 ...
- C 语言编译过程
编译过程 编译过程是将高级编程语言(如 C 语言)写成的源代码转换成机器可以执行的低级机器语言(通常是二进制代码)的过程.这个过程一般可以分为几个阶段: 预处理(Preprocessing): 预处理 ...
- [Udemy] AWS Certified Data Analytics Specialty - 3.Processing
Lambda Lambda 经常起胶水的作用,就是粘合不同的service. 如下图例子 另外Requirement #1 也是一个例子,还有Requirement #3 除了Kinesis Data ...
- sharepoint 打开rdl报表,报表服务器数据库内出错。此错误可能是因连接失败、超时或数据库中磁盘空间不足而导致的
最近在做reporting services报表的时候,部署到sharepoint后,打开rdl报表,经常遇到一个问题: 报表服务器数据库内出错.此错误可能是因连接失败.超时或数据库中磁盘空间不足而导 ...
- 全面掌握 Jest:从零开始的测试指南(上篇)
随着JavaScript在前后端开发中的广泛应用,测试已成为保证代码质量的关键环节. 为什么需要单元测试 在我们的开发过程中,经常需要定义一些算法函数,例如将接口返回的数据转换成UI组件所需的格式.为 ...
- @vue/cli eslint插件使用指南
使用步骤 使用 npm 安装 @vue/cli-service 版本对应的 @vue/cli-plugin-eslint 例如:"@vue/cli-service": " ...