鹅厂面试太太太坎坷了—网络篇
从2019年12月底开始,我开始踏上腾讯的面试之路,前前后后共面试五个岗位,分别是两个财付通岗位,一个腾讯云岗位,两个智慧零售的岗位,时间跨度约6个月,在面试过程中内心充满着期待、失望、无奈、自我怀疑,经过不折不挠、倔强的坚持后,直至2020年5月时才拿下offer,可以说求职之路十分的艰辛与坎坷。
计算机网络
讲讲OSI七层模型、tcp/ip四层模型
OSI七层协议模型(简称OSI七层模型),是一个定义好的协议规范,被认为是现代开放性通信系统互连互通的标准参考模型。OSI模型有7层结构,每层都可以有几个子层,OSI的7层从上到下分别是:
应用层:与其它计算机进行通讯的一个应用,它对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。
表示层:这一层的主要功能是定义数据格式及加密,例如FTP允许你选择以二进制或ASCII格式传输,如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据,而在接收方将标准的ASCII转换成接收方计算机的字符集。
会话层:它定义了如何开始、控制、结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下如果表示层收到了所有的数据,则用数据代表表示层。
传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,以及在同一主机上对不同应用的数据流的输入进行复用,包括对收到的顺序不对的数据包的重新排序功能。
网络层:这层对端到端的包传输进行定义,它定义了能够标识所有节点的逻辑地址、路由实现的方式及学习的方式,为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。
数据链路层:它定义了在单个链路上如何传输数据,这些协议与被讨论的各种介质有关。
物理层:该层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准,如连接头、帧、帧的使用、电流、编码及光调制等都属于各种物理层规范中的内容。
而在TCP/IP四层模型中,将分为应用层、传输层、网络层、数据链路层:
应用层:为用户提供所需要的各种服务,例如HTTP协议、FTP协议、SMTP协议等等。
传输层:为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。
网络层:解决主机到主机的通信问题、定义能够标识所有节点的逻辑地址。
数据链路层:负责监视数据在主机和网络之间的交换。
讲讲TCP三次握手,四次挥手的过程?
1、第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。 2、第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。 3、第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
所谓四次挥手即终止TCP连接,指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开,这过程可由客户端或服务端任一方执行close来触发。
1、第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。 2、第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。 3、第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。 4、第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
为什么TCP是三次握手?
在了解三次握手之前,我们需要先了解下全双工、半双工通信的概念。
全双工:即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息。
半双工:A可以给B发,B也可以给A发,但是A在给B发的时候,B不能给A发,即不同时,为半双工。
单工:只能A给B发,B不能给A发; 或者是只能B给A发,不能A给B发。
TCP是属于全双工通信类型,我们假设客户端A、服务端B是通信的双方,通信一次信息就是进行一次握手。
- 第一次握手: A打电话给B说,你可以听到我说话吗?
- 第二次握手: B收到了A的电话后并对A说: 我可以听到你说话,你能听到我说话吗?
- 第三次握手: A收到了B的电话回复,然后说我也可以听到你说话,现在我要给你发信息了!
经过三次握手之后,客户端A和服务端B都能确定对方能互相听得到说话,因此可以开始正常通信。
由于HTTP是基于TCP协议的,因此每次都是客户端发送请求,服务器应答,然而还有基于TCP协议的应用服务,存在客户端A、服务端B在建立链接之后,谁都可能先开始通信。
如果只需要两次握手,那么服务端B无法确定客户端A是否能收到B的信息,因此如果服务端B先讲话,可能后面的A都收不到,会出现问题 。
如果握手四次,会造成了浪费,因为在三次握手结束之后,就已经可以保证客户端A可以给服务端B发信息,客户端A可以收到服务端B的信息。
为什么四次挥手需要等待2个MSL时间段?
每一个报文段都有最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间。
- 防止在客户端发送的最后一个ACK包,Server端没收到,因此客户端在超时后重发第三次握手的FIN包,服务端在接到重发的FIN包后可再发一个ACK应答包给客户端。
- 在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用,如果没有TIME_WAIT的话,本地端口会重复使用,如果有旧会话报文,收到乱序序列号,误以为丢包导致会触发快速重传机制,造成一定干扰。
如何解决tcp粘包、半包问题的?
- 固定长度:发送端给每个数据包首部添加数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段就知道每一个数据包的实际长度;或者发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据后就能把每个数据包拆分开来。
- 转义字符:在数据包之间设置边界,如添加特殊符号,而在接收端通过这个特殊字符就可以将不同的数据包拆分开。
在应用层协议中有哪些是基于tcp协议?
HTTP:超文本传送协议 (WWW)
SMTP:简单邮件传输协议
FTP:文件传输协议
SSH:安全登录、文件传送(SCP)和端口重定向
TELNET:不安全的文本传送
TFTP:简单文件传输协议
POP3:邮局协议
IMAP3:交互邮件访问协议
HTTPS:基于SSL的超文本传输协议
为什么https相比http是安全的?
首先我们需要先了解HTTP及HTTPS是什么?
-
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
-
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL,HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全,另一种就是确认网站的真实性。
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
客户端在使用HTTPS方式与服务端通信时有以下几个步骤,如图所示。
(1)客户使用https的URL访问Web服务器,同时将生成随机数R1、支持的加密算法等发送给服务端。
(2)服务端收到客户端请求后,同样生成随机数R2,将网站的证书信息(证书中包含公钥)、支持的加密算法传送给客户端。
(3)客户端的浏览器与服务端开始协商SSL连接的安全等级及使用的加密算法。
(4)客户端的浏览器根据双方同意的安全等级与加密算法,利用公钥加密随机生成的Premaster secret,并将随机数R1、R2及Premaster secret并传送给服务端。
(5)服务端利用自己的私钥解密出会话密钥key,并用会话秘钥key解密传输内容。
(6)待上述步骤完成后便与正常的HTTP请求-响应是一样了。
HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:
- 使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器。
- HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
- HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
- 谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。
SSL协议加密的方式
SSL加密协议即用到了对称加密也用了非对称加密(公钥加密),在建立传输链路时,SSL协议首先使用公钥对对称加密的密钥进行非对称加密,待链路建立好之后,SSL对传输内容使用对称加密。
- 对称加密:速度高,可加密内容较大,用来加密会话过程中的消息。
- 公钥加密:加密速度较慢,但能提供更好的身份认证技术,用来加密对称加密的密钥。
浏览器访问https为什么会出现不受信任提示
当浏览器访问https网站,CA认证机构会对服务器证书校验三个关键信息,若这些信息不通过,则会显示浏览器告警页面。
服务器证书三个关键信息是:
- 证书颁发者受浏览器信任。
- 证书颁发给与访问地址是否匹配。
- 证书的有效期。
如果检查时CA认证机构对上面关键信息不通过,则会警告出现不信任的提示。
https证书申请及制作流程
- 服务器首先生成公钥和私钥对,然后确认申请信息(域名、申请者信息、公钥),最后封装为一个.csr文件(文件内不包含私钥,私钥只在服务端存在)。
- 服务端将申请信息发送到CA认证机构,CA认证机构通过线上、线下多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法、该组织是否拥有本域名的所有权等。
- 如果信息审核通过,CA认证结构会向申请者签发认证文件—证书。证书包含以下信息:申请者公钥、申请者组织信息、签发机构CA信息、有效时间、证书序列号等信息的明文,同时还会包含一个签名和签名产生的算法:首先使用散列函数计算公开的明文信息的信息摘要,然后采用CA认证结构的私钥对信息摘要进行加密,密文即为签名。
- 客户端向服务器第一次发出请求时,服务端返回证书文件。
- 客户端读取证书中的明文信息,采用相同的散列函数计算出信息摘要,然后利用对应CA认证机构的公钥解密证书中的签名数据,对比证书的信息摘要,如果一致,则可以认定证书合法。
- 客户端还会验证证书相关的其他信息,如域名信息、有效时间等。
讲讲https的单向认证、双向认证
单向认证:https在建立连接之前,需要进行握手,具体过程如下:
-
客户端向服务端发送SSL协议版本号、支持的加密算法及生成的随机数R1等信息。
-
服务端给客户端返回SSL协议版本号、支持的加密算法、随机数R2、证书等信息。
-
客户端验证服务端返回的证书合法性,包括:
- 证书是否已过期。
- 发型服务器证书的CA是否可靠。
- 返回的公钥能否正确解开返回证书中的数字签名。
- 服务器证书上的域名是否和服务器的实际域名相匹配。
当客户端验证通过后,将继续进行通信,否则,终止通信。
-
客户端向服务端发送自己所支持的加密方式,供服务器端进行选择。
-
服务器端在客户端提供的加密算法中选择加密程度最高的加密方式。
-
服务器将选择好的加密方式通过明文方式返回给客户端。
-
客户端接收到服务端返回的加密方式后,使用该加密方式生成Premaster secret随机数,并使用服务端返回的公钥进行加密,将加密后的随机数发送至服务器。
-
服务器收到客户端返回的加密信息后,使用自己的私钥进行解密,获取Premaster secret。 在接下来的会话中,服务器和客户端将会使用随机数R1、R2及Premaster secret按照一定算法生成会话秘钥即session key进行对称加密,保证通信过程中信息的安全。
双向认证:双向认证与单向认证原理差不多,只不过除了客户端需要认证服务端外,还需要服务端认证客户端,具体过程如下:
-
客户端向服务端发送SSL协议版本号、支持的加密算法及生成的随机数R1等信息
-
服务端给客户端返回SSL协议版本号、支持的加密算法、随机数R2、证书等信息。
-
客户端验证服务端返回的证书合法性,包括:
- 证书是否已过期。
- 发型服务器证书的CA是否可靠。
- 返回的公钥能否正确解开返回证书中的数字签名。
- 服务器证书上的域名是否和服务器的实际域名相匹配。
当客户端验证通过后,将继续进行通信,否则,终止通信。
-
客户端将自己的证书发送至服务端。
-
验证客户端的证书,当通过验证后,获得客户端的公钥。
-
客户端向服务端发送自己所能支持的加密算法,供服务器端进行选择。
-
服务器端在客户端提供的加密算法中选择加密程度最高的加密。
-
使用之前获取到的客户端公钥对加密方式进行加密,并返回给客户端。
-
客户端收到服务端返回的加密方式密文后,使用自己的私钥进行解密,获取具体加密算法,随后生成Premaster secret随机数,并使用之前从服务端证书中获取到的公钥进行加密,再发送给服务端。
-
服务端收到客户端发送的Premaster secret随机数密文后,使用自己的私钥进行解密,并使用随机数R1、R2及Premaster secret按照一定算法生成会话秘钥即session key,在接下来的会话中,服务器和客户端将会使用会话秘钥进行对称加密,保证通信过程中信息的安全。
在https证书验证时,为什么需要随机数?
通过上图可知,在SSL四次握手期间会生成三个随机数,分别是R1、R2以及Premaster Secret,这三个随机数的作用都是保证生成对称加密的会话秘钥即session key的安全性,由于浏览器客户端也持有随机数R1、R2、Premaster Secret及证书公钥,因此与服务端一样可计算出会话秘钥,在传输时进行内容加密。
java ssl trust manager的作用
TrustManager的主要责任是确定认证凭证是否应该被信任。若凭证不被信任,连接将会被终止。为了验证安全套接字对端的远程身份,需要初始化一个包含一个或多个TrustManager的SSLContext上下文。
除了md5,还知道其他摘要算法吗?
MD5算法:常用来校验密码是否正确、校验下载文件是否完整无损,一般来说,我们需要对数据进行加盐,按照一定规则扰乱原有字符串,然后再进行MD5计算。
- SHA算法,例如SHA256,安全哈希算法(Secure Hash Algorithm)主要用于数字签名。
- MAC算法,即带秘密密钥的Hash函数,消息的散列值由通信双方知道的秘密密钥K来控制,Hash值称作MAC。
如何定位两个服务网络是否可通?
首先我们可以使用以下工具命令逐步排除网络问题:
-
ipconfig / ifconfig:检查本地的网络配置是否正确
-
ping:用来检测网络的连通情况和分析网络速度。
-
telnet:查看某个端口是否可以访问、远程登录到服务器,控制远程计算机。
-
mtr:一个集合 ping 和 traceroute 功能并能直观显示结果的网络诊断工具。
我们可以使用ping工具发送数据包到目标主机,通过观察丢包率判断网络是通畅的,如果有丢包的情况,说明我们的网络虽然是通的,但是比较堵塞比较卡,同时time指标的数字越小,表明目标主机回应我们的时间越短,也就是说网络越通畅,如果没有回应这些数据,说明我们的网络是不通的。
![image-20210203174930228](/Users/keres_liu/Library/Application Support/typora-user-images/image-20210203174930228.png)
当网络是通畅时,我们可使用telnet工具测试服务的端口是否已开放,如果telnet xxx.test.com 8080时发现未通,表示该服务可能未启动或服务启动了但开启防火墙。
![image-20210203175003893](/Users/keres_liu/Library/Application Support/typora-user-images/image-20210203175003893.png)
当发生网络丢包严重或者服务之间调用耗时的情况,可通过mtr工具双向测试网络链路,定位具体是哪个链路丢包严重。