发现对于HTTP协议不能脱口而出,故而怒翻资料,RFC2616 。

在其abstract中是这么说HTTP的,应用层协议,generic、无状态。其特点之一是 the typing and negotiation of data representation, allowing systems to be built independently of the data being transferred.

Messages以一种类似Internet mail使用的格式来传输,由MIME(Multipurpose Internet Mail Extensions)定义。

术语

connection:在两个程序之间因通信目的而创建的传输层虚拟回路。

message:HTTP通信的基本单元,由符合语法的结构化的八位组(octets)序列组成,通过connection传输。

request:一个HTTP request message。

response:一个HTTP response message。

resource:一个网络数据对象或者服务,可由URI确定。resources可能以multiple representations呈现(如多种语言、多种格式、多种尺寸等)。

entity:request或response承载传输的信息。一个entity由元数据(entity-header fields形式)和内容(entity-body)组成。

representation:response中的entity,服从于content negotiation。一个特别的response status可能存在multiple representations。

content negotiation:当服务一个request时,挑选合适的representation的机制。任何response的entity的representation都可被negotiated(包括error responses)。

variant:任意时刻,一个resource可能关联到一个或多个representation(s)。每一个representation就是一个variant。variant术语的使用,不意味着resource服从于content negotiation。

client:一个program,其创建connections的目的是发送requests。

user agent:发起request的client。通常是浏览器、编辑器、spiders(爬虫),或其他终端用户工具。

server:一个application program,接受connections以服务requests,会发回responses。任何program都可能既是client也是server。

origin server:一个server,具备指定的resource,或者将要创建该resource。

proxy:中间级program,同时扮演server和client角色,以代表其他clients发起requests。一个”transparent proxy”是说除了必要的proxy认证和识别之外,不会修改request或response的proxy。一个”non-transparent proxy”则会修改request或response,以为user agent提供一些额外的服务,例如group annotation services, media type transformation, protocol reduction, or anonymity filtering。

gateway:一个server,但为一些server扮演中间级。不像proxy,一个gateway接收requests就像它是requested resource的原始server一样;发起request的client不会意识到它是同一个gateway通信。

tunnel:一个中间级program,扮演了两个connections之间的盲人中继。一旦被激活,tunnel就不被认为是HTTP通信的一部分,虽然该tunnel可能是由一个HTTP request引起的!当被中继的connections的两端都关闭时,该tunnel就消失了。 -- 和gateway什么区别?

cache:program对response messages的local sotre,以及控制其message storage、retrieval、还有deletion的subsystem。一个cache会存储可缓存的responses,以便将来减少response时间和网络带宽的消耗。任何client或server都可以有一个cache,但扮演tunnel的server不能使用cache。

cacheable:只有在允许缓存存储response message的副本以用于回答后续requests时,该response才是cacheable的。就算一个resource是cacheable的,也可能有更多的限制来决定一个cache是否能够针对一个特别的request使用缓存过的副本。

first-hand:如果response直接来自origin server,没有不必要的延迟,例如经过一个或多个proxies,那该response就是first-hand。如果response的validity是由origin server直接检查的,那该response也是first-hand。  -- 没搞明白,经过proxy到底是不是first-hand???

explicit expiration time:origin server决定cache不应返回一个entity的时间?? The time at which the origin server intends that an entity should no longer be returned by a cache without further validation.

heuristic expiration time:当explicit expiration time不可用时,cache指定的expiration time。

age:一个response的age是指自origin server发送或成功校验时起的时间。

freshness lifetime:从response的生成到它的expiration time之间的时间长度。

fresh:如果response的age没有超出其freshness lifetime,那该response就是fresh的。

stale:如果response的age已经超出了其freshness lifetime,那该response就是stale。

semantically transparent:当一个cache是semantically transparent时,client会接收到与origin server直接处理返回的内容完全一样的内容 -- 除了hop-by hop headers。就是说,当cache的使用不会影响client和origin server -- 除了提高性能时,该cache相对某个response来说,就是semantically transparent。

validator:一个协议的元素(例如,一个entity tag,或一个Last-Modified time),用于找出一个cache entry是否是一个entity的等效副本。

upstream/downstream:描述了一个message的flow。所有的messages flow都是从upstream到downstream。

inbound/outbound:是指messages的request and response paths。inbound意味着向着origin server旅行;outbound意味着向着user agent 旅行。

HTTP通信通常基于TCP/IP连接。默认端口是TCP 80,但也可以使用别的端口。

在HTTP/1.0时代,多数HTTP实现为每次request/response exchange都使用一个新的connection。在HTTP/1.1时代,一个connection可能被用于一个或多个request/response exchanges,虽然connections可能由于种种原因被关闭。

URI 曾经有多种名字,但HTTP关心的只有Uniform Resource Identifiers,是简单格式化的字符串,能够区别出一个resource,通过名字、位置或其他特性。

http scheme,用于通过HTTP协议定位网络资源。

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]

默认80端口。如果一个proxy接收了一个不是全限定域名的host name,它可能将其自身的域名添加到该host name。如果一个proxy接收了全限定域名,proxy必须不准修改host name。

URI对比:

  • 如果没指定端口,或端口空着,等效于默认端口(80)。
  • host name的对比必须大小写不敏感。
  • scheme names的对比必须大小写不敏感。
  • 空的abs_path,等效于abs_path为”/”。

另外,在保留字和不安全字的集合(见RFC 2396)之外的字符,等效于他们的%HEX HEX编码。

例如,下面这些URIs是等效的:

http://abc.com:80/~smith/home.html

http://ABC.com/%7Esmith/home.html

http://ABC.com:/%7esmith/home.html

Date/Time 格式

HTTP应用历史上允许三种不同格式的date/time stamps representation:

Sun, 06 Nov 1994 08:49:37 GMT     ; RFC 822, updated by RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
Sun Nov 6 08:49:37 1994                   ; ANSI C's asctime() format

第一种格式推荐作为Internet标准;第二种格式很常用。HTTP/1.1 clients 和 servers必须同时能够接受这三种格式。

所有的HTTP date/time stamps必须用GMT时间。用于HTTP时,GMT完全等于UTC。

       HTTP-date    = rfc1123-date | rfc850-date | asctime-date
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
rfc850-date = weekday "," SP date2 SP time SP "GMT"
asctime-date = wkday SP date3 SP time SP 4DIGIT
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
date2 = 2DIGIT "-" month "-" 2DIGIT
; day-month-year (e.g., 02-Jun-82)
date3 = month SP ( 2DIGIT | ( SP 1DIGIT ))
; month day (e.g., Jun 2)
time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
; 00:00:00 - 23:59:59
wkday = "Mon" | "Tue" | "Wed"
| "Thu" | "Fri" | "Sat" | "Sun"
weekday = "Monday" | "Tuesday" | "Wednesday"
| "Thursday" | "Friday" | "Saturday" | "Sunday"
month = "Jan" | "Feb" | "Mar" | "Apr"
| "May" | "Jun" | "Jul" | "Aug"
| "Sep" | "Oct" | "Nov" | "Dec"

注意:HTTP对date/time stamp的要求仅限于协议内部使用。client 和 server不要求使用这些格式为用户呈现。

字符集 Character Sets

HTTP使用了MIME对Character Set的定义。注意,这种Character Set也被叫做 Character Encoding。应用应该使用IANA registry中的字符集。

一些HTTP/1.0软件,已经将Content-Type header解释

HTTP/1.1 学习的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  10. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

随机推荐

  1. 本地服务器能ping通,但是ssh及各种端口都访问不到---待整理

    情况描述: 情况一:后来发现,开机需要很长一段时间之后才能正常的访问那台机器 原因:系统启动时加载的程序多,所以开机需要很长的时间,关掉不用的就可以了 情况二:服务器位于局域网内,有的时候可以访问到, ...

  2. hibernate,动态更新,插入 dynamic-insert,dynamic-update 我有话要说 ---稍后整理

    http://dreamzhong.iteye.com/blog/1207377 http://blog.csdn.net/hsuxu/article/details/8108326 @org.hib ...

  3. 机器学习(3):支持向量机(SVM)

    1. 背景:      1.1 最早是由 Vladimir N. Vapnik 和 Alexey Ya. Chervonenkis 在1963年提出      1.2 目前的版本(soft margi ...

  4. [转] 禁止ultraedit自动检查更新的方法

    菜单栏: 高级->配置->应用程序布局->其他 取消勾选“自动检查更新”   (原文地址:http://blog.csdn.net/redeyerabbit/article/deta ...

  5. Nodejs 使用 Chrome DevTools 调试 --inspect-brk

    参考链接: https://cnodejs.org/topic/5a9661ff71327bb413bbff5b https://github.com/nswbmw/node-in-debugging ...

  6. Mybatis(五):Mybatis的三种使用方式

    注意,这篇文章只介绍mybatis单独使用时如何操作,是没有用到spring的,如果需要了解mybatis和spring如何搭建,请移步这里Mybatis(六):spring与mybatis三种整合方 ...

  7. MFC程序开始的执行过程详述

    1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数.而在MFC程 ...

  8. 笔试面试1 用C实现C库函数itoa, atoi

    要求用C实现C库函数itoa或者是atoi.也就是字符串和数字的相互转换. 事实上这是一个很easy的问题. 可是有次笔试我没有理解好题意,也没有想到事实上这就是一个怎样将数字以字符串的方式存放. 这 ...

  9. mkdir命令的-p和-m

    mkdir命令是常用的命令,用来建立空目录,它还有2个常用参数: -m, --mode=模式 设定权限 (类似 chmod),而不是 rwxrwxrwx 减 umask -p, --parents 需 ...

  10. js实现精确统计网站访问量的代码分享

    JS 精确统计网站访问量. 代码如下: /** * vlstat 浏览器统计脚本 */ var statIdName = "vlstatId"; var xmlHttp; /** ...