Fork me on GitHub

HTTP简介

引言

HTTP(超文本传输协议)是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。

HTTP协议的主要特点:

  1. 支持客户/服务器模式
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  5. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP-URL

URI: 统一资源标识符

URL: 统一资源定位符,URL是一种特殊类型的URI,描述了一台特定服务器上某资源的特定位置

HTTP URL 的格式如下: http://host:port/abs_path

  • http 表示要通过 HTTP 协议来定位网络资源;
  • host 表示合法的 Internet 主机域名或者 IP 地址;
  • port 指定一个端口号,为空则使用缺省端口 80;
  • abs_path 指定请求资源的URI;如果URL中没有给出 abs_path,那么当它作为请求 URI 时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。

eg:

  1. 输入:www.baidu.com 浏览器自动转换成: http://www.baidu.com/

  2. http:192.168.0.116:8080/index.jsp

HTTP-报文

HTTP报文是简单的格式化数据块。每条报文都包含一条来自客户端的请求,或者一条来自服务器的相应。它们由三个部分组成:对报文进行描述的起始行(start line)、包含属性的首部(header)、包含数据的主体(body)。

HTTP报文可以分为两类:请求报文响应报文

1
2
3
4
5
6
7
8
9
10
11
请求报文格式:
<methord> <request-URL> <version>
<headers>

<entity-body>

响应报文格式:
<version> <status> <reason-phrase>
<headers>

<entity-body>

请求报文和响应报文的格式,只有起始行的语法有所不同

  • 方法(method)

    客户端希望服务器对资源执行的动作。是一个单独的词,如GET、HEAD或POST。

  • 请求URL(request-URL)

    统一资源标识符。

  • 版本(version)

    报文所使用的HTTP版本。其格式如这样:HTTP/<major>.<minor>

  • 状态码(status-code)

    服务器发回的响应状态代码。这三位数字描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别(“成功”、“出错”等)。

  • 原因短语(reason-phrase)

    表示状态码的文字描述。

  • 首部(header)

    可以有零个或者多个首部,每个首部都包含一个名字,后面跟着一个冒号:,然后是一个可选的空格,接着是一个值,最后是一个CRLF(回车或者换行)。首部是由一个空行(CRLF)结束的,表示了首部列表的结束和实体主体部分的开始。

  • 实体的主体部分(entity-body)

    实体的主体部分包含一个由任意数据组成的数据块。并不是所有的报文都包含实体的主体部分,有时,报文只是以一个CRLF结束。

报文结构.png

常用HTTP方法

方法 描述 是否包含主体
GET 请求获取 Request-URL 所标识的资源
POST 在 Request-URL 所标识的资源后附加新的数据
HEAD 请求获取由 Request-URL 所标识的资源的首部,不返回实体的主体部分
PUT 将请求的主体部分存储在服务器,并用 Request-URL 作为其标识
DELETE 请求服务器删除 Request-URL 所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
OPTIONS 请求web服务器告知其支持的各种功能,可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法

状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 1xx:指示信息–表示请求已接收,继续处理
  • 2xx:成功–表示请求已被成功接收、理解、接受
  • 3xx:重定向–要完成请求必须进行更进一步的操作
  • 4xx:客户端错误–请求有语法错误或请求无法实现
  • 5xx:服务器端错误–服务器未能实现合法的请求

常见的状态码

状态码 状态描述 说明
200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在
500 Internal Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常

首部(消息报头)

首部和方法配合工作,共同决定了客户端和服务器能做什么事情。

在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些,可以将首部分为四个类型:

通用首部

这些是客户端和服务器都可以使用的通用首部。可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能。提供了与报文相关的最基本的信息。

首部 描述
Connection 允许客户端和服务器指定与请求/响应连接有关的选项,例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,断开连接
Date 提供日期和时间标志,说明报文是什么时间创建的
Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)
Pragma 另一种随报文传送只是的方式,但并不专用于缓存

请求首部

请求首部是请求报文特有的。他们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据。用于说明是谁或者什么在发送请求、请求源自何处,或者客户端的喜好及能力。服务器可以根据请求首部给出的客户端信息,试着为客户端提供更好的响应。

请求的信息性首部
首部 描述
Client-IP 提供了运行客户端的机器的IP地址
From 提供了客户端用户的E-mail地址
Host 给出了接收请求的服务器的主机名和端口号
User-Agent 将发起请求的应用程序名称告知服务器
Accept首部

Accept首部为客户端提供了一种能够将其喜好和能力告知服务器的方式,包括它们想要什么,可以使用什么,以及最重要的,它们不想要什么。这样服务器就可以根据这些额外的信息,对要发送的内容作出更明智的决定。

首部 描述
Accept 告诉服务器可以发送哪些媒体类型
Accept-Charset 告诉服务器可以发送哪些字符集
Accept-Encoding 告诉服务器可以发送哪些编码方式
Accept-Language 告诉服务器可以发送哪些语言
安全请求首部
首部 描述
Authorization 包含了客户端提供给服务器,以便对其自身进行认证的数据
Cookie 客户端向服务器传送一个令牌——它并不是真正的安全首部,但确实隐含了安全功能

响应首部

响应首部是响应报文特有的。响应首部为客户端提供了一些额外信息,比如谁在发送响应、响应者的功能,甚至与响应相关的一些特殊指令。这些首部有助于客户端处理响应,并在将来发起更好的请求。

首部 描述
Age (从最初创建开始)响应持续时间
Location 可以将响应接收方(客户端,如浏览器)引导至某个与请求URI位置不同的资源,当请求的资源位置改变时会返回该响应
Server 服务器应用程序软件的名称和版本
WWW-Authenticate 来自服务器的对客户端的质询列表,该首部必须被包含在状态码为401的响应报文中,客户端收到401响应消息的时候,发送含Authorization首部的请求报文请求服务器对其进行验证,服务器响应报文里就包含本首部

实体首部

实体首部提供了有关实体及其内容的大量信息,请求和响应报文中都可能包含实体部分,所以这两类报文都可能出现这些首部。总之,实体首部可以告知报文的接收者它在对什么进行处理。

首部 描述
Content-Base 解释主体中的相对 URL 时使用的基础 URL
Content-Encoding 对主体执行的任意编码方式
Content-Language 主体资源所用的自然语言
Content-Length 主体的长度或尺寸
Content-Locaton 资源实际所处的位置
Content-Type 发送给接收者的实体正文的媒体类型
Content-Range 在整个资源中此实体表示的字节范围
Expires 响应过期的日期和时间,超过该事件,实体不再有效,要从原始的源端再次获取此实体
Last-Modified 实体最后一次被修改的日期和时间
-------------本文结束感谢您的阅读-------------

本文作者:乔羽 / FightingJoey

发布时间:2017年04月18日 - 10:22

最后更新:2018年09月27日 - 10:09

原始链接:https://fightingjoey.github.io/2017/04/18/开发/HTTP简介/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!