10 道大厂面试必考的计算机网络问题-陶辉 极客时间

大厂中更多会考察你的长板.

在大厂中要学会求助

1.TCP的三次握手机制,为什么要三次?

为什么需要握手?

需要同步序列号,当然也有MSS(最大报文段长度),滑动窗口.

为什么是3次?

正常想法应该是:

C:我要建连接,我的seq是这个;

S:我收到了

S:我的Seq是这个

C:我也收到了

关连接的时候就是这样的思路.关连接的时候,允许消息处于半打开状态.Server关连接,而Client没有关连接的情况下,Client还可以长时间的发送数据(linux中不会对半打开状态下设置超时时间).

而建立连接时不允许半打开状态(半建立状态)就收发消息,因此需要Server同时发送确认ack和自己的序列号seq.

ps: HTTP:是单工,client发请求,server发响应.TCP:双工.

2.HTTP协议缓存处理流程

过期缓存304和200之间的差别.

$:cash,和cache发音相似,用来表示缓存.

Proxy:正向代理服务器,代理客户端

Gateway:网关,可以充当反向代理服务器,代理服务端.

根据摘要信息判断缓存是否最新,如果没有改变,会发送304告诉客户端没有改变;如果改变发送200,并重新获取资源.

3.输入URL后发生了什么

http请求的编码并非简单的是你输入的网址.

tcp:进程到进程

IP:主机之间

mac:局域网内的通讯

4.HTTP长连接的优点

长连接:connection:keep-alive

短:connection:close

连接越多,占内存越多,切换连接也会占用更多的cpu.

TCP支持1GB的文件也支持1B的文件,UDP发送大文件就有问题(因为TCP建立连接,是流传输的,有丢包重传机制;而UDP对于大文件,需要分批传输,UDP可能会丢包,导致文件不能够正常使用).

慢启动:每个TCP连接过程,一开始不分配太大的带宽,慢慢地把速度提上去.如果连接多,经历的慢启动的时间也会增多.

缺点:TCP是字符流协议,需要从文件头传到文件尾,一个字节一个字节的传,顺序不能乱. 如果只传输一个请求无所谓,不会有顺序乱的问题.如果在一个连接上同时传输多个请求,第一个没传完绝对不能第二个,是一种串行的方式.会出现队头阻塞,一个报文丢包了,那么后面的即使传过去了,对方的应用层也不能接收.

5.CLOSE_WAIT产生的原因

这个状态表示程序出了bug,而不是配置上的问题.

在关闭时不提客户端还是服务端,因为两者都可以发起关闭的请求,这里用主动端和被动端.

主动端的FIN_WAIT_1,FIN_WAIT_2,TIME_WAIT,服务器端会对这三种状态进行精细配置,linux下默认前两个是1min,最后一个是2min.

被动端的CLOSE_WAIT可以长时间存在,TCP允许这种半打开的状态,一端可以发消息,另一端不可以发了.但这种状态的场景是很少的,一般看到CLOSE_WAIT,应该是出bug了.

6.多播

多播包括广播和组播,一般是局域网中使用,5G中将在互联网中使用多播.

IPTV就是多播,arp攻击也是多播.

在多播中,网络设备去复制报文.

7.服务器的最大并发连接数

端口和进程是关联起来的,如果没有端口就没法关联到进程.

1台服务器它的ip在确定的情况下,目的ip和目的端口可变的情况下,可以建立2^(32+16)个连接. 

实践层面:在linux下可以配置ip_local_port_range把端口的范围进行修改.一台服务器可能有多个网卡,有很多虚拟ip地址,物理ip地址.

实现高并发的关键点在于不要处理一个连接的时间太长,否则会导致其他连接超时.把粒度切得非常小,这时候适合使用事件驱动的方式(无阻塞).

8.TCP/UDP的选择

TCP:字符流协议,可以传递任意长度的消息.要利用UDP实现传输大文件,需要应用层做比较复杂的封装.用UDP传输大量的消息时,需要在应用层做流量控制,否则会把网络打死.而TCP自带流量控制,包括滑动窗口(通过缓冲区,接收窗口)?

UDP:用UDP可以实现广播,组播,TCP不行. 效率高:UDP的报文头比TCP小很多,有效信息占比高.HTTP3不用TCP,用UDP.TCP由内核实现的.实时性更好,适合直播,车联网等.

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

PKI证书:解决信任问题,通过非对称加密(比如RSA)解决的.

对称加密(比如AES)要比非对称快很多.

传递密钥需要用到密钥交换协议,需要在SSL握手时确定使用哪种交换协议,目前主要使用的椭圆曲线.椭圆曲线比之前的DH协议快很多,而且有前向安全性(就算后来破解了密码,之前的数据还是不能用).

10.HTTP2的优点

gRPC使用的是HTTP2.0.

1.0的缺点:

-header太长了,比如cookie里存了很多东西,User-Agent也很长,而且每条请求都会发一遍,很浪费带宽.

-长连接时,不支持多路复用.

2.0解决方案:

-消息推送:1.0中对于服务器返回来的响应,浏览器会解析,可能此时需要css,js文件,再向服务器去请求,这就多了交互次数.而实际上服务器可以把关联性的资源推送.

-多路复用: 1.0中目前chrome中最多支持6个TCP连接,而现在网页中动辄成百上千个资源,每个TCP连接需要传输很多的请求,而且是串行的.而2.0可以多路复用,可以一次性传输很多个对象(当然也有优先级).

1.0的编码效率低,2.0可以压缩一半以上.

比如用数字来代替user-agent;

常用的61个header写死在代码中,称为静态表;不在这里的,建立动态表.

之前用字符串表示整数比较浪费内存,比如"1000000"需要七个字节,而实际上一个整数4个字节(32位)就可以了,而且可以表示到40多亿.

css,js不出来时是看不到页面的,可以先把这些加载出来.

再比如依赖中,先加载框架类的资源,再加载应用类的.

整理自B站视频:10 道大厂面试必考的计算机网络问题_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingLife99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值