计算机网络常见面试题

计算机网络常见面试题

一、请简述TCP/UDP的区别

​ TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和多播。两者的区别大致如下:

​ (1)TCP面向连接,UDP面向非连接即发送数据前不需要建立链接;

​ (2)TCP提供可靠的服务(数据传输),UDP无法保证;

​ (3)TCP面向字节流,UDP面向报文;

​ (4)TCP数据传输慢,UDP数据传输快

​ (5)在一个TCP连接中,仅有两方进行彼此通信,因此广播和多播不能用于TCP

​ (6)TCP使用校验和,确认和重传机制来保证可靠传输

​ (7)TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制

二、TCP协议是如何保证可靠传输的?

​ (1)应用数据被分割成TCP认为最合适发送的数据块。

​ (2)TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。

​ (3)校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。

​ (4)TCP 的接收端会丢弃重复的数据。

​ (5)流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)

​ (6)拥塞控制: 当网络拥塞时,减少数据的发送。

​ (7)ARQ协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。

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

三、TCP对应的协议和UDP对应的协议有哪些

TCP对应的协议:

​ (1)FTP:定义了文件传输协议,使用21端口。

​ (2)Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。

​ (3)SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。

​ (4)POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。

​ (5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。

UDP对应的协议:

​ (1)DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。

​ (2)SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。

​ (3)TFTP(Trival File TransferProtocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。

四、HTTP 协议包括哪些请求

​ (1)GET:对服务器资源的简单请求,GET用于信息获取,而且应该是安全和幂等的。

​ (2)POST:用于发送包含用户提交数据的请求,POST请求表示可能修改服务器上资源的请求。

​ (3)HEAD:类似于GET请求,不过返回的响应中没有具体内容,用于获取报头。

​ (4)PUT:传说中请求文档的一个版本。

​ (5)DELETE:发出一个删除指定文档的请求。

​ (6)TRACE:发送一个请求副本,以跟踪其处理进程。

​ (7)OPTIONS:返回所有可用的方法,检查服务器支持哪些方法。

​ (8)CONNECT:用于ssl隧道的基于代理的请求。

五、简述ping的原理

​ ping是用来探测本机与网络中另一主机之间是否可达的命令,如果两台主机之间ping不通,则表明这两台主机不能建立起连接。ping是定位网络通不通的一个重要手段。

​ ping 命令是基于 ICMP 协议来工作的,「 ICMP 」全称为 Internet 控制报文协议( Internet Control Message Protocol)。ping 命令会发送一份ICMP回显请求报文给目标主机,并等待目标主机返回ICMP回显应答。因为ICMP协议会要求目标主机在收到消息之后,必须返回ICMP应答消息给源主机,如果源主机在一定时间内收到了目标主机的应答,则表明两台主机之间网络是可达的。

六、请详细介绍一下 TCP 的三次握手机制,为什么要三次握手?可参考

计算机网络常见面试题

在讲三次握手之前首先要介绍 TCP 报文中两个重要的字段:一个是序号字段,另一个是确认号字段,这两个字段将在握手阶段以及整个信息传输过程起到重要作用。【为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个***, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知***起始值, 并确认对方已经收到了***起始值的必经步骤。如果只是两次握手, 至多只有连接发起方的起始***能被确认, 另一方选择的***则得不到确认】

(1)第一步:客户端 TCP 向服务端的TCP发送一个不带额外数据的特殊 TCP 报文段,该报文段的 SYN 标志位会被置1,所以把它称为 SYN 报文段。这时客户端会选取一个初始***(假设为 client_num),并将此编号放置在序号字段中。该报文段会被封装在一个IP数据报中发送给服务器。

(2)第二步:服务器接收到 SYN 报文段后,会为该 TCP 分配缓存和变量,并发送允许连接的确认报文。在允许连接的报文中,SYN 标志位仍被置为1,确认号字段填的是 client_num + 1的值。最后服务端也会选取一个 server_num 存放到序号字段中,这个报文段称为 SYNACK 报文段。

(3)第三步:在接收到 SYNACK 报文段后,客户端最后也要向服务端发送一个确认报文,这个报文和前两个不一样,SYN 标志位置0,在确认号字段中填上 server_num + 1的值,并且这个报文段可以携带数据。一旦完成这3个步骤,客户端和服务器之间就可以相互发送包含数据的报文了。

如果不是三次握手,二次两次的话,**服务器就不知道客户端是否接收到了自己的 SYNACK 报文段,从而无法建立连接;**四次握手就显得多余了。

七、详细介绍一下TCP的四次挥手机制,为什么要有TIME_WAIT状态,为什么需要四次握手?服务器出现了大量CLOSE_WAIT状态如何解决?

计算机网络常见面试题

当客户端要服务器断开连接时,客户端 TCP 会向服务器发送一个特殊的报文段,该报文段的 FIN 标志位会被置1,接着服务器会向客户端发送一个确认报文段。然后服务器也会客户端发送一个 FIN 标志位为1的终止报文段,随后客户端回送一个确认报文段,服务器立即断开连接。客户端等待一段时间后也断开连接。

其实四次挥手的过程是很容易理解的,由于 TCP 协议是全双工的,也就是说客户端和服务端都可以发起断开连接。两边各发起一次断开连接的申请,加上各自的两次确认,看起来就像执行了四次挥手。

为什么要有 TIME_WAIT 状态? 因为客户端最后向服务器发送的确认 ACK 是有可能丢失的,当出现超时,服务端会再次发送 FIN 报文段,如果客户端已经关闭了就收不到了。还有一点是避免新旧连接混杂。

大量 CLOSE_WAIT 表示程序出现了问题,对方的 socket 已经关闭连接,而我方忙于读或写没有及时关闭连接,需要检查代码,特别是释放资源的代码,或者是处理请求的线程配置。

八、HTTPS的工作原理

(1)Client 使用https的URL访问 Server,要求与 Server 建立 SSL 连接
​(2)Server 把事先配置好的公钥证书返回给客户端。
​(3)Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
​(4) Client使用伪随机数生成器生成加密所使用的对称**,然后用证书的公钥加密这个对称**,发给Server。
(5) Server使用自己的私钥(private key)解密这个消息,得到对称**。至此,Client和Server双方都持有了相同的对称**。
(6)Server使用对称**加密“明文内容A”,发送给Client。
(7)Client使用对称**解密响应的密文,得到“明文内容A”。
(8)Client再次发起HTTPS的请求,使用对称**加密请求的“明文内容B”,然后Server使用对称**解密密文,得到“明文内容B”。

九、 HTTPS的优点,尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:

​ (1)使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
​ (2)HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
​ (3)HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
​ (4)谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。

十、HTTPS的缺点,虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的:

​ (1)HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;
​ (2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
​ (3)SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
​ (4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。
​ (5)HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

十一、讲一下HTTP与HTTPS的区别?可参考

​ HTTP和HTTPS的主要区别在于HTTP协议传递的是明文数据,而HTTPS传递的是加密过的数据,也就是说HTTPS更具有安全性。也正由HTTPS需要保证安全性,所以它的性能要比HTTP差一点。[采用 对称加密 和 非对称加密 结合的方式来保护浏览器和服务端之间的通信安全。对称加密算法加密数据+非对称加密算法交换**+数字证书验证身份=安全]

​ (1)加密–对称加密/非对称加密,如果客户端和服务器之间都采用相同的加密算法,那么和没有加密是一样的。所以,需要让每个客户端与服务器之间都采用不同的加密方式。客户端和服务器之间每次都基于一个随机数产生加密算法。(具体实现时为了保证随机,用到还不止一个随机数)。

​ (2)对协商的过程进行加密–因为上一步的对称加密,此时不能在对称加密了。【通信双方一方持有私钥,一方持有公钥,经过私钥加密的信息,都能通过公钥进行解密。但是经过公钥加密的数据,只有私钥可以解密。】让服务器持有私钥,让客户端持有公钥。 这样就能保证客户端给服务器发送消息的时候是安全的(相反,服务器给客户端发送消息就是不安全的),我们可以把协商时重要的逻辑安排在客户端给服务器发送信息的过程中,从而保证了协商过程的安全性。

​ (3)客户端与服务器打交道之前是互不知道双方身份的,客户端如何获得公钥?客户端向服务器要公钥。 问题:如果中间人把服务器发送给客户端的公钥调包了怎么办?也就是说客户端无法知道发送公钥的是否是正真的服务器。

​ (4)客户端无法辨识服务端和中间人的问题称为“身份验证”问题,也就是说我们需要为服务器向客户端发送公钥的过程进行加密。只好通过第三方机构的介入。首先我们自己保存有第三方权威机构的公钥,然后第三方机构使用私钥对服务器将要发送给客户端的公钥进行加密,客户端接收到这个经加密的公钥后(数字证书),就能通过自己保存的第三方机构公钥进行解密。

​ (5)在现实生活中,CA不单止会给我们正常公司发放证书,还会给中间人的坏公司发放证书,如果中间人把发放的证书调包了怎么办?这时我们仍能用CA的私钥进行解密,但是证书已经被调包了。那么客户端怎样验证证书的真伪呢?答案是证书本身会告诉客户端如何辨认真伪。比方说证书(数字证书)上面有一个证书编号,还有一个如何计算证书编号的方法,客户端可以根据计算证书编号的方法计算出自己要获得的证书的编号(数字签名),然后把这个编号和证书上的编号进行比对,如果一样证明没有被调包。

​ 总结一下HTTPS:HTTPS想要保证客户端与服务器之间的通信安全,就得使用对称加密算法进行加密。协商对称加密算法的过程通过非对称加密算法来保证。在非对称加密算法中,客户端获得公钥的过程需要第三方机构(CA)通过颁发数字证书保证安全性。

十二、在地址栏键入URL后,网络世界发生了什么?

  1. DNS解析

    1. 1 DNS解析的过程就是寻找哪台机器上有你需要资源的过程。当你在浏览器中输入一个地址时,例如www.baidu.com,其实不是百度网站真正意义上的地址。互联网上每一台计算机的唯一标识是它的IP地址,但是IP地址并不方便记忆。用户更喜欢用方便记忆的网址去寻找互联网上的其它计算机,也就是上面提到的百度的网址。所以互联网设计者需要在用户的方便性与可用性方面做一个权衡,这个权衡就是一个网址到IP地址的转换,这个过程就是DNS解析。它实际上充当了一个翻译的角色,实现了网址到IP地址的转换。网址到IP地址转换的过程是如何进行的?
    2. 1 首先在本地域名服务器中查询IP地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求,如果根域名服务器也不存在该域名时,本地域名会向com*域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器得到google的IP地址并把它缓存到本地,供下次查询使用。【 递归,迭代】
  2. 建立TCP连接

    1. 为了准确地传输数据,TCP协议采用了三次握手策略。发送端首先发送一个带SYN(synchronize)标志的数据包给接收方,接收方收到后,回传一个带有SYN/ACK(acknowledegment)标志的数据包以示传达确认信息。最后发送方再回传一个带ACK标志的数据包,代表握手结束。在这过程中若出现问题中断,TCP会再次发送相同的数据包。TCP是一个端到端的可靠的面向连接的协议,所以HTTP基于传输层TCP协议不用担心数据的传输的各种问题。[三次握手的目的是为了让双方验证各自的接收能力和发送能力]
  3. 发送HTTP请求

  4. 服务器处理请求并返回HTTP报文

    1. 1xx:信息性状态码
    2. 3xx:成功状态码
      200:OK 请求正常处理
      204:No Content请求处理成功,但没有资源可返回
      206:Partial Content对资源的某一部分的请求
    3. 3xx:重定向状态码
      301:Moved Permanently 永久重定向
      302:Found 临时性重定向
      304:Not Modified 缓存中读取
    4. 4xx:客户端错误状态码
      400:Bad Request 请求报文中存在语法错误
      401:Unauthorized需要有通过Http认证的认证信息
      403:Forbidden访问被拒绝
      404:Not Found无法找到请求资源
    5. 5xx:服务器错误状态码
      500:Internal Server Error 服务器端在执行时发生错误
      503:Service Unavailable 服务器处于超负载或者正在进行停机维护
  5. 浏览器解析渲染页面

    1. 浏览器按顺序解析html文件。
    2. 布局:通过计算得到每个渲染对象在可视区域中的具体位置信息(大小和位置),这是一个递归的过程。
    3. 绘制:将计算好的每个像素点信息绘制在屏幕上
  6. 连接结束

十三、HTTPS的三次握手

计算机网络常见面试题

总体而言:
  (1) 客户端&服务端通信,协商加密方式
  (2)客户端(Client)和服务端(Server)互相确认身份(上面的图省略了服务端验证客户端身份的步骤)
  (3) 双方安全地交换https通信使用的**(Session Key)

第一阶段:C&S协商加密方式
客户端向服务端发送ClientHello信息,信息主要包括客户端支持的加密方式、客户端支持的SSL版本等;服务端接收到ClientHello信息后,向客户端发送一个ServerHello信息,主要是告诉客户端它将使用什么加密方式和SSL版本。

第二阶段:身份校验

第三阶段:产生通信**

十四、什么是Cookie,Cookie的使用过程是怎么样的?

​ 由于 http 协议是无状态协议,如果客户通过浏览器访问 web 应用时没有一个保存用户访问状态的机制,那么将不能持续跟踪应用的操作。比如当用户往购物车中添加了商品,web 应用必须在用户浏览别的商品的时候仍保存购物车的状态,以便用户继续往购物车中添加商品。

​ cookie 是浏览器的一种缓存机制,它可用于维持客户端与服务器端之间的会话。由于下面一题会讲到session,所以这里要强调cookie会将会话保存在客户端(session则是把会话保存在服务端)

​ 这里最常见的登陆案例讲解cookie的使用过程:

​ (1)首先用户在客户端浏览器向服务器发起登陆请求。
​ (2)登陆成功后,服务端会把登陆的用户信息设置 cookie 中,返回给客户端浏览器。
​ (3)客户端浏览器接收到 cookie 请求后,会把 cookie 保存到本地(可能是内存,也可能是磁盘,看具体使用情况而定)。
​ (4)以后再次访问该 web 应用时,客户端浏览器就会把本地的 cookie 带上,这样服务端就能根据 cookie 获得用户信息了。

十五、什么是session,有哪些实现session的机制?

​ session 是一种维持客户端与服务器端会话的机制。但是与 cookie 把会话信息保存在客户端本地不一样,session 把会话保留在浏览器端。

​ 以登陆案例为例子讲解 session 的使用过程:

​ (1)首先用户在客户端浏览器发起登陆请求。
​ (2)登陆成功后,服务端会把用户信息保存在服务端,并返回一个唯一的 session 标识给客户端浏览器。
​ (3)客户端浏览器会把这个唯一的 session 标识保存在起来。
​ (4)以后再次访问 web 应用时,客户端浏览器会把这个唯一的 session 标识带上,这样服务端就能根据这个唯一标识找到用户信息。

看到这里可能会引起疑问:把唯一的 session 标识返回给客户端浏览器,然后保存起来,以后访问时带上,这难道不是 cookie 吗?

​ 没错,session 只是一种会话机制,在许多 web 应用中,session 机制就是通过 cookie 来实现的。也就是说它只是使用了 cookie 的功能,并不是使用 cookie 完成会话保存。与 cookie 在保存客户端保存会话的机制相反,session 通过 cookie 的功能把会话信息保存到了服务端。

​ 进一步地说,session 是一种维持服务端与客户端之间会话的机制,它可以有不同的实现。以现在比较流行的小程序为例,阐述一个 session 的实现方案:

​ (1)首先用户登陆后,需要把用户登陆信息保存在服务端,这里我们可以采用 redis。比如说给用户生成一个 userToken,然后以 userId 作为键,以 userToken 作为值保存到 redis 中,并在返回时把 userToken 带回给小程序端。
​ (2)小程序端接收到 userToken 后把它缓存起来,以后每当访问后端服务时就把 userToken 带上。
​ (3)在后续的服务中服务端只要拿着小程序端带来的 userToken 和 redis 中的 userToken 进行比对,就能确定用户的登陆状态了。

十六、session和cookie有什么区别?

(1)cookie 是浏览器提供的一种缓存机制,它可以用于维持客户端与服务端之间的会话。
(2)session 指的是维持客户端与服务端会话的一种机制,它可以通过 cookie 实现,也可以通过别的手段实现。
(3)如果用 cookie 实现会话,那么会话会保存在客户端浏览器中,而 session 机制提供的会话是保存在服务端的。

十七、GET请求和POST请求的区别?

(1)从 HTTP 报文层面来看,GET 请求将信息放在 URL,POST 将请求信息放在请求体中。这一点使得 GET 请求携带的数据量有限,因为 URL 本身是有长度限制的,而 POST 请求的数据存放在报文体中,因此对大小没有限制。而且从形式上看,GET 请求把数据放 URL 上感觉不太安全,而 POST 请求把数据放在请求体里似乎安全一些。实际上想要获取 POST 请求中的内容还是很容易的,因此两者在安全性上其实没有太大差异,想要实现安全的信息传输还是得靠 HTTPS。

(2)从数据库层面来看,GET 符合幂等性和安全性,而 POST 请求不符合。这个其实和 GET/POST 请求的作用有关。按照 HTTP 的约定,GET 请求用于查看信息,不会改变服务器上的信息;而 POST 请求用来改变服务器上的信息。正因为 GET 请求只查看信息,不改变信息,对数据库的一次或多次操作获得的结果是一致的,认为它符合幂等性。安全性是指对数据库操作没有改变数据库中的数据。

一些。实际上想要获取 POST 请求中的内容还是很容易的,因此两者在安全性上其实没有太大差异,想要实现安全的信息传输还是得靠 HTTPS。

(2)从数据库层面来看,GET 符合幂等性和安全性,而 POST 请求不符合。这个其实和 GET/POST 请求的作用有关。按照 HTTP 的约定,GET 请求用于查看信息,不会改变服务器上的信息;而 POST 请求用来改变服务器上的信息。正因为 GET 请求只查看信息,不改变信息,对数据库的一次或多次操作获得的结果是一致的,认为它符合幂等性。安全性是指对数据库操作没有改变数据库中的数据。

(3)从其他层面来看,GET 请求能够被缓存,GET 请求能够保存在浏览器的浏览记录里,GET 请求的 URL 能够保存为浏览器书签。这些都是 POST 请求所不具备的。 缓存是 GET 请求被广泛应用的根本,他能够被缓存也是因为它的幂等性和安全性,除了返回结果没有其他多余的动作,因此绝大部分的 GET 请求都被 CDN 缓存起来了,大大减少了 Web 服务器的负担。