HTTP
1. 特点
1. 支持客户/服务器模式
客户服务器模式工作的方式是由客户端向服务器发出请求,服务器端响应请求,并进行相应服务
2. 简单快速
- 客户端向服务器请求服务时,只需要传送请求方法和路径
- 请求方法常用的有GET、HEAD、POST. 每种方法规定了客户端与服务器联系的类型不同
- 由于HTTP协议简单, HTTP服务器的程序规模小, 因而通信速度很快
3. 灵活
- HTTP允许传说任意类型的数据对象
- 正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识) 加以标记.
4. 无连接
无连接的含义是限制每次连接只处理一个请求
服务器处理完客户的请求, 并收到客户的应答后,即断开连接
采用这种方式可以节省传输时间.
后续有keep-alive保持连接,保持的是TCP连接.
5. 无状态
- HTTP协议是无状态协议
- 无状态是指协议对于事务处理没有记忆功能.缺少状态意味着如果后续处理需要前面的信息, 则它必须重传,这样可能导致每次连接传送的数据量增大.
- 另一方面,在服务器不需要前面的信息时他的应答就比较快.
2. URI与URL
URI: Uniform Resource Identifier 一个紧凑的字符串用来表示抽象或者物理资源;
A URI 可以进一步被分为定位符、名字或者两者都是;
术语“Uniform Resource Locator” (URL) 是URI的子集,除了确定一个资源,还提供一种定位该资源的主要访问机制(如其网络“位置”);
URI = URN + URL
URI可以分为URL,URN或者同时具备locators和names特性的一个东西
URN作用就好像一个人的名字,URL就像一个人的地址;
换句话说:URN确定了东西的身份, URL提供了找到它的方式;
3. 报文
1. HTTP的报文头分类
HTTP的报文头大体可以分为4类:通用报文头、请求报文头、响应报文头和实体报文头
2. HTTP的报文头字段
在HTTP/1.1 里一共规范了47中报文头字段
1.通用报文头
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部、连接的管理,keep-alive保持连接,Close,短连接 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主题的传输编码方式 |
Upgrade | 升级为其它协议 |
Via | 代理服务器的相关xinxi |
Warning | 错误通知 |
2. 请求报文头
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型,不支持的时候返406错误. 目前基本上都是*/*,代表服务器支持所有 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码, 通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip/deflate) |
Accept-Language | 优先的语言,申明自己接收的语言,Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3(q是权重值, 优先返回中文资源) |
Authorization | Web的认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-Since | 比较资源的更新时间 |
if-None-Match | 比较实体标记 |
If-Range | 资源未更新时发送实体Byte的范围请求 |
If-Unmodified-Since | 比较资源的更新时间 |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Range | 实体的字节范围请求 |
Referer | 对请求中URI的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP客户端程序的信息 |
3. 响应报文头
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
4. 实体报文头
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
4. 请求方法
Http/1.1 常用方法
GET
POST
PUT
HEAD
DELETE
OPTIONS
TRACE
CONNECT
1. GET
GET方法用来请求访问已经被URI识别的资源
指定的资源经过服务器端解析后返回响应内容
GET方法也可以用来提交表单和其它数据(数据量小,没有安全性)
http://localhost/login.php?userName=aa&&password=1234
从上面的URL请求中,很容易就可以辨认出表单提交的内容
2. POST
- POST方法与GET功能类似, 一般用来传输实体的主体
- POST方法的主要目的不是获取响应主体的内容
- 表单数据放在实体中,没有大小限制,安全系高.
3. PUT
从客户端向服务器传送的数据取代指定的资源的内容
PUT方法与POST方法使用上相同, 最大的不同是:PUT是幂等的,而POST是不幂等的
创建资源使用POST, 更新资源使用PUT
因此我们更多时候将PUT方法用作传输资源
http1.1的PUT方法没有安全验证,所以服务器通常使用POST请求来替代PUT请求
4. HEAD/DELETE
HEAD
类似GET请求,只不过返回的响应中没有具体的内容, 用于获取报头,可以用来检测链接是否能访问, 最近是否有更新
DELETE
请求服务器删除指定的资源.
http1.1的DELETE方法没有安全验证机制, 可以被攻击
5. OPTIONS
用来查询针对请求的URI指定的资源支持的方法
得到的响应
HTTP/1.1 200
Set-Cookie: JSESSIONID=Fasdkfjdasjfldajsklfdsalfldasfdsafkldas;path=/;HttpOnly
Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS
Content-Length: 0
Date: Wed, 07 Aug 2021 11:05:44 GMT
6.TRACE/CONNECT
- TRACE
- 回显服务器收到的请求, 主要用于测试或者诊断
- CONNECT
- 开启一个客户端与所请求资源之间的双向沟通的通道,他可以用来创建隧道
- 通常用proxy代理服务器之间.
5.状态码
用以表示网页服务器超文本传输协议响应状态的3位数字代码
1. 状态码分类
分类 | 含义 |
---|---|
1XX | 表示消息.这一类型的状态码,代表请求已被接收, 需要继续处理.这类响应是临时响应,值包含状态行和某些可选的响应头信息,并以空行结束 |
2XX | 表示成功。这一类型的状态码代表请求成功被服务器接收、理解、并接受。 |
3XX | 表示重定向。这类状态码代表需要客户端采取进一步的操作才能完成请求。通常这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。 |
4XX | 表示请求错误。这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前状况的实体,以及这是临时的还是永久性的状况。这些错误码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。 |
5XX | 表示服务器错误。这类错误码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以前的软硬件资源无法完成对请求的处理。除非这是一个HEAD请求,否则服务器应当包含一个解释当前错误状态以及这个状态是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。 |
2. 常用状态码
状态码 | 英文名称 | 描述 |
---|---|---|
200 | OK | 请求已成功,请求所希望的响应头或数据体将随响应返回 |
202 | Accepted | 已接受,已经接受请求,但未处理完成 |
206 | Partial Content | 部分内容,服务器成功处理了部分GET请求。断点续传的基石 |
301 | Moved Permanently | 永久移动,请求的资源已被永久的移动到新URI,返回信息会包括新的URl,,浏览器会自动重定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动,与301类似,但资源只是临时被移动。客户端应继续使用原有URI |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
502 | Bad GateWay | 充当网关或代理的服务器,从远端的服务接收到一个无效的请求 |
6.状态管理 Cookie与Session
Cookie和Session都称为状态跟踪技术
1. Cookie
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就像服务器浏览器颁发一个Cookie。
客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
SessionId就存在Cookie中。
2. Session
Session是另一种记录客户状态的机制,保存在服务器上。客户端浏览器访问服务器的时候, 服务器把客户端信息以某种形式记录在服务器上
客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
Session ID保存
- 保存在Cookie中
- URL重写,作为查询参数: http://localhost/query?sessionId=afalfjdsafja
- 隐藏表单
Session有效期
- Session 超时失效, 越来越多的Session触发Session清理操作
- 程序调用HttpSession.inivalidate();
- 服务器进程被停止
3. Cookie和Session的区别
- 存放位置不同:Cookie存放在客户端,Session存放在服务器
- 安全性(隐私策略)不同:Cookie存储在客户端浏览器中, 对用户可见.Session存在服务器中,用户不可见
- 有效期:Cookie可以在浏览器存很久, Session会经常被清理
- 对服务器的压力不同:Cookie对服务器没有什么压力, Session存在服务器,占用服务器内存
7. 认证方式
Basic:明文密码
Digest:提供了防止密码被窃听的机制,但是还是不能伪装
SSL客户端认证:SSL客户端认证借由HTTPS的客户端证书完成认证的方式.凭借客户端证书认证,服务器可确认访问是否来自自己登录的客户端。
基于表单的认证:由Web程序各自实现基于表单的认证方式,通过Cookie和Session的方式来保持用户的状态
8. HTTP的长连接与短连接
-
HTTP协议是基于请求、响应模式的,因此只要服务端给了响应,本次HTTP请求就结束了
-
HTTP的长连接和短连接本质上是TCP长连接和短连接
-
HTTP 1.0 默认使用短连接
-
HTTP 1.1 默认使用长连接
9. 断点续传
断点续传和多线程下载都是需要使用range头
1. Range
Range 用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式为:
Range:(unit=first byte position)-[last byte position]
如:
Range: bytes=0-499 从第0个到第499个位置byte
Range: bytes=500-999 从第500个到第999个位置的byte
Range: bytes=- 500 最后500个byte
Range: bytes=500- 从第500个位置之后的byte
Range: bytes=500-600,600-999
2. Content-Range
用于响应头中,在发出带Range的请求后,服务器会在Content-Range头部返回当前接收的范围和文件总大小.一般格式为:
Content-Range: bytes (unit first byte position) - [last byte position]/[entity length]
在响应完成后,返回的响应头内容不同:
HTTP/1.1 200 Ok (不使用断点续传方式)
HTTP/1.1 206 Partial Content (使用断点续传方式)
3. 断点续传过程
-
客户端下载1024k的文件, 已经下载了其中512k
-
网络中断,客户端请求续传,因此需要在http头中声明本次需要续传的片段: Range:bytes=512000- 这个头通知服务器端从文件的512k位置开始传输文件
-
服务器收到断点续传请求,从文件的512k位置开始传输,并且在HTTP头中增加:
Content-Range:bytes 512000-/1024000
并且此时服务器返回的HTTP状态码应该是206,而不是200
4. 多线程下载
- 所谓多线程下载,就是客户端主动使用Range头,将文件切个为多个部分,交由不同的线程去请求.