计算机网络面试问题集锦

本文对面试/笔试过程中经常会被问到的一些关于计算机网络的问题进行了梳理和总结,一方面方便自己温故知新,另一方面也希望为找工作的同学们提供一个复习参考。

Http和Https的区别

Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份

Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。二者之间存在如下不同:

  • 端口号不同:Http与Http使用不同的连接方式,用的端口也不一样,前者是80,后者是443
  • 资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源
  • 开销:Https通信需要证书,而证书一般需要向认证机构购买

Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。

对称加密和非对称加密

对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;

非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。

由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。

三次握手与四次挥手

三次握手

三次握手的过程

  • 我要和你建立链接
  • 你真的要和我建立链接么
  • 我真的要和你建立链接

连接建立的前提是服务端需要事先启动并监听到某个端口。

  • 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=X,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  • 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN置为1,ACK=X+1,随机产生一个值seq=Y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  • 第三次握手:Client收到确认后,检查ACK是否为X+1,如果正确则将标志位ACK置为Y+1,seq=Z并将该数据包发送给Server,Server检查ACK是否为Y+1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

image

为什么需要三次握手

我们都知道,TCP是提供的是数据的可靠传输。为了达到这个目的,就需要考虑各种异常情况,然后避免异常情况,对于TCP连接的建立来说,三次握手可以避免已失效的连接请求报文段突然又传到了服务端,因而产生错误。

假设客户端向服务端发送了请求连接的报文,但是报文丢失了,从而也没收到服务端返回的确认报文。于是客户端再次发送一个请求连接报文,而这次的报文顺利到达了服务端,服务端返回了确认报文。但是如果第一次的报文由于网络原因又到达了服务端,而这个报文已经被认为是失效的了,但是服务端是无法确定的,所以服务端还是会返回给客户端确认报文,同意建立连接,如果不采用三次握手,那么刚才的情况就会建立两个连接,而实际上只需要一个连接,这样就会造成资源浪费。

三次握手就解决了上面的这个问题,因为服务端还需要客户端的第二次确认,而对于上面的这种情况,客户端是知道第一个报文是废弃的,所以它就不会发送给服务端确认报文,所以就不会建立第二个连接。

三次握手的过程中可以携带数据吗

第一次握手和第二次握手都不能携带数据,但是都需要消耗掉一个序号。

第三次握手的ACK报文可以携带数据,但是如果不携带数据则不消耗序号。

更详细的底层描述可以参考:TCP连接建立的三次握手过程可以携带数据吗?

四次挥手

四次挥手的过程

  • 我要和你断开链接
  • 好的,断吧。我看看我还有没有数据要发送了
  • 我已经全部处理完了,我也要和你断开连接
  • 好的,断吧

  • 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

  • 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。Client收到ACK之后,进入FIN_WAIT_2状态。此时TCP链接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收
  • 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

image

主动关闭的一方等待2MSL的时间

  1. 为了保证最后发送的确认报文能够到达被动方,从而可靠地实现TCP全双工连接的终止。因为这个报文有可能会丢失,如果丢失了,被动方就要重传FIN这个报文,并且主动方要能够收到重传的这个报文,而如果重传,就需要等待2MSL的时间(ACK的时间+重传的时间),所以,如果主动方不到2MSL就关闭了,那么就可能收不到被动方重传的报文,就会导致被动方无法正常关闭。
  2. 为了防止”已失效的连接请求报文段”出现在本连接中(允许老的重复报文在网络中消失)。主动方发完最后一个ACK报文之后,等待2MSL,就可以使本连接持续时间内所产生的所有报文都在网络中消失,这样就可以在下一次连接中不会出现这种旧的连接请求报文段。

TCP连接期间客户端服务端状态

image

TCP协议如何来保证传输的可靠性

TCP提供一种面向连接的、可靠的字节流服务。其中,面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信;而字节流服务意味着两个应用程序通过TCP链接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。

对于可靠性,TCP通过以下方式进行保证:

  • 数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;

  • 对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;

  • 丢弃重复数据:对于重复数据,能够丢弃重复数据;

  • 应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;

  • 超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;

  • 流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议

客户端不断进行请求链接会怎样?DDos(Distributed Denial of Service)攻击?

服务器端会为每个请求创建一个链接,并向其发送确认报文,然后等待客户端进行确认

DDos攻击

  • 客户端向服务端发送请求链接数据包
  • 服务端向客户端发送确认数据包
  • 客户端不向服务端发送确认数据包,服务器一直等待来自客户端的确认

DDos预防

没有彻底根治的办法,除非不使用TCP

  • 限制同时打开SYN半链接的数目
  • 缩短SYN半链接的Time out 时间
  • 关闭不必要的服务

GET和POST的区别

HTTP中get和post的区别

GET请求中URL编码的意义

在GET请求中会对URL中非西文字符进行编码,这样做的目的就是为了避免歧义

比如:要传递的参数是name=value,而恰好此时,value是va&lu=e1,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。这样,我们的本意是只有一个键值对,但是服务端却会解析成两个键值对,这样就产生了歧义。

为了解决上述问题带来的歧义,就要对参数进行URL编码。例如,我们对上述会产生歧义的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。

TCP和UDP的区别

TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议,它们之间的区别包括:

  • TCP是面向连接的,UDP是无连接的;

  • TCP是可靠的,UDP是不可靠的;

  • TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式;

  • TCP是面向字节流的,UDP是面向报文的;

  • TCP有拥塞控制机制,UDP没有拥塞控制,适合媒体通信;

  • TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大;

TCP的拥塞处理

拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。注意,拥塞控制和流量控制不同,前者是一个全局性的过程,而后者指点对点通信量的控制。拥塞控制的方法主要有以下四种:

  • 慢启动
  • 拥塞避免
  • 快重传
  • 快恢复

慢启动

不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小

拥塞避免

拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按线性规律缓慢增长。

快重传

快重传要求接收方在收到一个失序的报文段后就立即发出重复确认

为的是使发送方及早知道有报文段没有到达对方,而不要等到接收方发送数据时捎带确认。

快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

image

快恢复

快重传配合使用的还有快恢复算法

当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半,但是接下去并不执行慢开始算法:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。

从输入网址到获得页面的过程

  1. 浏览器查询DNS,获取域名对应的IP地址
    • 具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。
    • 对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);
    • 如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。
    • 如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
  2. 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手
  3. TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求
  4. 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器
  5. 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源
  6. 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面

Session、Cookie

Cookie和Session都是客户端与服务器之间保持状态的解决方案,具体来说,cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie,而客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

Session

同样地,会话状态也可以保存在服务器端。客户端请求服务器,如果服务器记录该用户状态,就获取Session来保存状态,这时,如果服务器已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用;如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,并将这个sessionid在本次响应中返回给客户端保存。

保存sessionid的方式可以采用cookie机制,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器;若浏览器禁用Cookie的话,可以通过URL重写机制将sessionid传回服务器。

  • 实现机制:Session的实现常常依赖于Cookie机制,通过Cookie机制回传SessionID;

  • 大小限制:Cookie有大小限制并且浏览器对每个站点也有cookie的个数限制,Session没有大小限制,理论上只与服务器的内存大小有关;

  • 安全性:Cookie存在安全隐患,通过拦截或本地文件找得到cookie后可以进行攻击,而Session由于保存在服务器端,相对更加安全;

  • 服务器资源消耗:Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。

XSS 攻击

XSS是一种经常出现在web应用中的计算机安全漏洞,与SQL注入一起成为web中最主流的攻击方式。XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些脚本代码嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

原因分析

  • 主要原因:过于信任客户端提交的数据!
  • 解决办法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。
  • 进一步分析细节:客户端提交的数据本来就是应用所需要的,但是恶意攻击者利用网站对客户端提交数据的信任,在数据中插入一些符号以及javascript代码,那么这些数据将会成为应用代码中的一部分了,那么攻击者就可以肆无忌惮地展开攻击啦,因此我们绝不可以信任任何客户端提交的数据!

XSS 攻击分类

反射性XSS攻击(非持久性XSS攻击)

漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS攻击包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击),例如,正常发送消息:

1
http://www.test.com/message.php?send=Hello,World!

接收者将会接收信息并显示Hello,World;但是,非正常发送消息:

1
http://www.test.com/message.php?send=<script>alert(‘foolish!’)</script>!

接收者接收消息显示的时候将会弹出警告窗口!

持久性XSS攻击 (留言板场景)

XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。也就是说,每当用户使用浏览器打开指定页面时,脚本便执行。与非持久性XSS攻击相比,持久性XSS攻击危害性更大。从名字就可以了解到,持久性XSS攻击就是将攻击代码存入数据库中,然后客户端打开时就执行这些攻击代码。例如,留言板表单中的表单域:

1
<input type=“text” name=“content” value=“这里是用户填写的数据”>

正常操作流程是:用户是提交相应留言信息 —— 将数据存储到数据库 —— 其他用户访问留言板,应用去数据并显示;而非正常操作流程是攻击者在value填写:

1
<script>alert(‘foolish!’);</script> <!--或者html其他标签(破坏样式。。。)、一段攻击型代码-->

并将数据提交、存储到数据库中;当其他用户取出数据显示的时候,将会执行这些攻击性代码。

修复漏洞方针

漏洞产生的根本原因是太相信用户提交的数据,对用户所提交的数据过滤不足所导致的,因此解决方案也应该从这个方面入手,具体方案包括:

  • 将重要的cookie标记为http only,这样的话Javascript中的document.cookie语句就不能获取到cookie了(如果在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击)
  • 表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合
  • 对数据进行Html Encode 处理
  • 过滤或移除特殊的Html标签,例如: <script>, <iframe> , < for <, > for>, &quot for
  • 过滤JavaScript 事件的标签,例如 “onclick=”, “onfocus” 等等。

需要注意的是,在有些应用中是允许html标签出现的,甚至是javascript代码出现。因此,我们在过滤数据的时候需要仔细分析哪些数据是有特殊要求(例如输出需要html代码、javascript代码拼接、或者此表单直接允许使用等等),然后区别处理!

网络七层模型

OSI七层模型

网络层的ARP协议工作原理

网络层的ARP协议完成了IP地址与物理地址的映射。

首先,每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。

当源主机需要将一个数据包要发送到目的主机时,会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址:

如果有,就直接将数据包发送到这个MAC地址;

如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。

网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。

如果不相同就忽略此数据包;

如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址;

源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。

如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

IP地址的分类

IP地址是指互联网协议地址,是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP地址编址方案将IP地址空间划分为A、B、C、D、E五类,其中A、B、C是基本类,D、E类作为多播和保留使用,为特殊地址。

  • A类地址:以0开头,第一个字节范围:0~127;

  • B类地址:以10开头,第一个字节范围:128~191;

  • C类地址:以110开头,第一个字节范围:192~223;

  • D类地址:以1110开头,第一个字节范围为224~239;

  • E类地址:以1111开头,保留地址

HTTP报文

HTTP报文

HTTP重定向301、302、303、307

ICMP协议

ICMP是Internet Control Message Protocol,因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由器是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ICMP报文有两种:差错报告报文和询问报文。

DHCP协议

动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

网桥的作用

网桥是一个局域网与另一个局域网之间建立连接的桥梁

网络接口卡(网卡)的功能

  1. 进行串行/并行转换。
  2. 对数据进行缓存。
  3. 在计算机的操作系统安装设备驱动程序。
  4. 实现以太网协议。

TTL是什么?作用是什么?哪些工具会用到它

TTL是指生存时间,简单来说,它表示了数据包在网络中的时间,经过一个路由器后TTL就减一,这样TTL最终会减为0,当TTL为0时,则将数据包丢弃,这样也就是因为两个路由器之间可能形成环,如果没有TTL的限制,则数据包将会在这个环上一直死转,由于有了TTL,最终TTL为0后,则将数据包丢弃。

  • ping发送数据包里面有TTL,但是并非是必须的,即是没有TTL也是能正常工作的
  • traceroute正是因为有了TTL才能正常工作
  • ifconfig是用来配置网卡信息的,不需要TTL
  • netstat是用来显示路由表的,也是不需要TTL的。

路由表的作用

路由表是用来决定如何将一个数据包从一个子网传送到另一个子网的,换句话说就是用来决定从一个网卡接收到的包应该送到哪一个网卡上去。

路由表的每一行至少有目标网络号、子网掩码、到这个子网应该使用的网卡这三条信息。

当路由器从一个网卡接收到一个包时,它扫描路由表的每一行,用里面的子网掩码与数据包中的目标IP地址做逻辑与运算(&)找出目标网络号。如果得出的结果网络号与这一行的网络号相同,就将这条路由表记录下来作为备用路由。如果已经有备用路由了,就在这两条路由里将网络号最长的留下来,另一条丢掉(这是用无分类编址CIDR的情况才是匹配网络号最长的,其他的情况是找到第一条匹配的行时就可以进行转发了)。如此接着扫描下一行直到结束。

如果扫描结束仍没有找到任何路由,就用默认路由。确定路由后,直接将数据包送到对应的网卡上去。在具体的实现中,路由表可能包含更多的信息为选路由算法的细节所用。

RARP 协议

逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。

运输层协议与网络层协议的区别

网络层协议负责的是提供主机间的逻辑通信

运输层协议负责的是提供进程间的逻辑通信

静态路由和动态路由的区别

静态路由是由管理员手工配置的,适合比较简单的网络或需要做路由特殊控制。而动态路由则是由动态路由协议自动维护的,不需人工干预,适合比较复杂大型的网络。

路由器能够自动地建立自己的路由表,并且能够根据实际实际情况的变化适时地进行调整。动态路由机制的运作依赖路由器的两个基本功能:对路由表的维护;路由器之间适时的路由信息交换。

HTTP的长连接和短连接

HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议。

短连接:浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。

长连接:一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

TCP短连接:client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起 close操作.短连接一般只会在 client/server间传递一次读写操作

TCP长连接:client向server发起连接,server接受client连接,双方建立连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

交换机与路由器的区别

  • 工作所处的OSI层次不一样,交换机工作在OSI第二层数据链路层,路由器工作在OSI第三层网络层
  • 寻址方式不同:交换机根据MAC地址寻址,路由器根据IP地址寻址
  • 转发速度不同:交换机的转发速度快,路由器转发速度相对较慢。

计算机网络面试问题集锦