一、HTTP协议简介

什么是HTTP?全称是HyperText Transfer Protocal,即:超文本传输协议,从1990年开始就在WWW上广泛应用,是现今在WWW上应用最多的协议,目前版本是1.1。

Http是应用层协议,当你上网浏览网页的时候,浏览器和Web服务器之间就会通过HTTP在Internet上进行数据的发送和接收。

Http是一个基于请求/响应模式的、无状态的协议。即我们通常所说的Request/Response。

二、HTTP URL

HTTP URL格式如下:

http://host[“:”port][abs_path]

其中HTTP表示要通过HTTP协议来定位网络资源。host表示合法的Internet主机域名或IP地址。port用于指定一个端口号,拥有被请求资源服务器主机监听该端口的TCP连接,如果port是空的,或者没有给出,则使用默认的缺省值80.abs_path表示指定请求资源的URI(Uniform Resource Identifier,统一资源标示符),如果URL中没有给出abs_path,那么当他作为请求URI时,必须以”/”的形式给出。通常,这个工作就由浏览器帮助我们完成了。当我们在浏览器中输入www.cnblogs.com时,然后回车,浏览器会自动将我你们输入的地址转换成http://www.cnblogs.com/,注意最后的斜杠“/”。不信你试试。

三、HTTP请求

客户端通过发送HTTP请求向服务器请求对资源的访问,HTTP由三部分组成,分别是:请求行,消息报头,请求正文。

请求行:

请求行以一个方法符号开头,后面跟着请求URI和协议的版本,以CRLF作为结尾。请求行以空格分隔,除了作为CRLF外,不允许出现单独的CR或者LF字符。具体格式如下:

Method Request-URI HTTP-Version CRLF

Method表示请求方法,Request-URI是一个统一资源标示符,表示了要请求的资源,HTTP-Version表示请求的HTTP协议的版本号,CRLF表示回车换行。例如:

GET /form.html HTTP/1.1 (CRLF)

GET方法用于获取由Request-URI所表示的资源信息,常见形式是:

GET Request-URI HTTP/1.1

我们通过在浏览器地址栏中直接输入网址的方式去访问网页的时候,浏览器采用的就是GET方法向服务器获取资源信息。

POST方法用于向目的服务器发出请求,要求服务器接收附在请求后面的数据。POST方法在表单提交的时候用的较多。

一个采用POST方法提交的例子:

POST /form.html HTTP/1.1 (CRLF)

Accept:image/gif,application/json(…省略很多) (CRLF)

Host:www.abc.com (CRLF)

Content-Length:22 (CRLF)

Connection:Keep-Alive (CRLF)

Cache-Control:no-cache (CRLF)

(CRLF) //注意:空行上部是消息报头,下方是请求正文,这个空行是必须的。

user=zhangsan&password=123456

HEAD方法与GET方法几乎一样,他们的区别在于HEAD方法只是请求消息报头,而不是完整的内容。对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源的内容,就可以得到Request-URI所表示的资源信息。这个方法常被用来测试超链接的有效性,是否可以访问,以及最近是否更新。

四、HTTP响应

在接受和处理消息后,服务器会返回一个HTTP响应消息。与HTTP请求类似,HTTP响应也由三个部分组成,分别是:状态行,消息报头,响应正文。

状态行:

状态行由协议版本、数字形式的状态码、及响应的状态描述组成,各元素之间以空格分隔,除了结尾的CRLF(回车换行)之外,不允许出现CR或LF字符。格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

HTTP-Version表示服务器HTTP协议的版本,Status-Code表示服务器发回的响应代码,具体可参见这篇文章,【你知道HHTP各种状态代表什么意思吗?】.Reason-Phrase表示状态码的文本描述,CRLF表示回车换行。例如:

HTTP/1.1 200 OK (CRLF)

五、请求报头格式

1、通用报头

Cache-Control:客户端希望服务端如何缓存自己的请求数据,如"Cache-Control: no-cache","Cache-Control: max-age=0"; 
Connection:客户端是否希望与服务端之间保持长连接,如"Connection: close", "Connection: keep-alive"; 
Date:只有当请求方法为POST或PUT方法时客户端才可能会有些字段; 
Pragma:包含了客户端一些特殊请求信息,如 "Pragma: no-cache" 客户端希望代理或应用服务器不应缓存与该请求相关的结果数据。

2、请求报头

Accept:表明客户同端可接受的请求回应的媒体类型范围列表。星号“*”用于按范围将类型分组,用“*/*”指示可接受全部类型;用“type/*”指示可接受 type类型的所有子类型,如“ Accept: image/gif, image/jpeg, */*”; 
Accept-Charset:客户端所能识别的字符集编码格式,格式:“Accept-Charset: 字符集1[:权重],字符集2[:权重]”,如:“ Accept-Charset: iso-8859-5, unicode-1-1;q=0.8”; 
Accept-Language:客户端所能识别的语言,格式:“Accept-Language: 语言1[:权重],语言2[:权重]”,如:” Accept-Language: zh, en;q=0.7”; 
Host:客户请求的主机域名或主机IP,格式:“Host:域名或IP[:端口号]”,如:“Host:www.cnblogs.com:80“,请求行中若有HTTP/1.1则必须有该请求头; 
User-Agent:表明用户所使用的浏览器标识,主要用于统计的目的; 
Referer:指明该请求是从哪个关联连接而来; 
Accept-Encoding:客户端所能识别的编码压缩格式,如:“Accept-Encoding: gzip, deflate”; 
If-Modified-Since:该字段与客户端缓存相关,客户端所访问的URL自该指定日期以来在服务端是否被修改过,如果修改过则服务端返回新的修改后 的信息,如果未修改过则服务器返回304表明此请求所指URL未曾修改过,如:“If-Modified-Since: Fri, 2 Sep 2011 19:37:36 GMT”; 
If-None-Match:该字段与客户端缓存相关,客户端发送URL请求的同时发送该字段及标识,如 果服务端的标识与客户端的标识一致,则返回304表明此URL未修改过,如果不一致则服务端返回完整的数据信息,如:“If-None-Match: 0f0a893aad8c61:253, 0f0a893aad8c61:252, 0f0a893aad8c61:251”; 
Cookie:为扩展字段,存储于客户端,向同一域名的服务端发送属于该域的cookie,如:“Cookie: MailUserName=whouse”;

3、实体报头

Content-Encoding:客户端所能识别的编码压缩格式,如:“Content-Encoding: gzip, deflate”; 
Content-Length:客户端以POST方法上传数据时数据体部分的内容长度,如:“ Content-Length: 24”; 
Content-Type:客户端发送的数据体的内容类型,如:“Content-Type:application/x-www-form-urlencoded”为以普通的POST方法发送的数据;“Content-Type: multipart/form-data;

六、响应报头格式

1、通用报头

Cache- Control:服务端要求中间代理及客户端如何缓存自己响应的数据,如“Cache-Control: no-cache”,如:“Cache-Control: private” 不希望被缓存,“Cache-Control: public” 可以被缓存; 
Connection:服务端是否希望与客户端之间保持长连接,如“Connection: close”, “Connection: keep-alive”; 
Date:只有当请求方法为POST或PUT方法时客户端才可能会有些字段; 
Pragma:包含了服务端一些特殊响应信息,如 “Pragma: no-cache” 服务端希望代理或客户端不应缓存结果数据; 
Transfer-Encoding:服务端向客户端传输数据所采用的传输模式(仅在HTTP1.1中出现),如:“Transfer-Encoding: chunked”,注:该字段的优先级要高于“Content-Length” 字段的优先级;

2、请求报头

Accept-Ranges:表明服务端接收的数据单位,如:“Accept-Ranges: bytes”, ; 
Location:服务端向客户端返回此信息以使客户端进行重定向,如:“Location: http://www.abc.com”; 
Server:服务端返回的用于标识自己的一些信息,如:“ Server: Microsoft-IIS/6.0”; 
ETag:服务端返回的响应数据的标识字段,客户端可根据此字段的值向服务器发送某URL是否更新的信息

3、实体报头

Content-Encoding:服务端所响应数据的编码格式,如:“Content-Encoding: gzip”; 
Content-Length:服务端所返回数据的数据体部分的内容长度,如:“ Content-Length: 24”; 
Content-Type:服务端所返回的数据体的内容类型,如:“Content-Type: text/html; charset=gb2312” ; 
Set-Cookie:服务端返回给客户端的cookie数据,如:“ Set-Cookie: ASP.NET_SessionId=icnh2ku2dqlmkciyobgvzl55; path=/”

七、telnet工具的使用

1、使用微软自带的telnet工具可以连接远程主机的指定端口,(在windows server 2008中需要手动添加这个服务后才能使用)。
2、telnet可以连接到指定端口的主机。例如:
 cmd --> telnet www.cnblogs.com 80  就会成功连接到cnblgos的主机
接着输入HEAD请求:
HEAD /index.html HTTP/1.1
Host: www.cnblogs.com
有可能因为回显功能显示不出来,可以用set localecho命令设置回显功能。最后会输出响应信息。

作者:樊勇 
出处:http://www.cnblogs.com/fanyong/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 
我的联系方式:fanyong@gmail.com 
个人独立博客:www.fy98.com

【总结——HTTP协议】的更多相关文章

  1. HTTP协议系列(1)

    一.为什么学习Http协议       首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...

  2. 重温Http协议--请求报文和响应报文

    http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...

  3. 协议森林17 我和你的悄悄话 (SSL/TLS协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...

  4. 协议森林16 小美的桌号(DHCP协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. DHCP协议用于动态的配置电脑的网络相关参数,如主机的IP地址,路由器出口地址.DNS域名服务器地 ...

  5. 简约之美Jodd-http--深入源码理解http协议

    Jodd 是一个开源的 Java 工具集, 包含一些实用的工具类和小型框架.简单,却很强大! jodd-http是一个轻巧的HTTP客户端.现在我们以一个简单的示例从源码层看看是如何实现的? Http ...

  6. 【JavaScript】javascript中伪协议(javascript:)使用探讨

    javascript:这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行. 比如下面这个死链接: <a href="javasc ...

  7. SNMP简单网络管理协议

    声明:以下内容是学习谌玺老师视频整理出来(http://edu.51cto.com/course/course_id-861.html) SNMP(Simple Network Management ...

  8. 海鑫智圣:物联网漫谈之MQTT协议

    什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...

  9. linux-图形化远程管理协议

    远程管理控制方式: RDP(remote desktop protocol)协议: telnet: SSH(Secure Shell): RFB(Remote FrameBuffer)协议(图形化远程 ...

  10. RTP与RTCP协议介绍(转载)

    RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完 ...

随机推荐

  1. JDBC自定义连接池

    开发中,"获得连接"和"释放资源"是非常消耗系统资源的,为了解决此类性能问题可以采用连接池技术来共享连接Connection. 1.概述 用池来管理Connec ...

  2. 【flyway】Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' def

    报错如下: "2018-03-20 12:58:09.585 WARN 18026 — [ restartedMain] ConfigServletWebServerApplicationC ...

  3. 【spring boot Mybatis】报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.newhope.interview.dao.UserMapper.add

    报错如下: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.newhope.i ...

  4. 辅助方法 @Html.Raw与 HtmlString区别

    //Html.Raw其实是调用 new Microsoft.AspNetCore.Html.HtmlString(xxx) @{ ViewData["Title"] = " ...

  5. C语言枚举类型(Enum)

    在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等. 以每周七天为例, ...

  6. PAT 1003 Sharing (25)

    题目描写叙述 To store English words, one method is to use linked lists and store a word letter by letter. ...

  7. 消息列队 php 基于redis 实现

    说明 消息列队 基于PHP 实现. 之前 用python 的 flower 实现了 列队. 今天这里我们用的是 PHP 来实现: 在实际的业务环境中 PHP 用的多些: PHP 实现列队 最重要的是用 ...

  8. HDU 5289 Assignment(多校联合第一场1002)

    Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  9. 【前端JS】radio 可单选可点击取消选中

    普通情况下 radio 单选框仅仅能实现多选一的效果,可是一旦选择当中一个后,这个单选框就不可点击取消其选中状态了.这样的功能在某些业务环境下并不适用.有时我们既须要单选框的多选一效果.也须要复选框的 ...

  10. cocos2d-x 3.0 touch事件官方解释

    官方解释 http://www.cocos2d-x.org/docs/manual/framework/native/input/event-dispatcher/zh#_1