http协议
http协议:Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议;
http:是基于TCP/IP协议通信来传递数据。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。
http协议是传输协议,属于应用层协议,网络四层模型中,传输层负责数据包的发送和网络节点中数据包的流量控制传输等,可以想象成http协议就是快递的包装盒,每一个快递实物都是一个应用程序,http负责应用程序之间数据包装,快递员相当于传输层的tcp协议等,来发送每一个快递。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。
HTTP关系密切的协议:IP,TCP和DNS
负责传输的IP协议
是 IP 地址和 MAC 地址(Media Access Control Address)
IP 地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定 地址。IP 地址可以和 MAC 地址进行配对。IP 地址可变换,但 MAC 地址基本上不会更改。
确保可靠性的TCP协议
握手过程中使用了 TCP 的标志(flag) —— SYN(synchronize) 和 ACK(acknowledgement)。
若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发 送相同的数据包。
三次握手
四次挥手
TCP 位于传输层,提供可靠的字节流服务 ( 可靠、面向连接、字节流、传输层的服务 )
TCP 协议采用了三次握手 (three-way handshaking)策略
负责域名解析的DNS服务
DNS(Domain Name System)服务是和 HTTP 协议一样位于应用层的 协议。
它提供域名到 IP 地址之间的解析服务
DNS 协议提供通过域名 查找 IP 地址,或逆向从 IP 地址反查域名的服务。
HTTP特性
HTTP是无状态的
HTTP 协议自 身不对请求和响应之间的通信状态进行保存。
HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理
为了 更快地处理大量事务,确保协议的可伸缩性
HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于 是引入了 Cookie 技术
HTTP的请求方式
持久连接节省通信量
-
TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方 法。
HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认 URI 的有效性及资源更新的日期时间等。
FTP 协议的文件上传一样,要求在请 求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置
鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以 上传文件 , 存在安全性问题,因此一般的 Web 网站不使用该方法。
配合 Web 应用程序的验证机制,或架构设计采用 REST(REpresentational State Transfer,表征状态转移)标准的同类 Web 网站,就可能会开放使用 PUT 方法。
POST 方法用来传输实体的主体
GET 方法也可以传输实体的主体,但一般不用 GET 方法进行 传输,而是用 POST 方法。
虽说 POST 的功能与 GET 很相似,但 POST 的主要目的并不是获取响应的主体内容
GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器 端解析后返回响应内容。
OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。
OPTIONS:询问支持的方法
GET :获取资源
POST:传输实体主体
PUT:传输文件
HEAD:获得报文首部
DELETE:删除文件
TRACE:追踪路径
CONNECT:要求用隧道协议连接代理
HTTP/1.1和一部分的HTTP/1.0想出了持久连接(HTTP Persistent Connections, 也称为HTTP keep-alive或 HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
在 HTTP/1.1 中,所有的连接默认都是持久连接,但在 HTTP/1.0 内并 未标准化。
管线化
持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从 前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术 出现后,不用等待响应亦可直接发送下一个请求。做到同时并行发送多个请求,而不需要一个接一个地等待 响应了。
与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术则比持久连接还 要快。请求数越多,时间差就越明显
HTTP状态码
示客户端 HTTP 请求的返回结果
标记服务器端 的处理是否正常
通知出现的错误等工作
类别 | 原因短语 | |
---|---|---|
1XX | Iformational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求错误 |
14个具有代表性的状态码
2XX 成功
200 OK
表示从客户端发来的请求在服务器端被正常处理了
204 No Content
该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中 不含实体的主体部分
也不允许返回任何实体的主体
一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用
206 Partial Content
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。
响应报文中包含由 Content-Range 指定范围的实体内容
3XX 重定向
301 Moved Permanently(永久性重定向)
该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI
已经把资源对应的URI保存为书签了,这时应该按Location首部字段提示的URI重新保存
302 Found(临时性重定向)
该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问
和301Moved Permanently状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的。
已移动的资源对应的URI将来还有可能发生改变。
303 See Other
该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源
303状态码和302Found状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码有区别
304 Not Modified
该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系
307 Temporary Redirect(临时重定向)
302 标准 禁止 POST 变换成 GET , 但实际使用时大家并不遵守
该状态码与 302 Found 有着相同的含义
307 会遵照浏览器标准,不会从 POST 变成 GET。
4XX 客户端错误
4XX 的响应结果表明客户端是发生错误的原因所在
400 Bad Request
请求报文中存在语法错误
401 Unauthorized
发送请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。另外若之前已经进行过1次请求,则表示用户认证失败。
返回含有401的响应必须包含一个适用于被请求资源的WWW_Authenticate首部用以咨询(challenge)用户信息。当浏览器初次接收到401响应,会弹出认证用的对话窗口
403 Forbidden
请求资源的访问被服务器拒绝了,服务器端没有必要给出拒绝的详细理由,但如果想做说明的话,可以在实体的主题部分对原因进行描述,这样就能让用户看到了。
未获得文件系统的访问权限,访问权限出现某些问题(从未授权的发送源IP地址试图访问)等列举的情况都可以是发生403的原因
404 Not Found
该状态码表明服务器上无法找到请求资源,除此之外,也可以在服务器端拒绝请求且不想说明理由时使用
5XX 服务器错误
500 Internal Server Error
服务器端在执行请求时发生了错误,也有可能是Web应用存在的bug或某些临时的故障
503 Service Unavailable
状态码和状况不一致
不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。比如Web应用程序内部发生错误,状态码依然返回200OK,这种情况也经常遇到
服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入RetryAfter首部字段再返回给客户端
HTTP和Web服务器
HTTP首部字段
当 HTTP 报文首部中出现了两个或两个以上具有相同首部字段名时 会怎么样?这种情况在规范内尚未明确,根据浏览器内部处理逻辑 的不同,结果可能并不一致。有些浏览器会优先处理第一次出现的 首部字段,而有些则会优先处理最后出现的首部字段。
通用首部字段
请求报文和响应报文两方都会使用的首部
首部字段名 说明 Cache-Control 控制缓存行为 Connection 逐跳首部,连接管理 Date 创建报文的日期时间 Pragma 报文指令 Trailer 报文末端的首部一览 Transfer-Encoding 指定报文主题的传输编码方式 Upgrade 升级为其他协议 Via 代理服务器的相关信息 Warning 错误通知 请求首部字段
从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加 内容、客户端信息、响应内容相关优先级等信息。
首部字段名称 说明 Accept 用户代理可处理的媒体类型 Accept-Charset 优先的字符集 Accept-Encoding 优先的内容编码 Accept-Language 优先的语言(自然语言) Authorization Web认证信息 Expect 期待服务器的特定行为 From 用户的电子邮箱地址 Host 请求资源所在服务器 If-Match 比较实体标记(ETag) If-Modified-Since 比较资源的更新时间 If-None-Match 比较实体标记(与 If-Match 相反) If-Range 资源未更新时发送实体 Byte 的范围请求 If-Unmodified-Since 比较资源的更新时间(与If-Modified-Since相反) Max-Forwards 最大传输逐跳数 Proxy-Authorization 代理服务器要求客户端的认证信息 Range 实体的字节范围请求 Referer 对请求中 URI 的原始获取方 TE 传输编码的优先级 User-Agent HTTP 客户端程序的信息 响应首部字段
从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加 内容,也会要求客户端附加额外的内容信息。
首部字段名 说明 Allow 资源可支持的HTTP方法 Content-Encoding 实体主体适用的编码方式 Content-Language 实体主体的自然语言 Content-Length 实体主体的大小(单位:字节) Content-Location 替代对应资源的URI Content-MD5 实体主体的报文摘要 Content-Range 实体主体的位置范围 Content-Type 实体主体的媒体类型 Expires 实体主体过期的日期时间 Last-Modified 资源的最后修改日期时间 Accept-Ranges 是否接受字节范围请求 Age 推算资源创建经过时间 ETag 资源的匹配信息 Location 令客户端重定向至指定URI Proxy-Authenticate 代理服务器对客户端的认证信息 Retry-After 对再次发起请求的时机要求 Server HTTP服务器的安装信息 Vary 代理服务器缓存的管理信息 WWW-Authenticate 服务器对客户端的认证信息 实体首部字段
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更 新时间等与实体有关的信息。
HTTP的缺点
通信使用明文(不加密),内容可能会被窃听
不验证通信方的身份,因此有可能遭遇伪装
无法证明报文的完整性,所以有可能已遭篡改
SSL(Secure Socket Layer,安全套接层)或 TLS(Transport Layer Security,安全层传输协议)
不确认请求方隐患
无法确定请求发送至目标的 Web 服务器是否是按真实意 图返回响应的那台服务器。有可能是已伪装的 Web 服务器。
无法确定响应返回到的客户端是否是按真实意图接收响 应的那个客户端。有可能是已伪装的客户端
无法确定正在通信的对方是否具备访问权限。因为某些 Web 服务器上保存着重要的信息,只想发给特定用户通 信的权限。
无法判定请求是来自何方、出自谁手。
即使是无意义的请求也会照单全收。无法阻止海量请求 下的 DoS 攻击(Denial of Service,拒绝服务攻击)。