这篇博客主要介绍一下HTTP协议(HTTP 1.0 & HTTP 1.1)的相关内容:
1.特点(HTTP 1.0):
· 客户/服务器模式(C/S)
· 简单快速:HTTP服务器的程序规模小,因此通信速度快
· 灵活:HTTP允许传输任意类型的数据对象
· 无连接,每次连接只处理一个请求:服务器处理完客户的请求并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间
· 无状态:HTTP协议每当有新的请求产生,就会有对应的新响应产生,协议本身并不会保留之前的一切请求或者响应,这是为了更快的处理大量的事务,确保协议的可伸缩性(随着web的发展,为了保持状态的功能,比如保持用户的登录状态等,于是引入了cookie技术,用来保存用户方面的信息(用户成功登录一次后,服务器返回一个session ID给用户,存放在cookie中,下次登录就直接使用cookie中的信息))
2.URI、URL、URN
· URI(uniform resource identifier):统一资源标识符,用来唯一地标识一个资源(抽象的)
· URL(uniform resource locator):统一资源定位符,是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何定位这个资源(是URI的子集,任何东西,只要能够唯一地标识出来,都可以说这个标识是URI。如果这个标识是一个可获取到对象的路径,那么同时它也可以是一个URL;但是如果这个标识不提供获取到对象的路径,那么它就必然不是URL)
· URN(uniform resource name):统一资源命名,是通过名字来标识资源,也是一种URI
举例:
URI:/home/test.html
URL:www.xx.com:/home/test.html
再谈URL:
平时我们所说的网址,其实就是说的URL:
例如:
可以看到“+”被转义成了“%2B”,这里就要说一下urlencode和urldecode:
urlencode:将字符串以URL编码
urldecode:对字符串进行URL解码,就是urlencode的逆过程(解码规则:数字和字母不变;空格变为"+"号;其他被编码成"%"加上他们的ASCII码的十六进制)
3.HTTP协议格式:
(1)HTTP请求:
· 首行:方法+url+版本
· Header:请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
· Body:空行后的内容,允许为空字符串,如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度
(2)HTTP响应:
· 首行:版本号+状态码+状态码解释
· Header:请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
· Body:空行后的内容,允许为空字符串,如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度;如果服务器返回了一个html页面,那么页面内容就是在Body中
HTTP常见Header :
· Content-Type:数据类型(text/html等)
· Content-Length: Body的长度
· Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上
· User-Agent:声明用户的操作系统和浏览器版本信息
· referer:当前页面是从哪个页面跳转过来的
· location:搭配3xx状态码使用,告诉客户端接下来要去哪里访问;
· Cookie:用于在客户端存储少量信息,通常用于实现会话(session)的功能;
4.HTTP的方法:
方法 | 说明 | 支持的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 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINE | 断开连接关系 | 1.0 |
5.HTTP的状态码:用以表示服务器HTTP响应状态的3位数字代码,是HTTP返回给浏览器的状态码;通过状态码,就可以知道服务器端是否正确地处理请求,如果不正确,是因为什么原因导致的。
类别 | 原因短语 | |
1XX | Informational(信息性状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
常见状态码:
· 200 OK:客户端发来的http请求,被正确处理了
· 204 NO Content:请求结果被正确处理了,但是响应信息中没有响应正文
· 206 Partial Content:客户端对服务器进行了范围请求,而且服务器成功的执行了这部分GET请求
· 301 Moved Permamently:永久性重定向,表示请求的资源已经被分配了新的URI,以后应使用新的URI
· 302 Found:临时性重定向,目标资源被分配了新的URI,希望用户本次使用新的URI进行访问
(当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送;301、302标准是禁止将POST方法改变成GET方法的,但实际使用时大家并不遵守)
· 307 Temporary Redirect:临时重定向,该状态码与302 Found有着相同的含义。尽管302标准禁止POST变换成GET,但实际使用时大家并不遵守;307会遵照浏览器标准,不会从POST变成GET,但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况。
· 400 Bad Request:表明请求报文中存在语法错误,需修改请求内容重新发送,另外,浏览器会像200 OK一样对待该状态码
· 403 Forbbiden:表明浏览器所请求的资源被服务器拒绝了
· 404 Not Found:太常见了,表明服务器上没有浏览器所请求的资源
· 500 Internal Server Error:表明服务器端在执行的时候发生了错误
· 503 Server Unavailable:表明服务器目前处于超负载或正在进行停机维护状态,目前无法处理请求
6.HTTP 1.0和HTTP 1.1对比:
(1)HTTP 1.0规定浏览器与服务器只保持短暂的连接(短连接);浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求;不支持Host请求头字段,Web浏览器无法使用主机头名来明确表示要访问服务器上的哪个Web站点;不支持文件断点续传
(2)HTTP 1.1支持持久连接(长连接),在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟;允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间;增加Host请求头字段后,Web浏览器可以使用主机头名来明确表示要访问服务器上的哪个Web站点,这才实现了在一台Web服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟Web站点;还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。