细说Http协议

什么Http协议

HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程及数据本身的格式。

 版本:1.1(目前使用的)和1.0
和1.1可以在一次TCP/IP链接上,发出多次请求和得到多次响应
1.0每次都必须建立新的TCP/IP链接,比较浪费资源。

基于HTTP协议的客户/服务器模式的信息交换过程,如图所示,它分四个过程,建立连接、发送请求信息、发送响应信息、关闭连接。

三次握手

请求部分

请求消息头:客户端给服务器端发送的一些附加信息。

请求部分详解:
1、请求行:位于请求内容的第一行。
请求方式 请求的资源的URI地址 使用的协议及版本号
GET /app1/1.html HTTP/1.1

a、请求方式:
请求方式有:GET(默认的)、POST、HEAD、DELETE等
GET方式:/app1/1.html?username=abc&password=123。把表单的数据紧跟在URI地址后面,用?进行分割。问号后面的内容,专业叫法:查询字符串。请求行的长度不能超过1KB。不适合传递太多的数据。
POST方式:把表单的数据放在了请求的正文部分。没有长度限制。
b、请求的URI:
URI:统一资源标识符。http://localhost:8080/app1/1.html(URL),去掉协议、主机、端口剩余的叫做URI。
c、客户端使用的协议及版本。
2、请求消息头:
界限:从第2行开始,到第一个空行结束。
 Accept:浏览器可接受的MIME类型 。
Accept:text/html.
MIME类型是区分网络上传输的数据类型的。MIME:大类型/具体类型。MIME类型和文件的扩展名有对应关系(Tomcat\conf\web.xml)

 Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
 Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。 可以在浏览器中进行设置。
Host:初始URL中的主机和端口
 Referer:取值是一个URL,该URL表示用户是由哪个页面过来的。

 Content-Type:内容类型:告知服务器,请求正文的MIME数据类型,默认值:application/x-www-form-urlencoded
 if-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT利用这个头与服务器的文件进行比对,如果一致,则从缓存中直接读取文件。
 User-Agent:浏览器类型.
 Content-Length:表示请求消息正文的长度
 Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接
 Cookie:这是最重要的请求头信息之一 (会话管理时再讲)
 Date:Date: Mon, 22 Aug 2011 01:55:39 GMT请求时间GMT

3、请求正文:只有表单的请求方式是POST方式时才会出现。
username=abc&password=123 参数都是:key=value的形式,多个参数之间用&进行分割。

响应部分

响应消息头:服务器端给客户端发送的一些附加信息。


3.1响应消息行:位于第一行
服务器端使用的协议及版本 响应码 响应码描述
HTTP/1.1 200 OK
a、响应码:
1XX~5XX:目前用到了40个左右。
记住常用的几个状态码:
200:一切正常
302/307:请求重定向
304:服务器的资源没有修改。
404:客户端访问的地址不存在
500:服务器端程序遇到异常

3.2响应消息头:(重点)
 Location: http://www.it315.org/index.jsp指示新的资源的位置
一般和302、307响应码一起使用,完成请求重定向。
 Server:apache tomcat指示服务器的类型
 Content-Encoding: gzip告知客户端服务器发送的请求正文内容的压缩编码
 Content-Length: 80 告诉浏览器正文的长度
 Content-Language: zh-cn服务发送的文本的语言
 Content-Type: text/html; charset=GB2312服务器发送的内容的MIME类型
 Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT文件的最后修改时间
 Refresh: 1;url=http://www.it315.org指示客户端刷新频率。单位是秒

 Content-Disposition: attachment; filename=aaa.zip指示客户端下载文件
 Set-Cookie:SS=Q0=5Lb_nQ; path=/search服务器端发送的Cookie(会话管理)
 Expires: -1
 Cache-Control: no-cache (1.1)
 Pragma: no-cache (1.0) 三个头一般一起使用,告诉客户端不要缓存内容
 Connection: close/Keep-Alive
 Date: Tue, 11 Jul 2000 18:23:51 GMT

3.3响应正文:
和在页面上点击右键“查看源码”看到的是一样的。

三种禁止浏览器缓存的头字段

// 不要 缓存的 三个 头 :

        //Cache-Control  : no-cache
//      Pragma: no-cache
//      Expires: Thu, 01 Dec 1994 16:00:00 GMT  (时间值 )

        // 都是 用于 控制 浏览器 缓存的 , 当前 是要不缓存, 其 值  是 no-cache,  no-cache,Thu, 01 Dec 1994 16:00:00 GMT 时间值 

        // 为什么 有三个 头 啊 ?
//      如果 要 通知 浏览器 不缓存, 最好 的方式 这个三个 都设置
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        // 设置 expires 的时候  需要 调用 这个 方法 : setDateHeader(java.lang.String name, long date)
        response.setDateHeader("Expires", -1);

状态码所表示的意义

状态行
格式: HTTP版本号 状态码 原因叙述
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的各种不同处理结果和状态,它是一个三位的十进制数。响应状态码分为5类,使用最高位为1到5来进行分类如下所示:

一、200状态码:
成功2××: 成功处理了请求的状态码。
1、200 :服务器已成功处理了请求并提供了请求的网页。
2、204: 服务器成功处理了请求,但没有返回任何内容。
二、300状态码:
重定向3×× :每次请求中使用重定向不要超过 5 次。
1、301: 请求的网页已永久移动到新位置。当URLs发生变化时,使用301代码。搜索引擎索引中保存新的URL。
2、302: 请求的网页临时移动到新位置。搜索引擎索引中保存原来的URL。
3、304: 如果网页自请求者上次请求后没有更新,则用304代码告诉搜索引擎机器人,可节省带宽和开销。
三、400状态码:
客户端错误4×× :表示请求可能出错,妨碍了服务器的处理。
1、400: 服务器不理解请求的语法。
2、403: 服务器拒绝请求。
3、404: 服务器找不到请求的网页。服务器上不存在的网页经常会返回此代码。
4、410 :请求的资源永久删除后,服务器返回此响应。该代码与 404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时用来替代404 页面代码。如果资源已永久删除,应当使用 301 指定资源的新位置。
四、500状态码:
服务器错误5×× :表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
1、500 :服务器遇到错误,无法完成请求。
2、503: 服务器目前无法使用(由于超载或停机维护)。

时间: 2024-10-03 19:44:02

细说Http协议的相关文章

ios7 push/pop转场动画

前言 iOS 7之后,苹果提供了自定义转场动画的API,我们可以自己去定义任意动画效果.本篇为笔者学习push.pop自定义转场效果的笔记,如何有任何不正确或者有指导意见的,请在评论中留下您的宝贵意见!!! 请注意:如果要求支持iOS 7以下版本,则不可使用此效果. 我们本篇文章目标效果: 视图切换种类 如下效果图,这是有两大类视图切换动画的,一种是交互式的,另一种就是自定义的. 本篇只讲其中的UIViewControllerAnimatedTransitioning协议,来实现push.pop

直接用socket实现HTTP协议(下载专用)

从HTTP服务器上下载一个文件有很多方法,"热心"的微软提供了 WinInet 类,用起来也很方便.当然,我们也可以自己实现这些功能,通过格式化请求头很容易就能实现断点续传和检查更新等等功能 .本文附带的工程中有一个支持 HTTP1.1 协议,直接用 Socket 实现下载功能的 DLL,实现了以下功能: 连接主机 格式化请求头 设置接收,发送超时 接收并分析回应头 连接,发送,设置超时,接收数据等我就不细说了,windows socket早就做好了,调用相应的函数就OK了. 要想从服

Objective-C中的类目,延展,协议

Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词的时候,有种感觉这是不是学习的坎?这东西难不难?能不能学会?经过本人亲自验证,这三个东西理解起来还是蛮简单的,学过C++或者Java的小伙伴对比理解还是蛮轻松的.类目(Category)就是给已有的类扩充相应的方法,扩充的方法是公有的,类目还可以起到分模块的功能,下面会详细说到. 延展(Extens

TCP协议实现ethernet bootloader的方法教程

TCP/IP Stack    Microchip TCP/IP Stack是免费的,广泛应用于PIC单片机中.由于有远程更新程序的需求,我决定开发基于TCP协议的ethernet bootloader, 主要使用了Microchip TCP/IP Stack的TCP模块.最终我开发出来的ethernet bootloader 在PIC18F97J60上验证通过.整个实现上分两部分,一部分是单片机端的基于TCP协议的bootloader程序,我将其命名为PhnBoot_v2.0, 另外一部分是P

TCP/IP协议体系结构简介

  1.TCP/IP协议栈 四层模型 TCP/IP这个协议遵守一个四层的模型概念:应用层.传输层.互联层和网络 接口层. 网络接口层 模型的基层是网络接口层.负责数据帧的发送和接收,帧是独立的网络信息传 输单元.网络接口层将帧放在网上,或从网上把帧取下来. 互联层 互联协议将数据包封装成internet数据报,并运行必要的路由算法. 这里有四个互联协议: 网际协议IP:负责在主机和网络之间寻址和路由数据包. 地址解析协议ARP:获得同一物理网络中的硬件主机地址. 网际控制消息协议ICMP:发送消

路由器多个协议共存而没有互相影响的原因

路由器之所以能够正常的运行,主要是其中很多不同的协议共同努力的结果,为什么各个协议之间可以共存而不会互相影响呢?这也就是下面所要讲的内容,路由协议运行的的一些概念. 一.VRF:路由协议的安全举措之一就是路由隔离和信息隔离,它是通过VPN路由转发表和MPLS中的LSP来实现的.在PE路由器上,存在有多个路由协议概念一:VRF表,这些VRF表是和PE路由器上的一个或多个子接口相对应的,用于存放这些子接口所属VPN的路由信息. VRF表中只包含一个VPN的路由信息,但是当子接口属于多个VPN时,其所

网络子系统25_生成树协议

//参考 深入理解linux网络技术内幕 //生成树协议(Spanning Tree Protocol, STP)是用于消除环路拓扑的分布式算法. //生成树协议的基本元素: // 1.链路开销,当链路没有指定开销,或者都设置成相同开销时,一个节点到达根的距离用网络跃点数来测量. // 2.BPDU,STP通过让各个网桥之间交换称为网络协议数据单元(BPDU)的特殊帧来传递配置信息. // 3.根网桥,唯一能产生BPDU的网桥,其他网桥只有在接收到BPDU时才会传输BPDU(当网桥第一次加入时,

udp java-JAVA UDP协议下怎么样才能突破局域网内的双向通信啊?求高人务必指导下。。。。

问题描述 JAVA UDP协议下怎么样才能突破局域网内的双向通信啊?求高人务必指导下.... 本人是个接触JAVA2个月的菜鸟,最近在研究UDP广域网的通信,实现的过程也就是常说的双向通信:客户端(局域网内)先发数据给远方的服务器(服务器是公网IP,映射了个端口),服务器能收到,但是服务器不能回发数据给客户端...对于这方面的问题,在网上找了很多资料,全是局域网内的,网上说什么UDP打洞啊,穿透啊等等的,说实话有点晕,直到有一天在网上一个论坛看到同样类似的帖子,主人说根本就不需要什么UDP打洞这

利用 http协议代替ftp协议进行数据传输

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1394077 Internet上的网络往往有内网,架构上大都是前端是防火墙+NAT,后端是内网的各个主机,因此要穿透防火墙进行传输需要对防火墙或NAT进行额外的配置.Internet上的两个Windows服务器之间传输数据,最长用就是FTP,其次还有HTTP等.Linux上还有SSH中的scp和NFS以及其他方法.古