http学习

冒着再次挂科的危险,给大家写文章,不容易啊,

希望大家支持,相信在这次认真复习之后,稳过了,

不知道为什么学渣,总是会挂科,

哎,估计学渣有自己认为重要的事情要忙吧

学霸们都去考研了,

在这里要感谢一下这个博客的作者,让我学习到了HTTP协议的知识

深入理解HTTP协议(转) - 苏勇的blog - BlogJava
​www.blogjava.net
图标

在这里只是简单的将一些重点的列出来,

在这里推荐一本书啊《图解HTTP》,个人觉得这本书挺好的,

为什么呢?

主要是因为有图有真相嘛,一大堆文字,难免会很枯燥,

还是来点图更有意思

我个人还是蛮喜欢结合图形讲解知识点的,通熟易懂,

还可以发挥左脑的想象力

喜欢的伙伴可以去下面那个网站下载pdf电子版的,有钱还是支持一下作者买本书

那么接下来就是了解什么是http协议呢?

HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传输协议,

他可以使浏览器更加高效使网络传输较少

注意 HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型

HTTP 是一个无状态连接的协议

那么什么是状态连接呢?

下面是个人理解哈

我就从我们生活中的例子来说,

就好像我们在网上买东西一样,快递员会帮我们送快递,

他们只负责把快递送到就好了,无需了解你下一次是否还买东西,
HTTP在协议栈中的位置
HTTP 协议通常承载于TCP 协议之上,有时也承载于 TSL或者SSL 协议层之上,

这个时候就是我们通常说的加密连接 HTTPS了

最重要的核心就是 –> HTTP的请求和响应模型

这样有一个缺点就是限制了使用HTTP协议,

无法实现在客户端没有发起请求的时候,

服务器将消息推送给客户端

HTTP的工作流程

1)首先客户机与服务器需要建立连接。

只要单击某个超级链接,HTTP的工作开始。

2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:

统一资源标识符(URL)、协议版本号,

后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,

包括信息的协议版本号、一个成功或错误的代码,

后边是MIME信息包括服务器信息、实体信息和可能的内容。

4)客户端接收服务器所返回的信息通过

浏览器显示在用户的显示屏上,

然后客户机与服务器断开连接。

如果在以上过程中的某一步出现错误,

那么产生错误的信息将返回到客户端,

有显示屏输出。对于用户来说,

这些过程是由HTTP自己完成的,

用户只要用鼠标点击,等待信息显示就可以了。

几个重要的概念

建立连接

HTTP/1.0 每次请求都需要建立新的TCP连接,连接不能复用。

HTTP/1.1 新的请求可以在上次请求建立的TCP连接之上发送,连接可以复用。

优点是减少重复进行TCP三次握手的开销,提高效率。

注意 在同一个TCP连接中,新的请求需要等上次请求收到响应后,才能发送。

host 域

Eg:
GET /pub/www/my.html HTTP/1.1
host: www.baidu.com

日期时间戳

Eg:

Sun, 06 Nov 1994 08:49:37 GMT;RFC 822, updated by RFC 1123

Sunday,06 Nov94 08:49:37 GMT;RFC 850, obsoleted by RFC 1036

Sun Nov 6 08:49:37 1994 ;ANSI C’s asctime() format

响应状态码

2.3.2.1 1**:请求收到,继续处理

100——客户必须继续发出请求

101——客户要求服务器根据请求转换HTTP协议版本

2.3.2.2 2**:操作成功收到,分析、接受

200——交易成功

201——提示知道新文件的URL

202——接受和处理、但处理未完成

203——返回信息不确定或不完整

204——请求收到,但返回信息为空

205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件

206——服务器已经完成了部分用户的GET请求

2.3.2.3 3**:完成此请求必须进一步处理

300——请求的资源可在多处得到

301——删除请求数据

302——在其他地址发现了请求数据

303——建议客户访问其他URL或访问方式

304——客户端已经执行了GET,但文件未变化

305——请求的资源必须从服务器指定的地址得到

306——前一版本HTTP中使用的代码,现行版本中不再使用

307——申明请求的资源临时性删除

2.3.2.4 4**:请求包含一个错误语法或不能完成

400——错误请求,如语法错误

401——未授权

HTTP 401.1 - 未授权:登录失败

  HTTP 401.2 - 未授权:服务器配置问题导致登录失败

  HTTP 401.3 - ACL 禁止访问资源

  HTTP 401.4 - 未授权:授权被筛选器拒绝

HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败

402——保留有效ChargeTo头响应

403——禁止访问

HTTP 403.1 禁止访问:禁止可执行访问

  HTTP 403.2 - 禁止访问:禁止读访问

  HTTP 403.3 - 禁止访问:禁止写访问

  HTTP 403.4 - 禁止访问:要求 SSL

  HTTP 403.5 - 禁止访问:要求 SSL 128

  HTTP 403.6 - 禁止访问:IP 地址被拒绝

  HTTP 403.7 - 禁止访问:要求客户证书

  HTTP 403.8 - 禁止访问:禁止站点访问

  HTTP 403.9 - 禁止访问:连接的用户过多

  HTTP 403.10 - 禁止访问:配置无效

  HTTP 403.11 - 禁止访问:密码更改

  HTTP 403.12 - 禁止访问:映射器拒绝访问

  HTTP 403.13 - 禁止访问:客户证书已被吊销

  HTTP 403.15 - 禁止访问:客户访问许可过多

  HTTP 403.16 - 禁止访问:客户证书不可信或者无效

HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效

404——没有发现文件、查询或URl

405——用户在Request-Line字段定义的方法不允许

406——根据用户发送的Accept拖,请求资源不可访问

407——类似401,用户必须首先在代理服务器上得到授权

408——客户端没有在用户指定的饿时间内完成请求

409——对当前资源状态,请求不能完成

410——服务器上不再有此资源且无进一步的参考地址

411——服务器拒绝用户定义的Content-Length属性请求

412——一个或多个请求头字段在当前请求中错误

413——请求的资源大于服务器允许的大小

414——请求的资源URL长于服务器允许的长度

415——请求资源不支持请求项目格式

416——请求中包含Range请求头字段,

在当前请求资源范围内没有range指示值,

请求也不包含If-Range请求头字段

417——服务器不满足请求Expect头字段指定的期望值,

如果是代理服务器,可能是下一级服务器不能满足请求长。

2.3.2.5 5**:服务器执行一个完全有效请求失败

  HTTP 500 - 内部服务器错误

  HTTP 500.100 - 内部服务器错误 - ASP 错误

  HTTP 500-11 服务器关闭

  HTTP 500-12 应用程序重新启动

  HTTP 500-13 - 服务器太忙

  HTTP 500-14 - 应用程序无效

  HTTP 500-15 - 不允许请求 global.asa

  Error 501 - 未实现

HTTP 502 - 网关错误

响应消息格式

HTTP响应消息的格式如下所示:

状态行

通用信息头|响应头|实体头

CRLF

实体内容

其中:状态行 = 版本号 [空格] 状态码 [空格] 原因 [回车换行]

状态行举例:

Eg1:

HTTP/1.0 200 OK

  Eg2:

HTTP/1.1 400 Bad Request

 HTTP响应消息实例如下所示:

HTTP/1.1 200 OK

ETag: W/”158-1192590101000”

Last-Modified:Wed,17 Oct 2007 03:01:41GMT

Content-Type: text/html

Content-Length: 158

Date: Wed, 17 Oct 2007 03:01:59 GMT

Server: Apache-Coyote/1.1

请求的方法

GET Get方式在通过URL提交数据,数据在URL中可以看到

POST POST方式,数据放置在HTML HEADER内提交

HEAD 获取报文头部信息

PUT 传输文件

DELETE 删除文件

OPTIONS 询问支持的方法

TRACE 追踪路径

CONNECT 要求用隧道协议链接代理

请求头信息

HTTP最常见的请求头如下:

Accept:浏览器可接受的MIME类型;

Accept-Charset:浏览器可接受的字符集;

Accept-Encoding:浏览器能够进行解码的数据编码方式,

            比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。

            许多情形下这可以减少5到10倍的下载时间;

Accept-Language:浏览器所希望的语言种类,

             当服务器能够提供一种以上的语言版本时要用到;

Authorization:授权信息,通常出现在对服务器发送的

           WWW-Authenticate头的应答中;

Connection:表示是否需要持久连接。

        如果Servlet看到这里的值为“Keep-Alive”,

        或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),

        它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),

        显著地减少下载所需要的时间。

        要实现这一点,Servlet需要在应答中发送一个Content-Length头,

        最简单的实现方法是:先把内容写入ByteArrayOutputStream,

        然后在正式写出内容之前计算它的大小;

Content-Length:表示请求消息正文的长度;

Cookie:这是最重要的请求头信息之一;

From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它;

Host:初始URL中的主机和端口;

If-Modified-Since:只有当所请求的内容在指定的日期之后

               又经过修改才返回它,否则返回304“Not Modified”应答;

Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,

    即使它是代理服务器而且已经有了页面的本地拷贝;

Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关 则该值非常有用;

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器

                               所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

2.7 响应头

HTTP最常见的响应头如下所示:

Allow:服务器支持哪些请求方法(如GET、POST等);

Content-Encoding:文档的编码(Encode)方法。

            只有在解码之后才可以得到Content-Type头指定的内容类型。

            利用gzip压缩文档能够显著地减少HTML文档的下载时间。

            Java的GZIPOutputStream可以很方便地进行gzip压缩,

            但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。

            因此,Servlet应该通过查看Accept-Encoding头

            (即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,

            为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面;

Content-Length:表示内容长度。

            只有当浏览器使用持久HTTP连接时才需要这个数据。

            如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,

            完成后查看其大小,然后把该值放入Content-Length头,

            最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容;

Content-Type: 表示后面的文档属于什么MIME类型。

           Servlet默认为text/plain,但通常需要显式地指定为text/html。

           由于经常要设置Content-Type,因此HttpServletResponse

           提供了一个专用的方法setContentTyep。 

           可在web.xml文件中配置扩展名和MIME类型的对应关系;

Date:当前的GMT时间。你可以用setDateHeader来设置这个头

  以避免转换时间格式的麻烦;

Expires:指明应该在什么时候认为文档已经过期,从而不再缓存它。

Last-Modified:文档的最后改动时间。

           客户可以通过If-Modified-Since请求头提供一个日期,

           该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,

           否则返回一个304(Not Modified)状态。

Last-Modified也可用setDateHeader方法来设置;

Location:表示客户应当到哪里去提取文档。Location通常不是直接设置的,

      而是通过HttpServletResponse的sendRedirect方法,

     该方法同时设置状态代码为302;

Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。

     除了刷新当前文档之外,你还可以通过

     setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。

    注意这种功能通常是通过设置HTML页面HEAD区的

    实现,这是因为,

    自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。

    但是,对于Servlet来说,直接设置Refresh头更加方便。

    注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,

    而不是“每隔N秒刷新本页面或访问指定页面”。

    因此,连续刷新要求每次都发送一个Refresh头,

    而发送204状态代码则可以阻止浏览器继续刷新,

    不管是使用Refresh头还是。

    注意Refresh头不属于HTTP 1.1正式规范的一部分,

    而是一个扩展,但Netscape和IE都支持它。

更多东西请参考

这个博客 http://www.blogjava.net/zjusuyong/articles/304788.html

还有就是上面那本书

本站整理下载:链接:http://pan.baidu.com/s/1jI64ar0 密码:cfft

你可能感兴趣的:(http,http)