HTTP协议详解

HTTP协议简介

HTTP协议,即超文本传输协议(Hypertext transfer protocol)。

HTTP协议的特点

1、支持客户/服务器模式,支持基本认证和安全认证。 2、简单快速:客户端向服务器发送请求时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST,每种方法规定了客户端与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 3、灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记。 4、无状态:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。

HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象。

HTTP协议是无状态的和Connection: keep-alive的区别:

1、无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。 2、HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。 3、从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。 4、Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

HTTP工作流程

一次HTTP操作称为一个事务,其工作过程可分为四步: 1、首先客户端与服务器需要建立连接,只要触发一次事件,HTTP的工作开始。 2、建立连接后,客户端发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户端信息等。 3、服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息等。 4、客户端接收服务器所返回的信息显示在用户的屏幕上,然后客户端与服务器断开连接。

TCP连接的三次握手:

HTTP是基于传输层的TCP协议,而TCP是一个端到端的面向连接的协议。所谓的端到端可以理解为进程到进程之间的通信。所以HTTP在开始传输之前,首先需要建立TCP连接,而TCP连接的过程需要所谓的“三次握手”。在TCP三次握手之后,建立了TCP连接,此时HTTP就可以进行传输了。一个重要的概念是面向连接,既HTTP在传输完成之间并不断开TCP连接。在HTTP1.1中(通过Connection头设置)这是默认行为。 1、客户端向服务器发出连接的请求。 2、服务器回应了客户端的请求,并要求确认。 3、客户端回应了服务器的确认,连接成功。

HTTP协议详解之URL篇

1、URL是Uniform Resoure Locator(统一资源定位符)的缩写,其URL地址格式为:

scheme://host:Port/path
scheme://host:Port/path?parameters=123#anchor

其中: scheme:服务器标识符,通过选择服务器标识符能够确定将要访问的服务器的类型,例如:http, https, ftp。 host:表示服务器的域名或者IP地址。 port:服务器的端口号(默认端口是80)。 path:访问资源的路径。 parameters:参数 Anchor:锚

URI和URL区别

1、URI(uniform resource identifier),统一资源标识符,顾名思义,用来唯一的标识一个资源。而URL(uniform resource locator),统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,是URI命名机制的一个子集,可以说URI是抽象的,而具体要使用URL来定位资源。 2、网络上面的每一种资源如:图片、文档、视频等,都是由URI定位的,这里所谓的定位指的是网络上面的资源相对于服务器来说,存放在服务器上的具体路径。 3、URL是网络上用来描述信息资源文件的字符串,用在客户程序和服务器上,定位客户端连接服务器所需要的信息,它不仅定位了这个信息资源,而且定义了如何找到这个资源。 4、个人认为URI是一个字符串格式规范。URL是资源定位的规范,包括网址 ftp服务器、文件路径等。URI就是一种资源定位机制,它是比较笼统地定位了资源,并不局限于客户端和服务器,而URL就定位了网上的一切资源,只要是网上的资源,都有唯一的URL。

HTTP协议详解之请求篇

HTTP 请求由三部分组成:请求行、请求头和请求正文。

POST /app/index.php?act=app_tip&op=versionTip HTTP/1.1
Host:test.m.51fanxing.com
Content-Type:application/x-www-form-urlencoded
Cookie:4C1E_goodsnum=0; PHPSESSID=frt15rbae4hml6gr4ofnb7lg05
Connection:keep-alive
Accept:*/*
User-Agent:FXBEST/2.7.2 (iPhone; iOS 9.3.2; Scale/2.00)
Accept-Language:zh-Hans-CN;q=1
Content-Length:151
Accept-Encoding:gzip, deflate
username=aa&password=1234

请求行:请求方法URI协议/版本

请求的第一行是“方法 URL 协议/版本”,并以 回车换行作为结尾。请求行以空格分隔。格式如下:

POST /app/index.php?act=app_tip&op=versionTip HTTP/1.1

以上代码中”POST”代表请求方法,”/app/index.php?act=app_tip&op=versionTip”表示URI,HTTP/1.1代表协议和协议的版本。

请求方法

HTTP/1.1协议中共定义了八种方法,其中最常用的方法就是GET和POST两种。

GET方法:

使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器:

/index.php?name1=value1&name2=value2

特点: 1、GET请求能够被缓存 2、GET请求会保存在浏览器的浏览记录中 3、GET请求有长度限制 4、GET请求主要用以获取数据。

POST方法:

使用POST方法时,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:

POST /test/demo_form.asp HTTP/1.1 Host: w3schools.com name1=value1&name2=value2

特点: 1、POST请求不会被缓存 2、POST 请求不会保留在浏览器历史记录中 3、POST 请求对数据长度没有要求

区别:

1、GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如index.php?name=test1&id=123456,而POST方法是把提交的数据放在HTTP包的Body中。 2、GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制. (3).GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,也就是说GET是通过地址栏来传值,而POST是通过提交表单来传值。 3、GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

HTTP协议详解之响应篇

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

HTTP/1.1 200 OK
Date: Sun, 17 Mar 2013 08:12:54 GMT
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
<html>
<head>
<title>HTTP响应示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>

状态行

状态行由协议版本、数字形式的状态代码,及相应的状态描述组成,各元素之间以空格分隔,结尾时回车换行符,格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

HTTP-Version 表示服务器 HTTP 协议的版本,Status-Code 表示服务器发回的响应代码,Reason-Phrase 表示状态代码的文本描述,CRLF 表示回车换行。例如:

HTTP/1.1 200 OK (CRLF)

状态代码与状态描述

状态代码由3位数字组成, 表示请求是否被理解或被满足,状态描述给出了关于状态码的简短的文字描述。状态码的第一个数字定义了响应类别,后面两位数字没有具体分类。第一个数字有5种取值,如下所示。

1xx:指示信息——表示请求已经接受,继续处理
2xx:成功——表示请求已经被成功接收、理解、接受。
3xx:重定向——要完成请求必须进行更进一步的操作
4xx:客户端错误——请求有语法错误或请求无法实现
5xx:服务器端错误——服务器未能实现合法的请求。
常见状态代码、状态描述、说明:
200 OK      //客户端请求成功
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

HTTP协议详解之常用的头信息

Accept:指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset:浏览器可以接受的字符编码集。 Accept-Charset: iso-8859-5 Accept-Encoding:指定浏览器可以支持的web服务器返回内容压缩编码类型。 Accept-Encoding: compress, gzip Accept-Language:浏览器可接受的语言 Accept-Language: en,zh Accept-Ranges:可以请求网页实体的一个或者多个子范围字段 Accept-Ranges: bytes Authorization:HTTP授权的授权证书 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== Cookie:HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 Cookie: $Version=1; Skin=new; Content-Length:请求的内容长度 Content-Length: 348 Content-Type:服务器告诉浏览器自己响应的对象的类型。 Content-Type:application/xml Content-Encoding:服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。 Content-Encoding:gzip Content-Language:服务器告诉浏览器理解主体时最适宜使用的自然语言。 Content-Length:服务器告诉浏览器自己响应的对象的长度或尺寸 Content-Length: 26012 Cache-Control:指定请求和响应遵循的缓存机制,在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached各个消息中的指令含义如下: no-cache:指示请求或响应消息不能缓存,实际上是可以存储在本地缓存区中的,只是在与原始服务器进行新鲜度验证之前,缓存不能将其提供给客户端使用。 no-store:缓存应该尽快从存储器中删除文档的所有痕迹,因为其中可能会包含敏感信息。 max-age:缓存无法返回缓存时间长于max-age规定秒的文档,若不超规定秒浏览器将不会发送对应的请求到服务器,数据由缓存直接返回;超过这一时间段才进一步由服务器决定是返回新数据还是仍由缓存提供。若同时还发送了max-stale指令,则使用期可能会超过其过期时间。 min-fresh:至少在未来规定秒内文档要保持新鲜,接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象。 max-stale:指示客户端可以接收过期响应消息,如果指定max-stale消息的值,那么客户端可以接收过期但在指定值之内的响应消息。 only-if-cached:只有当缓存中有副本存在时,客户端才会获得一份副 Public:指示响应可被任何缓存区缓存,可以用缓存内容回应任何用户。 Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理,只能用缓存内容回应先前请求该内容的那个用户。 Pragma:用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同。 Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。 Close:告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了。 Keepalive:告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求。 Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒),如Keep-Alive:300。 Date:表示消息发送的时间,服务器响应中要包含这个头部,因为缓存在评估响应的新鲜度时要用到,其时间的描述格式由RFC822定义,Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。 Date:Mon, 31 Dec 2001 04:25:57 GMT Transfer-Encoding:WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)。 Transfer-Encoding: chunked Last-Modified:WEB服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。 Last-Modified:Tue, 06 May 2008 02:42:43 GMT Host:指定请求的服务器的域名和端口号 Etag:就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供WEB服务器判断一个对象是否改变了。比如前一次请求某个html文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得ETag值发送给WEB服务器,然后WEB服务器会把这个ETag跟该文件的当前ETag进行对比,然后就知道这个文件有没有改变了。 If-Match:只有请求内容与实体相匹配才有效 If-Match: “737060cd8c284d8af7ad3082f209582d” If-Modified-Since:如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT If-None-Match:如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 If-None-Match: “737060cd8c284d8af7ad3082f209582d” If-Range:如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag If-Range: “737060cd8c284d8af7ad3082f209582d” If-Unmodified-Since:只在实体在指定时间之后未被修改才请求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT Range:只请求实体的一部分,指定范围 Range: bytes=500-999 Referer:浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL Referer:http://www.ecdoer.com/ User-Agent:浏览器表明自己的身份(是哪种浏览器)。 User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN;rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14 Server:服务器表明自己是什么软件及版本等信息。 Accept-Ranges:WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。 Expires:服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。是 HTTP/1.0 的头部。 Expires:Sat, 23 May 2009 10:02:12 GMT Via:列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。当客户端请求到达第一个代理服务器时,该服务器会在自己发出的请求里面添加 Via 头部,并填上自己的相关信息,当下一个代理服务器 收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via头部,并把自己的相关信息加到后面,以此类推,当 OCS 收到最后一个代理服务器的请求时,检查 Via 头部,就知道该请求所经过的路由。例如:Via:1.0 236-81.D07071953.sina.com.cn:80 (squid/2.6.STABLE13)

HTTP协议详解之解决HTTP无状态协议问题

1、通过Cookies保存状态信息 2、通过Session保存状态信息 Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

Session的实现方式:

1、使用Cookie来实现服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。 2、使用URL回写来实现URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带会服务器。如果直接在浏览器输入服务端资源的url来请求该资源,那么Session是匹配不到的。Tomcat对Session的实现,是一开始同时使用Cookie和URL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写。如果发现Cookie被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用response.encodeURL() 。

Cookie和Session有以下明显的不同点:

1、Cookie数据存放在客户的浏览器上,Session数据放在服务器上; 2、Cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用Session; 3、Session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE; 4、单个Cookie在客户端的限制是4K,就是说一个站点在客户端存放的COOKIE不能超过4K;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

recv函数说明返回值

客户端的程序连接上服务器后recv函数阻塞接受,有时会返回0,说明接收超时服务器主动断开了连接,需要重新connect服务器,但重新connect时会报“Tr...

4661
来自专栏云计算教程系列

使用Capistrano,Nginx和Puma在Ubuntu 14.04上部署Rails应用程序

Rails是一个用Ruby编写的开源Web应用程序框架。Nginx是一种高性能HTTP服务器,反向代理和负载均衡器,以其并发性,稳定性,可伸缩性和低内存消耗而著...

1664
来自专栏大闲人柴毛毛

Linux系统服务——Daemon

什么是Daemon? Daemon是Linux的一些系统服务,它们是一些常驻内存的进程。 Daemon分类 Daemon拥有两种分类方式,按照“daemon是...

3774
来自专栏人人都是极客

Linux下so动态库一些不为人知的秘密

Linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。

2002
来自专栏测试开发架构之路

命令行窗口中用telnet测试HTTP协议

1. 命令行窗口中用telnet测试HTTP协议  HTTP消息是由普通ASCII文本组成。消息包括消息头和数据体部分。消息头以行为单位,每行以CRLF(回车和...

4319
来自专栏C/C++基础

DOS常用命令大全

2010-04-17 22:27:19|  分类: 电脑技术 |  标签:dos命令大全 |字号大中小 订阅

2321
来自专栏技术博文

H5缓存机制浅析

1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性。离线存储(也可称为缓存机制)是其中一个非常重要的特性。H5 引入的离...

4348
来自专栏IT笔记

Nginx学习之缓存配置

项目采用的是Nginx+Tomcat,Nginx处理静态请求并缓存,Tomcat处理动态请求。 缓存配置proxy_cache.conf: #设置Web缓存区名...

3057
来自专栏写代码的海盗

hadoop2.2.0安装需要注意的事情

今天在安装hadoop2.2.0时遇到若干问题,解决这些问题有些心得,记录下来以备不时之需。 问题1、master和slave之间不能相互ssh免密码登陆。  ...

3294
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(十六) ——Redis文件事件 (原创内容,转载请注明来源,谢谢)

《Redis设计与实现》读书笔记(十六) ——Redis文件事件 (原创内容,转载请注明来源,谢谢) 一、概述 redis服务器是一个事件驱动...

3166

扫码关注云+社区

领取腾讯云代金券