首页 > 代码库 > HTTP协议概述

HTTP协议概述

HTTP协议概述

URI(Uniform Resource Identifier)

用来标识网络上特定的服务器资源,URI有两种形式,分别为URL和URN:

URL(Uniform Resource Locator)

URL是目前被最广泛使用的一种形式,URL描述了一台特定服务器上某资源的特定位置。这里的资源可以只一个文件,页面,图片等。

标准URL格式定义如下:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

 

scheme 使用的协议(例如http(s), ftp, rtsp) URI.Scheme
user 某些协议需要的用户名(例如ftp协议) URI.UserInfo
password 用户名所对应的密码 URI.UserInfo
host 服务器的主机名或者IP地址 URI.Host
port 服务器监听端口号(http默认为80,https默认为443) URI.Port
path 服务器上资源的本地名,也称相对路径 URI.AbsolutePath
params 某些协议的输入参数,如包含多个用;分隔 URI.AbsolutePath
query 某些协议的查询参数,http协议一般用&分隔多个参数 URI.Query
frag

某页面内部特定资源的引用,一般用来指定特定段落。

用于客户端使用,服务器端会忽略这个字段

URI.Fargment

常见协议URL:

http://cnblogs.com/qlluo/default.html#URL

ftp://qlluo:psd@ftp.cnblogs.com/resource/info.txt

协议标准请参考:rfc1738

URN(Uniform Resource Name)

URN与URL的最大区别在于,URN无需指定资源的具体位置,她标识网络上某一特定内容。该协议比较超前,目前几乎没有被使用,这里不做具体介绍。

HTTP报文

技术分享

上图描述了最常见的HTTP报文流向,由客户端发往服务器端的报文称为请求(request)报文,由服务器会发给客户端的报文称为相应(response)报文。

习惯上定义报文的流向为从上游(upstream)流向下游(downstream),在讲到代理服务器时会使用该术语。

ps: 客户端和服务器端没有绝对严谨的定义,一般称主动发送请求的一方为客户端,监听某一特定端口等待连接的一方为服务器端。

请求(Request)

 HTTP请求报文由起始行,首部,实体主体三部分组成:

<method> <request-URL> <version>         //起始行
<headers>                                //首部

<entity-body>                            //实体主体

起始行

起始行包括方法,请求URL和版本号三部分:

1. 方法:表示客户端希望服务器执行的操作类型,常见的有GET, POST, DELETE等。

2. 请求URL:表示客户端需要请求的资源,一般为绝对URL。

3. 版本号:表示报文使用的HTTP版本,格式为HTTP/<major>.<minor>,当前主流版本为HTTP/1.1

GET http://www.cnblogs.com/ HTTP/1.1

首部

首部包括一些特定的键值对,对请求报文的一些属性做解释。

首部有零行或多行组成,每行之间使用CRLF(\r\n)分隔。每行由冒号分隔名字和值,冒号后面可以跟一个可选的空格。

首部是由一个空行结束的。

Content-Type: text/plain
Content-Length: 50

HTTP协议预定义了很多首部,用于实现协议的基础和扩展功能。一般来讲,有效的HTTP请求报文都会包含多个首部。

实体主体

实体主体可以包含一个由任意文本数据块,对于某些特定的方法(GET, HEAD)也可能不包含实体主体。

实体主体的格式由上层协议决定,并受Content-Type, Content-Length, Content-Encoding约束。

 

下面是一个访问园子首页的请求报文,其中忽略掉了一些不常见的首部。

GET http://www.cnblogs.com/ HTTP/1.1
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

相应(Response)

 HTTP相应报文由起始行,首部,实体主体三部分组成:

<version> <status> <reason-phrase>
<headers>
<entity-body>

起始行

起始行包括版本号,状态码和原因短语三部分组成:

1. 版本号:表示报文使用的HTTP版本,格式为HTTP/<major>.<minor>,当前主流版本为HTTP/1.1,与请求报文的版本号格式一致。

2. 状态码:用一个三位数字描述相应报文的状态(成功,出错等),下表简述了状态码的分类,后续会逐个介绍常见的状态码。

状态码范围 预定义范围 分类 解释
100-199 100-101 信息提示  
200-299 200-206 成功 最常见的成功状态码是200,表示请求成功
300-399 300-307 重定向

一般配合一个Location首部使用,表示资源被永久或暂时移动到了Location指定的URL处。

常见的重定向状态码有301,304,307

400-499 400-417 客户端错误

表示客户端向服务器发送的请求有错误。

常见的有400(Bad Request), 401(Unauthorized), 403(Forbidden), 404(Not Found)

500-599 500-505 服务器端错误

表示服务器端在处理请求的过程中发生错误。

常见的有500(Internal Server Error), 503(Services Unavailable)

3. 原因短语:描述#2中状态码的一句短语,起解释作用,是状态码的可读版本。

HTTP/1.1 200 OK

首部

格式与HTTP请求报文的首部一致,但包含的首部内容不同

实体主体

格式与HTTP请求报文的实体主体一致,用来承载响应的内容。

常见的响应实体主体包括:页面,js,css,图片,文件,json或xml文本等。

下面是访问园子首页的响应报文,其中省略掉了大部分实体主体内容。

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Last-Modified: Wed, 25 Jan 2017 05:06:04 GMT
Content-Length: 45005

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>博客园 - 开发者的网上家园</title>
...
</html>

 

本文主要介绍了HTTP协议最基本,最常用的协议和报文部分。续集会深入介绍HTTP的首部,状态码,连接机制,代理,缓存以及认证相关的内容。

HTTP协议概述