HTTP/1.1 学习
发现对于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
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 学习的更多相关文章
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Unity3d学习 制作地形
这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
随机推荐
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...
- #ifndef用于避免多重包含
原因:C中,某一个重要的头文件可能被多个文件包含,如果编译的多个文件均包含了同一个头文件, 就可能存在,一个头文件被多次包含的问题. 用法:这个问题,一般用#ifndef来解决. 1.定义一个与文件名 ...
- struts2漏洞-第一次入侵经历
这两天上数据库,老师给了我们一个网站,该网站是一个售花网站.是有一个师兄写的毕业设计.然后挂在内网,然后使用这个系统,然后分析网站,写个数据库设计的报告.简单的写了数据库作业后就闲来无事做,就想对这个 ...
- ie浏览器不兼容css媒体查询的解决办法
有些页面布局复杂,在不同分辨率下表现需要一致,这时需要用媒体查询根据不同分辨率进行百分比定位(不能用像素定位),如: @media screen and (max-width: 1600px) { . ...
- C#通用JSON帮助类
using System; using System.Data; using System.Text; using System.Collections.Generic; using System.R ...
- Jquery获取下拉选择节点名称值赋给textbox文本框 获取 父节点的栏目名称编号
<label for="parentNode" style="float:left" >父级栏目:</label> <select ...
- 李洪强iOS开发之FMDB线程安全的用法
// // ViewController.m // 04 - FMDB线程安全的用法 // // Created by 李洪强 on 2017/6/6. // Copyright © 2017 ...
- 使用tesseract-ocr破解网站验证码
首先我得承认,关注tesseract-ocr, 是冲着下面这篇文章的噱头去的,26行groovy代码破解网站验证码 http://www.kellyrob99.com/blog/2010/03/14/ ...
- singer页面点击歌手singer是跳转到singer-detail的设置
1.创建components/singer-detail/singer-detail.vue 2.配置动态路由: { path: ':id', name:'singer-detail', compon ...
- ssm项目开发通用base模块和工具
controller层日期转换通用类 package cn.itcast.jk.controller; import java.text.DateFormat; import java.text.Si ...