0


常见网络知识面试题总结

🍓个人主页:个人主页

🍒系列专栏:C/C++基础与进阶

💬推荐一款模拟面试、刷题神器,从基础到大厂面试题👉点击跳转刷题网站进行注册学习

   无论是软件开发人员,还是测试人员,亦或是运维人员、技术支持人员,都需要掌握一些常用的基础网络知识,以用于日常网络方面问题的排查。这些基本的网络知识与概念,不仅日常工作中会用到,找工作时的笔试面试也会涉及到。大部分IT岗位在面试或笔试时都会问到这些常见的网络问题,今天就在这里详细地总结一下,以供参考。本文的内容适用于应届生、有工作经验的人。

1、OSI七层模型与TCPIP四层模型是什么?

   **OSI参考模型**分为7层,分别为应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。

OSI七层模型的全称为开放式系统互联通信参考模型(Open System Interconnection Reference Model),它是一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。

  ** 基于TCP/IP的参考模型**将协议分成四个层次,分别为应用层、传输层、网络层和物理链路层。也可以将物理链路层拆为两层,一个是数据链路层,一个是物理层,这样TCPIP模型就变成了五层一般我们使用的四层模型。

TCP/IP的全称为传输控制协议/网际协议(Transmission Control Protocol/Internet Protocol),它是一组用于实现网络互连的通信协议,是构建Internet互联网的基础,Internet网络体系结构是以TCP/IP为核心的。

   平时主要使用TCP/IP四层模型。从wireshark中抓到的数据包中能看到每一层的数据信息,如下所示:

2、为什么说TCP是可靠的?

   TCP是基于连接的,在进行数据通信之前需要先通过三次握手建立TCP连接,TCP连接建立后才能收发数据。在收发数据时有个ACK确认机制,数据发送方在将数据发出后,需要等待对方的ACK包回应,收到ACK包才表示对方收到数据了,才会接着发下一包。

   如果在指定的时间内没有收到对方的回应,则会触发丢包重传。正是三次握手、ACK确认、丢包重传等机制的存在,保证了TCP的可靠性。

3、为什么说UDP是不可靠的?UDP的优势在哪里?

    UDP是无连接的,在收发数据之前不需要建立连接,直接将数据丢到目标IP和端口上就可以了,不确定对端是否收到了数据,没有TCP中的ACK确认机制,也没有TCP中的丢包重传机制。所以,UDP是不可靠的。但UDP因为没有TCP的ACK确认机制,数据发送的实时性比较好。

4、TCP和UDP区别有哪些?

   TCP是基于连接的,有ACK确认机制和丢包重传机制,是可靠的,能保证数据能有效地到达对端。所以**软件中的控制信令一般使用TCP传输**,因为控制信令需要准确无误地传输到对端。

    TCP在收发数据时有ACK确认机制,发送数据时收到ACK确认后,才会发送下一包,这虽然给数据传输带来了可靠性保障,但这也会给数据传输的效率带来影响。而UDP是无连接的,没有繁冗的ACK确认机制,数据传送的效率比较高,虽然不能保证数据的可靠传输,但实时性比较好,比如在**传输数据量较大的音视频码流时会选择使用UDP**。

相对于控制信令,音视频数据(声音和图像)有少量的丢包时可以容忍的,但要保证音视频的实时性。比如在视频会议系统中音视频的实时性要求是比较高的。

5、建立TCP连接的三次握手流程是什么?

   TCP的三次握手,是指建立一个TCP连接时,客户端和服务器之间一共发送3个包才能完成连接的建立。三次握手的目的是连接服务器指定端口、建立TCP连接、同步连接双方的序列号和确认号并交换 TCP 窗口大小等信息。在socket编程中,客户端执行connect接口去连接目标IP和端口,就会触发三次握手的流程。

   从wireshark的抓包来看,可以看出完整的三次握手的全过程:

在排查远端服务器无法连接时,可以通过wireshark抓包,查看三次握手的相关流程有没有走完。

   三次握手的流程如下:

(1)第一次握手

客户端发送一个TCP的SYN标志位置1的包,指明客户打算连接的服务器的端口,并将包的序号设置为X。
(2)第二次握手

服务器收到客户端发来的SYN包,给客户端回ACK确认包,包中的SYN标志位和ACK标志位设置为1,并将ACK确认号设置为Y
(3)第三次握手

客户端收到服务器的ACK包,客户端给服务器发送一个ACK确认包,包中的SYN标志位设置为0,ACK标志位设置为1,并把包中的SEQ号设置为X+1,把ACK号设置为Y+1。

服务器收到客户端发来的ACK包后,TCP连接建立了,连接就编程了established已建立状态。

6、为什么TCP必须使用三次握手,不能用两次握手去建立连接?

   三次握手的好处:

(1)三次握手目的是确认双方的接收与发送能力是否正常,同步连接双方的初始化序列号 ISN,为后面的可靠性传输做准备。而两次握手只有服务端对客户端的起始序列号做了确认,但客户端却没有对服务端的初始序列号做确认,不能保证传输的可靠性。
(2)三次握手可以防止已失效的连接请求报文段突然又传送到了服务端,导致服务器错误地建立连接,浪费服务端的连接资源。

   如果客户端发出的第一个连接请求报文并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达服务器侧。本来这是一个早已失效的报文,但服务器收到此失效的连接请求报文后:

(1)假设不采用“三次握手”,那么只要Server发出确认,新的连接就建立了。但由于现在Client并没有发出建立连接的请求,因此不会理睬Server的确认,也不会向Server发送数据。而Server却以为新的连接已经建立,并一直等待Client发来数据,这样,Server的很多资源就白白浪费掉了
(2)采用“三次握手”协议,只要Server收不到来自Client的确认,就知道Client并没有要求建立请求,就不会建立连接了。

7、什么是SYN包网络攻击?

** SYN 包攻击是指利用 TCP 需要三次握手的特性,攻击者伪造 SYN 报文向服务器发起连接,服务器在收到报文后用 ACK应答,但之后攻击者不再对该响应进行应答,造成一个半连接。**假设攻击者发送大量这样的报文,那么被攻击主机就会造成大量的半连接,服务器支持的总的连接数是有限的,最终会导致服务器连接资源耗尽,导致正常的 SYN 请求因为队列满而被丢弃,使得正常用户无法访问。

   这个问题我们以前遇到过,在一个项目中客户的网络环境比较复杂,其安全系统竟然向我们的业务服务器发SYN包攻击,导致我们的业务服务器无法提供正常的连接服务。

服务器侧有一个半连接队列和一个全连接队列。半连接队列是指,服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD状态,此时双方还没有完全建立其连接,服务器会把这种状态下的请求连接放在一个队列里,我们把这种队列称之为半连接队列。对于全连接队列,完成三次握手后建立起的连接就会放在全连接队列中。

8、简述TCP的丢包重传机制

   对于TCP连接,数据发送方将数据发出去后,会启动一个定时器,等待接收端回ACK确认包,如果在指定的时间内没有收到ACK确认包,就会触发TCP的丢包重传机制。如果发送重传包后还是没收到ACK,下一次的重传时间间隔会加倍,当重传次数达到系统上限(Windows默认的上限是5次,Linux默认的上限是15次)后,协议栈就认为网络出故障了,协议栈会直接将对应的连接关闭了。          

   所以当网络出现故障时有数据交互,协议栈会在数十秒内检测到网路出现异常,就会直接将连接直接关闭掉。丢包重传机制的详细描述如下所示:

9、TCP的四次挥手流程是什么?

    数据通信结束后,通信的双方都可以释放连接,将连接关闭掉。连接关闭时将会走四次挥手的流程如下图所示:

** (1)第一次挥手**
客户端A的应用程序先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。客户端A把连接释放报文段首部的FIN置1,其序号seq=x。这时客户端A进入FIN-WAIT-1(终止等待1)状态,等待服务器B的确认(请注意:TCP规定,FIN报文段即使不携带数据,它也要消耗一个序号)。

(2)第二次挥手
服务器B收到连接释放报文段后即发出确认,确认号是ack=x+1,序号为seq=y。然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭状态,即客户端A已经没有数据要发送了,但B若发送数据,客户端A仍要接收。也就是说,从服务器B到客户端A这个方向的连接并未关闭。这个状态可能会持续一些时间。

客户端A收到来自服务器B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待服务器B发出的连接释放报文段。

(3)第三次挥手
若B已经没有要向客户端A发送的数据,其应用进程就通知TCP释放连接。这时服务器B发出的连接释放报文段需要置FIN=1。现假定服务器B的序号为z(在半关闭状态B可能又发送了一些数据)。服务器B还必须重复上次已发送过的确认号ack=x+1。这时服务器B就进入了LAST-ACK(最后确认)状态,等待客户端A的确认。

(4)第四次挥手
客户端A在收到服务器B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack=z+1,而自己的序号是seq=u+1(根据TCP标准,前面发送过的FIN报文段要消耗一个序号)。然后进入到TIME-WAIT(时间等待)状态(请注意:现在TCP连接还没有释放掉。必须经过时间等待计时器设置的时间2MSL(MSL:最长报文段寿命)后,客户端A才进入到CLOSED状态)。

10、为什么是四次挥手,不能是三次挥手吗?

    如果只是三次挥手,那就相当于服务器端发送完第三次挥手的报文后直接进入CLOSED(关闭)状态,假如此时网络出现问题,丢失了第三次挥手的报文,相当于客户端没有收到,那他依旧认为连接没有结束,在一段时间没有收到第二次ACK应答报文后,他会重新发送请求断开连接的报文,但是服务器端已经关闭,不会再接收报文,又形成了类似死锁的情况。

11、四次挥手中为什么要有CLOSE-WAIT状态和TIME-WAIT状态?

   ** 对于CLOSE-WAIT状态**,因为服务器端收到断开TCP连接请求时,有可能还有数据没有向客户端发送完毕,需要一段时间来把所有信息传输完毕。

 **   对于TIME-WAIT状态**,假设客户端发送完第四次挥手的报文后,直接进入CLOSED(关闭)状态。那么假设此时网络出现问题,报文丢失,那么因为服务器端收不到第四次挥手的ACK报文段,所以认为此时TCP连接还没有断开。然后重发ACK+FIN报文段,但此时客户端已经关闭与其的TCP连接,肯定不会再接收该报文,这样会浪费大量资源。

12、什么情况下会出现大量的TIME-WAIT状态?该怎么解决?

    在高并发且短连接的通信情况下,服务器会出现大量TIME-WAIT状态,这占用了大量的socket,会影响服务器的正常通信服务。解决办法有:

(1)降低time_wait的时限;
(2)设置中允许重用time_wait的socket;
(3)设置快速回收time_wait的socket。

13、使用TCP的常见协议有哪些?使用UDP的常见协议有哪些?简单说几个

   使用TCP的常见协议有:HTTP超文本传输协议、HTTPS安全超文本传输协议、SMTP简单邮件传输协议(收发邮件)、FTP文件传输协议、SSH安全外壳协议(用于加密安全登陆,替代安全性差的Telent协议)

   使用UDP的常见协议有:DHCP动态主机配置协议、TFTP简单文件传输协议、SNMP简单网络管理协议。

14、如何判断访问目标地址的网络是通的?如何简单地查看到目标地址的网络是否有丢包和抖动?

   使用ping命令即可,可以ping域名,也可以ping IP地址。

   如果**软件系统在交互的过程中数据出现延时或抖动**,可以在ping指令后面加上一个-t的参数,比如ping 192.168.0.1 -t,查看连续的ping包,看网络是否存在明显的延迟或抖动,如下:

15、如果知道目标服务器的服务端口有没有开启?

   使用telnet命令可以检查服务器上的端口有没有开启监听,比如telnet 192.168.100.196 7800,如果7800端口没有开启监听,则会提示连接失败。

telnet命令其实对应的是telnet客户端程序(telnet.exe),该程序使用的是telnet协议。telnet协议是TCP/IP协议族中的一员,是远程登陆服务的标准协议和主要方式,它为用户提供了从本地计算机远程登录远程主机的能力。

   如果在Windows的cmd窗口中提示找不到Telnet,需要到控制面板->程序与功能->启用和关闭Windows功能中开启Telnet客户端,如下所示:

    有时即使程序开启了端口,可能也连接不上,可能是路由器或者防火墙禁用了该端口,导致发给该端口的数据(包括连接请求)都被拦截了,此时需要在网络环境中放行该端口,即不再拦截与该端口相关的数据。

16、如何查看网卡上的地址配置信息?如何刷新系统DNS缓存?

   在Windows系统中,主要使用ipconfig命令。ipconfig命令主要用来查看网卡的配置信息,比如IP地址,子网掩码和默认网关等,一般使用ipconfig /all,如下所示:

还有比较常用的是ipconfig /flushdns命令,用来清除系统中的DNS缓存:

17、使用哪个命令查看本机的网络连接及端口信息?

    netstat命令用来查看本机的网络连接与端口占用情况,如下:

netstat命令支持多个参数,具体使用netstat /?去查看详细说明:

18、在Windows系统中如何查看系统路由表?Windows系统中有两张网卡,如何解决访问内网和外网的问题?

    route相关命令主要用来查看路由表、添加/删除路由等。首先来看看route print命令,该命令是将Windows系统中的路由表打印出来,如下图所示:

    route add命令可以往路由表中添加一条路由,route delete命令可以删除一条路由。命令具体怎么使用可以使用route /?命令查看一下参数的说明以及范例:

    一般在处理Windows系统中的多网卡问题时,会用到这些路由相关的命令。比如以前我们遇到的一个场景,Windows系统中有两张网卡,一张是连接局域网的内网网卡,一张是连接外网的外网网卡:

Windows系统中只能设置一个默认网关,外网网卡的IP和默认网关是从路由器自动获取的,肯定是有默认网关的,所以内网的网卡不能设置默认网关。如果要通过内网的网卡访问局域网中的地址,则需要使用route add命令添加策略路由来控制ip的访问走向,即通过策略路由让访问内网地址的都走内网的网关。给内网的网卡添加策略路由的命令为:

route add 172.16.0.0 mask 255.255.0.0 172.16.30.186(172.16.30.186为内网中的网关)

该命令的含义是,所以访问172.16开头的地址时,都通过内网的网关172.16.30.186走出去。

    服务器上一般都会配置多个网卡,有时也会通过添加策略路由去处理服务器之间无法访问的问题,这样的场景我们都遇到过。

19、ARP地址解析协议是用来干什么的?简述一下ARP地址解析的流程

   该arp命令主要用来显示和修改地址解析协议(ARP)使用的“IP 到物理”地址转换表:

系统中会保存IP和MAC地址的映射表。其中ARP协议(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

    可以使用arp -a的命令查看系统缓存的映射表,使用arp -s保存一个IP和MAC地址的映射对,使用arp -d删除符合条件的映射对,条件中支持使用通配符,比如:arp -d 192.168.*.*。

    ARP协议,它是根据 IP 地址获取 MAC 地址的一种协议,核心原理就是广播发送ARP请求,单播发送ARP响应。关于ARP相关流程的说明如下:

(1)每个主机都在自己的ARP缓冲区中建立一个ARP列表,以表示 IP 地址和 MAC 地址之间的对应关系。
(2)当源主机要发送数据时,先检查ARP列表中是否有该 IP 地址对应的 MAC 地址,如果有,则直接发送数据;如果没有,就向本网段的所有主机发送ARP数据包,用于查询目的主机的MAC地址,该数据包包括的内容有:源主机IP地址,源主机MAC地址,目的主机的IP。
(3)当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
(4)源主机收到 ARP 响应包后,将目的主机的 IP 和 MAC 地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

20、DNS域名服务器用来做什么的?简述一下域名解析的大体流程

    DNS域名服务器主要是用来请求域名对用的IP地址的,进行网络通信时,如果使用的目标地址是域名,则需要将域名转换成IP地址,然后将IP地址设置到socket套接字中(代码级的网络编程)发起通信请求。

   **使用DNS系统查询IP的完整流程,这里详细说一下**。DNS服务器大致分为三种类型:根DNS服务器、顶级域DNS服务器和权威DNS服务器,其中顶级域DNS服务器主要负责诸如com、org、net、edu、gov 等顶级域名。

根DNS服务器存储了所有顶级域DNS服务器的 IP 地址,可以通过根服务器找到顶级域服务器,比如百度的域名www.baidu.com,根服务器会返回所有维护 com 这个顶级域服务器的 IP 地址。然后你任选其中一个顶级域服务器发送请求,该顶级域服务器拿到域名后能够给出负责当前域的权威服务器地址。以 百度的域名为例,顶级域服务器将返回所有负责百度这个域的权威服务器地址。接着任选其中一个权威服务器地址查询“www.baidu.com”的具体 IP 地址,最终权威服务器会返回给你具体的 IP 地址。此外,本地 DNS 服务器是具有缓存功能的,通常两天内的记录都会被缓存。

    所以,通过DNS系统查询域名对应的 IP 的具体步骤可以总结为:

(1)操作系统先查本地 hosts文件 中是否有记录,如果有,则直接返回相对应映射的IP地址。
(2)如果本地hosts文件中没有配置,则主机向自己的本地DNS服务器发送查询报文,如果本地DNS服务器缓存中有,将直接返回结果。
(3)如果本地服务器缓存中没有,则从内置在内部的根DNS服务器列表(全球13台,固定的IP地址)中选一个发送查询报文。
(4)根服务器解析域名中的后缀名,告诉本地服务器负责该后缀名的所有顶级服务器列表。
(5)本地服务器选择其中一个顶级域服务器发送查询请求,顶级域服务器拿到域名后继续解析,返回对应域的所有权威服务器列表。
(6)本地服务器再向返回的权威服务器发送查询报文,最终会从某一个权威服务器上得到具体的 IP 地址。
(7)主机返回结果IP。

21、一个完整的http请求是什么样的?简述从输入网址到获得页面的过程

    从输入网址到获得页面的大概过程如下:

(1)解析url,获取 url 中包含的域名;
(2)通过DNS系统查询域名对应的IP;
(3)浏览器得到域名对应的IP地址之后,向服务器发起三次握手请求建立TCP链接;
(4)TCP链接链接建立起来后,浏览器向服务器发送http请求,如果 html文件在缓存里,浏览器则直接返回, 如果没有,则去后台拿。

22、http和https的区别

(1)http 和 https 都是基于 TCP 协议,但是 http 是使用明文传输,通讯内容可能被窃听和篡改,客户端也无法验证通讯方的身份,无法保证数据发送到正确的机器上;https 是在 http 的基础上加入了 SSL/TLS,可看成是添加了加密和认证机制的http,使用对称加密、非对称加密、证书等技术进行进行客户端与服务端的数据加密传输,最终达到保证整个通信的安全性。
(2)默认端口不同。http默认使用的是80端口,https默认使用的是443端口。
(3)资源消耗也不同。和http通信相比,https通信会由于加解密处理消耗更多的CPU和内存资源。

23、网络抓包分析工具wireshark了解吗?说说使用时常用的过滤条件有哪些

    现代的软件系统都是基于网络的,客户端软件需要通过网络和远端的服务器进行数据通信。远端的服务器可能是部署在局域网中的,也可能是部署在公网上。通过网络进行通信,就会出这样那样的与网络有关的一些问题客户端软件与服务器之间的交互数据都是通过网卡发送到网络上,进而送达到对端的。wireshark可以抓取目标网卡上收到和发出去的网络数据包,在开启抓包时选择要在哪个网卡上抓包(可能机器上有多张网卡)。

    通过抓包可以分析网络故障问题,查看收发的数据内容是否正确等。可以使用目标ip和源ip地址进行过滤,也可也使用端口过滤,也可以使用协议过滤(比如TCP、UDP、http、websocket、xmpp等)。

本文转载自: https://blog.csdn.net/chenlycly/article/details/127067195
版权归原作者 dvlinker 所有, 如有侵权,请联系我们删除。

“常见网络知识面试题总结”的评论:

还没有评论