2msl 《我想进大厂》之网络篇夺命连环12问
转自:艾晓贤
谈谈你对TCP/IP四层模型和OSI七层模型的理解?
为了增强通用性和兼容性,计算机网络被设计为分层组织,每一层都遵循一定的规则。
因此,以OSI作为网络通信的抽象参考模型,计算机网络系统可以按照这个标准相互连接。
数据链路层:首先将比特流封装成数据帧格式,0和1分组。电脑连接后,数据通过网卡传输,网卡上定义了世界上唯一的MAC地址。然后通过广播的方式将数据发送给局域网内的所有电脑,再根据数据中的MAC地址与自身的对比来判断是否发送给自己。
网络层:广播形式太低效。为了区分哪些MAC地址属于同一个子网,网络层定义了IP和子网掩码,通过and运算可以知道是否是同一个子网,然后通过路由器和交换机进行传输。IP协议属于网络层协议。
传输层:有了网络层的MAC+IP地址后,为了确定数据包是从哪个进程发送的,就需要端口号来通过端口建立通信。比如TCP和UDP就属于这一层协议。
会话层:负责建立和断开连接
表示层:为了使数据被其他计算机理解,数据被再次转换成另一种格式,如文本、视频、图片等。
应用层:最高层,面向用户,提供最终呈现给用户的计算机网络和接口
TCP/IP是四层结构,相当于OSI模型的简化。
数据链路层也称为网络接入层和网络接口层。它包括OSI模型的物理层和数据链路层,连接计算机。
网络层,也称为IP层,处理IP数据包的传输和路由,并建立主机之间的通信。
传输层为两台主机设备提供端到端通信。
应用层包括OSI会话层、表示层和应用层,提供一些常用的协议规范,如FTP、SMPT、HTTP等。
综上所述,物理层通过物理手段连接计算机,数据链路层对比特流的数据进行分组,网络层建立主机到主机的通信,传输层建立端口到端口的通信,应用层最终负责建立连接、数据格式转换并呈现给用户。
谈谈TCP三次握手的过程?
在建立连接之前,服务器端需要监听端口,所以初始状态是监听。
客户端建立连接并发送同步数据包。发送后,状态变为SYN _ SENT
服务器端收到SYN后,同意建立连接,返回ACK响应,同时向客户端发送SYN包。发送后,状态变为SYN_RCVD
当从服务器接收到确认时,客户端变为已建立,并将确认返回给服务器端。服务器收到后,状态也会变为“已建立”,连接也就建立了。
为什么三次?两次,四次?
因为TCP是双工传输方式,不区分客户端和服务器,所以连接的建立是一个双向的过程。
如果只有两次,则无法建立双向连接。从连接建立服务器回复的SYN和ACK的组合可以看出,不需要四次。
你为什么挥四次手?因为挥手ACK和FIN不能同时发送,因为数据传输的截止时间不同。
挥舞四次的过程呢?
客户端向服务器发送FIN数据包,进入FIN_WAIT_1状态,表示客户端没有数据可发送。
服务器收到后会返回一个ACK,进入CLOSE_WAIT等待关闭的状态,因为服务器可能还有未完全发送的数据。
服务器端所有数据发送完毕后,服务器端向客户端发送FIN,进入LAST_ACK状态
客户端收到确认后进入TIME_WAIT状态,同时回复确认。服务器收到ack后直接进入CLOSED状态,连接关闭。但是,客户端将在进入CLOSED状态之前等待2MSL。
为什么要等2MSL才关门?
为了确保可靠的连接闭合。如果服务器没有收到最后一个确认,FIN将被重新传输。
避免端口复用造成的数据混乱。如果客户端直接进入CLOSED状态,用相同的端口号建立与服务器的连接,最后一次连接的部分数据会在网络中较晚到达服务器,数据可能会混淆。
TCP怎么保证传输过程的可靠性?校验和:发送方在发送数据前计算校验和,接收方在接收数据后计算校验和。如果不一致,说明传输错误。
确认响应,序列号:数据在TCP传输时进行编号,每次接收方返回ACK时,都有一个确认序列号。
超时重传:如果发送方在发送数据一段时间后没有收到ACK,就会重传数据。
连接管理:三次握手和四波过程。
流量控制:TCP协议报头包含16位窗口大小,接收方在返回ACK时会填写其即时窗口,发送方根据报文中的窗口大小控制发送速度。
拥塞控制:数据传输开始时,拥塞窗口为1,每次收到ACK后,拥塞窗口为+1,然后拥塞窗口和收到的窗口取较小值作为实际传输窗口,超时重传时,拥塞窗口复位为1。这样做的目的是确保传输过程的效率和可靠性。
说说浏览器请求网址的过程。
首先由DNS服务器将域名解析为IP地址,通过IP和子网掩码判断是否属于同一个子网
应用层请求http消息,传输层添加TCP/UDP报头,网络层添加IP报头,数据链路层添加以太网协议报头
数据通过路由器和交换机转发,最后到达目标服务器。目标服务器还解析数据,最终得到http消息,并根据相应程序的逻辑进行响应。
你知道HTTPS是怎么工作的吗?
用户通过浏览器请求https网站,服务器收到请求后,选择浏览器支持的加密和哈希算法,将数字证书返回给浏览器,包括颁发机构、网站地址、公钥、证书有效期等信息。
浏览器验证证书的内容,如果有问题,会有提示警告。否则,将生成一个随机数x,用证书中的公钥加密,并发送到服务器。
服务器收到后,用私钥解密得到随机数X,再用X对网页内容加密后返回给浏览器
浏览器使用X和先前商定的加密算法来解密并获得最终的网页内容
负载均衡的实现方法有哪些?
DNS:这是最简单的负载均衡方式,一般用于实现地理层面的负载均衡。不同地区的用户可以通过DNS解析返回不同的IP地址。这种负载均衡方式简单,但是扩展性太差,控制权在域名服务提供商。
Http重定向:通过修改Http响应头的Location,302重定向Http来达到负载均衡的目的。这种方法会影响性能并增加请求时间。
反向代理:作用于应用层的一种模式,也称为七层负载均衡,比如常见的Nginx,其性能一般可以达到1万级。该方法部署简单,成本低,易于扩展。
IP:作用于网络层和传输层的一种模式,也称为四层负载均衡,通过修改数据包的IP地址和端口来达到负载均衡的效果。LVS很常见,它的性能可以支持100,000个并发。
按类型也可分为DNS负载均衡、硬件负载均衡和软件负载均衡。
其中硬件负载均衡价格昂贵,性能最好,可达百万,软件负载均衡包括Nginx和LVS。
说说BIO/NIO/AIO的区别?
BIO:同步阻塞IO。对于每个客户端连接,服务器将对应一个处理线程。未分配给处理线程的连接将被阻止或拒绝。相当于一个连接和一个线程。
NIO:同步无阻塞IO。基于反应器模型,客户端与通道通信,通道可以读写。多路选择器轮询其上注册的通道,然后执行输入输出操作。在这种情况下,使用另一个线程来处理IO操作就足够了,即一个请求和一个线程。
AIO:异步无阻塞IO,相比NIO,完全由操作系统完成请求处理,然后通知服务器打开线程进行处理,所以是一个线程的有效请求。
那么如何理解同步和阻塞呢?
首先,我们可以认为一个IO操作由两部分组成:
启动输入输出请求
实际输入输出读写操作
同步和异步在于第二个,实际的IO读写操作。如果操作系统帮助您完成,它将是异步的,否则称为同步。
阻塞和非阻塞位于第一个,它启动IO请求。对于NIO,通过通道发起IO操作请求后,实际返回,所以是非阻塞的。
你对反应堆模型有什么理解?
反应堆模型由两部分组成:
反应堆:负责查询和响应IO事件,当检测到IO事件时,分发到Handlers进行处理。
处理程序:绑定到IO事件,负责处理IO事件。
它包含几个实现:
单线程反应器
在这种模式下,反应器和处理器在同一个线程中。如果一个处理程序被阻塞,所有其他处理程序都不会执行,多核的性能也不会得到充分利用。
单反应器多线程
由于解码、计算和编码的操作都不是IO操作,多线程Reactor的思想就是充分发挥多核的特性,将非IO操作分离出来。
然而,单个反应堆负责所有事件监控和响应工作。如果连接太多,可能仍然存在性能问题。
多反应器多线程
为了解决单反应器的性能问题,产生了多反应器模式。主反应器建立连接,多个子反应器负责读写数据。