[TOC]
@(iOS总结)
一切从简,用自己的方式记录。如果你觉得啰嗦,那可能是我怕说的不明白;如果你觉得太笼统,那可能是我觉得太基础没写出来,或者我还没认知到;如果你觉得和别的文章太重复,那可能是我没有找到更好的表达方式;
系统学习最好看一下 UNIX网络编程卷1:套接字联网API(第3版).pdf
一、TCP(详情参考:必须懂的计算机网络知识—(TCP))
1.1、网络模型数据处理过程
1.2、TCP和UDP的区别
TCP
位于传输层,传输层协议还包括UDP
、HTTP
(超文本传输协议)、FTP
(文件传输协议)、SNMP
(简单网络管理协议)、Telnet
(远程登录协议)等。下面的表格列出了TCP
和UDP
的区别。
传输层协议 | TCP(Transmission Control Protocol传输控制协议) | UDP(User Datagram Protocol用户数据报协议) |
---|---|---|
连接方式 | 面向连接(一对一) | 无连接(一对一、一对多、多对一、多对多) |
占用系统资源 | 多(首部开销20字节) | 少(首部开销8字节) |
可靠性 | 可靠,保证数据正确(全双工) | 不可靠,可能会丢包 |
数据顺序 | 保证数据顺序 | 不保证数据顺序 |
拥塞控制 | 有拥塞控制,面向数据流 | 无拥塞控制,面向报文 |
流量控制 | 有(滑动窗口) | 无 |
注意: “
ping
”命令是使用 IP 和网络控制信息协议 (ICMP
),因而没有涉及到任何传输协议(UDP/TCP
) 和应用程序
TCP
因为是面向连接的,所以比UDP
要更复杂,建立连接需要三次握手
,断开连接需要四次挥手
。TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制
,还可以对次序乱掉的分包进行顺序控制
。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过检验和
、序列号
、确认应答
、重发控制
、连接管理
以及窗口控制
等机制实现可靠性传输
。
1.3、建立连接为什么要三次握手?
假如让我和你来实现一次完整可靠的连接,会怎么做呢?
- 第一次握手,
我
告诉你
我要和你建立连接 - 第二次握手,
你
告诉我
你能收到我发送的消息 - 第三次握手,
我
告诉你
我能收到你发送的消息 然后,你能收到我发送的,我能收到你发送的,咱俩下面就可以畅聊了
1.4、断开连接为什么要四次挥手?
- 第一次握手:
我
告诉你
,我要和你断开连接 - 第二次握手:
你
告诉我
,你收到我发送的断开连接消息了,但是可能还有数据没有发送完毕,等一会再告诉我 - 第三次握手:
你
告诉我
,你没有正在发送的数据了,你可以和我断开连接了 - 第四次挥手:
我
告诉你
,我收到你发送的可以和我断开连接的消息了 然后,本次会话完美结束了,没有漏掉任何消息
1.5、TCP流量控制
所谓的流量控制
就是接收方让发送方的发送速率
不要太快,让接收方来得及接收。利用滑动窗口机制
可以很方便的在TCP连接上实现对发送方的流量控制。TCP窗口的单位是字节,不是报文段,发送方的发送窗口
不能大于接收方给出的接收窗口
(rwnd)的大小。
1.6、TCP拥塞控制
为了方式网络的拥塞现象,TCP提出了一系列的拥塞控制机制
。拥塞控制的原理主要依赖于一个拥塞窗口(cwnd)
,发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就增大一写,以便把更多的分组发送出去。但是只要出现网络拥塞,拥塞窗口就减少一些,以便减少注入到网络中的分组。主要有四种算法:慢启动(Slow-start)
、拥塞避免(Congestion Avoidance)
、快重传(Fast Restrangsmit)
、快恢复(Fast Recovery)。
拥塞控制和流量控制的区别
区别 | 拥塞控制 | 流量控制 |
---|---|---|
作用范围 | 全局性的(设计所有主机、路由器、以及与降低网络传输性能有关的所有因素) | 点对点的通信量控制,是个端到端的问题 |
控制方 | 发送方控制 | 接收方控制 |
控制结果 | 控制发送方注入到网络中的数据量 | 控制发送端的发送数据速率,以便接收端来得及接收 |
二、HTTP、HTTPS
2.1、HTTP(详情参考:HTTP 教程| 菜鸟教程 、关于HTTP协议,一篇就够了)
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。规范把 HTTP 请求分为三个部分:状态行
、请求头
、消息主体
。
2.1.1、HTTP基础知识:URL
统一资源定位符(Uniform Resource Locator)是网络资源的位置和访问方法的简洁表示。常见的url包括4个部分,结构如下图:
组件 | 含义 |
---|---|
方案 | 使用的协议,如http或https |
主机 | 服务器的域名或IP地址 |
路径 | 服务器上资源的本地名,用(/)与前面的scheme分隔开来 |
查询字符串 | 通过查询字符串来减小请求资源类型的范围,如参数 |
2.1.2、HTTP之状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别: 1xx:指示信息–表示请求已接收,继续处理 2xx:成功–表示请求已被成功接收、理解、接受 3xx:重定向–要完成请求必须进行更进一步的操作 4xx:客户端错误–请求有语法错误或请求无法实现 5xx:服务器端错误–服务器未能实现合法的请求
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
复制代码
2.1.3、HTTP请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。 HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。 HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
复制代码
2.1.4、HTTP与TCP的区别?
TCP
协议对应于传输层,HTTP
协议对应于应用层,从本质上来说二者没有可比性。 很多人喜欢把IP
比作告诉公路,TCP
是告诉公路上的卡车,他们携带的货物就是HTTP
协议。 我觉得这是很不严谨的,如果非要举个形象的例子,我觉得可以把IP
比作电话号码
,TCP
就像电话
,传输去的声音
就像数据包
,如果是开会就会遵循电话会议规则(比如HTTP
),如果是销售就会遵循推销规则(比如FTP
),如果是闲聊就按照双方想要的规则(自定义数据传输协议
)。TCP
传输的数据包可以任何格式的,可以自定义规则
,可以遵循HTTP
协议,也可以遵循FTP
协议。
2.1.5、如何解决HTTP的无状态协议?
使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是”老用户“。
2.2、HTTPS(详情参考:详细解析 HTTP 与 HTTPS 的区别)
https, 全称Hyper Text Transfer Protocol Secure,相比http,多了一个secure。一句话:HTTPS=HTTP+加密+认证+完整性保护
。
理清几个概念很重要
- 1、CA(数字证书颁发机构)
- 2、非对称秘钥:CA的一对非对称秘钥、服务器的一对非对称秘钥、客户端的一对非对称秘钥
- 3、对称秘钥:客户端随机生成的,用于认证完成之后的数据加解密(客户端通过服务器返回的数字证书中的公钥加密对称秘钥后,发送给服务器)
- 4、数字证书:CA颁发给服务器的数字证书(证书中的公钥是服务器的公钥,但是签名使用的是CA的私钥)、CA根证书(证书中的公钥是CA自己的公钥,签名使用的是CA自己的私钥<用来保证该证书没有被中间篡改过>)
- 5、单双向认证:单向认证,客户端验证服务器;双向认证,客户端先验证服务器证书,服务器在验证客户端的证书。双向认证的时候,客户端需要向服务器请求颁发给自己数字证书 = 用服务器的公钥(另外一对中的)加密摘要得到的签名+客户端信息 + 客户端公钥。Https单向认证和双向认证
浏览器
、操作系统
、或者应用
自己内置了信任的根证书
,浏览器或者客户端接收到服务器返回的的CA颁发的数字证书,从内置信任的根证书中获取CA的公钥,然后对服务器返回的数字证书中的签名进行解密得到摘要1,然后对服务器返回的数字证书中的内容进行取摘要运算得到摘要2,最后对比摘要1与摘要2是否相等,继而判断服务方是否是被CA认证的服务方。
2.2.1、SSL解决了通信中哪些问题?
-
1、
认证(Authentication)
:无法确认与我正在通信的人,就是我真正想通信的人 -
2、
泄露(privacy)
:与我通信的内容,被别人偷听 -
3、
篡改(data integrity)
:我接受到的的内容,并不是对方原始发送的数据
SSL不解决以下问题: 不可抵赖性(消息的发送者没办法不承认消息是自己发出的)。因为SSL并不对传输的数据做签名。但是SSL加上数字签名证书可以解决该问题。
2.2.2、检验双方的真实性
HTTPS使用了数字证书(身份认证机构盖在数字身份证上的一个章或印,或者说加在数字身份证上的一个签名),这一行为表示身份认证机构已认定这个人,证书的合法性可以向CA验证。客户端收到服务器的响应后,先向CA验证证书的合法性,如果校验不通过浏览器就会终止连接,并提示用户证书不安全。 数字证书的组成:
- 证书颁发机构
- 证书颁发机构签名(数字签名是什么?)
- 证书绑定的服务器域名
- 证书版本、有效期
- 签名使用的算法(非对称加密算法,RSA)
- 公钥
2.2.3、数据的保密性
就是对数据进行加密,通常使用两种加密算法:对称加密
、非对称加密
。
对称加密: 加密和解密使用相同的密钥,有点是加解密速度快,缺点是密钥丢失后无法做到保密,常用的有AES、DES。 非对称加密: 有一对密钥,公钥(向所有人开放)和私钥(不对外开放)。公钥加密的数据只能私钥解密,私钥加密的数据只能公钥解密,利用这种特性可以用来校验数字签名。
HTTPS的解决方案是这样的:用非对称算法随机加密出一个对称密钥,然后双方用对称密钥进行通信。具体来说,就是客户端生成一个随机密钥,用服务器的公钥对这个密钥进行非对称加密,服务器用私钥进行解密,然后双方就用这个对称密钥来进行数据加密了。
2.2.4、数据的完整性
哈希算法可以将任意长度的数据转化成固定大小的字符串,并且该过程不可逆,利用这个特性做数据完整性的校验。
2.2.5、HTTPS完整过程大致如下两图
要点: 使用公钥对摘要加密得到签名,使用私钥解密签名得到公钥
为什么需要数字证书? 因为网络通信的双方都可能不认识,那么就需要第三方介绍,这就是数字证书。数字证书是由Certificate Athority(CA认证中心)颁发的。
2.2.6、为什么Charles
能够抓取HTTPS报文?
通过上面的分析,我们知道HTTPS可以有效防止中间人攻击,但是Charles
,Fiddler
是可以抓取HTTPS请求并解密的,它们是如何做到的呢?
Charles作为一个中间人代理
,当浏览器和服务器通信时,Charles接收服务器的证书,但自己动态生成一张证书发送给浏览器,也就是说Charles作为中间代理在浏览器和服务器之间通信,所以通信的数据可以被Charles拦截并解密。由于Charles更改了证书,浏览器校验不通过会给出安全警告,必须安装Charles的证书后才能进行正常访问。
-
1、客户端向服务器发起HTTPS请求
-
2、Charles拦截客户端的请求,伪装成客户端向服务器进行请求
-
3、服务器向“客户端”(实际上是Charles)返回服务器的CA证书
-
4、Charles拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥)
-
5、客户端接收到“服务器”(实际上是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles)
-
6、Charles拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥)
-
7、服务器用自己的私钥解密对称密钥,向“客户端”(Charles)发送响应
-
8、Charles拦截服务器的响应,替换成自己的证书后发送给客户端
至此,连接建立,Charles拿到了 服务器证书的公钥 和 客户端与服务器协商的对称密钥,之后就可以解密或者修改加密的报文了。
HTTPS抓包的原理还是挺简单的,简单来说,就是Charles作为“中间人代理”,拿到了 服务器证书公钥 和 HTTPS连接的对称密钥,前提是客户端选择信任并安装Charles的CA证书,否则客户端就会“报警”并中止连接。这样看来,HTTPS还是很安全的。
2.2.7、如何阻止Charles读取HTTPS数据?
- 方案一:对HTTPS传输的数据进行二次对称加密(对称秘钥不能泄露)
- 方案二:使用双向认证,不仅客户端验证服务器证书的合法性,服务器也要验证客户端证书的合法性
参考资料
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101171.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...