HTTP协议简要分析

HTTP协议

一、HTTP协议简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)
HTTP是一个基于TCP/IP通信协议来传递数据的应用层传输协议

二、主要特点

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

三、工作原理

HTTP是基于TCP/IP通讯协议的,所以他也是使用socket套接字来完成数据传输,底层的通讯和TCP/IP一致。

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

以下是 HTTP 请求/响应的步骤:
1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com
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请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式

在HTTP请求request中其请求头部一般由以下一些信息组成
1、HTTP请求方式

GET      向Web服务器请求一个文件
POST     向Web服务器发送数据让Web服务器进行处理
PUT      向Web服务器发送数据并存储在Web服务器内部
HEAD     检查一个对象是否存在
DELETE   从Web服务器上删除一个文件
CONNECT  对通道提供支持
TRACE    跟踪到服务器的路径
OPTIONS  查询Web服务器的性能

主要使用到“GET”和“POST”方式
2、Host
请求的web服务器域名地址
3、User-Agent
HTTP客户端运行的浏览器类型的详细信息。通过该头部信息,web服务器可以判断到当前HTTP请求的客户端浏览器类别。
4、Accept
指定客户端能够接收的内容类型,内容类型中的先后次序表示客户端接收的先后次序
注:在Prototyp(1.5)的Ajax代码封装中,将Accept默认设置为“text/javascript, text/html, application/xml, text/xml, /”。这是因为Ajax默认获取服务器返回的Json数据模式。
在Ajax代码中,可以使用XMLHttpRequest 对象中setRequestHeader函数方法来动态设置这些Header信息。
5、Accept-Language
指定HTTP客户端浏览器用来展示返回信息所优先选择的语言。
6、Accept-Encoding
指定客户端浏览器可以支持的web服务器返回内容压缩编码类型
7、Accept-Charset
浏览器可以接受的字符编码集
8、Content-Type
显示此HTTP请求提交的内容类型。一般只有post提交时才需要设置该属性。
有关Content-Type属性值可以如下两种编码类型:
(1)“application/x-www-form-urlencoded”: 表单数据向服务器提交时所采用的编码类型,默认的缺省值就是“application/x-www-form-urlencoded”。 然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。
(2)“multipart/form-data”: 在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。
当提交为单单数据时,可以使用“application/x-www-form-urlencoded”;当提交的是文件时,就需要使用“multipart/form-data”编码类型。
在Content-Type属性当中还是指定提交内容的charset字符编码。一般不进行设置,它只是告诉web服务器post提交的数据采用的何种字符编码。
一般在开发过程,是由前端工程与后端UI工程师商量好使用什么字符编码格式来post提交的,然后后端ui工程师按照固定的字符编码来解析提交的数据。所以这里设置的charset没有多大作用。
9、Connection
表示是否需要持久连接
如果web服务器端看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。
10、cookie
HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。
11、Referer
包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

下边是一个POST请求(每行都有回车换号符)

POST / HTTP/1.1\r\n
Host: 119.255.80.100\r\n
User-Agent: Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0)\r\n
Accept-Language:zh-cn\r\n
Accept-Encoding:deflate\r\n
Accept:*/*\r\n
Connection:Keep-Alive\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length:36\r\n
\r\n
mT=0&username=abc&password=abc%08091\r\n
\r\n

第一部分:请求行,第一行明了是POST请求,以及http1.1版本
第二部分:请求头部,第二行至第六行
第三部分:空行,第七行的空行
第四部分:请求数据,第八行

五、HTTP请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法
HTTP1.0定义了三种请求方法:GET, POST 和 HEAD方法
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法

GET     请求指定的页面信息,并返回实体主体。
HEAD    类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT     从客户端向服务器传送的数据取代指定的文档的内容。
DELETE  请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE   回显服务器收到的请求,主要用于测试或诊断。

六、服务器响应消息

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

在HTTP响应response中其信息头部一般包含如下信息
1、Server
web服务器软件名称
2、Date
原始服务器消息发出的时间
3、Accept-Ranges
表明服务器是否支持指定范围请求及哪种类型的分段请求
4、Age
从原始服务器到代理缓存形成的估算时间(以秒计,非负)
5、Allow
对某网络资源的有效的请求行为,不允许则返回405
6、Cache-Control
告诉所有的缓存机制是否可以缓存及哪种类型
7、Content-Encoding
web服务器支持的返回内容压缩编码类型
8、Content-Language
响应体的语言
9、Content-Length
响应体的长度
10、Content-Location
请求资源可替代的备用的另一地址
11、Content-MD5
返回资源的MD5校验值
12、Content-Range
在整个返回体中本部分的字节位置
13、Content-Type
返回内容的MIME类型
14、ETag
请求变量的实体标签的当前值
15、Expires
响应过期的日期和时间
16、Last-Modified
请求资源的最后修改时间
17、Location
用来重定向接收方到非请求URL的位置来完成请求或标识新的资源
18、Pragma
包括实现特定的指令,它可应用到响应链上的任何接收方
19、Proxy-Authenticate
它指出认证方案和可应用到代理的该URL上的参数
20、refresh
应用于重定向或一个新的资源被创造,在5秒之后重定向
21、Retry-After
如果实体暂时不可取,通知客户端在指定时间之后再次尝试
22、Set-Cookie
设置Http Cookie
23、Trailer
指出头域在分块传输编码的尾部存在
24、Transfer-Encoding
文件传输编码
25、Vary
告诉下游代理是使用缓存响应还是从原始服务器请求
26、Via
告知代理客户端响应是通过哪里发送的
27、Warning
警告实体可能存在的问题
28、WWW-Authenticate
表明客户端请求实体应该使用的授权方案

下边是一个服务器响应消息结构

HTTP/1.1 200 OK
Server: ABC_SERVER
Content-Type: application/json; charset=utf-8
Content-Md5: d01920026e6fcc99b4363dd69412d30e
Connection: keep-alive
Date: Thu, 10 Aug 2017 06:39:22 GMT
Content-Length: 108

{"result":true,"token":"3625c58ad4a6f3d78421977abac7ae24","expiretime":1502347461,"responseTime":1502347162}

第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息
第二行和第三行为消息报头,Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8 Date:生成响应的日期和时间
第三部分:空行,消息报头后与正文部分的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息空行后面的部分为响应正文

七、HTTP状态码

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
HTTP状态码的英文为HTTP Status Code
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
下面是常见的HTTP状态码:

200 OK                        //客户端请求成功
400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden                 //服务器收到请求,但是拒绝提供服务
404 Not Found                 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
505 HTTP Version not supported //服务器不支持请求的HTTP协议的版本,无法完成处理
HTTP状态码分类
分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

八、HTTP统一资源标识符URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息
URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:
http://www.powersdazf.com:8080/news/index.asp?boardID=1&ID=2367&page=1#name
从上面的URL可以看出,一个完整的URL包括以下几部分:
1.协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在”HTTP”后面的“//”为分隔符
2.域名部分:该URL的域名部分为“www.powersdazf.com”。一个URL中,也可以使用IP地址作为域名使用
3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口
4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”
5.文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分
7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值