1.https
TLS
是
SSL
的升级替代版
1、客户端向服务端发起建立HTTPS请求,带随机数A。
2、服务器向客户端发送数字证书,带随机数B(还带上公钥)。
3、客户端验证数字证书,证书验证通过后客户端生成会话密钥C(双向验证则此处客户端也会向服务器发送证书)。
4、服务器用私钥解密客户端发来的会话密钥C(双向验证此处服务端也会对客户端的证书验证)。
5、客户端与服务端以随机数A,随机数B,会话密钥C生成的秘钥D开始进行加密会话。
1:客户端浏览器会预置根证书, 里面包含CA公钥
2:服务器去CA申请一个证书
3: CA用自己的签名去签一个证书,指纹信息保存在证书的数字摘要里面, 然后发送给服务器
中间人攻击(实际上就是偷梁换柱)
服务器向客户端发送公钥。
攻击者截获公钥,保留在自己手上。
然后攻击者自己生成一个【伪造的】公钥,发给客户端。
客户端收到伪造的公钥后,生成加密hash值发给服务器。
攻击者获得加密hash值,用自己的私钥解密获得真秘钥。
同时生成假的加密hash值,发给服务器。
服务器用私钥解密获得假秘钥。
这里就需要一个强大的公证人,就是CA,操作系统会做CA证书的判断。
1、为什么 tcp 要经过三次握手,四次挥手?
“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生 错误”。主要目的防止 server 端一直等待,浪费资源。
“
四次挥手
”
原因是因为
tcp
是全双工模式,接收到
FIN
时意味将没有数据再发来,但是还是
可以继续发送数据。
2、TCP 可靠传输原理实现(滑动窗口)。
确认和重传:接收方收到报文后就会进行确认,发送方一段时间没有收到确认就会重传。
数据校验。
数据合理分片与排序,
TCP
会对数据进行分片,接收方会缓存为按序到达的数据,重新排序
后再提交给应用层。
流程控制:当接收方来不及接收发送的数据时,则会提示发送方降低发送的速度,防止包丢
失。
拥塞控制:当网络发生拥塞时,减少数据的发送。
3、Tcp 和 Udp 的区别?
1
、基于连接与无连接;
2
、对系统资源的要求(
TCP
较多,
UDP
少);
3
、
UDP
程序结构较简单;
4
、流模式与数据报模式 ;
5
、
TCP
保证数据正确性,
UDP
可能丢包;
6
、
TCP
保证数据顺序,
UDP
不保证。
4、如何设计在 UDP 上层保证 UDP 的可靠性传输?
传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照
tcp
可靠
性传输的方式。如不考虑拥塞处理,可靠
UDP
的简单设计如下:
1
、添加
seq/ack
机制,确保数据发送到对端
2
、添加发送和接收缓冲区,主要是用户超时重传。
3
、添加超时重传机制。
具体过程即是:送端发送数据时,生成一个随机
seq=x
,然后每一片按照数据大小分配
seq
。
数据到达接收端后接收端放入缓存,并发送一个
ack=x
的包,表示对方已经收到了数据。
发送端收到了
ack
包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数
据。
目前有如下开源程序利用
udp
实现了可靠的数据传输。分别为
RUDP
、
RTP
、
UDT:
5、socket 断线重连怎么实现,心跳机制又是怎样实现?
许多计算机操作系统为应用程序与
TCP
/
IP
协议交互
提供了套接字
(Socket)
接口。应 用层可以和传输层通过
Socket
接口,区分来自不同应用程
序进程或网络连接的通信,实现数据传输的并发服务。
建立 socket 连接
建立
Socket
连接至少需要一对套接字,其中一个运行于客户端,称为
ClientSocket
,另一
个运行于服务器端,称为
ServerSocket
。
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
socket 断线重连实现
正常连接断开客户端会给服务端发送一个
fin
包,服务端收到
fin
包后才会知道连接断开。而
断网断电时客户端无法发送
fin
包给服务端,所以服务端没办法检测到客户端已经短线。 为
了缓解这个问题,服务端需要有个心跳逻辑,就是服务端检测到某个客户端多久没发送任何
数据过来就认为客户端已经断开, 这需要客户端定时向服务端发送心跳数据维持连接。
心跳机制实现
长连接的实现:心跳机制,应用层协议大多都有
HeartBeat
机制,通常是客户端每隔一小段
时间向服务器发送一个数据包,通知服务器自己仍然在线。并传输一些可能必要的数据。使
用心跳包的典型协议是
IM
,比如
QQ/MSN/
飞信等协议
1
、在
TCP
的机制里面,本身是存在有心跳包的机制的,也就是
TCP
的选项:
SO_KEEPALIVE
。
系统默认是设置的
2
小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断
线。 而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。
通过使用
TCP
的
KeepAlive
机制(修改那个
time
参数),可以让连接每隔一小段时间就产
生一些
ack
包,以降低被踢掉的风险,当然,这样的代价是额外的网络和
CPU
负担。
心跳机制实现
客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,
使
用心跳包的典型协议是
IM
TCP本身也有心跳机制,不过是2小时一次,而且他检测不到断电等特殊情况,所以一般需要应用层处理
2、Cookie 与 Session 的作用和原理。
Session
是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存
在集群、数据库、文件中。
Cookie
是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现
Session
的一种方式
Cookie
Cookie
是由服务器端生成,发送给
User-Agent
(一般是
web
浏览器),浏览器会将
Cookie
的
key/value
保存到某个目录下的文本文件内,下次请求同一网站时就发送该
Cookie
给服
务器(前提是浏览器设置为启用
Cookie
)。
Cookie
名称和值可以由服务器端开发自己定义,
对于
JSP
而言也可以直接写入
Sessionid
,这样服务器可以知道该用户是否合法用户以及是
否需要重新登录等。
6、
浏览器输入地址到返回结果发生了什么?
总体来说分为以下几个过程
:
1
、
DNS
解析,此外还有
DNSy
优化(
DNS
缓存、
DNS
负载均衡)
2
、
TCP
连接
3
、发送
HTTP
请求
4
、服务器处理请求并返回
HTTP
报文
5
、浏览器解析渲染页面
6
、连接结束
如何尽快的加载资源(网络优化)?
答案就是能不从网络中加载的资源就不从网络中加载,当我们合理使用缓存,将资源放在浏
览器端,这是最快的方式。如果资源必须从网络中加载,则要考虑缩短连接时间,即
DNS
优化部分
;
减少响应内容大小,即对内容进行压缩。另一方面,如果加载的资源数比较少的
话,也可以快速的响应用户。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的
地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只
是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有
单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多
线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些
要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
简而言之
,
一个程序至少有一个进程
,
一个进程至少有一个线程。