了解 web 及网络基础
HTTP(HyperText Transfer Protocol): 超文本传输协议
WWW:
- HTML:超文本标记语言
- HTTP:文档传递协议
- URL:指定文档所在的地址
TCP / IP
TCP/IP 是互联网相关的各类协议族的总称:IEEE 802.3 、FDDI 、ICMP、TCP 、IP、DNS、FTP、SNMP、UDP、PPPoE
分层管理
应用层:FTP、DNS、HTTP
传输层:TCP、UDP; 数据分割并打上标记序号及端口号
网络层:IP;增加 MAC 地址
数据链路层:硬件相关(网卡、驱动、光纤等)
封装(encapsulate): 把数据信息包装起来
ARP 协议是一种用以解析地址的协议,根据通信方的 IP 地址就可以反查出对应的 MAC 地址
IP 协议 的作用是把各种数据包传送给对方
TCP 协议 提供可靠的字节流服务,将大块数据分割成以报文段为单位的数据包进行管理,并且能够确认数据最终是否送达到对方。
三次握手
- SYN
- SYN/ACK
ACK
注释:SYN(synchronize) ACK(acknowledgement)
DNS 协议: 提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务
简单的HTTP 协议
请求报文:
- 请求方法
- 请求 URI
- 协议版本
- 可选的请求首部字段
- 内容实体
响应报文:
- 协议版本
- 状态码
- 用以解释状态码的原因短语
- 可选的响应首部字段
- 实体主体
HTTP 是不保存状态的协议,可通过cookie做持久化处理
HTTP 方法
方法 | 说明 |
---|---|
GET | 获取资源 |
POST | 传输实体主体 |
PUT | 传输文件 |
HEAD | 获得报文首部 |
DELETE | 删除文件 |
OPTIONS | 询问支持的方法 |
TRACE | 追踪路径 |
CONNECT | 要求用隧道协议连接代理 |
持久连接
只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。V1.1 所有的连接默认都是持久连接,从而使得管线化方式发送成为可能,即不用等待响应亦可直接发送下一个请求。
Cookie
通过在请求和响应报文中写入cookie信息来控制客户端的状态。cookie 会根据从服务器端发送的响应报文内的 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当客户端再次发送请求时,会自动在请求报文中加入 Cookie 值后发送出去
HTTP 报文内的 HTTP 信息
编码提升传输速率
压缩传输的内容编码
- gzip: GUN zip
- compress: UNIX 系统的标准压缩
- deflate:zlib
- identity: 不进行编码
分割发送的分块传输编码
分块传输编码:把主体实体分块,每一块都会用十六进制来标记块的大小。传输编码(Transfer Coding)机制就是作用于分块传输编码中。
发送多种数据的多部分对象集合
MIME(Multipurpose Internet Mail Extensions 多用途因特网邮件扩展): 会使用多部分对象集合的方法来容纳多份不同类型的数据。
**多部分对象集合**
(Multipart): 通过Content-Type来指定,使用 boundary 字符串来划分多部分对象集合指明的各类实体。
- multipart/form-data: 在 Web 表单上传时使用
- multipart/byteranges:状态码206(Partial Content, 部分内容)响应报文包含了多个范围的内容时使用
获取部分内容的范围请求
可恢复机制:指能从之前下载中断处恢复下载,则需要指定下载的实体范围。
范围请求:指定范围发送的请求,使用 Range 来指定 byte 范围
服务器针对范围请求会返回206,如果无法响应,则返回200及完整的实体内容
内容协商返回最合适的内容
内容协商机制(Content Negotiation): 指客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。判断基准:
- Accept
- Accept-Charset: 字符集
- Accept-Encoding:编码方式
- Accept-Language:语言
- Content-Language: 语言
返回结果的 HTTP 状态码
类别 | 原因短语 | |
---|---|---|
1XX | 信息 | 接收的请求正在处理 |
2XX | 成功 | 请求正常处理完毕 |
3XX | 重定向 | 需要进行附加操作以完成请求 |
4XX | 客户端错误 | 服务器无法处理请求 |
5XX | 服务器错误 | 服务器处理请求出错 |
常见状态码
200 OK
请求被正常处理
204 No Content
请求处理成功,但没有资源可返回
一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用
206 Partial Content
范围请求
响应报文中包含 Content-Range 指定范围的实体内容
301 Moved Permanently
永久性重定向,URI 已更新
302 Found
临时性重定向,URI 临时更新
303 See Other
使用 GET重新获取资源,URI 已更新
304 Not Modified
资源已找到,但未符合条件请求(If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since),即服务端资源未改变,可直接使用客户端未过期的缓存。
400 Bad Request
请求报文中有语法错误
401 Unauthorized
请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息
403 Forbidden
不允许访问,即未获得文件系统的访问授权
404 Not Found
服务器上没有请求的资源
500 Internal Server Error
服务器端在执行请求时发生了错误,也可能是 Web 应用存在的 bug 或某些临时的故障
503 Service Unavailable
服务器暂时处于超负载或正在进行停机维护
与HTTP协作的Web服务器
用单台虚拟主机实现多个域名
虚拟主机可以寄存多个不同主机名和域名的网站,因此访问的是相同的 IP 地址,在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI
通信数据转发程序
代理
- 利用缓存技术减少网络带宽的流量
- 组织内部针对特定 URI 的访问控制,以获取访问日志为主要目的
网关
可以由 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 客户端程序的信息 |
响应首部字段
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定 URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP 服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体首部字段
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的 HTTP 方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的 URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
确保 Web 安全的 HTTPS
HTTP 的缺点
- 通信使用明文(不加密), 内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
HTTP + 加密 + 认证 + 完整性保护 = HTTPS
- 通常 HTTP 直接和 TCP 通信,HTTPS 则是 HTTP 先和 SSL 通信,再由 SSL 和 TCP 通信
- SSL 是独立于 HTTP 协议的,其他运行在应用层的 SMTP 和 Telnet 等协议均可配合 SSL 协议使用
- HTTPS 采用混合加密机制,在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式
- HTTPS 比 HTTP 要慢 2 到 100倍
- 与纯文本通信相比,加密通信会消耗更多的 CPU 及内存资源
确认访问用户身份的认证
认证:
- 密码:只有本人才会知道的字符串信息
- 动态令牌:仅限本人持有的设备内显示的一次性密码
- 数字证书:仅限本人(终端)持有的信息
- 生物认证:指纹和虹膜等本人的生理信息
- IC 卡:仅限本人持有的信息
BASIC 认证(基本认证)
- 发送请求
- 返回401以告知客户端需要进行认证
- 用户 ID 和 密码以 BASE64 方式编码后发送
- 认证成功者返回200,认证失败则返回401
BASE64是明文密码,安全级别偏低
DIGEST 认证(摘要认证)
- 发送请求
- 返回临时的质询码(随机数,nonce)以告知需要认证的状态码 401
- 发送摘要以及由质询码计算出的响应码(response)
- 认证成功者返回200,认证失败则返回401认证成功
安全级别偏低,使用不便捷
SSL客户端认证
- 将客户端证书分发到客户端
- 双因素认证:即结合表单认证的密码
- 需要付费
FormBase认证(表单认证)
- 发送已登陆信息(ID、密码)
- 服务器端发送包含Session ID 的 Cookie(Set-Cookie)
客户端发送包含Session ID 的 Cookie(Cookie)
httponly
基于HTTP的功能追加协议
HTTP 瓶颈
- 一条连接上只可发送一个请求
- 请求只能从客户端开始。客户端不可以接收除响应以外的指令
- 请求/响应首部未经压缩就发送。首部信息越多延迟越大
- 发送冗长的首部。每次互相发送相同的首部造成的浪费较多
- 可任意选择数据压缩格式。非强制压缩发送
SPDY
以会话层形式加入,控制对数据的流动,但还是采用HTTP建立通信连接
WebSocket
XMLHttpRequest 虽然可以达到局部 Web 页面替换的效果,但是会产生大量的请求。websocket 可以解决其附带缺陷。
- 推送功能:服务器可直接发送数据
- 减少通信量:只要建立起 WS 连接,就希望一直保持连接状态
握手-请求
- Upgrade: websocket
- Sec-WebSocket-Key: 记录着握手过程中必不可少的键值
- Sec-WebSocket-Protocol: 记录使用的子协议
握手-响应
- 返回101 Switching Protocols
- Sec-WebSocket-Accept: 是由 Sec-WebSocket-Key 的值生成的
web 的攻击技术
SSH:远程登录协议
通过 URL 查询字段或表单、HTTP 首部、Cookie 等途径将攻击代码传入到HTTP请求报文内
主动攻击
- SQL 注入攻击
- OS 命令注入攻击
被动攻击:主要攻击用户的资源和权限