第一章:HTTP概述
Web客户端与服务器是如何通信的,
表示Web内容的资源来自何方,
Web事务是怎样工作的,
HTTP通信所使用的报文格式,
底层TCP网络传输,
不同的HTTP协议
- 1、Http使用可靠的数据传输协议
- 2、客户端发送请求给服务器,服务器会在HTTP响应中回送所请求的数据
- 3、Web服务器是Web资源的宿主。Web资源是Web内容的源头。
- 4、HTTP仔细的给每种通过Web传输的对象都打上了名为MIME(媒体类型)的数据格式标签
- Web服务器会为所有HTTP对象数据附加一个MIMT类型;Content-type:image/jpg<<<<即MIME类型
- Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。
形式 | 解释 |
---|---|
application/x-www-form-urlencoded | HTTP会将请求参数用key1=val1&key2=val2的方式进行组织,并放到请求实体里面,不支持文件,一般用于表单提交 |
multipart/form-data | 与application/x-www-form-urlencoded不同,这是一个多部分多媒体类型,一般需要上传文件的表单则用该类型 |
application/json | JSON是一种轻量级的数据格式,以“键-值”对的方式组织的数据,需要参数本身就是json格式的数据,参数会被直接放到请求实体里,不进行任何处理。服务端/客户端会按json格式解析数据(约定好的情况下) |
application/xml 和 text/xml | 与application/json类似,这里用的是xml格式的数据,text/xml的话,将忽略xml数据里的编码格式 |
- 建议:
- 如果是一个restful接口(json格式),一般将Content-Type设置为application/json; charset=UTF-8;
- 如果是文件上传,一般Content-Type设置为multipart/form-data
- 如果普通表单提交,一般Content-Type设置为application/x-www-form-urlencoded
- MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔。
- HTML格式的文本文档由text/html类型标记
- 普通的ASCII文本文档由text/plain类型来标记
- PEG格式的图片为image/jpeg类型
- GIF格式的图片为image/gif类型
- Apple的QuickTime电影为video/quicktime类型
- 微软的PowerPoint演示文件为application/vnd.ms-powerpoint类型
- 5、服务器资源名称:统一资源标识符(URI):统一资源定位符(URL:说明了协议/服务器/本地资源)和统一资源名(URN);几乎所有的URI都是URL
- 6、一个HTTP事务由一条请求命令和一个响应结果组成
- 7、HTTP方法:GET/PUT/DELETE/POST/HEAD
方法 | 解释 |
---|---|
GET | 从服务器向客户端发送命名资源 |
PUT | 将来自客户端的数据存储到一个命名的服务器资源中 |
DELETE | 从服务器删除命名资源 |
POST | 将客户端数据发送到一个服务器网关应用程序 |
HEAD | 仅发送命名资源响应中的HTTP首部 |
- 8、常用状态码:200/302/404
状态码 | OK.文档正确返回 |
---|---|
200 | OK.文档正确返回 |
302 | Redirect(重定向)。到其他地方区获取资源 |
404 | NotFound(没找到)。无法找到这个资源 |
- 9、Web页码中可以包含多个对象
- 10、报文:HTTP报文都是纯文本(起始行/首部字段/主体)
组成 | 解释 |
---|---|
起始行 | 报文的第一行就是起始行 |
首部字段 | 每个首部字段都包含一个名字和一个值,两者之间用冒号:来分隔;首部以一个空行结束 |
主体 | 空行之后就是可选的报文主体,主体可以包含任意的二进制数据 |
- 11、连接:报文通过传输控制协议(TCP)连接从一个地方搬移到另一个地方
- HTTP是个应用层协议。HTTP无需操心网络通信的具体细节,他把联网的细节都交给了通用、可靠的因特网传输协议TCP/IP
- 只要建立了TCP连接,客户端和服务器之间的报文交换就不会丢失,不会被破坏,也不会在接收时出现错序了
- 12、连接、IP地址及端口号:
- 在HTTP客户端向服务器发送报文之前,需要用网际协议(IP)地址和端口号在客户端和服务器之间建立一条TCP/IP连接
- URL是资源地址,进而可以知道存储资源的机器的IP地址。DNS域名服务能够方便的将主机名转换为IP地址
(a)浏览器从URL中解析出服务器的主机名
(b)浏览器将服务器的主机名转换成服务器的IP地址
(c)浏览器将端口号(如果有的话)从URL中解析出来
(d)浏览器建立一条与Web服务器的TCP连接
(e)浏览器向服务器发送一条HTTP请求报文
(f)服务器向浏览器回送一条HTTP响应报文
(g)关闭连接
- 13、Web的结构组件:
- 代理:位于客户端和服务器之间的HTTP中间实体
- 缓存:HTTP的仓库,使常用页面的副本可以保存在里客户端更近的地方
- 网关:连接其他应用程序的特殊Web服务器
- 隧道:对HTTP通信进行盲转发的特殊代理
- Agent代理:Web浏览器,发起自动HTTP请求的半智能Web客户端
第二章:URL与资源
URL语法
各种URL组件的含义及其所做的工作
URL编码及字符规则
各种因特网信息系统常见的URL方案
- 1、URL分为三部分:方案、位置、资源,如:http://www.joes-hardware.com/seasonal/index-fall.html
- 方案:http;方案可以告知Web客户端怎样访问资源,在这个例子中,URL说明要使用HTTP协议
- 位置:www.joes-hardware.com,这部分告知Web客户端资源位于何处
- 资源路径:/seasonal/index-fall.html 说明了请求的是服务器上哪个特定的本地资源
- 大多数URL结构:方案://服务器位置/路径
- 2、URL语法:9部分构成的通用格式上
- 😕/:@:port/
;?# - 几乎没有哪个URL包含了所有这些组件。URL最重要的3个部分是方案(scheme)、主机(host)和路径(path)
- 方案:访问服务器以获取资源时要使用哪种协议,默认:无
- 用户:某些方案访问资源时需要用的用户名,默认:匿名
- 密码:用户名后面可能要包含的密码,中间由冒号(:)分隔,默认:<E-mail 地址>
- 主机:资源宿主服务器的主机名或点分IP地址,默认:无
- 端口:资源宿主服务器正在监听的端口号。很多方案都有默认端口号,(HTTP默认端口号为80),默认:每个方案特有
- 路径:服务器上资源的本地名,由一个斜杠(/)将其与前面的URL组件分隔开来。默认:无
- 参数:“;”参数为名/值对,URL中可以包含多个参数字段,它们相互之间以及路径的其余部分之间用分号分隔“;”
- 查询:“?”将其与URL的其余部分分隔开来
- 片段:“#”一小片或一部分资源的名字,引用对象时,不会将frag字段传送给服务器,这个字段在客户端内部使用的,通过字符“#”将其与URL的其余部分分隔开,服务器处理的是整个对象,因此URL片段仅客户端使用
- 😕/:@:port/
- 3、编码机制:通过一种“转义”表示法来表示不安全的字符,这种转义表示法包含一个百分号(%),后面跟着两个表示字符ASCII码的十六进制数
字符 | ASCII码 | 示例URL |
---|---|---|
~ | 126(0x7E) | http://www.joes-hardware.com/%7Ejoe |
空格 | 32(0x20 | http://www.joes-hardware.com/more%20tools.html |
% | 37(0x25) | http://www.joes-hardware.com/100%25statisfaction.html |
- 4、字符限制:
字符 | 解释 |
---|---|
% | 保留作为编码字符的转义标志 |
/ | 保留作为路径组件中分隔路径段的定界符 |
. | 保留在路径组件中使用 |
# | 保留作为分段定界符使用 |
? | 保留作为查询字符串定界符使用 |
; | 保留作为参数定界符使用 |
: | 保留作为方案、用户/命令,以及主机/端口组件的定界符使用 |
$,+ | 保留 |
@&= | 在某些方案的上下文中有特殊的含义,保留 |
{} | ^~[] |
<>" | 不安全,这些字符在URL范围之外通常是有意义的,比如在文档中对URL自身进行定界,所以应该对其进行编码 |
0x00-0x1F,0x7F 受限 | 这些十六进制范围内的字符都在US-ASCII字符集的不可打印区间内 |
- 5、常见的方案格式
- http:超文本传输协议方案,除了没有用户名和密码之外,与通用的URL格式相符,如果省略了端口,就默认为80
- 基本格式:http://:/
?# - 示例:http://www.joes-hardware.com/index.html
http://www.joes-hardware.com:80/index.html - https:方案https与方案http是一对。唯一区别在于方案https使用了网景的SSL,SSL为HTTP连接提供了端到端的加密机制,其语法与HTTP语法相同,默认端口为443
- 基本格式:https://:/
?# - 示例:https://www.joes-hardware.com/secure.html
- ftp:文件传输协议URL可以用来从FTP服务器上下载或向其上载文件,并获取FTP服务器上的目录结构内容的列表
- 基本格式:ftp://:@:/
; - 示例:ftp://:@:/
;
ftp://anonymous:joe%40joes-hardware.com@prep.ai.mit.edu:21/pub/gnu/ - file:方案file表示一台制定主机(通过本地磁盘、网络文件系统或其他一些文件共享系统)上可直接访问的文件
- 基本格式:file///
- 示例:file//OFFICE-FS/policies/casual-fridays.doc
- mailto:Mailto URL指向的是E-mail地址
- 基本格式:mailto:
- 示例:mailto:joe@joes-hardware.com
- rtsp,rtspu:RTSP URL是可以通过实时流传输吸引解析的音/视频媒体资源的标识符,方案rtsup中的u表示它是使用UDP协议来获取资源的
- 基本格式:rtsp://:@:/
rtspu://:@:/ - 示例:rtsp://www.joes-hardware.com:554/interview/cto_video
- news:用来访问一些特定的文章或新闻组
- telnet:用于访问交互式业务。
第三章:HTTP报文
报文是如何流动的,
HTTP报文的三个组成部分(起始行、首部和实体的主体部分),
请求和响应报文之间的区别,
请求报文支持的各种功能(方法),
和响应报文一起返回的各种状态码,
各种各样的HTTP首部都是用来做什么的
- 1、报文流,HTTP报文是在HTTP应用程序之间发送的数据块。这些数据以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分
- 术语“流入”、“流出”、“上游”及“下游”都是用来描述报文方向的
- HTTP报文流入源端服务器,HTTP使用术语流入和流出来描述事务处理的方向。报文流入源端服务器。工作完成之后,会流回用户的Agent代理中
- 所有报文都向下游流动,所有报文的发送者都在接收者的上游
- 2、报文由三部分组成:对报文描述的起始行,包含属性的首部块,以及可选的包含数据的主体部分
- 3、报文的语法:所有的HTTP报文都可以分为两类:请求报文和响应报文
- 4、起始行:所有的HTTP报文都以一个起始行作为开始。请求报文的起始行说明了要做些什么,响应报文的起始行说明发生了什么
- 5、请求行:请求报文的起始行,或称为请求行,包含了一个方法和一个请求URL以及HTTP版本
- 6、响应行:响应报文的起始行称为响应行,响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。包含了HTTP版本、数字状态码、以及描述操作状态的文本形式的原因短语;所有这些字段都由空格符进行分隔
- 7、方法:
- GET:从服务器获取一份文档,不包含主体
- HEAD:只从服务器获取文档的首部,不包含主体
- POST:向服务器发送需要处理的数据,包含主体
- PUT:将请求的主体部分存储在服务器上,包含主体
- TRACE:对可能经过代理服务器传送到服务器上去的报文进行追踪,不包含主体
- OPTIONS:决定可以在服务器上执行哪些方法,不包含主体
- DELETE:从服务器上执行哪些方法
- 8、状态码:方法是用来告诉服务器做什么事情的,状态码则用来告诉客户端,发生了什么事情
- 1**:信息提示(100~101)
- 2**:成功(200~206)
- 3**:重定向(300~305)
- 4**:客户端错误(400~415)
- 5**:服务器错误(500~505)
- 9、常见的状态码:
- 200>OK>成功。请求的所有数据都在响应主体中
- 401>Unauthorized(未授权)>需要输入用户名和密码
- 404>Not Found(未找到)>服务器无法找到所请求URL对应的资源
- 10、原因短语:它为状态码提供了文本形式的解释
- 11、 版本号:说明了应用程序支持的最高HTTP版本
- 12、首部:向请求和报文中添加了一些附加信息,本质上说,它们只是一些名/值对的列表,语法:名字后面跟着冒号(😃,然后跟上可选的空格,再跟上字段值,最后一个CRLF
- 13、HTTP首部可以分为以下几类,通用首部:既可以出现在请求报文中,也可以出现在响应报文中
- 请求首部
- 响应首部
- 实体首部:描述主体的长度和内容,或者资源本身
- 扩展首部:规范中没有定义的新首部
- 实体的主体部分:就是HTTP要传输的内容
- 14、状态码:
- 15、100~199:信息状态码,100 Continue 说明收到了请求的初始部分,请客户端继续。发送了这个状态码之后,服务器再收到请求之后必须进行响应
- 101 Switching Protocols 说明服务器正在根据客户端的指定,将协议切换成Update首部所列的协议
- 16、200~299:成功状态码,200 OK 请求没问题,实体的主体部分包含了所有请求的资源
- 201 Created 用于创建服务器对象的请求。
- 202 Accepted 请求已被接受,但服务器还未对其执行任何动作。
- 203 Non-Authoritative Information 实体首部包含的信息不是来自于源端服务器,而是来自资源的一份副本
- 204 No Content 响应报文中包含若干首部和一个状态行,但没有实体的主体部分
- 205 Reset Content 另一个主要用于浏览器的代码,负责告知浏览器清除当前页面中所有HTML表单元素
- 206 Partial Content 成功执行了一个部分或Range(范围)请求,206响应中必须包含Content-Range、Date以及ETag或Content-Location首部
- 17、300~399:重定向状态码,要么告知客户端使用替代位置来访问它们所感兴趣的资源,要么就提供一个替代的响应而不是资源的内容
- 300 Multiple Choices 客户端请求一个实际指向多个资源的URL时会返回这个状态码
- 301 Moved Permanently 在请求的URL已被移除时使用。响应的Location首部中应该包含资源现在所处的URL
- 302 Found 与301状态码类似;但是,客户端应该使用Location首部给出的URL来临时定位资源,将来的请求仍应用老的URL(HTTP/1.0)
- 303 See Other 告知客户端应该用另一个URL来获取资源,新的URL位于响应报文的Location首部,其主要目的是允许POST请求的响应将客户端定向到某个资源上去
- 304 Not Modified 客户端可以通过所包含的请求首部,是请求变成由条件的,如果客户端发送了一个特殊的If-Modified-Since首部,说明只读取1997年10月之后修改过的文档。这个日期之后,此文档未被修改过,因此,服务器发送了一个304状态码,而不是文档的内容
- 305 Use Proxy 用来说明必须通过一个代理来访问资源,代理的位置由Location首部给出
- 307 Temporary Redirect 与301状态码类似;但客户端应该使用Location首部给出的URL来临时定位资源。将来的请求应该使用老的URL(HTTP/1.1)
- 18、400~499:客户端错误状态码,有时候客户端会发送一些服务器无法处理的东西,比如格式错误的请求报文,或者最常见的是404,表明服务器对我们请求的资源一无所知