TCP为什么是可靠的
TCP是面向连接的,三次握手四次挥手,有流量控制,拥塞控制等机制 A:客户端 B:服务端
三次握手
A->B : async = 0,ack = 0,序列号 x
B收到之后B->A: syn = 1,ack + 1,序列号Y
A收到:A->B: ,确认好 Y+1 ,序列号X+1
为什么三次握手
- A->B: B确认A的发送正常,B接收正常
- B->A: A确认B发送正常,A接收正常
- A->B: A告诉B,A收发都正常 (第三次握手可有效防止失效请求)
四次挥手:
A->B:发送FIN ACK,告诉B,我要断开了
B->A:返回 ACK+1,告诉A,可以断
B->A:发送FIN,要断开了
A->B: 断开吧,我也断了
因为TCP是全双工连接,关闭连接需要双向确认关闭才算是真正的关闭,否则未关闭一方仍可以继续发送数据。
流量控制
如果发送方把数据发送的过快,接收方来不及接收,会造成数据丢失,所谓流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收
利用滑动窗口机制可以方便的在TCP链接上实现对发送方的流量控制
设A向B发送数据,在链接建立时,B告诉A,我的接收窗口rwnd = 400(receive window),因此,发送方的发送窗口不能超过接收方给出的窗口数值
TCP拥塞控制:
发送方维持了一个cwnd(congestion window 拥塞窗口)的状态数量,拥塞窗口的大小取决于网络负载情况,并且动态的在变化,发送方让自己的窗口等于拥塞窗口,
发送方控制拥塞窗口的原则: 只要网络没有出现拥塞,拥塞窗口就增大一些,以便把更多的分组发出去,但是只要网络出现拥塞,拥塞窗口就小一些,以减少注入到网络中的分组数.
慢开始算法
当主机开始发送数据时,如果立即把大量数据字节注入网络,那么就有可能引起网络拥塞,因为现在并不清楚网络负荷情况,因此,叫较好的方式就是先去探测,由小及大逐渐增大发送窗口数量
每经过一次轮次,拥塞窗口数cwnd加倍, 为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置门限ssthresh
- 当 cwnd < ssthresh 时,使用上述的慢开始算法。
- 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
- 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。拥塞避免
拥塞避免
让拥塞窗口缓慢增长,没经过一个往返时间RTT就把发送放的拥塞窗口+1,而不是加倍,这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率慢得多,
无论在慢启动阶段还是拥塞避免阶段,只要发送方判断网络出现拥塞(根据是没有收到确认),就要把慢开始门限设置为出现拥塞时的发送方的窗口值的一半(但是不能小于2),然后把拥塞窗口cwnd重新设置为1,执行慢开始算法
HTTPS 认证过程
单向认证
双向认证
中间人攻击
https中客户端验证公钥证书的过程
服务器将公钥证书发送给客户端 客户端验证公钥证书 从而确保公钥的合法性
- 客户端取出提前内置在手机内部的认证机构的公钥
- 用认证机构的公钥去解密公钥证书里的数字签名 从而得到数字指纹
- 客户端对公钥证书的服务器公钥进行 数字摘要算法 从而生成数字指纹
- 对比客户端自己生成的数字指纹(第3步)和解密得到的数字指纹(第2步)是否一致 如果一致则公钥证书验证通过 就可以进行接下来的握手步骤了
数字证书内容
服务器公钥,权威机构信息,服务器域名,还有经过ca加密的之后的私钥(通过hash算法计算得到证书摘要,然后用权威机构的私钥加密证书摘要得到数字签名)