枯燥而又非常重要的东西:HTTP协议

HTTP概述:

一、HTTP协议简介

超文本传输协议(英文:HyperTextTransferProtocol.缩写:HTTP)是一种用于分布式,协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础,HTTP的发展是由蒂姆.伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(W3C)和互联网工程任务组(IETE)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的RFC2616,定义了HTTP协议中现今广泛使用的一个版本–HTTP1.1
2014年12月,互联网工程任务组(IETE)的Hypertext Transfer Protocol Bis (httpbis)工作小组将HTTP/2标准提议递交至IESG进行讨论,与2015年2月17日被批准。HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP1.1成为HTTP的实现标准。
在这里插入图片描述
客户端和服务器通过交换相互独立的消息来通讯(而不是数据流)。客户端(通常是 web 浏览器)发送的消
息叫请求(requests),而服务器发送的消息作为客户端消息的回应被称为响应(response)

二、HTTP协议概述

HTTP是一个客户端终端(用户)和服务端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其他的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器、网关或者隧道(tunnel)
尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层。事实上。HTTP可以在任何互联网协议上,或者其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。
通常,有HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接、HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如“HTTP/1.1 200 OK”,以及返回的内容,如请求的文件、错误消息或者其他信息。

HTTP的特性

1.HTTP构建于TCP/IP协议之上,默认端口号是80

2.HTTP是无连接无状态的

"无连接:"无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

"无状态:"HTTP协议是无状态协议。无状态是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

在TCP/IP协议栈中的位置

HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:
在这里插入图片描述

三、HTTP工作原理

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

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

四、HTTP请求的八种方法

HTTP/1.1协议中共定义了八种方法(也叫‘动作’)来以不同方式操作指定的资源:
(1)、GET:
向指定的资源发出‘显示’请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
(2)HEAD:
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的文本部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或元数据)
(3)POST:
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求文本中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
(4)PUT:
向指定资源位置上传其最新内容。
(5)DELETE:
请求服务器删除Request-URL所标识的资源。
(6)TRACE:(跟踪)
回显服务器收到的请求,主要用于测试或诊断。
(7)OPTIONS:(选项)
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用‘*’来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作
(8)CONNECT:(连接)
HTTP/1.1协议中预留给能够连接改为管道方式的代理服务器。通常用于SSL加密服务器的连接(经由非加密的HTTP代理服务器)。
注意事项:
1、方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Methond Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implementen)
2、HTTP服务器至少应该事先GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当匹配下属的方法各自的语义定义。此外除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如PATCH(由RFC5789指定的方法)用于将局部修改应用到资源。

五、HTTP状态码

HTTP协议状态码:详细的参考资料
100-101 信息提示
200-206 成功
300-307 重定向
400-415 错误类信息,客户端错误
500-505 错误类信息,服务器端错误
常见的HTTP状态码:
200:OK成功,请求数据通过响应报文的entity-body部分发送
301:Moved Permanently 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;
302:Moved Temporarily 响应报文Location指明资源临时新位置
304:Not Modified 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应次响应状态码通知客户端;
401:Unauthorized需要输入账号和密码认证方能访问资源;
403:Forbiden请求被禁止;
404:Not Found服务器无法找到客户端请求的资源;
500:Internal Server Error 服务器内部错误;
502:Bad Gateway代理服务器从后端服务器收到了一条伪响应,如无法连接到网关
503:服务不可用,临时服务器维护或过载,服务器无法处理请求
504:网关超时

首部的分类:

1、通过首部:请求报文和响应报文两方都会使用的首部
2、请求首部:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、请求内容相关优先级等信息
3、响应首部:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息
4、实体首部:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有管的信息
5、扩展首部

HTTP之URL:

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

URL,全称UniformResourceLocator,中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍一下普通URL的各部分组成:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&

page=1#name
从上面的URL可以看出,一个完整的URL包括以下几部分:
1、协议部分: 该URL的协议部分为**“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等;
本例中使用的是HTTP协议。在“HTTP”后面的“//”为分隔符
2、域名部分:**该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用
3、端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,将采用默认端口
4、虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是
虚拟目录部分
。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”
5、文件名部分:域名后的最后一个“/”开始到“?”位置,是文件名部分,如果没有**“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”。那么从域名后的最后一个“/”**开始到结束都是文件名部分。本例中的文件名是"index.asp"。文件名部分也不是一个URL必须的部分如果省略该部分,则使用默认的文件名

6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

URI和URL的区别

URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。

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

URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。

URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等

URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。

URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。

在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。
在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。
相反的是,URL类可以打开一个到达资源的流。

HTTP之请求消息Request

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
在这里插入图片描述

Http请求消息结构

请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。
Get请求例子,使用Charles抓取的request:

GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/,/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.

GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。

第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息

从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等

第三部分:空行,请求头部后面的空行是必须的

即使第四部分的请求数据为空,也必须有空行。

第四部分:请求数据也叫主体,可以添加任意的其他数据。

这个例子的请求数据为空。

POST请求例子,使用Charles抓取的request:

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley
第一部分:请求行,第一行明了是post请求,以及http1.1版本。
第二部分:请求头部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:请求数据,第八行。

HTTP之响应消息Response

一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
在这里插入图片描述

http响应消息格式

一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端,HTTP的响应内容同样有标准的格式。无论是什么客户端或者是什么服务端,大家只要按照HTTP的协议标准来实现的话,那么它一定是通用的。
例子
HTTP请求格式
HTTP请求格式主要有四部分组成,分别是:请求行、请求头、空行、消息体,每部分内容占一行

<request-line>
<general-headers>
<request-headers>
<entity-headers>
<empty-line>
[<message-body>]

request-format
在这里插入图片描述
请求行:请求行是请求消息的第一行,由三部分组成:分别是请求方法(GET/POST/DELETE/PUT/HEAD)、请求资源的URI路径、HTTP的版本号

GET /index.html HTTP/1.1

请求头:请求头中的信息有和缓存相关的头(Cache-Control,If-Modified-Since)、客户端身份信息(User-Agent)等等。例如:

Cache-Control:max-age=0
Cookie:gsScrollPos=; _ga=GA1.2.329038035.1465891024; _gat=1
If-Modified-Since:Sun, 01 May 2016 11:19:03 GMT
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36

消息体:请求体是客户端发给服务端的请求数据,这部分数据并不是每个请求必须的。

HTTP响应格式
服务器接收处理完请求后返回一个HTTP相应消息给客户端。HTTP响应消息的格式包括:状态行、响应头、空行、消息体。每部分内容占一行。

<status-line>
<general-headers>
<response-headers>
<entity-headers>
<empty-line>
[<message-body>]

response-format
在这里插入图片描述
状态行:状态行位于相应消息的第一行,有HTTP协议版本号,状态码和状态说明三部分构成。如:

HTTP/1.1 200 OK

响应头:响应头是服务器传递给客户端用于说明服务器的一些信息,以及将来继续访问该资源时的策略。

Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Fri, 24 Jun 2016 06:23:31 GMT
Server:nginx/1.9.12
Transfer-Encoding:chunked

响应体:响应体是服务端返回给客户端的HTML文本内容,或者其他格式的数据,比如:视频流、图片或者音频数据。

GET和POST请求的区别

GET请求

GET /books/?sex=man&name=Professional HTTP/1.1 
 Host: www.wrox.com 
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) 
 Gecko/20050225 Firefox/1.0.1 
 Connection: Keep-Alive 

注意最后一行是空行

POST请求

POST / HTTP/1.1 
 Host: www.wrox.com 
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) 
 Gecko/20050225 Firefox/1.0.1 
 Content-Type: application/x-www-form-urlencoded 
 Content-Length: 40 
 Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley 

1、GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据

因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

2、传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。

而在实际开发中存在的限制主要有:

GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系 统的支持。

因此对于GET提交时,传输数据就会受到URL长度的 限制。

POST:由于不是通过URL传值,理论上数据不受 限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

3、安全性

POST的安全性要比GET的安全性高。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存;(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击

4、Http get,post,soap协议都是在http上运行的

(1)get:请求参数是作为一个key/value对的序列(查询字符串)附加到URL上的
查询字符串的长度受到web浏览器和web服务器的限制(如IE最多支持2048个字符),不适合传输大型数据集同时,它很不安全

(2)post:请求参数是在http标题的一个不同部分(名为entity body)传输的,这一部分用来传输表单信息,因此必须将Content-type设置为:application/x-www-form- urlencoded。post设计用来支持web窗体上的用户字段,其参数也是作为key/value对传输。
但是:它不支持复杂数据类型,因为post没有定义传输数据结构的语义和规则。

(3)soap:是http post的一个专用版本,遵循一种特殊的xml消息格式
Content-type设置为: text/xml 任何数据都可以xml化。

Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.

我们看看GET和POST的区别

GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.

GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值