Appearance
HTTP协议
HTTP,超文本传输协议( HyperText Transfer Protocol )。互联网应用最为广泛的一种网络应用层协议。它可以减少网络传输,使浏览器更加高效。
这一个是一个无状态的(不会记录用户的信息), 以请求头, 应答方式运行的协议, 可以使用拓展的语义和自描述的信息格式
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。
消息格式
浏览器 —> 发给 —> 服务器。主旨内容包含4部分:
- 请求行: 说明请求类型, 要访问的资源, 以及使用的http版本
- 请求头
- 请求方法 比如GET/POST/HEAD/PUT 标记对用的资源操作
- 请求的目标, 通常是一个URI, 记录要操作的资源
- 版本号, 使用的协议版本
- 响应头
- 版本号
- 状态码, 三位数字, 200成功, 500 服务错误
- 原因, 数字的描述
- 请求头: 说明服务器要使用的附加信息
按照一个key-value的形式存在, 使用":"进行分割, 使用一个CGLF("\r\n")进行分割
- 常用数据的类型
"Content-type": 数据的类型("application/json")
这一个不只是可以使用以及有的, 还可以自定义拓展
注意: 名字不区分大小写, 不可以有空格, 可以使用"-"但是不可以使用"_", 名字之后立即是":"不可以有空格, 名字前面可以有, 顺序可以是随机的, 原则上是不可以重复的, 但是有的字段是可以重复的("Set-Cookie")
- 常用的字段
Host: 标识连接是和哪一个服务建立的
Referer: 限制来源
Server: 标识服务器的类型
Date: 时间
Content-type: 数据的类型
Connection: 连接的方式
- 空行: 必须!, 即使没有请求数据
- 请求数据: 也叫主体, 可以添加任意的其他数据
实际流程
查找ip
会从浏览器的缓存文件里面查找有没有这一个网站的IP地址
chrome://net-export/
这一个网址可以查看chrome浏览器
这一个文件里面没有的时候会从本机里面的host文件里面查找, 还没有的话就会使用DNS服务器进行查找
网络请求
进行TCP三次握手, 连接以后就可以进行发送HTTP请求了, 之后返回信息由本地进行解析
连接结束以后四次挥手
实际信息
请求消息(Request)
以下是浏览器发送给服务器的http协议头内容举例, 注意:9行的空行(\r\n)也是协议头的一部分:
- GET /hello.c HTTP/1.1
- Host: localhost:2222
- User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:24.0) Gecko/201001 01 Firefox/24.0
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.
- Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
- Accept-Encoding: gzip, deflate
- Connection: keep-alive
- If-Modified-Since: Fri, 18 Jul 2014 08:36:36 GMT
- //这是一个空行, 用于和数据之间分割
默认使用的是TCP连接
响应消息(Response)
服务器 —> 发给 —> 浏览器。主旨内容包含4部分:
- 状态行: 包括http协议版本号, 状态码, 状态信息
- 消息报头: 说明客户端要使用的一些附加信息
- 空行: 必须!
- 响应正文: 服务器返回给客户端的文本信息
以下是经服务器按照http协议,写回给浏览器的内容举例,1~9行是协议头部分。注意:9行\r\n的空行不可忽略
- HTTP/1.1 200 Ok
- Server: xhttpd
- Date: Fri, 18 Jul 2014 14:34:26 GMT
- Content-Type: text/plain; charset=iso-8859-1 (字符文件, 以及使用的编码, 必选项)
- Content-Length: 32 ( 要么不写 或者 传-1, 要写务必精确 !(实际测试的时候在服务器-1会出问题) )
- Content-Language: zh-CN
- Last-Modified: Fri, 18 Jul 2014 08:36:36 GMT
- Connection: close
- #include <stdio.h> (从这里开始是实际返回的额信息)
- int main(void)
- {
- printf(“ Welcome to itcast ... \n");
- return 0;
- }
HTTP请求方法
- GET
请求指定的页面信息,并返回实体主体。参数的传递是受限制的, 传递的参数直接显示在地址栏
- POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。可以用于传输大量数据
- HEAD
类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
- PUT
从客户端向服务器传送的数据取代指定的文档的内容。和POST类似, 但是这一个会指定数据存放的地址
- DELETE
请求服务器删除指定的页面。
- CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS
允许客户端查看服务器的性能。
- TRACE
回显服务器收到的请求,主要用于测试或诊断。
HTTP常用状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
o 1xx:指示信息--表示请求已接收,继续处理
o 2xx:成功--表示请求已被成功接收、理解、接受
o 3xx:重定向--要完成请求必须进行更进一步的操作
o 4xx:客户端错误--请求有语法错误或请求无法实现
o 5xx:服务器端错误--服务器未能实现合法的请求
l 常见状态码:
200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权,
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在,eg:输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求。
常见网络文件类型:
普通文件: text/plain; charset=iso-8859-1
*.html : text/html; charset=iso-8859-1
*.jpg : image/jpeg
*.gif : image/gif
*.png: image/png
*.wav: audio/wav
*.avi : video/x-msvideo
*.mov : video/quicktime
*.mp3 : audio/mpeg
charset=iso-8859-1 西欧的编码,说明网站采用英文编码
charset=gb2312 说明网站采用的编码是简体中文
charset=utf-8 代表世界通用的语言编码;可以用到中文、韩文、日文等世界上所有语言编码
charset=euc-kr 说明网站采用的编码是韩文;
charset=big5 说明网站采用的编码是繁体中文;
HTTPS
在传输之前需要对数据进行一次加密, 在HTTP层和TCP层之间加了一个安全传输层SSL/TSL层, 一般使用端口443
摘要算法
md5, sha1, sha2, sha1 256
可以把任意长度的数据压缩成为一个固定长度, 并且独一无二的数据, 之后把明文和摘要数据进行一起传输, 数据到对方以后再进行解密以及对比摘要数据
对称加密
编解码的时候使用相同的密钥
可以使用xor进行
非对称加密
有两个密钥, 一个是公钥另一个是私钥, 这两个是不同的, 使用公钥进行加密, 使用私钥进行解密
公钥是可以随意分发的, 私钥是不可以在网络进行传输的, 这一种算法的效率比较低
DH, DSA, RSA, ECC
TLS里面综合使用这两种加密方式, 取长补短, 既可以安全的交换密钥, 又可以高效的解密
流程
这一个是在三次握手之后进行的, 客户端发送一下自己支持的加密算法, 服务器选择一个加密套件, 公钥数字以及证书, 告诉客户端
这一个证书里面要求有公钥用户信息, 公钥, 权威机构签名, 有效期等用于证明这一个服务器是真正的服务器
之后客户端会随机生成一个密钥(对称加密使用), 之后使用从服务器获取的公钥进行加密, 发送给服务器, 服务器使用自己的私钥进行解密
交换之后就可以使用对称的加密算法进行数据的传输