Network Basic

网络基础

OSI 七层模型

应用层

表示层

会话层

传输层

网络层

数据链路层

物理层

Socket

TCP/UDP

TCP/IP

TCP/IP 是互联网相关的各类协议族的总称

TCP/IP 概念层模型

应用层

应用层决定了向用户提供应用服务时通信的活动。

TCP/IP协议族内预存了各类通用的应用服务。比如:FTP(File Transfer Protocol) 文件传输协议、DNS(Domain Name System) 域名系统 就是其中两类。

传输层

传输层对上层应用层,提供处于网络连接中的两台主机之间的数据传输。

在传输层有两个性质不同的协议:TCP(Transmission Control Protocol) 传输控制协议 和 UDP(User Data Protocol) 用户数据报协议。

网络层

网络层(又名网络互连层),是用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方主机,并把数据包传送给对方。

数据链路层

用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,网卡),及光纤等物理课件部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。

HTTP/HTTPS

HTTP(HyperText Transfer Protocol) 超文本传输协议

HTTP 和 HTML(Hypertext Markup Language 超文本标记语言)一起诞生,用于网络上请求和传输HTML内容。

HTTPS

HTTPS并非应用层的一种新协议,只是HTTP通讯接口部分由SSL/TLS协议代替,通常HTTP直接和TCP通信,当使用SSL/TLS时,则变成先和SSL/TLS通信,再由SSL/TLS和TCP通讯,因此HTTP其实就是披上SSL保护外衣的HTTP。

HTTPS 的优势

  1. 内容加密,建立一个信息的安全通道,来保证数据传输过程的安全性。
  2. 身份认证,确认网站的真实性。
  3. 数据完整性,防止内容被第三方冒充或者篡改。

HTTP1.0

HTTP1.0 诞生于 1996年

  • 使用 header 里的 If-Modified-Since、Expires 来做为缓存判断的标准

HTTP1.1

HTTP1.1 诞生于 1999年

  • 引入了更多的缓存控制策略,例如:Entity tag、If-Unmodified-Since、If-Match、If-None-Match
  • 支持 range 206 Partial Content
  • 新增 24个错误码,409 Conflict 410 Gone

HTTP2

HTTP2 诞生于 2015年

HTTP报文结构

Request Methods

  • GET 获取资源;没有Body
  • POST 增加或修改资源;有Body
  • PUT
  • DELETE
  • HEAD

Status Code(状态码)

HTTP状态码是对结果做出类型化描述,它由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码分为5中类型:

分类 分类描述
1xx 临时性信息,服务器收到请求,需要请求者继续执行操作
2xx 成功,操作被成功接收并处理
3xx 重定向,需要进一步的操作以完成请求
4xx 客户端错误,请求包含语法错误或无法完成请求
5xx 服务器错误,服务器在处理请求的过程中发生了错误

HTTP消息的元元素 (metadata)

加密

对称加密

对称加密,也叫私钥加密,是指加密和解密使用相同的密钥的加密算法。就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。常见的对称加密有DES(Data Encryption Standard)AES(Advanced Encryption Standard)、RC4、IDEA

非对称加密

非对称加密算法有两个秘钥:公开秘钥(public key)和私有秘钥(private key),并且公开秘钥和私有秘钥是成对出现的。

数字摘要

数字摘要是采用单项Hash函数将需要加密的明文”摘要”成一串固定长度(128位)的密文,这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文摘要必定一定。数字摘要是https能确保数据完整性和防篡改的根本原因。常用的摘要主要有MD5SHA1SHA256等。

数字签名

数字签名技术是对”非对称密钥加解密”和”数字摘要”两项技术的应用,它将摘要信息用发送者的私钥加密,与原文一起传送给接受者。接受者只有用发送者的公钥才能解密被加密的摘要信息,然后用Hash函数对收到的原因产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输的过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

```flow
st=>start: 明文
st2=>start: Hash运算
st3=>start: 摘要
st4=>start: 私钥加密
e=>end: 数字签名
st(right)->st2(right)->st3(right)->st4(right)->e(right)
```

注意:数字签名只能验证数据的完整性,数据本身是否加密不属于数字签名的控制范围

数字证书

为了确保请求方的公钥一定是目标主机发送的,防止目标主机本身从事窃取用户信息的不正当行为,这时候,我我们需要一个权威的第三方机构(一般由政府机构审核并授权的机构)来统一对外发送主机机构的公钥,只要请求方这种机构获取公钥,就能避免上述问题。

数字证书的颁发过程

数字证书包含哪些内容

QA

  1. HTTPS可以抓包吗? HTTPS的数据是加密的,常规下抓包工具代理请求后抓到的包内容是加密状态,无法直接查看。但是,可以通过抓包工具来抓包。它的原理其实是模拟一个中间人。 通常HTTPS抓包工具的使用方法是生成一个证书,用户需要手动把证书安装到客户端中,然后终端发起的所有请求通过该证书完成与抓包工具的交互,饭后抓包工具再转发请求到服务器,最后把服务器返回的结果在控制台输出后返回给终端,从而完成整个请求的闭环。

  2. 既然HTTPS不能防止抓包,那HTTPS的意义是什么? HTTPS 可以防止用户在不知情下通信链路被监听,对于主动授信的抓包操作是不提供防护的,因为这个场景用户是已经对风险知情。要防止被抓包,需要采用应用级的安全防护,例如采用私有的对称加密,同时做好移动端的防反编译加固,防止本地算法被破解。

  3. 如何防止抓包?

    对于HTTPS API接口,如何防止抓包呢?既然问题出在证书信任问题上,那么解决方法就是在我们的APP中预置证书。在TLS/SSL握手时,用预置在本地的证书中的公钥校验服务器的数字签名,只有签名通过才能成功握手。由于数字签名是使用私钥生成的,而私钥只掌握在我们手上,中间人无法伪造一个有效的签名,因此攻击失败,无法抓包。

    同时,为了防止预置证书被替换,在证书存储上,可以将证书进行加密后进行「嵌入存储」,如嵌入在图片中或一段语音中。这涉及到信息隐写的领域,这个话题我们有空了详细说。

    关于 Android 中Https 请求如何防止中间人攻击和Charles抓包,可以看一下这一篇文章。

    Android中Https请求如何防止中间人攻击和Charles抓包原理