学习笔记-图解HTTP

news2024/11/15 17:56:14

1 Web及网络基础

1.1 适用Http协议访问Web 

在浏览器上输入网址然后访问指定的网页,浏览器就相当于是客户端,访问的网址就是指向特定的服务器。

HTTP协议:HyperText Transfer Protocol,超文本传输协议。

Web是建立在HTTP协议上通信的。

1.2 HTTP的诞生

HTTP/0.9:于1990年问世,1.0之前的版本统称

HTTP/1.0:1996年5月,HTTP正式被作为标准公布,命名为HTTP/1.0,记载于RFC1945,RFC1945 - Hypertext Transfer Protocol -- HTTP/1.0。

HTTP/1.1:1997年1月公布的。最初版本为RFC2068,之后发布的修订版RFC2616就是当前最新版本,RFC2616 - Hypertext Transfer Protocol -- HTTP/1.1。

1.3 网络基础TCP/IP

1.3.1 TCP/IP协议族

1.3.2 TCP/IP的分层管理

TCP/IP协议族按照层次分为四个层次:应用层、传输层、网络层和数据链路层。

  • 应用层:决定了向用户提供应用服务时通信的任务,如FTP(File Transfer Protocol,文件传输协议),DNS(Domain Name System,域名系统),HTTP协议。
  • 传输层:对上应用层,提供处于网络连接中的两台计算机之间的数据传输,包含两个性质不同的协议TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
  • 网络层:又名网络互连层,用来处理在网络上流动的数据包。数据包时网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包发送给对方。
  • 链路层:又名数据链路层,网络接口层,用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分,还包括连接器等一切传输媒介。硬件的范畴均属于链路层。

1.3.3 TCP/IP通信传输流

 利用TCP/IP协议族进行网络通信时,发送端从应用层往下走,接收端则从链路层往上走。

 发送端在层与层之间传输数据时,每经过一层就会添加一个该层的首部信息,反之,接收端每经过一层则会把对应的首部信息消去。

这种把数据信息包装起来的做法称为封装(encapsulate)

1.4 与HTTP密不可分的三个协议IP、DNS、TCP

1.4.1 负责传输的IP协议

IP(Initenet Protocol)网际协议位于网络层。

IP协议的作用是把各种数据包传送给对方。起中有两个关键点IP地址和MAC地址(Media Access Control Address)。

  • IP地址指明了节点被分配到的地址。
  • MAC地址指网卡所属的固定地址,每张网卡出厂时都有一个MAC地址。

路由选择(routing):数据在互联网中的传输路线。

 1.4.2 确保可靠性的TCP协议

TCP协议属于传输层,提供可靠的字节流服务。

字节流服务(Byte Stream Service)指为了传输方便将大块数据分割成以报文段(segment)为单位的数据包进行管理。

TCP协议为了更容易传输大数据把数据分割,而且能够确认数据最终是否送达到对方。

TCP协议采用三次握手(three-way handshaking)策略。

  • 发送端首先发送一个带有SYN标志的数据包给对方。
  • 接收端收到后回传一个带有SYN/ACK标志的数据包以示接收到。
  • 最后发送端再回传一个带有ACK标志的数据包,代表握手结束。
  • 握手过程中断后,TCP协议会再次以相同的顺序发送相同的数据包。

TCP协议才有其他手段保证通信可靠性。

1.5 负责域名解析的DNS服务

DNS(Domain Name System)服务是和HTTP一样位于应用层的协议,提供域名到IP地址之间的解析服务。 

 1.6 各种协议和HTTP协议之间的关系

1.7 URI和URL

1.7.1 URI(统一资源标识符)

URI 是Uniform Resource Identifier的缩写。

URI用字符穿标识某一互联网资源,而URL标识资源的地点,可见URL是URI的子集。

1.7.2 URI格式

  • 适用http:或https:等协议方案名获取访问资源是要指定协议类型。不区分字母大小写,最后附一个冒号(:),也可以适用data:或javascript:这类指定数据或脚本的方案名。
  • 登陆信息(认证):指定用户名和密码作为从服务器获取资源时的必要登录信息。为可选项。
  • 服务器地址:使用绝对URI必须指定待访问的服务器地址。域名,IPv4地址(如192.168.1.1)或IPv6地址(如[0:0:0:0:0:0:0:1])。
  • 服务器端口号:网络端口号。
  • 带层次的文件路径:指定服务器上文件路径,与UNIX系统的文件目录结构类似。
  • 查询字符串:针对已制定的文件路径类的资源,可以使用查询字符串传入任意参数。可选项。
  • 片段标识符:用来标记出以获取资源中的子资源(文档内的某个位置)。可选项。

2 简单的HTTP协议

2.1 HTTP协议用于客户端和服务器之间的通信

 2.2 通过请求和响应的交换达成通信

 请求报文:

 响应报文:

 2.3 HTTP是不保存状态的协议

HTTP是一种不保存状态,即无状态(stateless)协议。自身不对请求和响应之间的通信状态进行保存。

使用Cookie技术,再用HTTP协议通信,就可以管理状态。

2.4 请求URI定位资源

若不是访问特定资源,而是对服务器本身发起请求,可以使用一个*来代替请求URI。

如下是查询HTTP服务器端支持的HTTP方法种类:

OPTIONS * HTTP/1.1

2.5 告知服务器意图的HTTP方法

2.5.1 GET:获取资源

GET方法用来请求访问已被URI识别的资源。

 2.5.2 POST:传输实体主体

POST用来传输实体的主体。

 2.5.3 PUT:传输文件

PUT方法用来传输文件。但是由于PUT方法自身不带验证机制,任何人都可以上传文件,存在安全隐患,因此一般网站不适用该方法。

 2.5.4 HEAD:获得报文首部

HEAD方法和GET方法一样,只是不返回报文主体部分。

用于确认URI的有效性及资源更新的日期时间等。

 2.5.5 DELETE:删除文件

 DELETE方法用来删除文件,与PUT相反的方法。同PUT方法,由于不带验证机制,一般不使用该方法。

 2.5.6 OPTIONS:询问支持的方法

OPTIONS方法用来查询针对请求URI指定的资源支持的方法。

 2.5.7 TRACE:追踪路径

TRACE方法是让Web服务器端将之前的请求通信环回给客户端的方法。是用来确认连接过程中发生的一系列操作,使用它容易引发XST(Cross-Site Tracing,跨站追踪)攻击,一般不使用。

 2.5.8 CONNECT:要求使用隧道协议连接代理

 CONNECT方法要求在与代理服务器通信时建立隧道,实现使用隧道协议进行TCP通信,主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。

格式如下:

CONNECT 代理服务器名:端口号 HTTP版本

 2.6 使用方法下达命令

         注:方法区分大小写,需要使用大写字母。

2.7 持久连接节省通信量

早起的HTTP协议版本,每次通信都需要断开一次TCP连接,会增加多余的通信量开销。

 

2.7.1 持久连接

 持久连接(HTTP Persistent Connections,也称为HTTP keep-alive或HTTP connection reuse)的方法,用于解决每次都要断开一次的问题。

持久连接只要任意一端没有明确提出断开连接,则保持TCP连接。

 2.7.2 管线化

持久连接使得多数请求以管线化(pipelining)方法发送成为可能。

 2.8 使用Cookie的状态管理

Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。

没有Cookie信息状态下的请求:

 第2次以后(存在Cookie信息状态)的请求:

 3 HTTP报文内的HTTP信息

3.1 HTTP报文

用于HTTP协议交互的信息被称为HTTP报文。

请求端(客户端)的HTTP报文叫做请求报文。

响应端(服务器端)的报文叫做响应报文。

HTTP报文本身是由多行(用CR+LF做换行符)数据构成的字符串文本。

HTTP报文大致可以分为报文首部和报文主体两块,通常不一定有报文主体。

 3.2 请求报文及响应报文的结构

  • 请求行:包含用于请求的方法,请求URI和HTTP版本。
  • 状态行:包含表明响应结果的状态码,原因短语和HTTP版本。
  • 首部字段:包含表示请求和响应的各种条件和属性的各类首部。
    • 一般有四种首部:通用首部、请求首部、响应首部、实体首部。
    • 其他:RFC里未定义的首部(Cookie等)。

 3.3 编码提升传输速率

传输时编码可以有效地处理大量的访问请求。但是编码的操作需要计算机来完成,因此会消耗更多的CPU资源。

3.3.1 报文主体和实体主体的差异

名称英文基本信息备注
报文messageHTTP通信中的基本单位,由8位组字节流(octet sequence,其中octet为8个比特)组成,通过HTTP传输通常报文主体等于实体主体,当传输中进行编码操作时,实体主体的内容发生变化两者才会产生差异。
实体entity作为请求和响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。

3.3.2 压缩传输的内容编码

常用的内容编码:

  • gzip (GNU zip)
  • compress (UNIX系统的标准压缩)
  • deflate (zlib)
  • identity (不进行编码)

3.3.3 分割发送的分块传输编码

分块传输编码(Chunked Transfer Coding):把实体主体分块的功能。

 分块传输编码将实体主体分为多个部分(块)。每一块都会用十六进制来标记块的大小。

实体主体的最后一块会使用“0(CR+LF)”来标记。

3.4 发送多种数据的多部份对象集合

 多部分对象集合(Multipart):用来容纳多份不同类型的数据。

多部分对象集合包含的对象:

  • multipart/form-data:在web表单文件上传时使用。
  • multipart/byteranges:状态码206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用。

 在HTTP报文中使用多部分对象合集时,需要在首部字段里加上Content-type。

使用boundary字符串来划分多部分对象集合指明的各类实体。在boundary字符串指定的各个实体的起始行之前插入“--”来标记。在多部分对象集合对应的字符串的最后插入“--”标记作为结尾。

 3.5 获取部分内容的范围请求

范围请求(Range Request):指定范围发送的请求。  

 使用首部字段Range来指定资源的byte范围。 

针对范围请求,响应会返回状态码为206 Partial Content的响应报文。对于多重范围的范围请求,响应会在首部字段Content-Type表明multipart/byteranges后返回响应报文。

若服务器无法响应范围请求,则会返回状态码200 OK和完整的实体内容。

3.6 内容协商返回最合适的内容

内容协商(Content Negotiation)根据不同的语言等信息返回不同版本资源的机制。

 判断基准字段:

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

内容协商技术的3种类型:

类型说明
服务器驱动协商(Server-driven Negotiation)

由服务器进行内容协商。

以请求的首部字段为参考,在服务器端自动处理。

对用户来说,以浏览器发送的信息作为判断的依据,并不一定能筛选出最优内容。

客户端驱动协商(Agent-drven Negotiation)

由客户端进行内容协商的方式。

用户从浏览器显示的可选列表中手动选择。

可以利用JavaScript脚本在Web页面上自动进行选择。

如按照OS类型或浏览器类型自动切换PC版页面或手机页面。

透明协商(Transparent Negotiation)服务器驱动和客户端驱动的结合体。

4 返回结果的HTTP状态

4.1 状态码返回请求结果

 状态码分类:

状态码类别说明
1XXInformational 信息性状态码正在处理接收的请求
2XXSuccess 成功状态码清楚正常处理完毕
3XXRedirection 重定向状态码需要进行附加操作以完成请求,将访问重定向到其他地址。
4XXClient Error 客户端错误状态码服务器无法处理请求,如常见的404错误。
5XXServer Error 服务器错误状态码服务器处理请求出错。

4.2 2XX成功

表示请求被正常处理了。

状态码内容说明
200 OK

请求被正常处理了。

如:GET方法返回主体,HEAD方法返回首部,不返回主体。

204 No Content请求成功,但返回的相应报文中不含实体的主体部分。如:返回204响应后,浏览器显示的页面不发生更新。
206 Partial Content

表示客户端进行了范围请求。

响应报文包含Content-Range指定范围的实体内容。

 4.3 3XX重定向

表示需要执行某些处理,比如需要登陆或者验证等。

 4.4 4XX客户端错误

表示客户端发送错误的原因所在。

 4.5 5XX服务器错误

 表明服务器本身发生错误。

 5 与HTTP协作的Web服务器

5.1 单台虚拟主机实现多个域名

 虚拟主机(Virtual Host,又称虚拟服务器),使用一台服务器,提供多个服务。

 

 

 由于虚拟主机具有相同的域名,进行请求时Host首部内要完整指定主机名或域名的URI。

 5.2 通信数据转发程序:代理、网关、隧道

 5.2.1 代理

 作为中间人,直接转发信息,不改变请求URI。

 

 分类:

  • 缓存代理(Caching Proxy):预先将特定资源的副本缓存到代理服务器上。
  • 透明代理(Transparent Proxy):不对报文做任何加工的代理类型。
  • 非透明代理:对报文内容进行加工的代理。

 5.2.2 网关

 可以转换请求类型。

5.2.3 隧道

 

 通信线路,如SSL、SSH等。

5.3 保存资源的缓存

代理服务器或本地磁盘保存的资源副本。

可节省通信流量和通信时间。

5.3.1 缓存的有效期

 缓存需要确认缓存的有效性,若过期了需要及时更新。

 5.3.2 客户端的缓存

 6 HTTP首部

 6.2 HTTP首部字段

首部字段用来给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。

6.2.1 首部字段结构:

首部字段名:字段值


如:
Content-Type: text/html        # 说明对象类型
Keep-Alive:timeout=15,max=100    #单个字段多个值

6.2.2 4种HTTP首部字段类型

类型说明
通用首部字段 General Header Fields请求报文和响应报文两方都会使用的首部。
请求首部字段 Request Header Fields

发送请求报文时使用的首部。

补充请求的附加内容、客户端信息、响应内容相关优先级等。

响应首部字段 Response Header Fields

返回响应报文时使用的首部。

补充响应的附加内容。

实体首部字段 Entity Header Fields针对请求和响应报文的实体部分使用的首部。

6.2.3 HTTP/1.1 首部字段一览表

类型字段名说明
通用首部字段
Cache-Control
控制缓存的行为
Connection
逐跳首部、连接的管理
Date
创建报文的日期时间
Pragma
报文指令
Trailer
报文末端的首部一览
Transfer-Encoding
指定报文主体的传输编码方式
Upgrade
升级为其他协议
Via
代理服务器的相关信息
Warning
错误通知
请求首部字段
Accept
用户代理可处理的媒体类型
Accept-Charset
优先的字符集
Accept-Encoding
优先的内容编码
Accept-Language
优先的语言(自然语言)
Authorization
Web认证信息
Expect
期待服务器的特定行为
From
用户的电子邮箱地址
Host
请求资源所在服务器
If-Match
比较实体标记(ETag)
If-Modified-Since
比较资源的更新时间
If-None-Match
比较实体标记(与 If-Match 相反)
If-Range
资源未更新时发送实体 Byte 的范围请求
If-Unmodified-Since
比较资源的更新时间(与If-Modified-Since相反)
Max-Forwards
最大传输逐跳数
Proxy-Authorization
代理服务器要求客户端的认证信息
Range
实体的字节范围请求
Referer
对请求中 URI 的原始获取方
TE
传输编码的优先级
User-Agent
HTTP 客户端程序的信息
Cookie服务器接收到的Cookie信息
响应首部字段
Accept-Ranges
是否接受字节范围请求
Age
推算资源创建经过时间
ETag
资源的匹配信息
Location
令客户端重定向至指定URI
Proxy-Authenticate
代理服务器对客户端的认证信息
Retry-After
对再次发起请求的时机要求
Server
HTTP服务器的安装信息
Set-Cookie开始状态管理所用的Coookie信息
Vary
代理服务器缓存的管理信息
WWW-Authenticate
服务器对客户端的认证信息
实体首部字段
Allow
资源可支持的HTTP方法
Content-Encoding
实体主体适用的编码方式
Content-Language
实体主体的自然语言
Content-Length
实体主体的大小(单位:字节)
Content-Location
替代对应资源的URI
Content-MD5
实体主体的报文摘要
Content-Range
实体主体的位置范围
Content-Type
实体主体的媒体类型
Expires
实体主体过期的日期时间
Last-Modified
资源的最后修改日期时间

7 确保Web安全的HTTPS

HTTPS(HTTP Secure,超文本传输安全协议,或称HTTP over SSL):与SSL组合使用的HTTP。

7.1 HTTP的缺点

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

7.2 HTTP+加密+认证+完整性保护 = HTTPS

使用 HTTPS 通信

 简言之,所谓 HTTPS,其实就是身披 SSL协议这层外壳的 HTTP。

 使用两把密钥的公开密钥加密 

 证明公开密钥正确性的证书

 

HTTPS 的安全通信机制:

 

 8 确认访问用户身份的认证

8.1 何为认证

HTTP/1.1 使用的认证方式如下所示。
  • BASIC 认证(基本认证)
  • DIGEST 认证(摘要认证)
  • SSL 客户端认证
  • FormBase 认证(基于表单认证)

 

本文为《图解HTTP》的阅读笔记,旨在记录该书本中的一些重要知识点以作复习之用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL8.0安装详细教程

前言: MySQL版本区别: ● MySQL Community Server:Community是社区版本,开源免费,但不提供官方技术支持; ● MySQL Enterprise Edition:Enterprise企业版本,需付费,可以…

剑指 Offer 数组中数字出现的次数

⭐️ 题目描述 🌟 leetcode链接:数组中数字出现的次数 ⭕️ 代码: /*思路:有两个出现单次的数字,其余数字都出现两次。把所有的数字分成两组,这两个数组分到不同的组,异或起来,就可…

力扣 108. 将有序数组转换为二叉搜索树

题目来源:https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ C题解1:递归法。由于要求是平衡树,又给出了递增数组,所以构建二叉树只需将中间值作为中间节点,左右两边分属左右子树…

无广告 齐全 简洁 免费的音乐开源软件(支持 电脑max win linux 手机 )——lxMusic

无广告 齐全 简洁 免费的音乐开源软件(支持 电脑max win linux 手机 )——lxMusic 话不多说先上效果 (真香) 下载地址(官方) https://www.lanzoui.com/b0bf2cfa/ 密码:glqw 软件安装包说明 文…

python接口自动化(五)--接口测试用例和接口测试报告模板(详解)

简介 当今社会在测试领域,接口测试已经越来越多的被提及,被重视,而且现在好多招聘信息要对接口测试提出要求。区别于传统意义上的系统级别测试,很多测试人员在接触到接口测试的时候,也许对测试执行还可以比较顺利的上手…

FDM3D打印系列——5、上色和灯光

3D打印扎古头可动并加灯 大家好,我是阿赵,这次通过一个实际操作的例子,来聊一下3D打印模型添加效果。这里主要讲2个方面,一个是上色,另一个是加灯光 一、上色 这个扎古头模型就是这次的主角。 1、打磨 可以看到&…

MIT 6.S081 教材第七章内容 -- 调度 -- 上

MIT 6.S081 教材第七章内容 -- 调度 -- 上 引言线程(Thread)概述XV6线程调度XV6线程切换实际切换流程 XV6进程切换示例程序yield/sched函数switch函数scheduler函数 补充 引言 MIT 6.S081 2020 操作系统 本文为MIT 6.S081课程第七章教材内容翻译加整理…

基于Python所写的飞鸟游戏设计

https://blog.csdn.net/qq_64505944/article/details/131493838?spm1001.2014.3001.5502

容器环境检测方法总结

在渗透测试过程中,我们的起始攻击点可能在一台虚拟机里或是一个Docker环境里,甚至可能是在K8s集群环境的一个pod里,我们应该如何快速判断当前是否在容器环境中运行呢? 当拿到shell权限,看到数字和字母随机生成的主机名…

(四)Qt 动态手势识别“手掌随动”+“握拳选择”

系列文章目录 通过Qt实现手势识别控制软件操作相关系列技术方案 (一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现 (二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆…

【java爬虫】使用selenium爬取优惠券

本文将介绍使用selenium爬取某宝优惠券的方法,之所以使用selenium是因为我不会js逆向,如果你已经参透了淘宝联盟的js逆向方法,那么直接使用接口调数据就行了。 使用selenium接管chrome浏览器 由于淘宝联盟需要先登录,为了避免每…

【剧前爆米花--爪哇岛寻宝】TCP实现可靠性的方法以及连接相关的三次握手四次挥手

作者:困了电视剧 专栏:《JavaEE初阶》 文章分布:这是一篇关于网络编程的文章,在这篇文章中我会具体介绍TCP是如何实现可靠性的并且分析建立断开连接的情况,希望对你有所帮助! 目录 可靠性 确认应答 超时…

iOS开发进阶(一):走近iOS原生开发

文章目录 一、前言二、知识储备三、 Object-C四、启动流程五、拓展阅读 一、前言 在应用 uni-app 进行跨平台APP开发过程中,发现并不支持视频播放小窗功能,且插件市场提供的插件用户体验不好,遂决定自行开发 uni-app 原生插件。 uni-app原生…

力扣 450. 删除二叉搜索树中的节点

题目来源:https://leetcode.cn/problems/delete-node-in-a-bst/description/ C题解1:迭代法。删除节点需要分情况讨论: 找不到节点,返回原根节点;删除节点无子节点,那么其父节点指向空就行(注意…

Java前端编译与优化

一个编译器的前端把*.java文件转变成*.class文件的过程称为Java前端编译。像Javac这类前端编译器对代码的运行效率几乎没任何优化措施,但是其做了许多针对Java语言编码过程的优化措施来降低程序员的编码复杂度、提供编码效率。 1 Javac编译器 准备过程 初始化插入…

《PyTorch深度学习实践》第十讲 卷积神经网络(基础篇)

b站刘二大人《PyTorch深度学习实践》课程第十讲卷积神经网络(基础篇)笔记与代码:https://www.bilibili.com/video/BV1Y7411d7Ys?p10&vd_sourceb17f113d28933824d753a0915d5e3a90 上一讲中MNIST数据集的例子采用的是全连接神经网络&#…

自然语言处理从入门到应用——预训练模型总览:两大任务类型

分类目录:《自然语言处理从入门到应用》总目录 从大量无标注数据中进行预训练使许多自然语言处理任务获得显著的性能提升。总的来看,预训练模型的优势包括: 在庞大的无标注数据上进行预训练可以获取更通用的语言表示,并有利于下游…

python语法(高阶)-多线程编程

""" 演示多线程编程的使用 """ import time import threadingdef sing(msg):while True:print(msg)time.sleep(1)return Nonedef dance(msg):while True:print(msg)time.sleep(1)return Noneif __name__ __main__:# 创建一个唱歌的线程&#xf…

后台管理系统的权限(vue如何实现后台管理系统的权限,react如何实现后台管理系统的权限)

一、权限的解释 一般来说,在后台管理系统里肯定会使用到权限,权限一般分为功能级权限和数据级权限 1、功能级权限 1)、页面级权限(菜单): 不同的用户(角色)登录到管理系统后&#…

mysql load data infile 报错 1290 处理方法

mysql load data infile 命令导入数据报错"16:06:13 load data infile “/var/lib/mysql/test/employee.csv” into table emp fields terminated by ‘,’ ignore 1 lines Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cann…