HTTP详解
零、预备知识
URI
- 统一资源标识符(Uniform Resource Identifier,URI)
- 是一个用于标识某一互联网资源名称的字符串
- 分为URL和URI
URL(通常用来作为网址)
- (Uniform Resource Locator,统一资源定位符)
- 每一信息资源都有统一的且在网上唯一的地址,即你可以通过它确定一个 [唯一的] 地址(网址)
URN
- 统一资源名(URN,Uniform Resource Name)
- 通过它可以确定一个 [唯一的] 资源
举例
一个URL http://www.baidu.com/s?wd=hello%rsv_spt=1#5
- 这个网址可以拆成以下几个部分
- http:// :协议
- www.baidu.com:域名,其中.com是顶级域名(一级),baidu是二级域名,www是三级域名,所以baidu.com 和 它不是同一个域名,但它们共有二级域名
- /s:路径
- ?wd=hello&rsv_spt=1:查询参数
-
5:锚点
DNS
- (Domain Name System) 域名系统(服务)协议
- 用户输入域名, 路由帮你去问通讯公司, 通讯公司(如电信)再告诉你IP
- 即DNS作用就是,输入域名 输出IP
一、简介
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。(超文本是啥?超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。超文本更是一种用户界面范式,用以显示文本及与文本之间相关的内容。)
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。(TCP/IP是啥?传输控制/网络协议;TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、FMTP、TCP、UDP、IP等协议构成的协议簇)
二、HTTP协议的作用
HTTP是一个客户端和服务器端请求和应答的标准(TCP)
-
客户端是终端用户,服务器端是网站;
-
通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent);
-
应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server);
-
在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道(tunnels);
-
尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。
HTTP和HTTPS的区别
- HTTPS协议可以理解为HTTP协议的升级,就是在HTTP的基础上增加了数据加密
- 在数据进行传输之前,对数据进行加密,然后再发送到服务器
- 这样,就算数据被第三者所截获,但是由于数据是加密的,所以你的个人信息让然是安全的
三、HTTP与Server交互
1) 步骤
http的作用就是直到浏览器和服务器如何进行沟通(毕竟是协议嘛)
- HTTP客户端(浏览器)负责发起请求,建立一个到服务器指定端口(默认是80端口) 的TCP连接
- 服务器在80端口接受请求
- 一旦收到请求,服务器负责返回内容(响应)
- 浏览器负责下载响应内容
2) 请求
a. 请求示例
- 输入
curl -s -v -H "Try: xxx" -- "https://www.baidu.com"
(在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具,会得到请求和响应的格式及内容)> GET / HTTP/1.1
> GET / HTTP/1.1
请求方式 资源路径 协议/版本
> Host: www.baidu.com
要访问的域名(请求的服务器主机名)
> User-Agent: curl/7.65.3
访问的软件(发起请求的工具)
> Accept: */*
接收内容(这里是接收发过来的任何内容)
> Try: xxx
请求内容
>
- 输入
curl -X POST -s -v -H "Try: xxx" -- "https://www.baidu.com"
- 这里只是将请求方式改成了POST
> POST / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.65.3
> Accept: */*
> Try: xxx
>
- 输入
curl -X POST -d "1234567890" -s -v -H "Try: xxx" -- "https://www.baidu.com"
- 多了一个参数 -d
> POST / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.65.3
> Accept: */*
> Try: xxx
> Content-Length: 10
请求体的长度
> Content-Type: application/x-www-form-urlencoded
请求的与实体对应的MIME信息。如果是post请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码
>
b. 请求格式
- 请求行
- 请求方式 资源路径 协议/版本
- 请求头
- 一堆的key: value
- Content-Type Content-Length
- 请求体--要上传的内容
-
请求最多包含四部分,最少包含三部分(第四部分可以为空)
-
第三部分是一个回车
-
请求方式
- GET:向特定的资源发出请求
- POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改
- PUT:向指定资源位置上传其最新内容(整体更新)
- PATCH:向指定资源位置上传其最新内容(局部更新)
- DELETE:删除某个资源
- HEAD:和GET方法类似,不过进要求服务器返回头部信息, 不需要传输任何实际内容
- OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性
- TRACE:回显服务器收到的请求,主要用于测试或诊断
-
这里的路径包括[查询参数], 但不包括[锚点]
-
没写路径的话就默认为 /
-
第二部分中的Comtent-Type标注了第四部分的格式
3) 响应
a. 响应示例
- 输入
curl -s -v -H "Try: xxx" -- "https://www.baidu.com"
< 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: Fri, 03 Jul 2020 09:23:44 GMT
< Etag: "58860402-98b"
< Last-Modified: Mon, 23 Jan 2017 13:24:18 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<
- 输入
curl -X POST -d "1234567890" -s -v -H "Try: xxx" -- "https://www.baidu.com"
< HTTP/1.1 302 Found
< Connection: keep-alive
< Content-Length: 17931
< Content-Type: text/html
< Date: Fri, 03 Jul 2020 09:20:12 GMT
< Etag: "54d9748e-460b"
< Server: bfe/1.0.8.18
<
b. 状态码
-
1xx:指示信息,表示请求已接收,继续处理
-
2xx:成功,表示请求已被成功接受,处理。
-
200 OK:客户端请求(GET)成功
-
201 Created: 常用于POST,PUT 请求,表明请求已经成功,并新建了一个资源。并在响应体中返回路径
-
202 Accepted: 请求已经接收到,但没有响应,稍后也不会返回一个异步请求结果。 该状态码适用于等待其他进程处理或者批处理的场景
-
203 No-Authoritative Information: 表明响应返回的元信息(meta-infomation)和最初的服务器不同,而是从本地或者第三方获取的。
主要用于其他资源的镜像和备份。除了前面的情况,首选还是200。
-
204 No Content:无内容。服务器成功处理(POST),但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面
-
205 Reset Content: 告诉用户代理(浏览器)重置发送该请求的文档
-
206 Partial Content:服务器已经完成了部分GET请求(客户端进行了范围请求)。响应报文中包含Content-Range指定范围的实体内容
-
-
3xx:重定向(失败)
- 301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置。
- 302 Found:临时重定向,表示请求的资源临时搬到了其他位置
- 303 See Other:临时重定向,应使用GET定向获取请求资源。303功能与302一样,区别只是303明确客户端应该使用GET访问
- 307 Temporary Redirect:临时重定向,和302有着相同含义。POST不会变成GET
- 304 Not Modified:表示客户端发送附带条件的请求(GET方法请求报文中的IF…)时,条件不满足。304状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应, 即这次请求和之前缓存的
-
4xx:客户端错误(失败, 访问者出错)
- 400 Bad Request:客户端请求有语法错误,服务器无法理解。
- 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
- 403 Forbidden:服务器收到请求,但是拒绝提供服务
- 404 Not Found:请求资源不存在, URL无效或者URL有效但是没有资源。比如,输入了错误的url
- 406 Not Acceptable: 资源类型不符合服务器要求
- 407 Proxy Authorization Required: 需要代理授权
- 415 Unsupported media type:不支持的媒体类型
- 426 Upgrade Required: 告诉客户端需要升级通信协议。
-
5xx:服务器端错误,服务器未能实现合法的请求
- 500 Internal Server Error:服务器发生不可预期的错误
- 502 Bad Gateway: 服务器作为网关使用时,收到上游服务器返回的无效响应
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
- 504 Gateway Timeout: 网关超时。服务器作为网关或者代理,不能及时从上游服务器获取响应返回给客户端
- 505 Http Version Not Supported: 发出的请求http版本服务器不支持。如果请求通过http2发送,服务器不支持http2.0,就会返回该状态码