【10道大厂必考的计算机网络问题】陶辉老师

目录

1.请详细介绍一下TCP的三次握手协议,为什么要三次握手?

2.说说HTTP协议中缓存的处理流程?缓存的应用流程?与缓存相关的HTTP头部?

3.在地址栏键入URL后,网络世界发生了什么?

4.使用HTTP长连接有哪些优点?

5.介绍下close_wait状态产生的原因

6.介绍下多播是怎么实现的?

7.服务器的最大并发连接数是多少?

8.TCP和UDP协议如何选择?

         9.TLS/SSL是如何保障信息安全的?

10.HTTP2协议有哪些优点?


0.引用

一个面试合集 

1.请详细介绍一下TCP的三次握手协议,为什么要三次握手?

问的点:
1.为什么TCP要握手?
2.为什么TCP握手是三次?



答的点:
1.全双工,需要知道对方的序列号进行通信,为了同步序列号,所以需要握手;
2.在握手的时候不可以在半打开状态下就开始传输消息,这个是TCP的规范所不允许的,所以server在
回复ack的情况下就必须把它自己的sequence也发给客户端.



需要回答的点:
TCP有一个非常重要的点就是可靠性,如何实现可靠性呢?
现在发一个消息给到对方,并不是发完就算了,一定要对方告诉我收到了消息才算真的发成功,
只要对端没有和我说,我就一直不停地重发,这个就是可靠性.
由可靠性需要考虑,怎么证明已经将消息发出去了才能发下一个消息呢?
这样要对每一个消息做一个编号,英文名就是序列号,客户端和服务器同时在发消息(双工).
双工和单工的典型代表就是TCP协议和HTTP协议.
我们发HTTP协议的时候,浏览器发一个请求,服务器回一个响应,绝对不会出现服务器发请求要求浏览器响应.
在TCP中,在同一时间客户端和服务器端都可以给对端发消息,这时候就需要对方的序列号,否则就无法回复
对方收到了哪个消息,是第一个消息还是第二个还是第三个呢,序列号不能从0开始,如果从0开始就会
让很多个连接(比如client和server可能断开又重现建连接)之间混淆,所以序列号是根据很多数字生成
的相对
随机的数字,在TCP握手通讯之前一定要获得对方的序列号,怎么获得呢?就是通过三次握手.
这就是需要握手的原因.
当然握手过程中不仅仅同步了序列号,还同步了MMS(最大报文长度),滑动窗口等.

为什么是3次握手呢?不能是4次呢?关连接的时候都是4次呢?
客户端和服务端说它要建立连接了,客户端把自己的序列号发送给服务器端,服务器端说我收到了,
服务器再把自己的序列号给客户端,客户端再说自己收到了,正常来说是4次,关连接的时候也是
四次,为什么建立连接的时候只能是三次不能是4次呢?
主要在于关连接的时候可以使得连接处理半打开状态,继续传输消息,也就是说server说我关连接了,
client没有关连接的情况下,client还可以继续长时间地去发送消息,究竟多长时间呢?就是服务器
没有强制关闭连接且符合协议的情况下,可以几天几个月不关都是可以的,linux下永远不会对半打开
状态设置超时时间,可以无限地使用这个时间.所以一定是fin包加ack包,客户端服务器端各收发一个
fin包和ack包.
在握手的时候这样是不可以的,因为在握手的时候不可以在半打开状态下就开始传输消息,这个是TCP
的规范所不允许的,所以server在回复ack的情况下就必须把它自己的sequence也发给客户端.

2.说说HTTP协议中缓存的处理流程?缓存的应用流程?与缓存相关的HTTP头部?

 

两个考核点:
1.是否理解缓存,应用流程到底是什么,过期缓存304,200之间的差别是什么?
  缓存在代理服务器和浏览器中是如何出现的?
2.控制缓存的http-header是什么?他们是怎么控制的.

答:
图中是restful架构,可扩展性好.缓存cache,因为和cash很相近,所以英文文档中将其画作$号.
UserAgent     --浏览器,可以有缓存
Proxy         --正向代理服务器,可以有缓存
Gateway       --反向代理服务器,有时候也是我们的负载均衡,如Nginx
Origin Server --可以是我们的tomcat等服务器

关于缓存我们要注意一点:
过期缓存也有很大的作用,比如说浏览器中的缓存已经过期了(超过其定时器的时间),浏览器并不会立刻
把缓存删除,它会把缓存打一个标签,我们将其称为摘要,这个摘要可以根据其长度和时间生成,这个摘要
是由服务器生成,客户端浏览器会保存这个摘要,接下来发起请求的时候会把摘要也带个服务器,服务器
根据摘要信息判断摘要对应的缓存是不是现在最新的,如果发生了变换就会发送200,把新的摘要和新的响
应发给客户端,如果摘要没有发生变化就不需要重新发送httpbody了,直接发送304-not modified就可以
了,这样就大量节约了httpbody所占用的带宽.

过期的共享缓存有很多用途,比如说提升用户体验,防止高并发的请求把后边的server打挂了,这个都是
这道题可以注意扩展的地方.

httpheader如何控制缓存是否过期时间非常复杂的,比如说Cache-Control中的max-age听着好像挺简单的,
但是max-age出现在http-request请求中和出现在http-response响应中表示的意思是完全不同的.
max-age-In-http-request:告诉代理服务器,如果代理服务器有缓存且缓存时间特别长了,超过max-age
                        的秒数,就不要再将缓存给客户端了,此时客户端认为服务器端的缓存已经
                        无效了,直接到原始服务器上去取最原始的数据.
max-age-In-http-response:告诉客户端,缓存的body时间最多只能到max-age秒,超过这个事件就应该
                         其作为过期来处理.
还有即使你的资源没有配置缓存,比如Nginx上直接配上expire就可以了,期待什么时候过期,就会自动
地在response中加响应的cache-control的字段,但是即使你忘了加这个字段,很多浏览器都会自己去
假定一个缓存时间,如何假定呢?它门会根据last-modify这个字段,实际上几乎所有的静态资源服务
器都会返回这个字段,通过http协议中的last-modify字段来说明这个资源上次是什么时候修改的传给
浏览器,浏览器根据它当时下载这个资源的时间,将两个时间乘以百分之十算出一个定时器,用这个定时
作为缓存的一个超时时间,其实这个是很复杂的.

这道题不一定需要完整答出,当然回答地越全面越透彻越好.

3.在地址栏键入URL后,网络世界发生了什么?

考查:
1.应用层;
2.系统层.

输入域名,转换成IP地址肯定要有一个DNS,通过DNS转换成IP地址,转成IP地址后可能会经历缓存,
如果缓存没有命中,可能会经历正向代理,正向代理可以也会也有缓存.正向代理到反向代理之间
可能又会经历DNS,从反向代理到负载均衡到源服务器,把这个流程说出,是第一个考点;

第二个考点考的是HTTP的编码,在地址栏输入的是http+域名+url,但是这个并不是HTTP请求的
编码,请求编码如上图,浏览器会自动的将其转换成图中的http请求的格式,包含方法,url还有
后面的版本,headers等,它是通过这样的方式来进行编码的.

第三个点是消息如何传递到服务器的.此处考查网络分层.网络如果不分层就太复杂了,1978年
以前tcp协议是不分层的,很难维护.后来分层之后每一层只解决各自的问题,就方便很多.TCP
层主要解决的的是进程到进程的,比如一个Chrome进程访问后面的Nginx进程.
IP层解决的是主机到主机的,包括中间的路由;
数据链路层解决的是一个局域网络内的通信和网络间的通信等.

4.使用HTTP长连接有哪些优点?

 

长连接和短连接是如何区分的,是通过一个http-header来区分的,这个http-header叫做connection,
connection后面跟close的时候就是短连接,谁来决定它是短连接呢?所有服务器都会决定,服务器只要 
收到的connection是close,再发完response以后就会关连接.长连接时connection对应的值是
keep-alive.图中串行连接是短连接,需要反复建立连接.

对于减少握手次数很好理解,4个请求,长连接一共7次握手,短连接则要28次握手.

减少慢启动影响,TCP有一个特点,不管是在传1GB还是在1byte,都是支持的,这个是它
非常了不起的地方,但是如果使用UDP,就不行了,发送100M文件都会很糟糕完蛋.
TCP做到这一点就导致它有一个问题,它先天性的问题就是发一个GB或者一个字节就有
尽量发,因为后面可能还有很多内容在等待发送,就想要快速发给对方,只要对方和我
的处理能力都足够应付(比如我们的内存都足够大,比如发送端和接收端都有1GB),
这样的快速发送可以吗?不可以的.因为网络带宽不够.对方操作系统的内存是足够的,
但是中间的公网的网络资源是非常紧张的,所以如何解决这个问题,就靠大家都流控,
TCP下的客户端和服务器天生自带流控,中间的网络带宽有限,每个TCP连接都先天性
地想把带宽占满,如何解决这个问题呢?就要采取慢启动,大家开始都慢一点,然后
再变快,这样的话,使用短连接,每一个连接都要经历从慢到快到最适合的那个速度,
所以这个影响是非常大的.


长连接的缺点:
TCP协议也是一种字符流式协议,就是传一个文件,一定要从文件的头传到文件的尾部,一个字节一个字节的
顺序不可以乱,只有一个请求的时候是无所谓的,一个请求本来就是不能乱的,但是如果在一个长连接上
传很多个请求,这些请求出现第一个没传完绝对不能传第二个的情况,变成串行的了,串行的情况下就有一
个叫做队头阻塞的问题,只有有一个报文丢包了,后面的即使传过去了对方的应用层也不能接受.
第十题http2的时候还会说到对头阻塞的问题,暂时先到这了.

5.介绍下close_wait状态产生的原因

这个状态特别有用,只要看到这个状态,就说明程序有bug了!!!
这个是程序bug,不是配置上的问题,要么是中间件的,要么是应用层的.
本题考查的是TCP状态机(很有用).
关闭连接的时候,双方都可以作为主动关闭连接方.
主动关闭连接方--主动端
被动关闭连接方--被动端
主动端的状态:FIN-WAIT-1,FIN-WAIT-2,TIME-WAIT
被动端的状态:CLOSE-WAIT,LAST-ACK
一般来说服务器对FIN-WAIT-1,FIN-WAIT-2,TIME-WAIT这几个状态都要进行精密化控制,
Linux下FIN-WAIT-1,FIN-WAIT-2是1min,TIME-WAIT是2min,可配置.
对于被动端的CLOSE-WAIT这个时间可以非常长,因为TCP协议允许全双工进入半打开连接这样
的一个状态,只有一端可以发消息一端不可以发了,当然长时间使用这种状态的连接是很少的,
如果用netstat命令看到了CLOSE-WAIT状态的连接,一般来说就是程序出Bug了.

也许回答到这里就够了,如果你对Linux更了解的话可以做延展,每一个状态都有很多sysctrl的
参数可以去控制,比如说重试次数,超时时间等.

6.介绍下多播是怎么实现的?

大家对TCP和UDP中的单播很熟悉,但对一对多这种多播可能就不那么熟悉.
多播目前主要是在局域网中使用,在广域网上使用较少,但华为前些天的NEWIP方案
就可以实现广域网上的多播.

什么是多播?
比如说IPTV,如果家里的网络受到攻击,有些病毒直接把路由器中的一些参数改了,
比如说ARP报文攻击也是一种多播.

多播分为:
(1)广播,向255.255.255.0发送UDP消息的时候就是一个广播消息;
(2)组播:对一部分机器发送消息.

多播的好处:
比如单播发1G的文件,如果给100个机器发,就意味着这台机器消耗的流量是100G流量,单播中
复制报文需要主机的CPU一直不停地复制,复制100份.
多播场景下向100台机器分别发1G的文件,是由网络设备(交换机和路由器)来做这个事情的,
它们会复制好直接转发,所以这个对发送端有巨大的性能提升,整个网络的带宽消耗的更少(为啥?).
所以华为要在5G时代实现广域网的多播.

升入问:
为什么可以广播?IP地址的特点,MAC地址全一的情况下就是一个广播.
组播又有什么特点?老师没有展开了,可自行查资料.

7.服务器的最大并发连接数是多少?

并发连接由一个TCP四元组决定的,包括:
IP报头中的源IP,
IP报头中的目的IP,
TCP报头中的源端口,
TCP报头中的目的端口.


端口很重要,端口与进程关联,没有端口就没有办法关联到进程.
目的端口和目的IP地址决定的情况下,可以建立多少个连接呢?
2的48次方.


这样的回答是不够的的,因为需要考虑实践能力.
比如说如何在Linux上实现更多的并发连接数?
需要考虑到ip-local-port-range,因为端口范围是受限的,需要将其打开.
另外也需要考虑到一台机器可以拥有不止一个IP地址,可以有很多虚拟的IP地址,
可以有很多网卡,更多的物理IP地址,这些都可以纳入考点.

延展:
1.如何实现高并发?
  处理一个连接的时间不要太长,一个连接太长的情况下会导致其他连接超时;
  所以需要将处理一个请求的粒度切得很小,一般来说这时我们就采用事件驱动和无阻塞技术了.
2.Linux下的高并发优化?
  设计到很多了.需要研究钻研.大厂千万并发连接等着你.

8.TCP和UDP协议如何选择?

TCP的选择:

(1)TCP是字符流协议,可以传任一长度的消息.微观上网线上的这些消息虽然是一个一个字节,
但是操作系统发出来的时候是一个报文一个报文来的,一个报文是有长度的,比如说在以太
网中是1500字节.UDP只能按照报文这种方式来.但是TCP协议操作系统将其封装好了,传多少
都可以,只要你想要传任一长度的消息,就肯定不能采用单纯的UDP协议了,如果用了UDP协议
上层的应用协议肯定做了非常复杂的封装才能实现.
(2)TCP可靠的.
(3)TCP的流量控制优势:
   比如说需要在网络中传输大量消息的时候如果采用的UDP协议,一定要在上层  
   做大量的流控的.否则也会将服务器打挂了.
   TCP有自己的流量控制
   (a)滑动窗口的流量控制,通过缓冲区接受窗口实现两台机器间的流量控制;
   (b)网络链路的流量控制,拥塞控制把网络链路也进行了流量控制.


如果你需要TCP的四个特点或者不想在应用层封装这四个特点的时候,就要选择TCP.


UDP的选择:
(1)一对多通信;
(2)效率很高:
   UDP的header远远短于TCP的header,有效信息的占例(传递的消息长度/报文的长度)非常高.
   我们知道TCP中的Nagle和KOC等算法都是在想办法提高有效信息的占比,他们很担心TCP的庞大
   的头部信息会使得数据在网络中的传递信息很低.
(3)简单:所以http3就没有用tcp了,因为tcp很复杂;
(4)实时性非常好,如车联网或者语音直播要是用tcp那就要完蛋了,这些要求实时性更好.

9.TLS/SSL是如何保障信息安全的?

1.PKI证书体系,解决信任问题,通过IC或者非对称加密来解决的;
2.消息通过对称加密算法来加密的,对称加密算法只要秘钥大家不知道,哪怕所有的加密流程是公开的,
  中间的一些替算法中的XBOX这些参数全部公开,也无法在不知道秘钥的情况下将密文反推成明文.
  SSL是基于对称加密算法的,对称加密速度非常快(非对称加密算法的速度很慢,涉及到大量的运算),
  如何能传递这个秘钥呢?这个就是交换秘钥协议需要做的事情,秘钥交换协议的版本数非常多,客户端
  和服务器之间无法建立SSL协议就是因为需要在握手阶段协商使用哪种秘钥交换协议来传递后面对称加 
  密时使用的密码;
     (秘钥交换协议有很多种,目前使用的是椭圆曲线ECCDH,椭圆曲线要比以前DH秘钥交换协议快很多,
      而且有前向安全性的,)
3.主流对称加密算法:AES(高级加密算法)
前向安全性:假设你把传输报文保存下来了,过了两年终于破解出私钥,你也必须要重新破解
            两年前保存下来的密文,不能直接破解两年前的那个密文(没听明白).RSA就没有
            前向安全性,任何时间破解出私钥,前面保存的密文就可以很容易被破解.

秘钥不匹配的可能情况:
服务器使用了TLS1.3,TLS1.3是OpenSSL1.1版本下的,那个版本下只支持5种秘钥交换协议,因为以前的
秘钥交换协议有一个攻击破站,中间人可以降级攻击,客户端和服务器端可能都有很多加密算法,直接
通信就会选择最安全的,有中间人的话就会降级加密算法比如采用DES算法(非常容易被破解,秘钥长度
只有58个bit位,太短),所以TLS1.3不再接受早期的秘钥交换协议了,此时如果客户端不支持TLS1.3,就
无法建立起连接.TLS1.2为了好用,不管多老的客户端都可以建立连接,TLS1.3对于不安全的连接就不接
受了.所以如果使用新的浏览器就没有问题,肯定都支持,但如果客户端是自己写的,建议尽快升级到TLS1.3.

10.HTTP2协议有哪些优点?

 

大厂基本都升级到HTTP2.0了,谷歌的gRPC基于HTTP2.0,HTTP2.0现在比较基础.
回答这个问题,要知道HTTP1.0,HTTP1.1的缺点:
(1)header太长了,cookie很大,user-agent太恐怖了;
(2)长连接的情况下不支持多路复用,长连接可减少慢启动,尽量减少两端的资源消耗.
 

HTTP2.0如何解决:
(1)消息推送和多路复用;
(2)HPACK编码;
(3)Stream优先级.


关于消息推送:
HTTP1.1不支持消息推送,比如现在访问一个站点,默认浏览器发送的请求是index.html,之后浏览器解析
需要xxjquery.js或xxx.css文件,这就要一来一回了,但其实服务器在客户端访问index.html的时候,服务
器是知道的,服务器可以主动把相关资源推送给客户端,这样速度很快,HTTP2.0支持了.


关于多路复用:
在一个TCP连接上可以传很多个请求,一个Chrome下最多有6个TCP连接,一个页面动辄四五百个对象,
一个连接传七八十个资源且串行,传完第一个才能传第二个,这样可以想象打开一个门户站点会很慢,
但是如果使用了HTTP2.0就会有很大差异,因为HTTP2.0,一个TCP连接理论上可以将400个对象同时传
给客户端(当然实际上不会同时传,有优先级-有些js和css优先级很高,一些视频图片重要性没有那
么高,另外还要考虑带宽).


HPACK编码(H--Header):
通过四种手段将编码缩小到原来二分之一以内.
静态表
动态表
静态哈夫曼
整数编码

Header中有些资源反复传,如user-agent,可以用某个数字来代替它,常用的定义了61个header,这61个
Herder写死到代码中了;
动态表非常用,第一次出现两边都记一下,之后就用约定好的数字传;
以前的整数如100000,7个ASCII,其实一个整数4个字节就可以了,4个字节可以表示到40个亿,所以同样
是1000000,之前需要7个字节,现在3个多字节可能就搞定了.


Stream优先级:
一个页面中的每种资源的重要性是不一样的,CSS和JS不出来的话,用户绝对是看不了这个页面的,看不
图和视频没关系,但要现有一个轮廓,这个就要求HTTP2.0要支持不同资源的不同优先级,这个优先级会
影响谁呢?
影响中间的代理服务器,这些服务器在支持HTTP2.0的时候需要预分配大量的内存用作缓存,如果优先级
很高,就可以获取更多缓存资源和带宽资源;
优先级也有个依赖关系,比如说框架类的优先于应用类的,所以在传输的时候要设置不同的优先级.
在抓包的时候也可以发现优先级,每个请求Chrome都会按照自己的算法来设置优先级.

 

 

 

第一次当面试官,挂了一个两年经验的!

https://blog.csdn.net/weixin_44055176/article/details/108838082

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值