最近抽空读完了图解 HTTP 这本书,顺便写了一些笔记,没有包含 HTTPS 的内容,有机会单独写一篇,知识点整理如下:

1.通常使用的网络是在 TCP/IP 协议族基础上运作的。HTTP 属于内部的一个子集

2.TCP/IP 是互联网关联各类协议集合总称。计算机与网络设备互相通信,双方必须基于相同的方法,比如,如何探测通信目标,哪一边发起通信,使用什么语言,如何结束,都需要一种规则,这种规则被称为协议(protocol)

3.TCP/IP 协议按照层分别是:应用层、传输层、网络层、数据链路层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
应用层:决定了向用户提供应用服务时通信的活动。也实现了OSI模型的会话层和表示层功能
FTP(File Transfer Protocol,文件传输协议)
DNS(Domain Name System,域名系统)
HTTP
SSL/TLS
URL
HTML(表示层)
SSH

传输层:传输层对上层应用层,提供处于网络连接中两台计算机之间的数据传输。TCP(Transmission Control Protocol传输控制协议)和UDP(User Data Protocol 用户数据报协议),DCCP

网络层(网络互联层):处理网络上流动的数据包。数据包是网络传输的最小单位,规定了通过什么样的传输路径到达对方计算机,并把数据包传送给对方。IP internet protocol 网际协议属于网络层。IPv4,IPv6,ARP

链路层(网络接口层):用来处理网络的硬件部分。包括操作系统,设备驱动,网卡。硬件都属于链路层


image

4.ip:internet protocol 网际协议,位于网络层。IP 协议作用是把各种数据包传送给对方。需要的条件是 IP 地址和 MAC 地址(Media Access Control Address)网卡所属固定地址

5.通过 ARP 协议解析 MAC 地址。IP 通信需要依赖多台计算机和网络设备。利用下一站中转 MAC 地址来搜索下一个中转目标

6.TCP 位于传输层,提供可靠的字节流服务,为了确保数据可以准确无误的到达目标,TCP 采用了三次握手(three-way handshaking)策略。。握手过程使用了 TCP 标志————SYN(synchronize)和 ACK(acknowledgement)

发送端首先发送一个带 SYN 标志的数据包给对方,接收端接收到后,回传一个带有 SYN/ACK 标志的数据包以确认传达确认信息,最后,发送端在回传一个 ACK 标志的数据包,代表握手结束

7.DNS,提供 IP 到域名的解析服务,ip 不符合记忆习惯,所以需要域名,为了解决这个问题,DNS 应用而生,想通过域名知道 ip 地址,就要用 DNS 协议查找 ip

8.URI 用字符转标志某一互联网资源,URL 表示资源地点,URL 是 URI 的子集

1
2
3
4
URI示例
http://www.ietf.org/rfc/rfc2396.txt
ftp://ftp.is.co.za/rfc/rfc1808.txt

HTTP

9.请求报文:是由请求方法,请求 URI,协议版本,可选的请求首部字段和内容实体构成的
请求报文的构成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
post :请求方法
/form/entry : URI
HTTP1.1 :协议版本

<!--请求首部字段-->
host:xxx
Connection:keep-alive
Content-type:xxxx
Content-Length:16

<!--内容实体-->
name=ueno&age=37



10.响应报文基本上由协议版本,状态码,原因短语。可选的首部字段和内容实体构成

响应报文的构成

1
2
3
4
5
6
7
8
9
HTTP/1.1 : 协议版本
200 : 状态码
OK :状态码原因短语
<!--响应首部字段-->
Date:Tue,10 Jul .... : 响应创建日期
Content-Length:

<!--主体-->
<html></html>

11.HTTP 是一种无状态(stateless)协议,HTTP 协议自身不对请求和响应之间通信状态进行保存。为了保持浏览一些网站还能保留登录状态,于是引入了 Cookie,有了 Cookie 再使用 HTTP 协议,就可以管理状态。Cookie 可以从服务端获取一个 set-cookie 的首部字段,通知客户端保存 cookie,下次发送请求,客户端会自动在报文中加入 Cookie,cookie 的工作机制是用户识别以及状态管理

12.持久连接:HTTP 协议 1.0 中,每进行一次通信会断开一次 TCP 连接,为了解决这个问题,HTTP1.1 想出了 HTTP keep-alive,所有默认连接都是持久连接,好处在于减少 TCP 连接的重复和额外开销,减轻了服务器负载

HTTP 报文

13.报文结构:请求行、请求头部、空行、请求数据
请求报文首部结构:请求行,请求首部字段,通用首部字段,实体首部字段,其他

1
2
3
4
5
6
请求行:包含请求方法,请求URI和HTTP版本
状态行:包含表明响应结果的状态码,原因短语,HTTP版本
首部字段:请求各种条件和属性的首部,包括通用首部,请求首部,响应首部,实体首部



14.范围请求:中断续传恢复之前下载内容对,对 10000 字节大小的资源,通过范围请求 5001-10000 字节内的资源

1
2
3
4
5
6
7
8
9
10
11
范围请求首部字段会增加Range
Range:bytes=5001-10000

多重范围请求
Range:bytes=0-3000,5000-7000
Content-type:multipart/byteranges


范围请求,会返回206状态码


15:内容协商,客户端和服务端就响应资源内容交涉,提供给客户端最合适的资源,比如 google 会根据请求头 Accept-Language 来返回对应语言网站

状态码

1xx 接收请求正在处理

2xx 成功状态码

3xx 重定向状态码

4xx 客户端错误错误状态码

5xx 服务器错误状态码

状态码 释义
200 正常处理
204 服务器请求已被成功处理,但是不会返回内容,页面不会更新
206 客户端进行了范围请求,响应报文包含 Content-Range 指定的实体内容
301 永久重定向,请求的资源重新分配了 URI
302 临时重定向
303 表示由于请求资源存在另外一个 URI,应使用 GET 方法定向获取请求资源,与 302 区别是明确需要 GET 请求
304 服务端资源未改变,直接使用客户端未过期的缓存
400 请求报文存在语法错误
401 需要 HTTP 认证的信息,未授权
403 服务器拒绝访问
404 未找到资源
500 服务端执行请求出错
503 服务端处于超载或停机维护
1
2
当301.302.303状态码返回时候,所有浏览器都会把POST改为GET,然后删除请求报文主体,然后再次发送

与 HTTP 协作的 web 服务器

16:虚拟主机:HTTP1.1 允许一个服务器搭建多个 web 站点,物理层面只有一台

17:代理服务器:接收客户端请求再转发给其他服务器,使用代理服务器理由有:利用缓存减少网络带宽流量,内部针对特定网站的访问控制,代理有多种使用方法,一种是是否使用缓存,另外一种是是否会修改报文

1
2
3
缓存代理:代理转发请求响应时,缓存代理会预先将资源副本保存在代理服务器上

透明代理:转发请求或者响应时候,不对报文做加工的代理类型称为透明代理,对报文加工的称为非透明代理

18:网关:和代理类似网关可以使通信线路上的服务器提供非 HTTP 协议服务,利用网关能提高通信的安全性,客户端与网关之间通信线路上加密确保连接的安全

19:隧道:建立一条与其他服务器的通信线路,使用 SSL 等加密手段,目的是确保客户端和服务端安全通信

20:缓存代理服务器:缓存是指代理服务器或者客户端本地磁盘保存的资源副本,利用缓存减少对资源服务器的访问,缓存服务器是代理服务器的一种。当代理服务器从服务器返回响应时候,代理服务器会保存一份资源副本,缓存有效期失效,服务器会再次从源服务器拉取资源

21:客户端缓存:浏览器缓存有效,就不会向服务器请求相同资源,可以直接从本地磁盘读取

HTTP 首部

22:使用首部字段是为了给浏览器和服务器提供报文主体大小,所使用语言,认证信息等内容,如果重复,不同浏览器有不同处理情况,有的是按照第一次处理,有的是按照最后一次

23:4 种 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 资源的最后修改日期

通用首部字段释义

Cache-Control:用来操作缓存的工作机制,可以用于请求以及响应,参数多选通过,分割

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Cache-Control:private,max-age=0,no-cache
参数-缓存请求指令
no-cache:强制向源服务器再次验证,代理服务器不直接使用缓存
no-store:不缓存请求或者响应内容,不会保存缓存
max-age(秒):响应最大Age值,希望接受一个存在时间(age)不大于xx秒的资源
max-stale(秒):接收已过期响应,有定义多少秒就是多少秒
only-if-cached:告知代理服务器从缓存获取资源,不向服务器发起请求
must-revalidate

参数-缓存响应指令(服务器nginx可以设置)
public:任何情况下都要缓存该资源
private:仅向特定用户返回响应
no-cache:不直接使用缓存,向服务器发起新鲜度校验
no-store:不缓存请求或者响应内容

max-age:会判断缓存资源的缓存时间数值比指定时间数值更小,客户端接收缓存资源

cdn一般需要设置cache-control为public
缓存开关是: pragma, cache-control。
缓存校验有:Expires,Last-Modified,etag。

Connection:1.管理持久连接,2.控制不转发给代理的首部字段

1
2
3
4
5
6
7
8
9
connection:Upgrade 意思是删除Upgrade字段在转发

http/1.1版本默认连接都是持久连接,之前的版本都是非持久连接。

服务端想断开连接:
connection:close

旧版本维持持久连接:
connection:keep-alive

Date:创建 HTTP 报文时间

1
2
Date:Tue Jul 03 04:40:59 2012

Pragma:HTTP/1.1 之前的遗留字段,和 cache-control 区别是他只用在客户端发送请求过程中。作用是要求中间服务不返回不返回缓存资源,一般两个都会存在,因为不可能所有的中间服务器都是 HTTP1.1 版本

1
2
chache-control:no-cache
pragma:no-cache

请求首部字段

Accept:用户能处理的媒体类型

1
2
3
4
5
video/mpeg
video/quicktime
二进制文件
application/octet-stream

Accept-Language 告知服务器用户能处理的语言

1
2
Accept-Language:zh-cn,zh

Authorization:用户认证信息
Host:请求资源的互联网主机名和端口号

if-Match

1
2
3
if-Match:123456
只有if-Match和服务端Etag值一样,服务端才会接受请求,否则返回412

if-Modified-Since 304 状态码

1
2
3
4
5
6
7
8
if-Modified-Since:Thu,15 Apr 2004 00:00:00

如果在指定的日期之后对内容进行过修改,会返回200
如果没有在指定的日期之后修改过,返回304
Last-Modified会有上次修改时间

if-Modified-Since只能用在GET或者HEAD请求中
如果与If-None-Match一同出现,If-Modified-Since会被忽略

if-None-Match

1
2
3
作用与if-Match相反,

if-None-Match的字段值与Etag不一致时候,会处理该请求

if-Range

1
2
3
范围请求匹配条件
如果if-Range和服务端Etag相同,会做范围请求,否则返回全体资源

if-Unmodified-Since

1
2
3
与if-Modified-Since相反
如果在指定的日期之后,没有对资源进行过修改,会处理请求
如果在指定日期之后发生了变化,会返回412

Proxy-Authorization

1
向代理服务器认证用户代理的凭证

Range

1
2
3
Range:bytes=5001-10000
范围请求。获取5001-10000字节的资源
处理之后,会返回206状态码

Referer

1
2
3
4
告知服务器请求资源原始URI

正确拼写:Referrer

user-agent

1
2
将创建请求的浏览器和用户代理名称给服务器

响应首部字段

Accept-Ranges

1
2
3
4
5
告知客户端是否能处理范围请求
Accept-Ranges:bytes|none

bytes:可处理
none:不能处理

Age

1
2
3
Age:600
告知客户端,源服务器在多久前创建了响应,单位s

ETag

1
2
3
4
5
6
7
8
9
10
服务器为每份资源都有一个Etag(实体的标记值),资源如果发生更新,资源的Etag也会发生改变,服务端向客户端发送Etag,客户端记录下来通过请求头If-None-Match携带这个,相等返回304,否则返回200

TEag有强ETag和弱ETag

强ETag:不论发生多么细微变化都会改变值
弱ETag:只用于提示资源是否相同,资源发生根本改变,产生差异才会改变ETag值,在字段开始处附加,W/

ex:Etag:"usagi-1234" 强ETag
ex:Etag:W/"usagi-1234" 弱ETag

Location

1
2
3
4
这个字段会配合3xx等状态码,接收到这个字段,会提示重定向资源访问

将响应方引导至与请求URI位置不同的资源

Retry-after

1
2
Retry-after:120
告知客户端在多久之后再次发起请求,配置503状态码和3xx Redirect状态码使用

Server

1
2
3
告知客户端,当前服务器上安装的HTTP服务器应用程序信息

Server:Apache/2.2.3 (unix) php/5.2.5

Vary

1
2
3
4
代理服务器接收到Vary首部字段获取资源,如果使用的Accept-language字段值相同,就直接从缓存返回响应,反之,需要从源服务器获取资源再返回



WWW-Authenticate

1
2
3
会告知客户端适用于访问请求URI所指定的认证方案和带参数提示的质询。401响应一定会有这个字段

WWW-Authenticate:Basic realm="Usagidesign Auth"

控制缓存的几个字段

1
2
3
4
cache-control http1.1
Pragma http1.0
Vary Accept-language字段值相同返回缓存

实体首部字段

是指包含在请求报文和响应报文实体部分所使用的首部,请求和响应两方都含有与实体相关的首部字段

Allow

1
2
3
用于通知客户端能支持的Request-URI指定资源的HTTP方法,接收到不支持的HTTP方法时候,会返回405 Method Not Allowed

Allow:GET,HEAD

Content-language

1
2
3
4
用于通知客户端,实体主体使用的语言

content-language:zh-CN

Content-length

1
2
3
4

表明实体主体部分大小(单位是字节)
Content-length:15000

Content-Range

1
2
3
范围请求
Content-Range:bytes 5001-10000/10000

Content-Type

1
2
3
Content-Type:text/html;charset=utf-8
说明实体主体内对象的媒体类型

Expires

1
2
3
4
5
6
7
8
告知客户端资源失效日期
Expires:Wed,04 Jul 2012 08:26:05 GMT

缓存服务器接收到含有Expires字段之后,在过期时间之前,会用缓存,超过之后,会像源服务器请求数据。

源服务器不希望缓存服务器缓存资源时候,Expires写入和Date相同的字段,但是优先级会比Cache-control的max-age小

这个时间是一个绝对时间,受限于本地时间,修改了本地时间会造成失效

Last-Modified

1
2
3
4
Last-Modified:Wed,04 Jul 2012 08:26:05 GMT
指明资源最终被修改时间


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Set-Cookie:响应首部字段。

Set-Cookie:status=enable;express=Tue,05 Jul 2011 07:26:31 GMT;path=/;domain=.hacker.jp

NAME=VALUE,名称和值
expires=DATE Cookie的有效期,默认为浏览器关闭之前
path=PATH 表示cookie所在的目录
domain=域名 可以使用cookie的域名,不指定默认为创建时候的
secure HTTPs时候才会发送
HttpOnly 不可以通过JS脚本访问,防止XSS(跨站脚本攻击)
SameSite 防止 CSRF 攻击和用户追踪
SameParty


Cookie:请求首部字段

其他首部字段

x-frame-options

1
2
3
4
5
6
7
响应首部
控制iframe是否可以被嵌套

DENY:拒绝
SAMEORIGIN:同源域名可以
或者设置
<meta http-equiv="X-Frame-Options" content="DENY" />

X-XSS-Protection

1
2
3
4
5
响应首部
控制浏览器XSS防护机制的开关
0:XSS过滤设置为无效状态
1:XSS设置为有效状态

DNT

1
2
3
4
5
do not track(拒绝个人信息被搜集)
拒绝被广告精准追踪
0:同意被追踪
1:拒绝被追踪

HTTPS

http 的不足和缺点

1
2
3
4
1.通信采用的是明文,内容会被窃听
2.不验证通信双方,有可能遭遇伪装
3.无法验证报文的完整性,内容可能被篡改

https 的不足

1
2
1.HTTPS比HTTP慢2-100倍,因为要进行SSL通信,需要加解密处理

http 加密方式:
通信加密和内容本身加密

1.通信的加密:HTTP 没有加密机制,但是可以通过 SSL(安全套接层)或者 TLS(安全层传输协议)组合使用加密。
用 SSL 建立安全通信协议之后,就可以在这条线路上进行 HTTPS(超文本传输安全协议)通信

2.内容加密:对传输内容本身加密

不验证通信方可能遭遇伪装

服务器只要接受到请求,不管对方是谁都会返回响应(在 ip 没有限制情况下)

  • 客户端无法确定发送目标 web 服务器是不是伪装的服务器
  • 服务端无法确定响应返回的客户端是不是伪装的客户端
  • 无法确定是否具有访问权限,无意义的请求也会照收。无法阻止海量 Dos 攻击

使用 SSL 的证书手段可以确定客户端和服务端是实际存在的

HTTP/2.0

消除 HTTP 瓶颈的 SPDY

谷歌 2010 年发布了 SPDY(SPeeDY),目标在解决 HTTP 的性能瓶颈,缩短 web 页面 50%的加载时间。
SPDY 没有改写 HTTP 协议,在 TCP/IP 的应用层与传输层增加了会话层,SPDY 规定使用 SSL。
使用 SPDY,HTTP 获得以下功能

  • 多路复用:
    通过单一的 TCP 连接,可以处理无限多的 HTTP 请求,所有的处理都在一个 TCP 上完成,因此 TCP 处理效率提高
  • 请求优先级:可以对请求逐个分配优先级。主要是为了解决发送多个请求时候,解决因带宽低导致响应变慢的问题
  • 压缩 HTTP 首部:压缩 HTTP 请求和响应首部,通信产生的数据包会减少
  • 推送功能:支持服务器主动向客户端推送
  • 服务器提示:服务器可以主动提示客户端请求所需资源,在资源已经缓存情况下,可以避免发送不必要的请求

http2.0 建立在 SPDY 和 websocket 基础之上

7 项技术以及讨论

  • 压缩
  • 多路复用
  • TLS 义务化
  • 协商
  • 客户端拉拽/服务器推送
  • 流量控制
  • websocket

web 攻击技术

http 是一个单纯的协议机制,安全方面呈劣势,针对 web 攻击方式有两种

1.主动攻击

1
2
3
指直接访问web应用,把攻击代码传入,主要针对服务器的资源进行攻击
SQL注入攻击和OS命令注入攻击

2.被动攻击

1
2
3
4
5
6
7
8
9
10
11
让用户触发已经设置好的陷阱,陷阱会发送嵌入攻击代码
1.跨站脚本攻击(XSS)
动态创建HTML,因为这样就可以创建script标签动态执行脚本,导致XSS
2.跨站点请求伪造(CSRF)
3.HTTP首部注入攻击,通过在响应首部插入换行%0D%0D,添加任意响应首部,比如随意设置Cookie,重定向至任意URL,显示任意主体
4.HTTP响应截断攻击:也是首部注入攻击一种,通过插入两个%0D%0A%0D%0A就可以显示伪造的主体,两个换行,后面的相当于主体内容,这样就可以伪造页面
%0D%0A%0D%0A<HTML><HEAD><TITLE>想显示的网页内容<!--
5.邮件首部注入攻击:%0D%0A代表换行符,可以追加内容导致篡改文件
6.目录遍历攻击:http://www.a.com/read.php?log=a.png,这个资源可以修改为http://www.a.com/read.php?log=../../etc/passwd,修改参数去访问别的目录资源
7.点击劫持,页面中嵌套一个iframe,然后用一个别的样式或者页面,透明层覆盖,按钮位置一样
8.dos攻击,发送大量合法请求(SYN攻击)

web 安全对策

1.输入值验证

2.输出值转义

其他术语

术语 释义
LAN 同一局域网
routing 路由选择
ARP 协议 解析地址的协议
字节流服务(Byte Stream Service) 为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理
TCP 传输控制协议(Transmission Control Protocol)
UDP 用户数据报协议(User Datagram Protocol)
DNS 提供 IP 到域名的解析服务(domain Name System)
URL 统一资源定位符(Uniform Resource Locator)
URI 统一资源标志符