HTTP概述

每天,都有数以亿万计的JPEG图片、HTML页面、文本文件、MPEG电影、WAV音频文件、Java小程序和其他资源在因特网上游弋。HTTP可以从遍布全世界的Web服务器上将这些信息快速、便捷、可靠的搬移到人们桌面上的Web浏览器上去。

HTTP,全称Hyper Text Transport Protocal,即超文本传输协议,定义了浏览器如何向服务器请求文档以及服务器怎样把文档传送给浏览器,它是万维网能够可靠的交换文件(包括文本,声音,图像等多种多媒体文件)的基础。

起源

超文本传输协议的前身是Xanadu项目,超文本的概念是Ted Nelson在1960年代提出的。1989年,Tim Berners Lee在CERN担任软件咨询师的时候,开发了一套程序,奠定了万维网的基础。1990年12月,超文本在CERN首次上线。1991年夏天,继Telnet等协议之后,超文本转移协议成为了互联网诸多协议的一份子。

特点

1、支持客户/服务器模式。支持基本认证 和安全认证。

        2、 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
 
        3、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
 
        4、HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象。
 
        5、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
 

Web客户端和服务器交互过程和模型

客户端/服务器(client/server)这个术语可追溯到上个千年(20世纪80年代),表示通过网络连接起来的个人计算机。客户端/服务器也可用于描述两个计算机程序的关系--客户程序和服务器程序。客户向服务器请求某种服务(比如请求一个文件或数据库访问),服务器满足请求并通过网络将结果传送给客户端。虽然客户端和服务器程序可存在于同一台计算机中,但它们通常都运行在不同计算机上。一台服务器处理多个客户端请求也是很常见的。

最常见的Web客户端就是浏览器了,一次请求/响应的模型如下图所示:

这里需要说明的一点是,每次访问一个静态资源,比如一个html文件,一个png图片或者一个文本文档都会向服务器发出一个HTTP请求,每个HTTP请求都会经历上图的请求/响应模型。比如我们点开http://www.taobao.com/(淘宝网),我们会往服务器发送成百上千个HTTP请求,收到来自客户端的请求后,服务器会去寻找相应的资源,如果成功,就将对象,对象类型,对象长度以及其他信息放在HTTP响应中发回客户端。那么问题来了,服务器怎么去寻找相应的资源,凭据是什么?

URL与资源

URL是浏览器寻找信息时所需要的资源位置。通过URL,人类和应用程序才能找到使用并共享因特网上大量的数据资源。URL是人们对HTTP和其他协议的常用访问点:在浏览器中输入一串URL,浏览器就会在幕后发送适当的协议报文来获取人们所期望的资源。

URL的语法 

大多数的URL方案的URL语法都建立在这个由9部分的通用格式上:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

几乎没有哪个URL中包含了所有这些组件。URL最重要的3个部分是方案(scheme)、主机(host)和路径(path)。

目前常见的协议类型有很多种,常用的有http,https(更安全的http),mailto(邮件),ftp(文件传输),rtsp(音频视频),file,news,telnet等等

HTTP报文

HTTP报文是在HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容和含义,后面跟着可选的数据部分。

报文的组成 

HTTP报文是简单的格式化数据块。每一条报文都包含一条来自客户端的请求,或者来自服务器的响应。它们有三个部分组成:对报文进行描述的起始行(start line)、包含属性的首部块(header),以及可选的、包含数据的主体部分(body)。

HTTP/1.0 200 OK            //起始行

Content-type:text/plain    //首部
Content-length:19 //首部 Hi I'm a message! //主体

报文的语法

 

所有的HTTP报文可以分为两类:请求报文(request message)和响应报文(response message)。请求报文会向服务器发送一个请求,响应报文会将结果返回个客户端。

请求报文的格式:

<method> <request-UTL> <version>
<headers> <entity-body>

      响应报文格式:

<version> <status><reason-phrase>
<header> <entity-body>

  

下面是对格式中各部分的简要描述

      1、方法(method)  GET

        客户端希望服务器对资源执行的动作。是一个单独的词,比如GET、HEAD或POST。

      2、请求的URL(request-URL)

        命名了所有请求资源,或者URL路径组件的完整URL。如果直接与服务器进行对话,只要URL的路径组件是资源的绝对路径,通常就不会有什么问题--服务器可以假定 义自己是URL的主机/端口。

      3、版本(version)  HTTP/1.1

       报文所使用的HTTP版本,其格式如下:

       HTTP/<major>.<minor>

       其中主要版本号(major)和次要版本号(minor)都是整数。  

     4、状态码(status)

      这三个数字描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别("成功"、"出错"等)。

     5、原因短语(reason-phrase)

      数字状态码的可读版本,包含行终止序列之前的所有文本。原因短语只是给人类看的,它不能说明什么。客户端依然采用状态码来判断请求/响应是否成功!

      例如:HTTP/1.0 200 NOT OK 客户端依然会当请求已成功处理。因为状态码是200。而原因短语只是说明而已,这对于自定义扩展状态码还是比较有用的。

     6、首部(header)

      可以有0个或多个首部,每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF。首部是由一个空行(CRLF)结束 的,表示了首部列表的结束和实体主体的开始。

      7、实体的主体部分(entity-body)

       实体的主体部分包含一个由任意数据组成的数据块。并不是所有的报文都包含实体的主体部分。如GET请求就不包含实体。

细说HTTP上篇的更多相关文章

  1. 细说Asp.Net Web API消息处理管道(二)

    在细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息 ...

  2. 【C#复习总结】细说 Lambda表达式

    1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...

  3. 【C#复习总结】细说匿名方法

    1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...

  4. 转:细说ASP.NET Windows身份认证

    转自:https://www.cnblogs.com/fish-li/archive/2012/05/07/2486840.html 细说ASP.NET Windows身份认证 阅读目录 开始 认识A ...

  5. 细说 ASP.NET控制HTTP缓存[转]

    阅读目录 开始 正常的HTTP请求过程 缓存页的请求过程 缓存页的服务端编程 什么是304应答? 如何编程实现304应答 如何避开HTTP缓存 在上篇博客[细说 ASP.NET Cache 及其高级用 ...

  6. 类型:.net;问题:asp.net window验证;结果:细说ASP.NET Windows身份认证

    细说ASP.NET Windows身份认证 阅读目录 开始 认识ASP.NET Windows身份认证 访问 Active Directory 在ASP.NET中访问Active Directory ...

  7. 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密

    0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...

  8. 细说WebSocket - Node篇

    在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...

  9. 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包

    0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...

随机推荐

  1. Linux内核分析——第八周学习笔记20135308

    第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 (1)进程分类 第一种分类 I/O-bound:等待I/O CPU-bound: ...

  2. 信息安全系统设计第二次&第四次实验

    实验二 固件设计  实验步骤: 环境配置如同实验一,承接实验一. 1.在虚拟机中编译代码.对于多线程相关的代码,编译时需要加-lpthread 的库. 2.下载调试在超级终端中运行可执行文件 pthr ...

  3. 利用link标签的disabed属性大面积的对其他标签元素的CSS样式进行替换操作

    由于平时对元素样式的控制基本上只是3,4个,所以一般用Jquery的时候直接使用$(element).css();这个方法,或者使用$(element).addClass()方法完成样式操作.对于小范 ...

  4. Entity Framework若干个扩展

    声明 这里有此东西是参考各大神修改和补充而来,有些地方就找不到原文章的地址了,一参考地址如下: http://www.cnblogs.com/ahui/archive/2011/08/04/21272 ...

  5. linux中的数值运算

    一.declare 作用:声明变量类型,bash默认变量为字符串类型的,并且字符串在拼接时直接拼接,不需要加号 使用方法: 二.数值运算 加法运算 a= b= c=$(($a+$b)) echo $c

  6. 【Moqui业务逻辑翻译系列】--UBPL Introduction同意的商业处理文库介绍

    h1. UBPL Introduction 通用的商业处理文库介绍h4. Why a Universal Business Process Library? 为什么需要通用的商业处理文库? The g ...

  7. ”耐撕“团队 2016.3.21 站立会议3 2 1 GO!

    ”耐撕“团队 2016.3.21 站立会议 时间:2016.3.21  ① 17:20-17:45  ②17:55-18:10  总计40分钟 成员: Z 郑蕊 * 组长 (博客:http://www ...

  8. 【CodeForces 504A】Misha and Forest

    题 题意 有n个点,代号分别为0到n-1,然后这n个点有d个相连点,相连点的XOR sum 为s,求所有的边. 分析 知识:a^b^a=b,a^b^b=a. 把相连点为1的i存进队列,i的唯一相连点就 ...

  9. 2.Android之按钮Button和编辑框EditText学习

    今天学习android一些基本控件:button和edittext使用,我们平时网页或者手机登录一般都会有登录框,这里面就用到这两个部件. 如图: 所对应XML文件: 一般第二个编辑框都是输入密码,所 ...

  10. maven-相关配置

    Linux Ubuntu 安装Maven 我配置了  sudo gedit /etc/profile 配置了vi .bashrc 这个文档比较好(参考文档:http://www.linuxidc.co ...