讲一下计算机网络的体系结构
可以分为7层,从上到下依次是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
书中一般分为5层,从上到下依次是应用层、传输层、网络层、数据链路层、物理层
一般使用的是TCP/IP 四层模型,从上到下依次是应用层、传输层、网络层、网络接口层
那说一下为什么要进行网络分层
分层主要是因为解耦,专注于某项功能的实现,就比如我们后台进行开发的时候,需要分为对数据库操作Mapper层,业务操作Service层,前后端数据交互Controller层
所以网络作为一个复杂的系统,分层可以让各个功能简化去实现,将一个大的问题简化,同时分层也就使得整体显得灵活,上层只受下层的影响。各层也就只需要独立去实现自己的功能
讲一下应用层的常见协议
HTTP,超文本传输协议
SMTP,简单邮件传输协议
DNS
FTP
POP3/IMAP
TELENT
SSH
讲一下DNS协议
DNS协议是将域名解析为相应的IP地址的一个协议
说一下DNS的过程
浏览器输入一个网站的时候,首先需要去获取它的域名,因此先去查看本地的DNS缓存,是否有该域名对应的IP地址,如果没有,就需要由本地DNS服务器去请求地区DNS服务器,查询是否有,如果没有,则让本地服务器再去请求根DNS服务器,返回对应的顶级DNS服务器,然后本地服务器再去请求对应的顶级服务器,获取对应的IP地址,缓存到本地服务器,然后就可以进行网站的访问
-----------------------------------
说一下 HTTP 与 HTTPS的区别
首先,HTTP是一个超链接文本协议,主要是用来规范浏览器和服务端的交互,同时也是一个无状态的协议,因为下一次打开浏览器再发出的请求与上一次毫无关联。
而HTTPS是基于 HTTP的基础上,利用 SSL/TLS进行加密的加密协议,它对要传输的数据不再是明文传输,而会将数据加密后再进行传输,并且从HTTP的80端口,改为了443端口
由于HTTPS需要去加密,所以在资源消耗上来说,HTTPS是比HTTP消耗更多的一个服务资源。
那SSL 和 TLS 有具体的区别么?
其实没有太大的区别,TLS就是基于SSL之上的一个新版本,在SSL 3.0 升级后,新的版本就被命名为TLC 1.0。
说一下SSL / TLS的工作原理
有两个过程,一个是非对称加密的过程,另一个是对称加密的过程
非对称
非对称加密的过程就是采用公钥和私钥,当在进行通信的时候,私钥只有双方各自拥有,公钥则可被所有人访问,可以把公钥放到证书中。
当需要访问的时候,请求证书获取要发送方的一个公钥,用自己的私钥加密后的信息,再用获取到的公钥去加密,然后将加密后的信息发送给接收方,
同时,接收方通过发送方的证书或其他方式获取公钥,先使用自身的私钥对加密的信息解密,然后,再用获取到的公钥进行解密,就获取到了要传输的数据。
对称
这个要传输的数据就可以是一个会话密钥,因为不可能每次都去使用公私钥去加密一个数据,一个过程繁琐,第二个就是消耗肯定更大,毕竟需要两次加密,解密,所以就可以用这个传输的会话密钥去加密数据,因为只有双方知道这个会话密钥,也可以保证传输的保密性,不会被他人窃听。
如何确保公私的依赖性?
客户端在发送https请求前,先获取目标服务器的一个证书,如果证书是经过CA机构颁发,没有过期,没有违法的,就可以得到一个信任,证书上包括目标服务器的公钥
如何确保证书的真伪?
简单来说就是通过数字签名,因为大家相信CA机构,所以只需要在请求证书的时候,被请求方 S 去请求CA机构颁发证书,S 获得 被CA机构使用私钥加密消息摘要的签名 的证书,发送给请求方A,请求方A只需要使用CA机构的公钥去解密,验证摘要是否被修改
讲一下HTTP 1.0 和 1.1有什么区别
分为5个方面吧
响应状态码
1.0只有16种,1.1就加入了大量状态码
缓存处理
1.0的时候使用一个EXPIRES 标签来标记一个响应体的时间,还有LAST-MODIFIED标签最后一次修改的时间,如果未被修改就直接从缓存中拿,如果被修改就发回新的,并返回 200(OK),1.1的时候,就在请求头加了一个Cache-Control,增加了灵活性和拓展性,主要是更加细致了
连接方式
1.0的时候使用的是短连接,也就是说每次请求都会去创建一次TCP请求,请求结束就关闭,由于这样会造成大量的浪费,在1.1的时候就默认KEEP-ALIVE,默认是一个长连接,也就是说建立连接后不会断开,而是保持这个状态,当然也不会一直去保持,会在长时间没有响应后去断开
host头处理这方面
1.0没有考虑多个主机名绑定到同一个IP地址的问题,就假如,http://www.example.com/login.html ,会请求成 GET /login.html,不会去加入主机名,因此就在1.1中加入了host字段,新增主机名,就如上例,会加入example.com
带宽优化
1.1 的时候加入了范围请求,可以请求一部分数据,也就是续传下载的类似功能
1.1的时候加入了100的状态码,对于某些较大的文件,可以响应这些请求,指示请求是否可被正常执行
1.1加入了对数据的压缩,对不同的采用不同编码,比如内容编码和传输编码之类
讲一下你知道的响应状态码
100:请求大资源预热
200:成功请求
302:临时被移动
400:请求语法错误
401:未被授权
403:被禁止,拒绝请求
404:没有找到相应页面
500:服务器错误,无法完成请求
既然 HTTP 是无状态协议,那如何保存用户的状态
可以通过cookie 和 session,一般cookie用于保存账号密码和sessionID,也就是保存客户端的用户状态信息,而session则是在服务端保存客户的状态,常用于购物车之类的功能,服务端这边就可以通过cookie中记录的sessionID来确认相应的客户
那 cookie 如果被禁用了怎么办
如果cookie被禁用了,就可以通过直接附加到url的后面来传输sessionID,作为一个参数
-----------------------------------
传输层的协议有哪些
TCP 和 UDP
TCP 和 UDP协议有什么区别
TCP是面向连接的协议,实现了可靠传输,基于字节流进行传输。
UDP 是不需要建立连接的协议,只需要将数据发送给请求的一方就可以
一般来说,对于直播、视频,使用UDP更好,因为对于TCP来说,建立连接,保证可靠传输都需要消耗资源,耗费时间,可能就无法保证一个实时性。
而对于TCP连接,可以去做一些需要可靠传输的工作,比如文件传输,发送邮件等
说一下TCP如何保证可靠传输的
应用数据会被分割成适合TCP发送的数据块,可以一块块的进行传输
TCP会对每一块进行编号,确保这个传输过程是有序的
然后TCP的首部拥有校验和,可以确保数据传输的过程有没有损坏,丢失
然后TCP接收端会拒绝接受重复报文
流量控制,发送和接收方都有固定的缓冲大小,只允许发送缓冲区能接受的数据,当来不及处理的时候,就会去缩小这个缓冲区的大小,一般就去使用滑动窗口实现流量控制
拥塞控制:当网络拥塞的时候,会减少数据的发送
ARQ 协议:就是说每发完一个报文,需要等待接收方确认接收后,再发送下一个报文
超时重传;当TCP发出一个段后,启动一个定时器,如果没有确认报文回来,就会进行重发
详细讲一下ARQ协议
ARQ协议就是自动重传协议,也就是使用确认和超时的机制,来保证报文没有丢失,其中包括停止等待ARQ和连续ARQ
停止等待ARQ协议就是说发完一个分组就会停止,等待所有确认完毕,再开始,如果有超时就会使用自动重传ARQ来重传超时的报文
连续ARQ就是在一个窗口的所有分组可以连续发送,不需要等待确认,最后只需要累计确认
讲一下滑动窗口和流量控制
流量控制的目的就是为了控制发送方的发送速率,以便于接收方能够正常接收,TCP所使用的就是滑动窗口来实现一个流量控制,窗口大小动态改变,限制每次发送的分组数量
详细讲一下拥塞控制
拥塞控制就是说对网络资源的一个处理,超出了能处理的范围,需要调整所能处理的资源。
因此TCP就会维护一个拥塞窗口,来确定发送窗口的大小。
采用了四种算法,慢开始,拥塞避免,快重传,快恢复
慢开始就是说,当主机开始发送数据,如果立刻发送大量数据可能会导致数据拥塞,因此就需要逐步去增加,这里使用的是每次成2的指数级增加,当达到一个临界值之后,就需要采用拥塞避免算法了
拥塞避免算法是为了减缓一个增加的速度,不能再去按照慢开始的指数增加了,采用每次加一的次数增加窗口的大小,当遇到数据包丢失的时候,就会触发重新设置拥塞窗口为1,再进行一个慢开始,拥塞避免的过程
快重传算法是说如果一个数据报迟迟未有确认报文返回,每次返回的确认都是上一个数据包的确认,累计三次之后,就会立即触发重传机制,而不需要去等待一个超时重传,同时,也会把拥塞窗口减小到一半,防止网络阻塞问题的原因。在这之后就是执行一个快恢复的算法,也就是说不用再经历慢开始的一个阶段,直接去到拥塞避免的过程
说一下TCP 三次握手和四次挥手
三次握手就是客户端发起连接请求,发送SYN到服务端,服务端接收到请求后,发送SYN 和 ACK给客户端,客户端接收到后,再发送给服务端ACK确认接受,从而建立连接
四次挥手就是客户端发起了FIN请求断开连接,服务端接收到请求后返回ACK,然后继续处理服务端剩下的业务,在处理完了之后,再发送FIN到客户端,说明,可以断开连接,客户端接收到服务端的FIN后,就发送ACK,确认已经接收到服务端断开连接的请求,待服务端接收到ACK后,服务端正式断开连接,客户端这边在等待TIME_WAIT时间后去断开连接
为什么要三次握手,四次挥手
目的是为了建立可靠的通信通道,比如如果是两次握手的话,如果服务端接收到了请求,就去建立连接,然后发送SYN给客户端,如果这个报文丢失了,那么服务端这边的连接建立而客户端没有,会导致服务端资源的一个浪费
四次回收也是同样的原因,如果服务端这方断开后,报文丢失,也就会导致客户端连接保持,同理,客户端断开后,报文丢失,也可能会导致服务端保持着连接
-----------------------------------
说一下输入 URL 地址后的一个过程
比如,输入百度,www.baidu.com,首先是需要对百度的域名进行解析,用DNS将域名解析成IP地址,然后由浏览器发送HTTP请求到该IP地址,也就是建立了TCP连接,待服务端处理完请求后,返回HTML响应,然后浏览器显示HTML
URL 和 URI的区别是什么
URI :统一资源认证符,标识唯一的资源,就相当于身份证号
URL:统一资源定位符,也就是指明如何找到该资源,可以说是一种具体的URI,不仅可以标识,还可以定位资源的信息