大厂中更多会考察你的长板.
在大厂中要学会求助
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