HTTP(S)协议概述
HTTP协议
HTTP(HyperText Transfer Protocol)超文本传输协议
定义:
? -规定了浏览器和服务器之间相互通信的规则
? -万维网交换信息的基础
? -允许将HTML文档从Web服务器传送到Web浏览器
特点:
? -HTTP协议建立在TCP协议的基础之上
? -HTTP协议是无状态的
URL与URI
统一资源定位符(Uniform Resource Locator,URL),统一资源名称(Uniform Resource Name,URN)是URI的子集。
Web上地址的基本形式是URI,它有两种形式:
-
一种是URL,这是目前URI的最普遍形式。
-
另一种就是URN,这是URL的一种更新形式,URN不依赖于位置,并且有可能减少失效连接的个数。但是其流行还需假以时日,因为它需要更精密软件的支持。
易混区分
URL | URI | |
---|---|---|
具体名称 | Uniform Resource Lacator, 统一资源定位符 |
Uniform Resource Identifier, 统一资源标识符 |
含义 | 在WWW上,每一信息资源都有统一的且唯一的地址, 该地址就是URL |
广义上的资源标识,既包括网络也可涵盖本地等 凡是标识资源的均可称为URI |
组成 | 三部分: 【协议/服务方式】 【该资源的主机IP地址(时含端口号)】 【主机资源的具体地址】 e.g. [协议]??/[主机地址]:(端口)/[路径] |
两段: 【特定协议】 及【协议内容的语法和语义】 e.g. [协议名]??/[用户名]:[密码]@[服务器地址]:[服务器端口号]/[路径]?[查询字符串]#[片段ID] |
HTTP方法
常见:
GET:获取资源
? -获取请求页面的指定消息
? -请求参数在请求头
? -请求长度有限制
POST:传输实体主体
? -获取请求页面的指定消息
? -请求参数在请求正文
HEAD:(只)返回报文首部
OPTIONS:询问支持的方法
PUT:传输文件
*但是实际上大多使用POST方式上传
DELETE:删除文件
TRACE:类比ping形式的请求
支持版本:
方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET | 获取资源 | 1.0、1.1 |
POST | 传输实体主体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获得报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
HTTP状态码
常见状态码:
2XX-成功 表示正常请求处理完毕?
? 200:OK,客户端请求成功
? 204:No Content,请求处理成功,但是没有资源返回(页面不更新)
? 206:Partial Content,客户端进行了范围请求(资源一部分请求)
3XX-重定向 需要进行附加操作以完成请求??
? 301:Move Permanently,永久性重定向,表示资源已经被分配信达URL,以后应使用资源现在所指的URL
*注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的 POST 请求得到了一个301响应的话,接下来的重定向请求将会变成 GET 方式。
? 302:Move Temporarily,临时重定向,表示资源已经被分配了新的URI,希望用户(本次)使用新的URI
? 304,Not Modified,服务器资源未改变,可直接使用未过期的缓存(无关)
4XX-客户端错误 服务器无法处理请求?
? 400:Bad Request,请求语法中存在报文错误,需要修改再次发送
? 401:Unauthorized,该状态码表示需要通过HTTP认证
? 403:Forbidden,请求访问的资源服务拒绝
? 404:Not Found,服务器上没有找到资源
5XX-服务器错误 服务器处理请求错误??
? 500:Internal Sever Error,服务器内部错误(PHP.INI关闭了display_errors,一般在服务器端源代码出现错误时出现)
? 502:Bad Gateway,作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效响应
? 503:Service Unavailable,服务器当前不能处理客户端的请求(超载或停机维护)
? 600:源站没有返回响应头,只能返回实体内容
状态码总结:
状态码 | 类别 | 原因 |
---|---|---|
1XX | 信息性 | 请求正在处理 |
2XX | 成功 | 请求正常处理完毕 |
3XX | 重定向 | 需要进行附加操作以完成请求 |
4XX | 客户端错误 | 服务器无法处理请求 |
5XX | 服务器错误 | 服务器处理请求错误 |
HTTP 首部
通用字段
? Cache-Con:控制缓存
? connection:连接的管理
? Date:创建报文的日期时间
请求字段
? Host:请求资源的主机和端口号
? User-Agent:客户端操作系统,浏览器等其他信息
? Referer:访问当前页面的上一个页面
? Cookie:请求者的身份凭证
? Accept:客户端希望接收的MIME类型消息
? Accept-Charset:指定客户端接收的字符集
响应字段
? Server:服务器所使用的Web服务名字
? Set-Cookie:向客户端设置Cookie
? Last-Modified:通知浏览器资源修改的最后时间
? Content-Length:正文长度
? Location:引导用户转向与请求URI不同的资源(重定向新资源位置)
实体字段
? Allow:通知客户端能够支持的HTTP方法
? Content-Encoding:告知客户端服务器对实体主体部分采用的字符编码
? Content-Language:告知客户端实体部分采用的语言
? Content-Location:给出与报文主体部分相对应实际的URI
? Content-Type:说明实体部分对象的媒体类型
HTTP请求过程
DNS查询
-DNS解析(域名解析服务器)
? a)首先会搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存)
? b)如果浏览器自身的缓存里面没有找到,那么浏览器会搜索系统自身的DNS缓存
? c)如果还没有找到,那么尝试从 hosts文件里面去找
? d)在前面三个过程都没获取到的情况下,就递归地去域名服务器去查找
建立TCP连接
-TCP连接建立(三次握手)
拿到域名对应的IP地址之后,User-Agent(一般指浏览器)会以一个随机端口(1024<端口<65535)向服务器的WEB程序(常用的有httpd,nginx)等的80端口。
? 这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间有各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终达到WEB程序,最终建立了TCP/IP的连接
HTTP请求
-发起HTTP请求(建立连接后)
? HTTP请求报文由三部分组成:请求行,请求头、空格、请求正文
? 请求行:用于描述客户端的请求方式(GET/POST等),请求的资源名称(URL)以及使用的HTTP协议的版本号
? 请求头:用于描述客户端请求哪台主机及其端口,以及客户端的一些环境信息等
? 空行:空行就是\r\n (POST请求时候有)
? 请求正文:当使用POST等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中(GET方式是保存在URL地址后面,不会放到这里)
关闭TCP连接
-TCP链接关闭(四次挥手)
? Web服务器向浏览器发送了请求数据,它就要关闭TCP连接
? 在头部添加代码connection:keep-alive
则会仍然保持打开状态
HTTPS
认识HTTPS
? HTTPS(Hyper Text Transfer Protocol Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但是利用SSL/TLS来加密数据包。目的是提供对网站服务器的身份认证(防冒充),保护交换数据的隐私(防窃听)与完整性(防篡改)。实现方式有通过建立基于HTTP的加密连接TLS或SSL两种。
? HTTP协议和安全协议同属于应用层。具体一点来说,安全协议工作在HTTP之下,传输层之上:安全协议像运行HTTP的进程提供一个类似TCP的套接字,供进程向其中注入报文,随后安全协议将报文加密并注入运输层套接字;或是从运输层获取加密报文,解密后交给对应进程。严格来说,HTTPS并不是一个单独的协议,而是对工作在一加密连接(TLS或SSL)上的常规HTTP协议的称呼。
? HTTPS报文中的任何东西都被加密,包括所有的报头和荷载。除了可能的选择密文攻击之外,一个攻击者所能知道的只有在两者有一连接这一事实。
TLS/SSL
? 安全传输层协议 TLS(Transport Layer Security)及其前身 安全套接字协议 SSL(Secure Sockets Layer)是为互联网提供安全及数据完整性保障的加密方式。
HTTPS流程
TLS协议关键点
(具体详细过程、字段含义可根据实际Https数据流跟踪分析)
1.客户端握手请求
·Client Hello
? -Random 发送随机数1(与服务器端共同生成)
? -Session ID 会话ID,身份标记
? -Cipher Suite 支持密码的套件
? -Compression Method 压缩方法
2.服务端端握手回应
·Server Hello
? -Random 发送随机数2(共同生成)
? -Session ID 会话ID(初次访问或已过期回发为0)
? -Cipher Suite 从客户端支持的密码套件中指定一种
? -Compression Method 指定压缩方法(若为空值null或0则为不压缩)
·Certificate
? -Certificates 发送证书链,供客户端依据证书路径进行验证
·Server Key Exchange,Server Hello Done
? -Server Key Exchange 包含密钥交换算法所需要的额外参数
? -Server Hello Done 表征握手结束
3.客户端密钥交换,准备完成
·Client Key Exchange,Change Cipher Spec,Encrypted Handshake Message
? -Client Key Exchange 交换共享公钥
? -Change Cipher Spec 进入准备加密状态
? -Encrypted Handshake Message 告知完成客户端所有握手准备内容
4.服务端准备完成
·(Server)New Session Ticket,Change Cipher Spec,Encrypted Handshake Message
? -New Session Ticket 更新客户端存储的session状态
? -Change Cipher Spec 进入准备加密状态
? -Encrypted Handshake Message 告知完成服务端所有握手准备内容
5.数据交换
·Application Data
推荐图文
图书类:
-《图解http》
-《Web之困:现代Web应用安全指南》
文章类:
-http://tools.ietf.org/html/rfc5246
-https://www.cnblogs.com/liuxiannan/p/https.html
-https://github.com/yorkeyanyy/Halforest-Field