《图解HTTP》是一本配有插图描述HTTP知识的书,没有那么枯燥。然后阅读HTTP也是Java EE老师布置的作业,于是就在一周内看完了。
1.HTTP的应用
1.1使用HTTP协议访问Web
1.2HTTP与IP、TCP、DNS
IP(Internet Protocal)网际协议位于网络层,它的作用是把各种数据包传送给对方。
这里有两个地址,IP地址和MAC地址,IP地址指明了节点被分配到的地址,可变换,MAC地址是网卡所属的固定地址,基本不会更改。IP地址可以和MAC地址进行配对。
在通信时,通常需要经过多台计算机和网络设备中转才能连接到对方,所以IP间的通信通常依赖MAC地址。ARP协议(Address Resolution Protocal)可以根据IP地址就反查出对应的MAC地址。
TCP(Transmission Control Protocal)位于传输层,提供可靠的字节流服务。为了准确无误地将数据送达目标处,TCP协议采用了三系握手策略。
TCP协议把带SYN标指的数据包发送出去之后,接收端收到则回传一个带有SYN/ACK标指的数据包以示传达确认信息,最后发送端再回传一个带ACK标指的数据包,代表“握手”结束。
如果再手握过程中某个阶段莫名中断,TCP协议会再次以相同顺序发送相同的数据包。
DNS(Domain Name System)服务适合HTTP协议一样位于应用层的协议,它提供域名到IP地址之间的解析服务。
所以我们再输入网址时,可以更便捷地输入好记的www.baidu.com,而不是一长串数字。
2.HTTP报文
客户端发出请求报文,然后服务器响应请求并返回响应报文。报文大致可以分为报文首部和报文主体两块。
请求报文的报文首部一般包括了请求行、请求首部字段、通用首部字段、实体首部字段。这是请求报文的构成↓
响应报文的报文首部一般包括了请求行、响应首部字段、通用首部字段、实体首部字段。这是响应报文的构成↓
2.1告知服务器意图的HTTP方法
GET:获取资源
POST:传输实体主体
PUT:传输文件
HEAD:获得报文首部
DELETE:删除文件
OPTIONS:查询支持的方法
TRACE:追踪路径
CONNECT:要求用隧道协议连接代理
2.2使用cookie的状态管理
HTTP是无状态协议,它不对之前发生过的请求和想要的状态进行管理。虽然这也是无状态协议的有点,这样可以减少服务器的CPU及内存资源的消耗,也正是因为HTTP协议本身非常简单,所以才会被应用在各种场景里。
Cookie技术通过再请求和响应报文中写入Cookie信息菜控制客户端的状态。
当客户端第一次对服务器发送请求时,服务器会再响应报文内添加一个字段Set-Cookie,然后客户端会保存Cookie。当第二次客户都拿想要访问时发出的请求报文中就会包含了一个字段Cookie,同时服务器拿到Cookie对比之后就知道了之前客户端的状态信息。
2.3HTTP的状态码
状态码的作用是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端时正常处理了请求,还是出现了错误。
3.HTTP报文首部
3.1首部字段
通用首部字段
首部字段名 | 说明 |
---|---|
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 | 资源的最后修改日期时间 |
4.HTTPS
HTTP除了优势之外,还有一些不足:
通信使用明文(不加密),内容可能会被窃听
不验证通信方的身份,因此有可能遭遇伪装
无法证明报文的完整性,所以有可能已遭篡改。
HTTPS=HTTP+加密+认证+完整性保护。
HTTPS不是一种新协议,只是HTTP通信接口部分用SSL(Secure Soket Layer)和TSL(Transport Layer Security)协议代替而已。
在采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。
4.2公开密钥加密技术
SSL采用一种叫做公开密钥加密(Public-key cryptography)的加密处理方式。
加密和解密同用一个密钥的方式陈伟共享密钥加密(Commen key crypto system),也被叫做对称密钥加密。但是这种方法很容易被攻击者拿到密钥,也就失去了加密的意义。
公开密钥加密解决了这个困难,它使用一堆非对称的密钥,一把叫做私有密钥(private key),另一把叫做公开密钥(public key)。
发送密文者使用对方的公开密钥进行加密处理,对方收到被加密的信息之后,再使用自己的私有密钥进行解密。这样的加密方式就安全了很多。
HTTPS 采用共享密钥加密和公开密钥加密两者并用的混合加密机制。因为公开密钥加密和共享密钥加密相比,前者处理速度更慢,所以在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段使用共享密钥加密方式。
4.3证书
公开密钥加密方式无法证明使用的公开密钥是否是货真价实的公开密钥,在传输途中,可能会被攻击者替换掉。所以可以使用由数字证书认证机构(Certificate Authority)和其相关机关办法的公开密钥证书。
4.4HTTPS通信过程
5.确认访问用户身份的认证
需要确认是否是用户本人,就要和对一些登录者本人才知道的信息。
认证方式:
- basic认证
- digest认证
- ssl客户端认证
- 基于表单的认证
6.web攻击技术
- 因输出值转义不完全引发的安全漏洞
- 因设置嚯设计上的缺陷引发的安全漏洞
- 因绘画管理疏忽引发的安全漏洞
- 其他安全漏洞(比如密码破解,点击劫持,dos攻击,后门程序2.0)