HTTP学习笔记

56次阅读

共计 2702 个字符,预计需要花费 7 分钟才能阅读完成。

一、WWW 概念 WWW(World Wide Web),主要包括三部分概念
URI,俗称网址
HTTP,两个电脑之间传输内容的协议
HTML,超级文本,主要用来做页面跳转
解释:URL 的作用是能让你访问一个页面,HTTP 的作用是让你能下载这个页面,HTML 的作用是让你能看懂这个页面。

URI 是什么
概念:统一资源标识符(英语:Uniform Resource Identifier,缩写 URI)
URI 分为 URL 和 URN,我们一般使用 URL 作为网址。

URN 是什么
概念:统一资源名称(英语:Uniform Resource Name,缩写 URN)

URL 是什么
概念:统一资源定位符(英语:Uniform Resource Locator,缩写 URL)

DNS 是什么
网域名称系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS 使用 TCP 和 UDP 端口 53[1]。当前,对于每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符。

二、请求与响应
2.1http 作用
HTTP 的作用就是指导浏览器和服务器如何进行沟通。
浏览器负责发起请求
服务器在 80 端口接收请求
服务器负责返回内容(响应)
浏览器负责下载响应内容

2.2 请求示例
Git Bash 命令行执行后,请求内容为:
- s 显示进度
- v 完整的显示请求和响应
- H 添加请求头

curl -s -v -H "Frank: xxx" -- "https://www.baidu.com"【GET 请求内容】GET / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: */*
Frank: xxx


curl -X POST -s -v -H "Frank: xxx" -- "https://www.baidu.com"【POST 请求内容】POST / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: */*
Frank: xxx


curl -X POST -d "1234567890" -s -v -H "Frank: xxx" -- "https://www.baidu.com"【POST 带数据请求内容】POST / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: */*
Frank: xxx
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
// 注意此处是空行
1234567890

2.3 请求内容格式示例

1 动词 路径 协议 / 版本
2 Key1: value1
2 Key2: value2
2 Key3: value3
2 Content-Type: application/x-www-form-urlencoded
2 Host: www.baidu.com
2 User-Agent: curl/7.54.0
3
4 要上传的数据
注:请求第二部分有多行内容,格式为 Key?: value?

0 请求最多包含四部分,最少包含三部分。(也就是说第四部分可以为空)
1 第三部分永远都是一个回车(n)
2 动词有 GET POST PUT PATCH DELETE HEAD OPTIONS 等

GET  获取
POST 新增 / 上传
PUT  整体更新
PATCH 局部更新    

3 这里的路径包括「查询参数」,但不包括「锚点」
4 如果你没有写路径,那么路径默认为 /
5 第 2 部分中的 Content-Type 标注了第 4 部分的格式

2.4 响应内容格式示例
1 协议 / 版本号 状态码 状态解释
2 Key1: value1
2 Key2: value2
2 Content-Length: 17931
2 Content-Type: text/html
3
4 要下载的内容

状态码要背,是服务器对浏览器说的话
1xx 不常用
2xx 表示成功【表示请求已成功被服务器接收、理解、并接受】
3xx 表示滚吧【重定向,需要客户端采取进一步的操作才能完成请求】
4xx 表示你丫错了【客户端错误】
5xx 表示好吧,我错了【服务器错误】
状态解释没什么用
第 2 部分中的 Content-Type 标注了第 4 部分的格式
第 2 部分中的 Content-Type 遵循 MIME 规范

GET 请求响应内容
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 2443
Content-Type: text/html
Date: Tue, 10 Oct 2017 09:14:05 GMT
Etag: "5886041d-98b"
Last-Modified: Mon, 23 Jan 2017 13:24:45 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/

<!DOCTYPE html>
<!--STATUS OK--><html> <head> 后面太长,省略了……


POST 请求响应内容
HTTP/1.1 302 Found
Connection: Keep-Alive
Content-Length: 17931
Content-Type: text/html
Date: Tue, 10 Oct 2017 09:19:47 GMT
Etag: "54d9749e-460b"
Server: bfe/1.0.8.18

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"> 后面太长,省略了……

注:
1、GET 请求和 POST 请求对应的响应可以一样,也可以不一样
2、响应的第四部分可以很长很长很长

2.5 使用 Chrome 查看请求
打开 Network
地址栏输入网址
在 Network 点击,查看 request,点击「view source」
点击「view source」
点击「view source」
点击「view source」
终于点了?可以看到请求的前三部分了
如果有请求的第四部分,那么在 FormData 或 Payload 里面可以看到
2.6 使用 Chrome 查看响应
打开 Network
输入网址
选中第一个响应
查看 Response Headers,点击「view source」
你会看到响应的前两部分
查看 Response 或者 Preview,你会看到响应的第 4 部分

正文完
 0

HTTP学习笔记

56次阅读

共计 5341 个字符,预计需要花费 14 分钟才能阅读完成。

本人其实对 HTTP 了解的不是太深,学习 HTTP 仅仅通过相关的面试问题进行了解,现在做一个整理,希望能够有所深层次的思考
HTTP 协议的版本
HTTP(HyperText Transfer Protocol)协议是基于 TCP 的应用层协议,它不关心数据传输的细节,主要是用来规定客户端和服务端的数据传输格式,最初是用来向客户端传输 HTML 页面的内容。默认端口是 80。
主要说明一下 HTTP1.0 HTTP1.1 HTTP2.0 版本,说明这个问题主要可以回答四个问题。
HTTP 协议有什么特点?

简单快速:每个资源(比如图片、页面)都通过 url 来定位。这都是固定的,在 http 协议中,处理起来也比较简单,想访问什么资源,直接输入 url 即可。
灵活:http 协议的头部有一个数据类型,通过 http 协议,就可以完成不同数据类型的传输。
无连接:连接一次,就会断开,不会继续保持连接。(这个特性针对 HTTP1.0 版本)
无状态:客户端和服务器端是两种身份。第一次请求结束后,就断开了,第二次请求时,服务器端并没有记住之前的状态,也就是说,服务器端无法区分客户端是否为同一个人、同一个身份。(服务端总是被动的,这一点问题在 HTTP2.0 版本得到了解决)

什么是持久连接 /HTTP 长连接?

轮询:http1.0 中,客户端每隔很短的时间,都会对服务器发出请求,查看是否有新的消息,只要轮询速度足够快,例如 1 秒,就能给人造成交互是实时进行的印象。这种做法是无奈之举,实际上对服务器、客户端双方都造成了大量的性能浪费。

长连接:HTTP1.1 中,通过使用 Connection:keep-alive 进行长连接。客户端只请求一次,但是服务器会将继续保持连接,当再次请求时,避免了重新建立连接。

注意,HTTP 1.1 默认进行持久连接。在一次 TCP 连接中可以完成多个 HTTP 请求,但是对每个请求仍然要单独发 header,Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。
说到长连接就不得不提到长连接的管线化问题。
管线化的原理:长连接时,默认的请求这样的:
请求 1 –> 响应 1 –> 请求 2 –> 响应 2 –> 请求 3 –> 响应 3
管线化就是,把现在的请求打包,客户端一次性发过去,服务端也给一次响应回来。
关于 HTTP2.0 你知道多少?

HTTP/ 2 引入了 ” 服务端推(server push)” 的概念,它允许服务端在客户端需要数据之前就主动地将数据发送到客户端缓存中,从而提高性能。

HTTP/ 2 提供更多的加密支持

HTTP/ 2 使用多路技术,允许多个消息在一个连接上同时交差。
它增加了头压缩(header compression),因此即使非常小的请求,其请求和响应的 header 都只会占用很小比例的带宽

HTTP 和 HTTPS?

HTTP 协议通常承载于 TCP 协议之上,在 HTTP 和 TCP 之间添加一个安全协议层(SSL 或 TSL),这个时候,就成了 HTTPS

默认 HTTP 的端口号为 80,HTTPS 的端口号为 443

既然有了 HTTP 协议,为什么要有 HTTPS,因为 HTTPS 更加的安全,那为什么 HTTPS 安全
因为网络请求需要中间有很多的服务器路由器的转发。中间的节点都可能篡改信息,而如果使用 HTTPS,密钥在你和终点站才有。https 之所以比 http 安全,是因为它利用 ssl/tls 协议传输。它包含证书,卸载,流量转发,负载均衡,页面适配,浏览器适配,refer 传递等。保障了传输过程的安全性
HTTP 报文
这是一个很大的问题,这个问题不复杂就是麻烦,但是这个很重要。说明报文问题之前,先描述一下报文会在哪里用到,在用户输入 URL 时,会用到报文。
一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?

浏览器查找域名对应的 IP 地址(DNS 查询:浏览器缓存 -> 系统缓存 -> 路由器缓存 ->ISP DNS 缓存 -> 根域名服务器)
浏览器向 Web 服务器发送一个 HTTP 请求(TCP 三次握手)— 这里用到了请求报文
服务器 301 重定向(从 http://example.com 重定向到 http://www.example.com)
浏览器跟踪重定向地址,请求另一个带 www 的网址
服务器处理请求(通过路由读取资源)
服务器返回一个 HTTP 响应(报头中把 Content-type 设置为 ‘text/html’)— 这里用到了响应报文
浏览器根据响应提进行 DOM 树构建
浏览器发送请求获取嵌在 HTML 中的资源(如图片、音频、视频、CSS、JS 等)
浏览器显示完成页面
浏览器发送异步请求

HTTP 请求报文
连接成功建立后,开始向 web 服务器发送请求,当浏览器向 Web 服务器发出请求时,它向服务器传递了一个数据块,也就是请求报文,HTTP 请求报文由 4 部分组成:

起始行:HTTP 请求方法 URL HTTP 版本
请求头:请求头的形式通过一个键值对进行渲染
空行:当服务器在解析请求头的时候,如果遇到了空行,则表明,后面的内容是请求体
请求体:get 方法的请求体是没有内容的(放在了 url 里)post 方法的请求体包含请求的内容

下面是一个 HTTP 请求的例子:
GET /sample.jsp HTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate

username=jinqiao&password=123412345678
起始行

请求的起始行是:”方法 URL http 版本“GET /sample.jsp HTTP/1.1

根据 HTTP 标准,HTTP 请求可以使用多种请求方法。例如:HTTP1.1 支持 7 种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE 和 TARCE。在 Internet 应用中,最常用的方法是 GET 和 POST。

URL 完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头。
协议版本声明了通信过程中使用 HTTP 的版本。

请求头(Request Header)
说明:常用的请求头和响应头,请看下面文章:https://blog.csdn.net/qq_3055…

请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。
# host 表示主机名,User-Agent 表示用户代理即浏览器

Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.123456
请求正文
请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:
username=frewen&password=12341
HTTP 响应
响应 web 服务器收到这个请求,进行处理。从它的文档空间中搜索子目录 mydir 的文件 index.html。如果找到该文件,Web 服务器把该文件内容传送给相应的 Web 浏览器。为了告知浏览器,Web 服务器首先传送一些 HTTP 头信息,然后传送具体内容(即 HTTP 体信息),HTTP 头信息和 HTTP 体信息之间用一个空行分开。
HTTP 响应与 HTTP 请求相似,HTTP 响应也由 4 个部分构成,分别是:

起始行:HTTP 协议版本 响应状态码 响应状态信息
响应头(Response Header):通过键值对的形式进行表示
空行:当客户端在解析响应头的时候,如果遇到了空行,则表明,后面的内容是响应体
响应体:网页代码 HTML、CSS、JS 代码文件

下面是一个 HTTP 响应的例子:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112

<html>
<head>
<title>HTTP 响应示例 <title>
</head>
<body>
Hello HTTP!
</body>
</html>
协议状态代码描述 HTTP 响应的第一行类似于 HTTP 请求的第一行,它表示通信所用的协议是 HTTP1.1 服务器已经成功的处理了客户端发出的请求(200 表示成功): HTTP/1.1 200 OK 响应头 (Response Header) 响应头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等:
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:13:33 GMT
Content-Type:text/html
Last-Moified:Mon,6 Oct 2003 13:23:42 GMT
Content-Length:11212345
响应体就是服务器返回的 HTML 页面:
<html>
<head>
<title>HTTP 响应示例 <title>
</head>
<body>
Hello HTTP!
</body>
</html>
HTTP 状态码
HTTP 应答码由 3 位数字构成,其中首位数字定义了应答码的类型:

1XX-信息类(Information), 表示收到 Web 浏览器请求,正在进一步的处理中 

2XX-成功类(Successful), 表示用户请求被正确接收,理解和处理例如:200 OK 

3XX – 重定向类(Redirection), 表示请求没有成功,客户必须采取进一步的动作。

4XX – 客户端错误(Client Error),表示客户端提交的请求有错误 例如:404 NOT Found,意味着请求中所引用的文档不存在。

5XX – 服务器错误 (Server Error) 表示服务器不能完成对请求的处理:如 500 

常见的状态码
100 Continue 继续,一般在发送 post 请求时,已发送了 http header 之后服务端将返回此信息,表示确认,之后发送具体参数信息

200 OK 正常返回信息
201 Created 请求成功并且服务器创建了新的资源
202 Accepted 服务器已接受请求,但尚未处理
206 Partial Content:客户端发送一个带有 range 头的 get 请求,服务端完成它。206 的应用的场景:range 指的是请求的范围,客户端只请求某个大文件里的一部分内容。比如说,如果播放视频地址或音频地址的前面一部分,可以用到 206。

301 Moved Permanently 请求的网页已永久移动到新位置。(永久重定向)
302 Found 临时性重定向。
303 See Other 临时性重定向,且总是使用 GET 请求新的 URI。
304 Not Modified 自从上次请求后,请求的网页未修改过。(服务器告诉客户端,客户端已经有缓存了,不需要从服务器这里取了。)

400 Bad Request 客户端有语法错误,不能被服务器所理解
401 Unauthorized 请求未授权。
403 Forbidden 禁止访问。
404 Not Found 找不到如何与 URI 相匹配的资源。

500 Internal Server Error 最常见的服务器端错误。
503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。
提到上面的状态码,不得不提到 304 缓存问题:304 缓存的原理

服务器首先产生 ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存
304 是 HTTP 状态码,服务器用来标识这个文件没修改,不返回内容,浏览器在接收到个状态码后,会使用浏览器已缓存的文件
客户端请求一个页面(A)。服务器返回页面 A,并在给 A 加上一个 ETag。客户端展现该页面,并将页面连同 ETag 一起缓存。客户再次请求页面 A,并将上次请求时服务器返回的 ETag 一起传递给服务器。服务器检查该 ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应 304(未修改——Not Modified)和一个空的响应体

HTTP 方法
HTTP 方法主要包括以下几个:

GET:获取资源

POST:传输资源

PUT:更新资源

DELETE:删除资源

HEAD:获得报文首部

说明一下 get 和 post 的区别

浏览器在回退时,get 不会重新请求,但是 post 会重新请求。【重要】

get 请求会被浏览器主动缓存,而 post 不会。【重要】

get 请求的参数,会报保留在浏览器的历史记录里,而 post 不会。做业务时要注意。为了防止 CSRF 攻击,很多公司把 get 统一改成了 post。

get 请求在 url 中传递的参数有大小限制,基本是 2kb,不同的浏览器略有不同。而 post 没有注意。

get 的参数是直接暴露在 url 上的,相对不安全。而 post 是放在请求体中的。

正文完
 0

HTTP学习笔记。

56次阅读

共计 1523 个字符,预计需要花费 4 分钟才能阅读完成。

HTTP 简介
HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传输协议。HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件,图片文件,查询结果等)。
HTTP 工作原理
HTTP 协议工作于客户端 - 服务端架构上。浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端发送所有的请求。Web 服务器:Apache 服务器,IIS 服务器等。Web 服务器根据接收的请求后,向客户端发送响应信息。HTTP 默认端口号为 80,但是你也可以改为 8080 或者其它端口。HTTP 三点注意事项:
*HTTP 是无连接的:无连接的含义是限制每次连接只处理一次请求。服务器处理完客户请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
*HTTP 是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过 HTTP 发送。客户端以及服务器指定使用适合的 MIME-type 内容类型。
*HTTP 是无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
以下图表展示了 HTTP 协议通信流程:
HTTP 消息结构
HTTP 是基于客户端 / 服务端的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求 / 响应协议。一个 HTTP 客户端是一个应用程序(Web 浏览器或其它任何客户端),通过连接到服务器达到向服务器发送一个或多个 HTTP 的请求的目的。一个 HTTP 服务器同样也是一个应用程序(通常是一个 Web 服务,如 Apache Web 服务器等),通过接收客户端的请求并向客户端发送 HTTP 响应数据。HTTP 使用统一资源标识符来传输数据和建立连接。一旦建立连接后,据消息就通过类似 Internet 邮件所使用的格式 [RFC5322] 和多用途 Internet 邮件扩展(MIME)[RFC2045]来传送。
客户端请求消息
客户端发送一个 HTTP 请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
服务器响应信息
HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
HTTP 请求方法
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。HTTP1.0 定义了三种请求方法:GET,POST,和 HEAD 方法。HTTP1.1 新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE 和 CONNECT 方法。
HTTP 响应头信息
HTTP 请求头提供了关于请求,响应或者其它的发送实体的信息。
HTTP 状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头用以响应浏览器的请求。下面是常见的 HTTP 状态码:
200:请求成功。
301:资源 (网页等) 被永久转移到其它 URL。
404:请求的资源(网页等)不存在。
500:内部服务器错误。
HTTP 状态码分类
HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP 状态码共分为 5 种类型:
HTTP content-type
Content-Type,内容类型,一般是指网页中存在的 Content-Type,用于定义网络文件的类型和王爷编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些 Asp 网页点击的结果却不是下载到一个文件或一张图片的原因。

正文完
 0