HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,基于TCP/IP通信协议来传递多媒体数据。HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求;Web服务器根据接收到的请求后,向客户端发送响应信息。

HTTP工作原理

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是 HTTP 请求/响应的步骤:

  1. 客户端连接到Web服务器
    一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
  2. 发送HTTP请求
    通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
  3. 服务器接受请求并返回HTTP响应
    Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
  4. 释放连接TCP连接
    若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
  5. 客户端浏览器解析HTML内容
    客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5. 释放 TCP连接;
6. 浏览器将该 html 文本并显示内容;   

HTTP通讯协议

HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:
互联网开发常识谱--http协议
OSI协议模型
互联网开发常识谱--http协议

HTTP之URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL(Uniform Resource Locator)统一资源定位符是一种特殊类型的URI,包含了用于查找某个资源的足够的信息。

一个完整的URL包括以下几部分:

http_URL = “协议部分:” “//” 域名部分 [ “:” 端口部分 ] [ 虚拟目录部分 [“/” 文件名部分 ] [ “?” 参数部分 ]][#锚部分]

  1. 协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在”HTTP”后面的“//”为分隔符。
  2. 域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用。
  3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口。
  4. 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。
  5. 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名。
  6. 锚部分:从“#”开始到最后,都是锚部分。锚部分也不是一个URL必须的部分。
  7. 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

URI和URL的区别

  • URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的.
    URI一般由三部组成:
    ①访问资源的命名机制
    ②存放资源的主机名
    ③资源自身的名称,由路径表示,着重强调于资源。

  • URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
    URL是Internet上用来描述信息资源的字符串,采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
    URL一般由三部组成:
    ①协议(或称为服务方式)
    ②存有该资源的主机IP地址(有时也包括端口号)
    ③主机资源的具体地址。如目录和文件名等

  • URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:[email protected]
    URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。
    在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。相反的是,URL类可以打开一个到达资源的流。

http报文结构

http报文结构概况

互联网开发常识谱--http协议

HTTP请求消息Request

客户端发送一个HTTP请求到服务器的请求消息包括请求行(request line)、请求头部(header)、空行和请求数据四个部分。
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。

请求行: Method Request-URI HTTP-Version CRLF
示例: GET /form.html HTTP/1.1 CRLF

请求行说明

结构 含义
Method 请求方法
Request-URI 统一资源标识符
HTTP-Version 请求的HTTP协议版本
CRLF 回车和换行,除了作为结尾的CRLF外,不允许出现单独的CR或LF字符

HTTP请求方法

HTTP Operation Description
GET 获取被请求URI(Request-URI)指定的信息(以实体的格式)
POST 请求源服务器接受请求中的实体作为请求资源的一个新的从属物
PUT 请求服务器去把请求里的实体存储在请求URI(Request-URI)标识下
DELETE 删除
HEAD HEAD方法在响应里不返回消息主体,其他和GET 方法一致

除POST以外的方法都具有幂等性(idempotent)

HTTP请求报头

报头名称 说明
Accept 请求报头域用于指定客户端接受哪些类型的信息。
Accept-Charset 请求报头域用于指定客户端接受的字符集。
Accept-Encoding 用于指定可接受的内容编码。
Accept-Language 用于指定一种自然语言
Authorization 请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
Host 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的(发送请求时,该报头域是必需的)
User-Agent User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。

http响应报文

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

响应行: HTTP-Version Status-Code Reason-Phrase CRLF
示例: HTTP/1.1 200 OK CRLF

响应行说明

结构 含义
HTTP-Version 服务器HTTP协议的版本
Status-Code 服务器发回的响应状态代码,状态代码有三位数字组成,第一个数字定义了响应的类别
Reason-Phrase 状态代码的文本描述
CRLF 回车和换行,除了作为结尾的CRLF外,不允许出现单独的CR或LF字符

HTTP响应状态代码

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

状态码举例

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

参考信息
http://www.cnblogs.com/ranyonsue/p/5984001.html
http://jinnianshilongnian.iteye.com/blog/2319573

相关文章:

  • 2021-08-26
  • 2021-09-02
  • 2022-02-21
  • 2021-06-03
  • 2022-12-23
  • 2021-07-20
  • 2021-11-03
猜你喜欢
  • 2021-07-26
  • 2021-06-01
  • 2021-07-25
  • 2021-12-16
相关资源
相似解决方案