HTTP协议讲解
Android
HTTP协议
- 用于客户端与服务端之间的通信。
- 无状态协议
- 位于OSI的应用层,在传输层的TCP建立连接之后进行通信。
请求流程

OSI七层协议
(摘自百度百科)
应用层
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
表示层
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、DECOIC、加密格式等
会话层
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
传输层
定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验 [2] 等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层
建立、维护、断开物理连接。(由底层网络定义协议)
请求报文的构成
1.方法(HTTP/1.1)
- GET:获取资源
- POST:传输实体主体
- PUT:传输文件
- HEAD:获得报文首部
- DELETE:删除文件
- OPTIONS:询问支持方法
- TRACE:追踪路径
- CONNECT:要求用隧道协议连接代理
2.URI
3.协议版本
4.可选的首部字段
5.内容实体
响应报文的构成
1.协议版本
2.状态码
3.状态码的原因短语
4.可选的响应首部字段
5.实体主体
TCP连接(三次握手)
HTTP协议是建立在TCP连接之后
- 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。(SYN:同步序列编号(Synchronize Sequence Numbers))
- 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
- 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
断开TCP连接(四次挥手)
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
- 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
Cookie
在请求和响应报文中写入Cookie信息(SessionID)来控制客户端状态。
首部字段信息:Set-Cookie(响应报文中)
一般会使用Cookie来管理Session(会话)
内容编码(压缩文件)
- gzip (GUN zip)
- compress
- deflate (zlib)
- identity
多部分对象集合
Content-type
- multipart/form-data
- multipart/byteranges
内容协商
首部字段重复会如何?
根据浏览器内部处理逻辑的不同,结果可能不一致。取决于处理顺序。
常见状态码
2XX 成功
- 200 正常处理
- 204 无实体内容
- 206 范围请求后的响应
3XX 重定向
4XX 客户端错误
- 400 请求报文中有错误
- 401 需要HTTP认证
- 403 请求被服务器拒绝
- 404 在服务器上找不到内容
5XX 服务器错误
- 500 服务端执行请求时发生了错误
- 503 服务器暂时处于超负载或者正在进行停机维护,现在无法处理请求
协作的Web服务器
- 虚拟主机
- 代理:转发
- 网关:提供非HTTP协议服务
- 隧道:确保安全通信(封装、加密)
- 缓存
常见首部字段信息
HTTP缺点
- 通信使用明文(未加密),内容可能会被窃听
- 不验证通信方的身份,有可能是伪装的
- 无法正面报文的完整性,有可能被篡改
HTTPS
- SSL或者TLS(对通信线路加密处理)
- 证书
- 完整性保护,混合加密机制
HTTP + 加密 + 认证 + 完整性保护 = HTTPS
HTTPS缺点
应该全部切换成HTTPS吗?
- 加密通信会消耗更多CPU及内存资源,导致能处理的请求数会减少
- 购买证书需要成本(CA)
SPDY
旨在缩短web页面的加载时间(50%以上),位于会话层,控制对数据的流动
- 多路复用流
- 赋予请求优先级
- 压缩HTTP首部
- 推送功能
WebSocket
全双工通信
HTTP/2.0
目标是改善用户在使用Web时的速度体验
Web的攻击技术