Skip to content

Latest commit

 

History

History
420 lines (256 loc) · 15.2 KB

网络协议.md

File metadata and controls

420 lines (256 loc) · 15.2 KB

Author: Yu Li
date: 2020/07/18

《图解HTTP》总结

Chapter1 了解Web及网络基础

  1. TCP/IP协议族各层的作用:

应用层:决定通信的活动,如FTP、HTTP和DNS

传输层:提供数据传输协议,如TCP和UDP

网络层:处理网络上流动的数据包,选择传输路线,即IP协议

链路层:硬件设备,如网卡、光纤等

  1. TCP/IP通信传输流:客户端>HTTP>TCP>IP>网络>IP>TCP>HTTP>服务器

客户端每经过一层就加一个首部,服务器每经过一层就去掉一个首部信息。

  1. 与HTTP密不可分的三个协议:IP、TCP、DNS

IP:两个重要部分是IP地址和MAC地址(Media Access Control Address)

IP地址指明节点被分配到的地址,MAC地址是指网卡所属固定地址。IP和MAC可配对,IP可变,MAC基本不变。

ARP协议(Address Resolution Protocol)可以解析地址,根据通信方的IP地址就可以反查出对应的MAC地址。

TCP:提供可靠的字节流服务(Byte Stream Service),即把大块数据分割成报文段(segment)为单位的数据包进行管理。

三次握手(Three-way handshaking):发送端先发一个带SYN标志的数据包,接收端收到后回传一个带SYN+ACK标志的数据包表示传达确认,最后发送方再回传一个带ACK标志的数据包,表示握手结束。若握手过程中某阶段中断,TCP会再次以相同顺序发送相同数据包。
四次挥手:一方发送FIN数据包,另一方回复ACK,结束单方面连接。另一方发送FIN,一方回复ACK,结束另一方的连接。

ACK —— 确认,使得确认号有效。 RST —— 重置连接(经常看到的reset by peer)就是此字段搞的鬼。 SYN —— 用于初如化一个连接的序列号。 FIN —— 该报文段的发送方已经结束向对方发送数据。

DNS:提供域名和IP地址之间的解析服务

相比域名,计算机更擅长处理IP

  1. URI和URL

URI用字符串标识某一互联网资源,而URL表示资源地点,所以URL是URI的子集。

Chapter2 简单的HTTP协议

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

例如: 

GET /index.htm HTTP/1.1
Host: hackr.jp
Connection: keep-alive
Content-Length: 16
...
name=ueno&age=37
  1. 响应报文是由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段及实体主体构成。

例如:

HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 06:50:15 GMT
Content-Length:362
Content-Type: text/html
...
<html>
...
  1. HTTP是无状态协议(stateless),即协议对于发送过的请求或响应都不做持久化处理。但为了实现保持状态的功能,引入了Cookie技术。

  2. HTTP方法

GET:获取资源

POST:传输实体主体

PUT:传输文件

HEAD:获得报文首部

DELETE:删除文件

OPTIONS:询问支持的方法

TRACE:追踪路径

CONNECT:要求用隧道协议连接代理

  1. 持久连接节省通信量

因为一次HTTP通信就要断开一次TCP连接

HTTP keep-alive特点,只要任意一端没有明确提出断开连接,则保持TCP连接状态。

HTTP/1.1中所有连接默认都是持久连接,HTTP/1.0未标准化。好处在于减少了TCP连接的重复建立和断开造成的额外开销,减轻服务端的负载。

管线化(pipelining):从前请求是串行的,管线化技术可以实现并行发送多个请求。

  1. 使用Cookie的状态管理

Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie,下次客户端再往该服务器发送请求,客户端会自动在请求报文中加入Cookie指后发送。服务端接收到Cookie会检查记录,得到之前的状态信息。

Chapter3 HTTP报文内的HTTP信息

  1. HTTP报文可分为报文首部和报文主体两块,由最初出现的空行(CR+LF)来划分。报文主体可以没有。

     请求报文首部:
     请求行
     请求首部字段
     通用首部字段
     实体首部字段
     其他
    
     响应报文首部:
     状态行
     响应首部字段
     通用首部字段
     实体首部字段
     其他
    
  2. 编码提升传输速率

内容编码+分块传输

  1. 发送多种数据的多部份对象集合

有以下几种Content-Type:

multipart/form-data
multipart/byteranges
  1. 内容协商包括:服务器驱动协商、客户端驱动协商、透明协商

Chapter4 返回结果的HTTP状态码

  1. 状态码
类别 原因短语
1XX Informational信息性 接收的请求正在处理
2XX Success成功 请求正常处理完毕
3XX Redirection重定向 需要进行附加操作已完成请求
4XX Client Error客户端错误 服务器无法处理请求
5XX server Error服务器错误 服务器处理请求出错
  1. 14个具体状态码
状态码 含义
200 正常处理
204 处理成功,但没资源返回
206 处理成功,返回一部分资源
301 永久性重定向,资源被分配到新URI
302 临时重定向
303 URI已更新,应用GET方法请求新URI
304 Not Modified没修改,可以使用缓存
307 临时重定向,同302
400 请求报文存在错误语法
401 第一次表示请求需要HTTP认证,第二次表示认证失败
403 拒绝访问
404 Not Found
405 Method Not Allowed
500 服务器故障
503 服务器超负载或正在停机维护,无法处理请求

Chapter5 与HTTP协作的Web服务器

  1. 单台虚拟主机实现多个域名,即IP绑多个域名

  2. 通信数据转发程序:代理、网关、隧道

代理:是一种有转发功能的应用程序,接收客户端返送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端

网关:转发其他服务器通信数据的服务器,接收从客户端发来的请求时,对请求进行转发

隧道:相隔很远的客户端和服务器两者之间中转,保持双方通信连接的应用程序

  1. 使用代理服务器的理由:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制等

  2. 代理分类:

缓存代理:转发时预先将资源的副本保存在代理服务器,再次请求相同资源时,就不从源服务器获取资源,而是将之前的缓存资源作为响应返回

透明代理:不对报文做任何加工的代理

非透明代理:对报文内容加工的代理

  1. 网关:工作机制和代理十分相似,而网关能使服务器提供非HTTP协议服务。利用网关可以提高通信的安全新,因为可以在客户端与网关之间通信线路上加密以确保连接的安全。网关可以连接数据库、和信用卡结算系统联动

  2. 隧道:可按要求建立与其他服务器的通信线路,届时使用SSL等机密手段进行通信。目的是确保客户端能与服务器进行安全通信。隧道不解析HTTP请求,保持原样转发给服务器。

  3. 保存资源的缓存

缓存指的是代理服务器或客户端本地磁盘内保存的资源副本。

缓存会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器会再次从源服务器上获取新资源。

Chapter6 HTTP首部

  1. 首部字段重复,不同浏览器处理逻辑不同。

  2. 4种HTTP首部字段类型

名称 作用
通用首部字段 请求报文和响应报文都会使用的首部
请求首部字段 客户端-》服务器
响应首部字段 服务器-》客户端
实体首部字段 针对实体使用的首部
  1. HTTP/1.1定义了47种首部字段,详见pdf p80

  2. Cache-Control:

no-cache:不缓存过期资源

no-store:不缓存

  1. HTTP/1.1遇到max-age和Expires首部,会优先处理max-age

  2. nginx中etag是由Last-Modified 与 Content-Length计算得到,而 last_modified 又由 mtime 组成。当编辑文件却未更改文件内容时,或者 touch file,mtime 也会改变,此时 etag 改变,但是文件内容没有更改。

  3. 两种协商缓存:

Last-Modified/if-Modified-Since

ETag/If-None-Match

  1. Expires会将资源失效的日期告知客户端。

  2. Set-Cookie字段属性

属性 说明
NAME=VALUE Cookie名
expires=DATE Cookie有效期
path=PATH 服务器上的文件目录作为Cookie的适用对象
domain=域名 作为Cookie适用对象的域名
Secure 仅在HTTPS安全通信时才会发送Cookie
HttpOnly Cookie不能被JS脚本访问,防止XSS攻击

Chapter7 确保Web安全的HTTPS

  1. HTTP不足:

     通信用明文,内容可能被窃听
     不验证通信方身份,有可能伪装
     无法证明报文完整性,可能已篡改
    
  2. 加密有两种方式:

通信加密:SSL+HTTP=》HTTPS

内容加密:报文主体加密和解密机制

  1. HTTP+加密+认证+完整性保护=HTTPS

HTTPS并非是应用层的新协议。只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。

通常HTTP直接和TCP通信,使用SSL后,演变成先和SSL通信,再由SSL和TCP通信。

  1. 共享密匙:对称加密,加密和解密用同样的密匙

公开密匙:非对称加密,一把公开密匙,一把私有密匙。用公开密匙加密,用私有密匙解密,不担心密匙泄露。

公开密匙比共享密匙处理速度慢很多

  1. HTTPS采用混合加密机制:首先通过公开密匙方式交换共享密匙用的密匙,然后利用共享密匙进行通信。

  2. SSL之所以慢,有两部分原因:一是SSL通信,二是加密处理。

Chapter8 确认访问用户身份的认证

  1. HTTP使用的认证方式包括:

     BASIC认证(基本认证)
     DIGEST认证(摘要认证)
     SSL客户端认证
     FormBase认证(基于表单认证)
    
  2. BASIC认证对 用户名:密码 采用Base64编码,可以被解码,安全性不高

  3. DIGEST认证由服务端发送质询码(随机数nonce)和realm,客户端回传username(realm限定范围内可认证的用户名)和response响应码(MD5运算后的密码字符串)。

  4. SSL客户端认证

服务器发送Certificate Request报文,要求客户端提供证书

客户端把证书以Client Certificate报文方式发给服务器

服务端验证证书通过,领取证书内公匙,然后开始HTTPS加密通信

  1. 表单认证

客户端把ID和密码通过POST方法发送给服务端

服务端把SessionID记录下来,并在响应首部加入set-cookie写入SessionID,为防止XSS攻击,建议在Cookie内加上httponly属性

客户端把sessionID存入cookie,下次发请求自动带上cookie

Chapter9 基于HTTP的功能追加协议

  1. SPDY目的是解决HTTP性能瓶颈

SPDY在应用层(HTTP)和表示层(SSL)之间插入了会话层(SPDY),具有以下功能:

多路复用流

赋予请求优先级

压缩HTTP首部

推送功能(服务器主动向客户端推送数据)

服务器提示功能

  1. WebSocket协议:是对HTTP协议的升级

其主要特点是:推送功能和减少通信量(长连接+首部信息量少)。

请求首部如下:

GET /chat HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: ...
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

响应首部如下:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: ...
Sec-WebSocket-Protocol: chat
  1. HTTP/2.0特点

// to do...

Chapter10 构建web内容的技术

Chapter11 Web的攻击技术

  1. Web应用的攻击模式有两种:主动攻击和被动攻击

主动攻击,最具代表性的攻击是SQL注入攻击和OS命令注入攻击

被动攻击是指利用圈套策略执行攻击代码的攻击模式。攻击模式如下:

诱使用户触发设计的陷阱,发送嵌入攻击代码的HTTP请求;执行攻击代码,可能导致用户Cookie等个人信息被窃取,用户权限遭到滥用。最具代表性的就是跨站脚本攻击(XSS)和跨站点请求伪造(CSRF)

  1. 因输出值转义不完全引发的安全漏洞

客户端验证

Web应用端验证:输入值验证+输出值转义

输出值转义的意思是:如果想要原样输出这些特殊字符,就必须在它们前面加上反斜杠,使其变成普通字符。这样可以防止<script>这类脚本标签转为字符串而不执行。

  1. XSS利用虚假输入表单骗取用户个人信息或Cookie,显示伪造的文章或图片

  2. SQL注入攻击,如

     SELECT * FROM table1 WHERE author='xxx'--' and flag=1
    

SQL语句会把--后的内容无视所以and flag=1条件就被忽略了

  1. HTTP首部注入攻击

101%0D%0ASet-Cookie:+SID=12345

101%0D%0A表示换行

  1. HTTP响应截断攻击

101%0D%0A101%0D%0A...

两个换行,将报文首部和主体分开,触发用户页面显示伪造Web页面

  1. Dos攻击:一种让运行的服务呈停止状态的攻击,有两种方式:

集中利用访问请求造成资源过载,资源用尽后,服务呈停止状态

通过攻击安全漏洞使服务停止