根据上野宣的《图解HTTP》整理的个人学习笔记,记录重点与配图
计算机网络体系结构
具有五层协议的体系结构
一般提到计算机网络体系结构,都指的是五层协议。七层协议虽然足够完整,但是过于复杂而且不实用。
-
应用层
应用层决定了向用户提供应用服务时通信的活动。
TCP/IP协议族内预存了各类通用的应用服务。比如FTP(File Transfer Protocol, 文件传输协议) 和 DNS(Domain Name System, 域名系统)服务就是其中两类。
-
传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。
在传输层有两个性质不同的协议,TCP(Transmission Control Protocol, 传输控制协议) 和 UDP (User Data Protocol, 用户数据报协议)。
-
网络层
网络层用来处理在网络上流动的数据包。数据包是网络传输中最小的数据单位。该层规定了计算机通过哪条路径到达对方计算机,并将数据报传送给对方。
与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项中选择一条传输路线。
-
链路层(又名数据链路层)
用来处理连接网络的硬件部分。包括控制操作系统、“硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。”
-
物理层
物理层考虑的是如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。
因为计算机之间的传输媒体有很多种,有wifi,蓝牙,电话网络,ADSL等等,物理层做的就是如何在这些传输媒体上传输数据。
TCP/IP 通信传输流
利用TCP/IP协议族进行网络通信时,会以分层顺序与对方进行通信。发送端会从应用层往下走,接收端会从链路层往上走。
IP、TCP和DNS
负责传输的IP协议
IP协议位于网络层,几乎所有使用网络的系统都会用到IP协议。IP指的是网际协议,与IP地址完全是两码事。
IP协议的作用是把数据传送给对方,而要保证确实的传送给了对方,需要两个条件:IP地址和MAC地址(Media Access Control Address)
IP地址: 节点被分配到的地址
MAC地址: 网卡所属的固定地址
IP地址可以和MAC地址配对,IP地址可以变换,但是MAC地址基本上不会更改。
TCP和IP统称为TCP/IP协议族,其中IP占据了一半,剩下的就是TCP。
ARP协议
ARP协议是一种用以解析IP地址的协议,最终将得到IP地址配对的MAC地址。
因为IP之间通信需要用到MAC地址,IP地址与MAC地址又是配对的。通常情况下通信的双方会经过多台计算机和网络设备中转才能连接到对方,那如何找到下一个中转设备,就需要通过ARP协议来解析IP地址从而获得MAC地址。
TCP协议
TCP协议为了准确可靠地将数据传输给对方,采用了三次握手(three-way handshaking)策略。
发送端首先发送一个带有SYN标志的数据包给对方,接收端收到后回传一个带有SYN/ACK标志的数据包以确认信息。最后发送端再回传一个带有ACK标志的数据报,代表握手结束。
DNS协议
DNS协议提供通过域名查找IP地址,也提供逆向通过域名查找IP地址的服务。
HTTP协议
通过请求和响应交换达成通信
HTTP协议规定,请求必须从客户端发出,最后服务端响应该请求并返回。
HTTP是不保存状态的协议
HTTP协议自身不对请求和响应之间的状态进行保存,也就是说HTTP协议对于发送过的请求和响应不做持久化处理。
起初这么设计纯粹是为了更快的处理大量事务,确保协议的可伸缩性。
HTTP方法有哪些
- GET: 获取资源
- POST: 传输实体主体
- PUT: 传输文件
- HEAD: 获得报文首部
- DELETE: 删除文件
- OPTIONS: 询问支持的方法
- TRACE: 追踪路径
- CONNECT: 要求用隧道协议连接代理
持久连接(keep-alive)
持久连接的特点是只要任意一端没有提出断开连接,则保持TCP连接状态。
在HTTP/1.1中,所有的连接默认都是持久连接。
使用Cookie状态管理
Cookie会根据从服务端发送的响应报文内Set-Cookie的首部字段信息来通知客户端保存Cookie。当下次客户端向服务器发送请求时,客户端会自动在请求报文中加入Cookie。
服务器在接收到Cookie后,会从服务器记录中对比是哪个客户端发送过来的请求,最后得到之前的状态并返回。
返回结果的HTTP状态码
状态码类别
只要遵守状态码类别的定义,即使改变RFC2616中定义的状态码,或服务端自行创建状态码都没问题。
2XX 成功
2XX的响应结果就代表被正常处理了。
- 200 OK 请求处理正常,返回报文。
- 204 No Content 请求处理成功,但无资源返回。
- 206 Partial Content 表示客户端进行了范围请求,获得了部分数据。
3XX 重定向
3XX响应结果表明浏览器需要执行某些特殊的处理才能正常处理请求。
- 301 Moved Permanently 永久重定向。表示请求资源已经被分配了新的URI, 以后应使用资源现在所指的URI。
- 302 Found 临时重定向。与301相似,不同的是只需要本次使用新的URI来访问。
- 303 See Other 请求的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
- 304 Not Modified 表示服务器允许请求访问资源,但是并未满足条件请求。
4XX 客户端错误
4XX的响应结果表示客户端发生的错误。
-
400 Bad Request 表示请求报文中存在语法错误。
-
401 Unauthorized 表示该请求需要通过BASIC、DIGEST认证
-
403 Forbidden 表示对请求资源的访问被服务器拒绝了
-
404 Not Found 表示未在服务器上找到该资源
5XX 服务器错误
5XX的响应结果表示服务器发生了错误。
- 500 Internal Server Error 一般指的是服务器端在请求时发生了错误。
- 503 Service Unavaliable 表示服务器暂时处于超负载或者在停机维护
HTTP首部
## HTTP首部字段
4种HTTP首部字段类型
- 通用首部字段 请求报文和响应报文都会使用的首部
- 请求首部字段 从客户端向服务端发送请求报文时使用的首部字段
- 响应首部字段 服务端向客户端返回响应报文时使用的首部字段
- 实体首部字段 针对请求报文和响应报文的实体部分使用的首部字段
通用首部字段
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部、连接的管理 |
Date | 创建报文的日期和时间 |
Pragma | 报文指令 |
Trailer | 报文末端首部一览 |
Transfer-Encoding | 报文主题的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warnning | 错误通知 |
请求首部字段
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 /表示任何类型, type/*表示该类型下的所有子类型, type/sub-type |
Accept-Charset | 客户端可接受的字符编码类型 |
Accept-Encoding | 数据传输的压缩格式(gzip,Compress) |
Accept-Language | 浏览器支持的语言类型,中文有多种字符集,比如big5,gb2312,gbk等等 |
Authorization | 当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,用该头部来回应自己的身份验证信息给WEB服务器。 |
Expect | 用于支出客户端要求的特殊服务器行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在服务器 |
If-Match | 如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。If-Match |
If-None-Match | 如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。If-None-Match |
If-Modified-Since | 服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回 |
If-Range | 资源未更新时发送实体Byte的范围请求(常用于断点续传) |
If-Unmodified-Since | 服务器只在所请求的资源在给定的日期时间之后没有对内容进行过修改的情况下才会将资源返回 |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器需要客户端的认证信息 |
Range | 实体的字节范围要求 |
Refer | 请求中URI的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP客户端程序的信息 |
响应首部字段
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 资源创建后经历的时间 |
ETag | 资源的特定版本标识符 |
Location | 令客户端重定向到指定URI |
Proxy-Authorization | 代理服务器需要客户端的认证信息 |
Retry-After | 表示用户需要等待多少时间之后才能继续请求 |
Server | HTTP服务器的相关信息 |
Vary | 代理服务器的缓存管理信息 |
WWW-Authorization | 定义了以何种方式去获取对资源的连接 |
实体首部字段
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体使用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体的主体大小 |
Content-Location | 替代对应资源的URI |
Content-MD5 | 用于检查报文主体是否完整 |
Content-Range | 表示发送的内容在整个实体中的范围 |
Content-Type | 主体媒体类型 |
Expires | 主体过期时间 |
Last-Modified | 资源最后修改时间 |
确保web安全的HTTPS
HTTP的缺点
HTTP主要有以下不足:
- 通信使用明文,内容可能会被窃听
- 不验证通信方的身份,可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
通信加密方式
- SSL 安全套接层
- TLS 安全传输协议
- 内容加密
HTTPS安全通信机制
HTTPS就是套了SSL证书壳的HTTP
- 客户端通过发送Client Hello报文开始SSL通信。
- 服务器可进行SSL通信时,会以Server Hello作为应答。
- 之后服务器发送Certificate报文。报文中包含公钥证书。
- 最后服务器发送Server Hello Done 报文通知客户端,最初阶段的SSL握手协商部分结束。
- SSL第一次握手结束后,客户端以Client Key Exchange报文作为回应。报文中还包含加密过的随机密码串(Pre master secret)
- 接着客户端发送Change Clip Spec报文,提示服务器接下来的报文会以Pre-master secret加密
- 客户端发送Finish报文,该报文包含全部报文的整体校验值。这次报文能否成功取决于服务器能否正确解密该报文。
- 服务器同样发送Change Clip Spec报文
- 服务器同样发送Finish报文
- 服务器和客户端Finish报文交换完毕后,SSL连接就算建立完成。接下来开始进行应用层通信协议。
- 应用层协议通信,发送HTTP响应
- 最后由客户端断开连接,断开连接时发送close_notify报文。
HTTPS速度慢
HTTPS的速度大概比HTTP慢2到100倍。看过上面的通信机制就知道HTTPS需要加上多次加密和解密运算操作。结果上来讲HTTPS比HTTP会更多的消耗客户端和服务器的硬件资源。
用户身份认证
HTTP认证方式
- BASIC认证
- DIGEST认证
- SSL客户端认证
- FormBase认证
BASIC认证步骤
- 当请求资源需要BASIC认证时,服务器会随状态码401 Authorization Required,返回带WWW-Authenticate首部字段的响应。
- 接收到状态码401的客户端为了通过BASIC认证,需要将用户ID以及密码发送给服务器。
- 接收到包含首部字段Authorization请求的服务器,会对认证信息的正确性进行验证。如验证通过,则返回一条包含Request-URI资源的响应。
BASIC认证缺点
- BASIC认证采用base64编码,但是这不是加密方式,可以很轻松的对其解码。
- 一般浏览器无法进行认证注销操作
DIGEST认证步骤
-
请求需认证的资源时,服务器会随着状态码401 Authorization Required,返回带WWW-Authenticate首部字段的响应。首部字段WWW-Authenticate内必须包含realm 和 nonce这两个字段的信息。
nonce是一种每次随返回的401响应生成的任意随机字符串。
-
接收到401状态码的客户端,返回的响应中包含DIGEST认证必须的首部字段Authorization信息。
首部字段内必须包含username、realm、nonce、url和response的字段信息。
-
接收到包含首部字段Authorization请求的服务器,会确认认证信息的正确性。认证通过后会返回包含Request-URI资源的响应。
并且这时会在首部字段Authentication-Info中写入一些认证成功的信息。
SSL客户端认证步骤
- 接收到需要认证资源的请求,服务器会发送Certificate Request报文,要求客户端提供客户端证书。
- 用户选择将发送的客户端证书后,客户端将客户端证书信息以Client Certificate报文方式发送给服务器。
- 服务器验证客户端证书,通过后方可领取证书内客户端的公钥,然后开始HTTPS通信。
SSL客户端双因素认证
SSL认证一般会和基于表单认证结合一起使用,SSL认证负责认证客户端计算机,而表单认证用来确定是否是用户本人的行为。