HTTP简介
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从网络服务器传输超文本到本地浏览器的传送协议。
HTTP基于TCP/IP协议来传输数据(HTML 文件, 图片文件, 查询结果等)。它和TCP/IP协议簇内的众多协议相同用来客户端和服务器通信。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP之URL
在认识URL之前,浅显的提一句URI。HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。而URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息
URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址
- URI 表示请求服务器的路径,定义这么一个资源
- URL 同时说明要如何访问这个资源
平时我们说的“网址”其实就是说的URL。
1 | http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1 |
从上边的URL可以看到,一个完整的URL包含这几个部分:
1.协议方案名:该协议方案名为“http:”,这代表网页使用的是HTTP协议
2.登陆信息(如果网页需要认证则会出现)
3.域名部分:该URL的域名部分为”www.example.jp"。一个URL中也可以使用IP地址作为域名使用
4.端口部分:跟在域名后面,与域名之间使用”:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分将会采用默认端口
5.带层次的文件路径:从域名后的第一个”/“开始到最后一个”/“结束,是虚拟目录部分。不是URL必须的部分,本例中的虚拟目录是”/dir/“
6.文件名部分:从域名后的最后一个”/“开始到”?”为止;如果没有”?”,则是从域名后的最后一个”/“开始到”#”为止;如果没有”?”和”#”,那么从域名后的最后一个”/“开始到结束都是文件名部分。本例中的文件名是”index.htm”。文件名部分也不是一个URL必须的部分,如果省略该部分则使用默认的文件名
7.参数部分:从”?”开始到”#”之间的部分称之为参数部分,又称搜索部分,查询部分。本例中的参数部分为”uid=1”。参数可以允许有多个参数,参数之间用”&”作为分隔符
8.锚部分:从”#”开始到最后都是锚部分。本例中的锚部分是”ch1”。锚部分也不是一个URL必须的部分
urlencode和urldecode
在URL中,像/?:这样的字符会被当做特殊意义理解,因此这些字符不能随意出现。而如若某个参数需要带有这些特殊字符,就必须对这些特殊字符进行转义,即urlencode编码。
转义规则:将需要转码的字符转为16进制,然后从右往左取四位(不足四位直接处理),每2位做一位,前面加上%,编码成%XY格式
如上图所示,我们搜索的是”C++”,而”+”被转义成了”%2B”
urldecode就是urlencode的逆过程,即解码。
HTTP协议格式
请求消息Request
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
- 请求行:用来说明请求类型,要访问的资源以及使用的HTTP版本信息
- 请求头部:请求的属性,冒号分割的键值对;每组属性用\n分隔,遇到空行则表示请求头部结束
- 空行
- 请求正文:请求正文允许为空字符串;如果请求正文存在则在请求头部中会有一个Content-Length属性来表示请求正文的长度
响应消息Response
服务器在接收并处理客户端发过来的请求之后会返回一个HTTP的响应消息
HTTP响应也分为四个部分组成,分别是:
- 状态行:[][][版本号]+[状态码]+[状态码描述]
- 消息报头:请求的属性,冒号分割的键值对;每组属性用\n分隔,遇到空行则表示请求头部结束
- 空行
- 响应正文:如果服务器返回了一个html页面,那么html页面内容就是在响应正文中
HTTP的方法
方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET | 请求指定的页面信息,并返回实体 | 1.0,1.1 |
POST | 向指定资源提交数据进行处理请求,可能会导致新的资源的建立或已有资源的修改 | 1.0,1.1 |
PUT | 传输文件 | 1.0,1.1(1.1新增) |
HEAD | 获得报文首部(类似于GET请求) | 1.0,1.1 |
DELETE | 删除文件 | 1.0,1.1(1.1新增) |
OPTIONS | 询问支持的方法 | 1.1(1.1新增) |
TRACE | 回显服务器收到的请求,追踪路径 | 1.1(1.1新增) |
CONNECT | 预留给能够将连接改为管道方式的代理服务器 | 1.1(1.1新增) |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINE | 断开连接关系 | 1.0 |
HTTP的状态码
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
常见状态码:
- 200(OK)
- 404(Not)
- 403(Forbidden)
- 302(Redirect,重定向)
- 504(Bad Gateway)
HTTP常见Header
- Content-Type:数据类型(text/html等)
- Content-Length:正文的长度
- Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上
- referer:当前页面是从哪个页面跳转过来的
- location:搭配3XX状态码使用,告诉客户端接下来要去哪里访问
- Cookie:用于在客户端存储少量信息,通常用于实现会话的功能
HTTP工作原理
1.客户端连接到Web服务器
一个HTTP客户端(通常是浏览器),与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接
2.发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个请求报文
3.服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。
4.释放连接TCP连接
5.客户端浏览器解析HTML内容
客户端首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端读取响应数据,根据HTML的语法对其进行格式化,并在浏览器窗口显示