HTTP协议

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属性来表示请求正文的长度

HTTP请求

响应消息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

Get与POST请求的区别

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的语法对其进行格式化,并在浏览器窗口显示

0%