【面经专栏】独家整理【计算机网络面经】

1、地址总线、数据总线、控制总线的作用

数据总线

  1. 是CPU与内存或其他器件之间的数据传送的通道。
  2. 数据总线的宽度决定了CPU和外界的数据传送速度。
  3. 每条传输线一次只能传输1位二进制数据。eg: 8根数据线一次可传送一个8位二进制数据(即一个字节)。
  4. 数据总线是数据线数量之和。

地址总线

  1. CPU是通过地址总线来指定存储单元的。
  2. 地址总线决定了cpu所能访问的最大内存空间的大小。eg: 10根地址线能访问的最大的内存为1024位二进制数据(1024个内存单元)(1B)
  3. 地址总线是地址线数量之和。

控制总线

  1. CPU通过控制总线对外部器件进行控制。
  2. 控制总线的宽度决定了CPU对外部器件的控制能力。
  3. 控制总线是控制线数量之和。

2、IP路由器寻址过程(ping)

​ 假设A网络中的主机A想要与网络B种的主机B通信时

  1. 主机A ping 主机B,首先ping在主机A端被ICMP协议封装,在使用IP协议封装上IP报头
  2. 进入数据链路层封装,在数据链路层要先确定主机A与主机B是否在同一个网络:通过主机A、B的子网号来判断他俩是在本地网络还是远程网络
  3. 主机A查询自己的路由表,看看是否存在通往网络B的路由记录
  4. 若没有,主机A将数据包发往默认网关,默认网关会转发数据包

3、HTTP请求报文是否区分大小写

​ 不区分

5、DDoS攻击,应对方式

​ 当被DDoS攻击时,主要表现为:

  1. 被攻击主机上有大量等待的TCP连接
    • SYN Flood攻击是当前网络上最为常见的DDoS攻击,它利用了TCP协议实现上的一个缺陷。通过向网络服务所在端口发送大量的伪造源地址的攻击报文,就可能造成目标服务器中的半开连接队列被占满,从而阻止其他合法用户进行访问
  2. 网络中充斥着大量的无用的数据包,源地址为假

应对措施:

  1. 在系统中加装防火墙系统,利用防火墙系统对所有出入的数据包进行过滤,检查边界安全规则,确保输出的包受到正确限制
  2. 开启全站CDN
    • CDN是内容分发网络,对中心平台进行负载均衡、内容分发
  3. 分布式集群防御:在每个节点服务器配置多个IP地址(负载均衡),并且每个节点能承受不低于10G的DDOS攻击,如一个节点受攻击无法提供服务,系统将会根据优先级设置自动切换另一个节点,并将攻击者的数据包全部返回发送点,使攻击源成为瘫痪状态

6、A给B发送消息后,B会返回什么结果

A的数据发到B的buffer后,若B不去调用recv()接收数据,则B也不会向A返回ACK信息,这样A将无法收到B的任何消息,换言之在A端将会出现计时器超时,于是A认为网络发生了拥塞,根据拥塞避免算法,A将慢开始门限值ssthresh减半,同时执行慢开始算法,但A发往B的数据同样不会被B接收,因此A端又出现计时器超时,A认为网络依然拥塞,根据拥塞避免算法,A再次将慢开始门限值ssthresh减半,同时执行新一次的慢开始算法,如此反复导致A根本无法发送数据

7、UDP报文能够传输的最大字节数

局域网中:1472(1500-8-20),UDP报头占8字节,IP数据包头最短是20字节,链路层的帧在局域网中的MTU(最大传输单元)是1500字节

Internet中:链路层MTU是576字节,UDP最多传输576-8-20个字节

9、怎样判断网络是否进入拥塞

通过观察网络的吞吐量与网络负载间的关系

如果随着网络负载的增加,网络的吞吐量明显小于正常的吞吐量,那么网络就进入例如轻度拥塞的状况。

如果网络得吞吐量随着网络负载的增大反而下降,那么网络就可能进入拥塞状态。

如果网络的负载继续增大,而网络的吞吐量下降到零,网络就可能进入了死锁状态。

11、A B C类IP地址范围

A类:1.0.0.0-126.0.0.0 开头是0

B类:128.0.0.0-191.255.0.0 开头是10

C类:192.0.0.0-223.255.255.0 开头是110

12、除了client关闭连接,server可以关闭连接么

可以

对于http1.0协议来说(短连接):

  • 如果响应头中有content-length头,则以content-length的长度就可以知道body(请求体/响应体)的长度了,客户端在接收body时,就可以依照这个长度来接收数据,接收完后,就表示这个请求完成了。服务端和客户端在明确自己数据处理完成后,都可以主动断开连接

  • 而如果没有content-length头,则客户端会一直接收数据,客户端必须等待服务端断开连接后,才能断开自己的连接

13、client与server同时发出关闭连接请求会怎样

双方同时关闭写端,对端不能再读

14、FIN报文是哪个系统调用发出的

关闭socket连接有两个系统调用:close shutdown

  1. close:并非马上关闭,只是将当前fd的引用减1,当fd的引用为0时,才真正关闭fd。多进程中,任意一次fork就将fd引用加1
  2. shutdown:立即终止连接,不关心fd的引用,可以关闭读或写,也能够都关闭

15.TCP 连接发了 1 2 3 5,客户端与服务端分别会怎么样,接收到 5 后,接收方回什么

如果接收端收到的数据包,不是本该要接受的数据包,服务端给发送端返回消息,告诉发送端自己应该接收的数据包。如果发送端连续收到3次这样的数据包,就认为该数据包没有成功发送到接收端,这时就重发该数据包。这种机制叫做高速重发机制

16.UDP怎么广播

使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。

单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途。

广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。

广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。

其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。

10、HTTP2.0

在HTTP1.1完全语义兼容的基础上,进一步减少了网络的延迟。实现低延迟高吞吐量。

HTTP1.x有以下几个主要缺点:

  1. HTTP/1.0一次只允许在一个TCP连接上发起一个请求,HTTP/1.1使用的流水线技术也只能部分处理请求并发,仍然会存在队列头阻塞问题,因此客户端在需要发起多次请求时,通常会采用建立多连接来减少延迟。
  2. 单向请求,只能由客户端发起。
  3. 请求报文与响应报文首部信息冗余量大。
  4. 数据未压缩,导致数据的传输量大

HTTP2.0采用的改进技术有:

  • 二进制分帧

    在应用层(HTTP2.0)和传输层(TCP or UDP)之间增加一个二进制分帧层。在二进制分帧层上,HTTP2.0会将所有传输的信息分为更小的消息和帧,并采用二进制格式编码,其中HTTP1.x的首部信息会被封装到Headers帧,而Request Body则封装到Data帧。

  • 首部压缩

    HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量

  • 多路复用

    针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面

  • 请求优先级(request prioritization)

    多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。

  • 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性。但是HTTP2.0也支持HTTP的明文传输

  • 服务器推送

    服务器可以对一个客户端请求发送多个响应。服务器向客户端推送资源无需客户端明确的请求。

17、怎样实现HTTP复用

图片描述

我们用“HTTP消息”来表示一个请求-响应的过程,那么HTTP/1.1中的消息是“管道串形化”的:只有等一个消息完成之后,才能进行下一条消息(注:不严谨);而HTTP/2中多个消息交织在了一起,这无疑提高了“通信”的效率。这就是多路复用:在一个HTTP的连接上,多路“HTTP消息”同时工作

为什么HTTP/1.1不能实现“多路复用”?简单回答就是:HTTP/2是基于二进制“帧”的协议,HTTP/1.1是基于“文本分割”解析的协议。

HTTP/1.1发送请求消息的文本格式:以换行符分割每一条key:value的内容,解析这种数据用不着什么高科技,相反的,解析这种数据往往速度慢且容易出错。“服务端”需要不断的读入字节,直到遇到分隔符(这里指换行符,代码中可能使用/n或者/r/n表示)。这样做的缺点是:

  • 一次只能处理一个请求或响应,因为这种以分隔符分割消息的数据,在完成之前不能停止解析
  • 解析这种数据无法预知需要多少内存,这会带给“服务端”很大的压力,因为它不知道要把一行要解析的内容读到多大的“缓冲区”中

HTTP/2设计是基于“二进制帧”进行设计的,帧是一个数据单元,实现了对消息的封装。

如果使用HTTP/1.1的话,你需要发送完上一个请求,才能发送下一个;由于HTTP/2是分帧的,请求和响应可以交错甚至可以复用。为了能够发送不同的“数据信息”,通过帧数据传递不同的内容,HTTP/2中定义了10种不同类型的帧,在上面表格的Type字段中可对“帧”类型进行设置。

17-2、http1.1pipeline vs htttp2.0 多路复用

img

  • (http1.0)图中第一种请求方式,就是单次发送request请求,收到response后再进行下一次请求,显示是很低效的。

  • 于是http1.1提出了管线化(pipelining)技术,就是如图中第二中请求方式,一次性发送多个request请求。

  • 然而pipelining在接收response返回时,也必须依顺序接收,如果前一个请求遇到了阻塞,后面的请求即使已经处理完毕了,仍然需要等待阻塞的请求处理完毕。这种情况就如图中第三种,第一个请求阻塞后,后面的请求都需要等待,这也就是队头阻塞(Head of line blocking)。

  • 为了解决上述阻塞问题,http2中提出了多路复用(Multiplexing)技术,Multiplexing是通信和计算机网络领域的专业名词。http2中将多个请求复用同一个tcp链接中,将一个TCP连接分为若干个流(Stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。也就是将每个request-response拆分为了细小的二进制帧Frame,这样即使一个请求被阻塞了,也不会影响其他请求,如图中第四种情况所示。

    https://www.cnblogs.com/shangyueyue/p/11041998.html

18、epoll水平触发、边缘触发的优缺点、使用场景

水平触发优、缺点及应用场景:

  • 优点:当进行socket通信的时候,保证了数据的完整输出,进行IO操作的时候,如果还有数据,就会一直的通知你。

  • 缺点:由于只要还有数据,内核就会不停的从内核空间转到用户空间,所有占用了大量内核资源,试想一下当有大量数据到来的时候,每次读取一个字节,这样就会不停的进行切换。内核资源的浪费严重。效率来讲也是很低的。

边沿触发优、缺点及应用场景:

  • 优点:每次内核只会通知一次,大大减少了内核资源的浪费,提高效率。

  • 缺点:不能保证数据的完整。不能及时的取出所有的数据。

  • 应用场景:处理大数据。使用non-block模式的socket。

19、幂等性

幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。

HTTP GET方法用于获取资源,不应有副作用,所以是幂等的。比如:GET http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。GET http://www.news.com/latest-news这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。

HTTP DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如:DELETE http://www.forum.com/article/4231,调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或刷新页面而不必担心引起错误。

POST所对应的URI并非创建的资源本身,而是资源的接收者。比如:POST http://www.forum.com/articles的语义是在http://www.forum.com/articles下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST方法不具备幂等性

PUT所对应的URI是要创建或更新的资源本身。比如:PUT http://www.forum/articles/4231的语义是创建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有幂等性。

20、物理层怎么保证数据传输的准确性?知道循环冗余码码

循环冗余校验码(CRC),简称循环码,是一种常用的、具有检错、纠错能力的校验码

奇偶校验码和海明校验码都是采用奇偶检测为手段检错和纠错的(奇偶校验码不具有纠错能力),而循环冗余校验则是通过某种数学运算来建立数据位和校验位的约定关系的

21、网关和路由器的区别

‘网关’一个大概念,不具体特指一类产品,只要连接两个不同的网络的设备都可以叫网关;而‘路由器’么一般特指能够实现路由寻找和转发的特定类产品,路由器很显然能够实现网关的功能。

网关是将两个使用不同协议的网络段连接在一起的设备

路由器是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号

22、Linux如何知道mac地址

ifconfig -a 其中 HWaddr字段就是MAC地址,这是最常用的方式,MAC地址由12位16进制数组成

23、中间人攻击

中间人攻击(Man-in-the-Middle Attack,简称“MITM攻击”)是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。

  • 信息篡改(主动攻击):当主机A、和主机B通信时,都由主机C来为其“转发”
  • 信息窃取(被动攻击):当A、B通信时,C不主动去为其“转发”,只是把他们的传输的数据备份,以获取用户网络的活动,包括账户、密码等敏感信息,这是被动攻击也是非常难被发现的。

DNS欺骗就是一种中间人攻击:DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。 原理:如果可以冒充域名服务器,然后把查询的IP地址设为攻击者的IP地址,这样的话,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了,这就是DNS欺骗的基本原理。DNS欺骗其实并不是真的“黑掉”了对方的网站,而是冒名顶替、招摇撞骗罢了。

防御措施

  1. 将一些机密信息进行加密后再传输,这样即使被“中间人”截取也难以破解;
  2. IP异常检测:如果用户以前从未使用某个设备或IP访问系统,则系统会采取措施;

24、TIME_WAIT过多带来的问题

高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上

  1. 高并发可以让服务器在短时间范围内同时占用大量端口,而端口有个0~65535的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了。
  2. 在这个场景中,短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接

比如取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的

解决TIME_WAIT过多:

  1. 端口复用:防止服务器重启时之前绑定的端口还未释放 || 程序突然退出而系统没有释放端口。此时如果设定了端口复用,

    则新启动的服务器进程可以直接绑定端口。如果没有设定端口复用,绑定会失败,提示ADDR已经在使用中

  2. 负载均衡:抗这些高并发的短请求。持续十万并发的短连接请求,两台机器,每台5万个

26、TCP选项SACK

标准的TCP确认机制中,如果发送方发送了0-1000序号之间的数据,接收方收到了0-100、300-1000,那么接收方只能向发送方确认101,这时发送方会重传所有101-1000之间的数据,实际上这是不必要的,因为有可能仅仅是丢了一小段而已,但是在标准的TCP确认机制中,发送方无法感知这一事情,只能重传从101开始的所有数据。

为了优化这种情况,必须让发送方知道更多的接收信息,所以发展出了SACK选项

  • 通过在TCP报文首部添加SACK选项,发送方可以知道接收方收到的报文区间(起始、终点),一旦窗口中的部分报文丢失后,不用从丢失点开始一直重发

27、HTTP请求方法

img

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法

https://www.cnblogs.com/jayxuan/p/10558961.html

28、URL各字段的含义

在这里插入图片描述

协议: http://为协议名,标明了请求需要使用的协议,通常使用的是HTTP协议或者安全协议 HTTPS.其他协议还有mailto:用户打开邮箱的客户端,和ftp:用来做文件的转换, file用来获取文件,data获取外部资源等

域名或IP: 标明了需要请求的服务器的地址.

端口: 标明了获取服务器资源的入口
端口号用于区分服务的端口,一台拥有IP地址的服务器可以提供许多服务,比如Web服务、FTP服务、SMTP服务等.那么,服务器的资源通过“IP地址+端口号”来区分不同的服务.如果把服务器比作房子,端口号可以看做是通向不同服务的门,
注意:80端口是默认隐藏的

路由或文件路径: 表示服务器上资源的路径,过去这样的路径标记的是服务器上文件的物理路径,但是现在,路径表示的只是一个抽象地址,并不指代任何物理地址.

参数(查询字符串): 是请求里提供的额外参数.这些参数是以键值对的形式,通过&符号分隔开来,服务器可以通过这些参数进行相应的个性化处理

29、http有哪些常见字段

Connection:Keep-Alive 或者 close 建立的请求通路保持激活

Accept:能接受的文件类型

Accept-Language :能接受的语言

User-Agent:指定客户端的信息

Content-Length:报文体的长度

Cache-control:是否缓存,如果缓存,从本地拿数据,不会请求网络

30、证书的工作机制

  1. 服务器将自己的公钥提交给数字证书认证机构(CA)
  2. CA用自己的私钥对服务器的公钥部署数字签名,并颁发证书,证书中存放着服务器的公钥
  3. 服务器将证书发送给客户端后,客户端使用CA的公钥(CA公钥是由客户端开发商嵌在客户端中的)验证证书上的数字签名,确认通过后确认了服务器公钥的真实性
  4. 客户端使用服务器公钥对报文加密后在发送
  5. 服务器使用私钥解密报文

25、怎样实现数字签名

  • 发送端用一个哈希函数从报文文本中生成报文摘要,然后用自己的私钥对摘要加密,加密后的摘要作为报文的数字签名和报文一起发送给接收端。
  • 接收端用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用公钥来对报文附加的数字签名进行解密。如果这两个摘要相同,那么接收方就能确认该数字签名是发送方的

4、主机怎么验证CA证书

接到证书的客户端使用数字证书认证机构的公钥,对证书上的数字签名进行验证。因为认证机关的公钥必须安全的交给客户端,所以浏览器开发商直接采取内部植入的方式

31、SSL四次握手

https://www.pianshen.com/article/71241175766/

32、gTLD

https://baike.baidu.com/item/%E9%80%9A%E7%94%A8%E9%A1%B6%E7%BA%A7%E5%9F%9F/2727771?fromtitle=gTLD&fromid=6758550&fr=aladdin

Generic top-level domain 通用顶级域

常见的有:

.com .edu .gov .org

33、公网和私网IP怎样转换

NAT(Network Address Translator),在本地网络中使用私有IP,在接入互联网时使用全局IP

当私网内的多台机器都要与外部通信时,加上端口号就能区分与公网中通信的到底是哪台主机了
ttps://baike.baidu.com/item/%E9%80%9A%E7%94%A8%E9%A1%B6%E7%BA%A7%E5%9F%9F/2727771?fromtitle=gTLD&fromid=6758550&fr=aladdin

Generic top-level domain 通用顶级域

常见的有:

.com .edu .gov .org

33、公网和私网IP怎样转换

NAT(Network Address Translator),在本地网络中使用私有IP,在接入互联网时使用全局IP

当私网内的多台机器都要与外部通信时,加上端口号就能区分与公网中通信的到底是哪台主机了

猜你喜欢

转载自blog.csdn.net/weixin_44484715/article/details/120825010