面试准备系列——Java基础技术篇(12)/计算机网络


面试时间是有限的,所以针对网络协议这一块知识点,考察最多的就是 TCP协议的三次握手和四次挥手以及TCP/UDP协议的区别了。在网络协议篇章,我们从 OSI七层协议说起,依次介绍TCP/IP协议,三次握手四次挥手,网络包的分片与重组,HTTP和HTTPS协议以及XSS和CSRF攻击等相关知识点。

1.简单说下OSI七层协议模型吧

开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model)。

OSI七层模型包括应用层,表示层,会话层,传输层,网络层,数据链路层以及物理层。示意图如下所示:
在这里插入图片描述
解析:

这是一个网络协议考察的基础题目,作为应聘者的我们,不光要能准确记忆这7层分别是什么,还需要做到切实理解。我们一起来简单看下各个层的作用吧。

  • 应用层:由用户自己规定,规定各个应用之间消息传递的形式等,包括各机互访协议,分布式数据库协议等。常见的应用层协议有HTTP协议和FTP等。
  • 表示层:在满足用户需求的基础上,尽可能的节省传输费用而设置的,比如传输压缩文件,jpeg或者加密文件等格式。
  • 会话层:用于建立和拆除会话。
  • 传输层:负责将来自会话层的消息传递给网络层,常见的传输层协议有TCP和UDP等协议
  • 网络层:规定通信网内的路由选择等方式,建立用户间的信息报传输设施。常见的网络层协议有IP,ICMP以及ARP等协议
  • 数据链路层:与建立数据传输链路相关。
  • 物理层:规定一些机电性能,也包括工作方式如双工、单工或半双工,建立通信的启动和终止等。

网上流传着各个口诀来对7层模型进行名字进行记忆,但是我认为没必要。你想,要想传输东西,我们是不是需要规定两个应用之间传输的请求和响应格式?那就是应用层负责的事情;接下来是不是需要规定传输格式?这就是表示层;然后需要会话层来建立会话;由传输层将数据包传输到网络层,然后通过数据链路来传输;最底层还需要物理层来规定一些物理硬件层面的东西。

总结:应用层->表示层->会话层->传输层->网络层->数据链路层->物理层

2.TCP/IP协议有了解吗?

TCP/IP协议是一系列网络协议的总称,是网络通信的基本骨架。TCP/IP协议模型在OSI七层模型的基础上,通过合并的方式,简化为四层,分别为应用层,传输层,网络层以及链路层。

我们通常的应用程序都工作在应用层,当各个应用之间通信时,传输层的TCP模块负责给HTTP数据添加TCP头部等信息;网络层的IP模块负责给HTTP数据添加IP头部等信息;链路层添加以太网首部等信息,并且通过电信号来传输数据包;然后数据包会依次经过对方的链路层,网络层,传输层以及应用层,实现数据的通信。

解析:

在这里,我们简单的了解了下如何使用TCP/IP协议进行数据的通信。这块涉及内容较多,包括IP协议,ARP协议以及路由协议等,这里我们做一个简单的介绍了解。

IP协议:
IP协议制定了一套网络地址,也就是IP地址,根据IP协议能够区分两台主机是否同属一个网络(子网)。

ARP协议(地址解析协议 Address Resolution Protocol):
根据IP地址获取MAC地址,将目标的IP地址在链路层进行包装,生成以太网数据包,在同一个子网内进行广播出去,各个主机拿到IP地址和自己的IP地址对比,若一样,则返回自己的MAC地址。注意,MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间。

路由协议:
ARP的寻址必须是在同一个子网内,我们可以通过IP协议来确定是否是同一个子网。如果不是同一个子网,则通过网关将数据包多次转发到对应的子网中,完成这个路由协议的物理设备就是路由器。

3.(重点)可以详细说一下三次握手以及四次挥手吗?

TCP协议是一种可靠的协议,在正式传输数据之前必须通过三次握手建立连接并且互相交换窗口大小。在传输结束之后,通过四次挥手来确认双方都结束数据交互。

三次握手的状态流程图如下所示:
在这里插入图片描述
客户端经历了Close->SYN_SENT->ESTABLISHED的状态变化;
服务端经历了Close->Listen->SYN_RCVD->EATABLISHED的状态变化。

面试时候的说法:

三次握手:
第一次握手: 客户端给服务器发送一个 SYN 报文。
第二次握手: 服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。
第三次握手: 客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。

为了对双方的sequence number达成共识。其实原本是Four-way handshake,只不过为了节省资源合并了中间的两个handshake过程。过程如下 第一步 :Client发SYN message,包含其sequence number。第二步:Server ACK Client的sequence number。第三步:Server发SYN message,包含其sequence number。 第四步:Client ACK Server的sequence number。这四步使得client 和 server都对双方的sequence number达成共识,缺一不可。为了简化流程,第二部和第三步可以合并为SYN/ACK message因此就变成了Three-way handshake。然后第四步中完成了整个handshake过程,所以可以在这一步中就开始从client向server传送data。

四次挥手的状态流程图如下所示:
在这里插入图片描述

客户端经历的状态变化为:
    ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSE
服务端经历的状态变化为:
    ESTABLISHED->CLOSE_WAIT-> LAST_ACK->CLOSE

面试时候的说法:

四次挥手:
第一次挥手: 主机1(可以是客户端,也可以是服务器端),向主机2发送一个FIN报文段;
(主机1进入FIN_WAIT_1状态)
第二次挥手: 主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段;
(主机1进入FIN_WAIT_2状态,主机2进入CLOSE_WAIT状态)
第三次挥手: 主机2向主机1发送FIN报文段,请求关闭连接;
(主机2进入LAST_ACK状态)
第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段;
(主机1进入TIME_WAIT状态)
主机2收到主机1的ACK报文段以后,就关闭连接;
此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,这时主机1也可以关闭连接了。

解析:

这是一个需要重点掌握知识点,当面试官考察该题目的时候,我们可以在纸上简单的画出状态流程图,并且给面试官讲讲。这个时候基本上面试官会比较满意,但是该题目中还有如下的知识点需要掌握。

“为什么需要三次握手?两次可以吗?“

答:不可以(非常坚定的语气)。可以给面试官举个例子:假如只有前面2次握手,那么服务端来收到SYN并且发出SYN+ACK包之后就会处于工作状态。如果服务端在某一时刻突然收到了一个来自客户端的SYN包,在发出ACK之后,服务端处于工作状态。但是可能这个包是卡了很久已经被客户端给丢弃了。客户端收到SYN+ACK之后,表示情绪淡定不予理会,但是服务端已经处于工作状态了,会造成资源的浪费。

“为什么需要三次握手?四次可以吗?“

对于这类型题目的统一回答:
TCP三次握手是什么?为什么要进行三次握手?两次,四次握手可以吗

  • 1.第一次握手,发送SYN报文,传达信息:“你好,我想建立连接”;

    第二次握手,回传SYN+ACK报文,传达信息:“好的,可以建立链接”;

    第三次握手,回传ACK报文,传到信息:“好的,我知道了,那我们连接”。然后就建立连接了。

  • 2.在发送报文之前各方都要确认可以进行连接。之所以采取三次握手机制,不过是为了信息传输的可靠性,如果其中某个握手失败,这个过程将会重复,来确保其可靠性。

  • 3.如果采取两次握手,相当于第二次握手结束便建立连接,如果发送SYN的一方不想连接了,也不会有反馈,另一方却一直在等待,浪费了时间。当然可以采取4次甚至N次握手,但是有必要吗?建立连接的时间太长,效果也会大打折扣。所以3次只是折中方案,保证了可靠性,又节俭了建立连接的时间。

“为什么断开连接需要四次?“

答:根据状态流程图,我们可以看出服务端响应断开连接的请求时,其ACK和FIN包并不是一起发送给客户端的,因为第一次由客户端->服务端的FIN信号表示的是客户端想要断开连接。服务端先给出ACK确认信号,表示已经收到FIN请求,然后当自己也可以结束的时候,再次发送FIN信号,所以需要挥手交互需要四次。

另一种答法:
因为每个方向都需要一个FIN和ACK,当一端发送了FIN包之后,处于半关闭状态,此时仍然可以接收数据包。
  在建立连接时,服务器可以把SYN和ACK放在一个包中发送
  但是在断开连接时,如果一端收到FIN包,但此时仍有数据未发送完,此时就需要先向对端回复FIN包的ACK。等到将剩下的数据都发送完之后,再向对端发送FIN,断开这个方向的连接。
  因此很多时候FIN和ACK需要在两个数据包中发送,因此断开连接需要四次握手。

“四次挥手主动方为什么需要等待2MSL?“

答:主动关闭方在收到被动一方发出的FIN信号,会立马发送ACK确认信号,之后状态转变为TIME_WAIT,等待2MSL后才会进入CLOSE状态。我们先来解释下什么叫MSL(Maximum Segment Lifetime)吧。

MSL表示最大报文生存周期,任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

主动关闭方需要等待2MSL是为了,防止最后一次ACK没有被正确的传给被动方,被动关闭方会再次发送第三次的FIN信号。

注意:

我们在本知识点中所说的客户端和服务端其实都是相对的概念,也可以叫做主动方和被动方。介绍三次握手的时候,我们说到了双方会交换窗口大小,那么什么是窗口呢?

滑动窗口:
位于传输层的TCP协议是面向连接的,可靠的传输协议,拥有着确认机制。理论上,每发一个数据包都会收到其对应的确认包,然后才可以继续发送数据。

在三次握手阶段,双方互相将自己的最大可接收的数据量告诉对方,也就是自己的数据接收缓冲池的大小。这样对方可以根据已发送的数据量来计算是否可以接着发送。在处理过程中,当接收缓冲池的大小发生变化时,要给对方发送更新窗口大小的通知,利用滑动窗口机制有效提高通信效率。

解析TCP之滑动窗口

对于TCP协议的安全性,你可以说说它的重传机制吗?

由于TCP的下层网络(IP)可能出现丢失、重复或失序的情况,TCP协议提供可靠数据传输服务。为保证数据传输的正确性,TCP会重传其认为已丢失(包括报文中的比特错误)的包。TCP使用两套独立的机制来完成重传,一是基于时间,二是基于确认信息的构成。(也叫作超时重传和快速重传

第一种基于时间的重传在其下的数据链路层、网络层乃至同层的UDP协议都有使用,即设置一个计时器来判断数据传输是否超时,当然它们对于计时器时间的设定规则有所不同。
面试答法:

  • 超时重传:当超时时间到达时,发送方还未收到对端的ACK确认,就重传该数据包
  • 快速重传:当后面的序号先到达,如接收方接收到了1、 3、 4,而2没有收到,就会立即向发送方重复发送三次ACK=2的确认请求重传。如果发送方连续收到3个相同序号的ACK,就重传该数据包。而不用等待超时

TCP重传原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。
  影响超时重传机制协议效率的一个关键参数是重传超时时间(RTO,Retransmission TimeOut)。RTO的值被设置过大过小都会对协议造成不利影响。
  (1)RTO设长了,重发就慢,没有效率,性能差。
  (2)RTO设短了,重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。
  连接往返时间(RTT,Round Trip Time),指发送端从发送TCP包开始到接收它的立即响应所消耗的时间。
  
既然说到了丢包重传机制,那么请注意SACK (Selective ACK),SACK是TCP选项,它使得接收方能告诉发送方哪些报文段丢失,哪些报文段重传了,哪些报文段已经提前收到等信息,根据这些信息TCP就可以只重传哪些真正丢失的报文段。

4.(重点)TCP和UDP协议的区别?

TCP和UDP协议都是传输层常见的协议,它们的主要区别如下所示:

  • TCP协议进行数据通信之前需要三次握手建立连接,UDP协议不需要建立连接即可发送数据。
  • TCP有确认机制,丢包可以重发,保证数据的正确性;UDP不保证正确性,只是单纯的负责发送数据包。
  • TCP协议可能会对大数据包进行拆分,并且在接收方进行重组数据包操作;UDP协议是面向报文的,不会进行分片和重组,所以需要注意传输的报文大小。
  • 网络包中的TCP头部为20个字节;UDP头部只有8个字节。

解析:

这也是一道几乎必考的面试题目,我们必须清楚的阐述是否需要三次握手以及传输是否可靠,即是否有确认机制。

既然说到了丢包重传机制,那么请注意SACK (Selective ACK),SACK是TCP选项,它使得接收方能告诉发送方哪些报文段丢失,哪些报文段重传了,哪些报文段已经提前收到等信息,根据这些信息TCP就可以只重传哪些真正丢失的报文段。

UDP协议的应用:
UDP协议由于传输不需要建立连接,资源消耗较小。常用在视频或者语音传输中,域名解析服务DNS都使用了UDP协议。

前面我们提到了TCP头部以及UDP头部所占大小,那么接下来让我们看看一个完整的网络数据包都包括哪些模块吧~

5.一个网络数据包包括哪些有了解吗?

网络数据包一般包括头部和数据部分,在TCP协议中,要发送的数据经过TCP模块添加TCP头部;然后IP模块添加IP头部和MAC头部;然后在最前面加上报头/起始帧分界符以及末尾假如FCS(帧校验序列),这样就构成了一个完成的数据包。
在这里插入图片描述
在UDP协议中就是UDP头部,各个头部都有其固定的格式,TCP头部最小20个字节,UDP头部最小8个字节。

6.TCP协议中的数据包分片与重组功能有了解吗?

当TCP传输的数据包比较大时,在发送方会进行分片,在接收方进行数据包的重组。

发送方:
将数据包分为多个TCP头部+数据包的组合,TCP头部中存着不同的数据序号;之后将多个组合交由IP模块,统一添加IP头部和MAC头部,IP头部的ID号设为统一的。

接收方:
IP模块具有分片重组的功能,如果接收到的包是经过分片的,那么IP模块会将它们还原成原始的包。

分片的包会在IP头部的标志字段中进行标记,当收到分片的包时,IP模块会将其暂时存在内部的内存空间中,然后等待IP头部中具有相同ID的包全部到达,因为同一个包的所有分片都具有相同的ID。此外,IP头部还有一个分片偏移量的字段,它表示当前分片在整个包中所处的位置。根据这些信息,在所有的分片全部收到之后,就可以将它们还原成原始的包。

解析:

数据包的分片和重组里边还涉及到了MTU和MSS的概念,介绍如下:

  • MTU: Maxitum Transmission Unit 最大传输单元
  • MSS: Maxitum Segment Size 最大分段大小,MSS就是TCP数据包每次能够传输的最大数据分段。

在这里插入图片描述

7.TCP协议的拥塞避免算法有哪些?

当网络中的资源供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降。也就是说对资源的需求超过了可用的资源,因为传输数据是需要资源的。

拥塞控制:防止过多的数据注入到网络中,使得网络中的路由器或链路不致过载。

拥塞避免算法主要有如下两种:

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

拥塞控制是一个全局性的过程; 流量控制是点对点通信量的控制
  TCP拥塞控制4个核心算法:慢开始(slow start)、拥塞避免(Congestion Avoidance)、快速重传(fast retransmit)、快速回复(fast recovery)
  拥塞窗口(cwnd,congestion window),其大小取决于网络的拥塞程度,并且动态地在变化。
  
  慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。

为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下:
当cwnd < ssthresh时,使用慢开始算法。
当cwnd > ssthresh时,改用拥塞避免算法。
当cwnd = ssthresh时,慢开始与拥塞避免算法任意。

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

8.HTTP和HTTPS的区别有哪些?

HTTP和HTTPS的主要区别可以总结如下:

  • HTTP是超文本传输协议,数据明文传输;HTTPS在HTTP的基础上加入了SSL协议,实现数据的加密传输;
  • HTTPS需要区申请证书,一般是收费的;
  • HTTP默认使用80端口,HTTPS默认使用443端口

解析:

这是一网络协议的基础题目,请大家务必掌握。在这里我们一起更加详细的进行学习吧。既然HTTPS = HTTP + SSL,那么我们先来看何为HTTP协议吧。

HTTP协议

HTTP是超文本传输协议,是一种无状态的协议,是常见的一种应用层协议。HTTP是一个通信规则,规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。

HTTP请求信息:HTTP请求头中可以看到当前请求支持的语言,压缩格式,编码格式以及何种类型的返回文件,Connection以及Cookie,Content-Type等信息。

HTTP返回信息:HTTP返回信息中包括响应协议,HTTP Code以及Content-Type,时间和Cookie等信息。

(HTTP请求和返回的具体信息,大家可以任意打开一个网址,F12查看每一个具体的HTTP请求的请求和返回信息)

在这里插入图片描述

HTTP请求中的Get和Post方法有哪些区别?

  • Get一般用来从服务器上查询获取资源;Post一般用来更新服务器上的资源;
  • Get方法将参数直接拼接在了URL后边,明文显示,可以通过浏览器地址栏直接访问;
  • Post请求用于提交表单,数据不是明文的,安全性更高;
  • Get请求有长度限制,Post请求没有

put请求与post请求的区别?

要理解这个问题首先需要解决幂等性的问题,幂等性就是:幂等通俗来说是指不管进行多少次重复操作,都是实现相同的结果。
GET,PUT,DELETE都是幂等操作,而POST不是。

首先GET请求很好理解,对资源做查询多次,此实现的结果都是一样的。

PUT请求的幂等性可以这样理解,将A修改为B,它第一次请求值变为了B,再进行多次此操作,最终的结果还是B,与一次执行的结果是一样的,所以PUT是幂等操作。
同理可以理解DELETE操作,第一次将资源删除后,后面多次进行此删除请求,最终结果是一样的,将资源删除掉了。

POST不是幂等操作,因为一次请求添加一份新资源,二次请求则添加了两份新资源,多次请求会产生不同的结果,因此POST不是幂等操作。

也就是,如果是更新,并不会产生新的数据,新的数据会覆盖老的数据,用put,如果是创建,会产生新的数据,则用post

常见的HTTP Code有哪些?

  • 1xx(临时响应)
  • 2xx(成功)
  • 3xx(重定向):表示要完成请求需要进一步操作
  • 4xx(错误):表示请求可能出错,妨碍了服务器的处理
  • 5xx(服务器错误):表示服务器在尝试处理请求时发生内部错误

接着,我们可以给出具体的状态码。

常见HTTP协议的状态码:

  • 200(成功)
  • 302 (重定向):请求重定向到指定网页
  • 304(未修改):自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容
  • 401(未授权):请求要求身份验证
  • 403(禁止):服务器拒绝请求(比如死循环了,一直访问)
  • 404(未找到):服务器找不到请求的网页
  • 405 (方法禁用):Post请求当成了Get请求直接访问
  • 500 (服务器内部错误):有bug导致程序崩溃了
  • 502 (错误网关):服务器从上游接到了无效响应
  • 504 ( 网关超时):nginx请求超时,请求一直没有返回

这里简单阐述304的含义,304表示上次请求结束到现在,目标网页内容未改变,客户端可以直接显示上次的内容。通过客户端和服务端之间的一个Last-Modified来判断。如下所示:
在这里插入图片描述
前面我们说到了HTTP是一种无状态的协议,也就是说每一次请求都是一个独立的会话,那么会话状态(比如说用户的登录状态)该如何保持呢?

cookie和session有了解吗?

HTTP协议是一种无状态的协议,我们可以使用cookie和session来保持会话状态。用户发起请求,服务端收到请求处理后可以生成一个sessionId,并且将sessionId存入cookie中返回给客户端,将session的内容存储在服务器上。在下一次的请求中,客户端带着cookie来请求服务器,服务端从cookie中取出sessionId,实现了用户会话状态的保持。

这样做有一个缺点就是将一些东西存在了服务器上,在用户量较大的情况下,服务器容量会不足。实际情况中,经常是将所需要的会话状态,比如说登录态直接存入cookie并且返回给客户端,下次请求时,服务端直接取出cookie中的信息和参数信息进行比较,保持HTTP会话状态。

总结:session保存在服务端。cookie保存在客户端,并且cookie有大小限制。

基本了解了HTTP协议之后,我们再来简单看下何为SSL协议吧

SSL协议

HTTPS协议在HTTP的基础上加入了SSL(安全套接字层)协议,SSL逐渐演变为了TLS协议,但是业界习惯仍然称其为SSL协议。

SSL协议在传输控制层的基础上建立了安全的连接,它作为一种通用可靠的安全解决方案,可与多种应用层协议结合使用,实现应用数据的安全传输。SSL协议分为记录协议,握手协议,警告协议和密码规范改变协议

记录协议:接收上层协议或下层协议的消息并进行一系列的处理,然后再将处理后的消息继续向下或向上传递。主要包括对消息进行加解密,压缩解压缩,分段或者重组等操作。

握手协议:建立在三次握手之后,为通信双方确立安全连接所需要的安全参数,通常也会在此阶段对通信双方身份的真实性进行验证。

警告协议:无论是在握手阶段还是在对应用层数据的传输阶段,都有可能出现差错。警告协议规定了在SSL协议工作过程中可能出现的差错、错误的严重等级以及相应的处理方式。

密码规范改变协议:在SSL握手刚开始的时候,加密参数还没确定,消息都是明文传送的。双方协商好加密参数之后,在发送握手结束消息之前,需要发送一个密码规范改变消息(Change Cipher Message)来通知对方随后的消息都使用刚刚协商好的加密算法和加密密钥进行加密。

9.HTTP1.0,HTTP1.1以及HTTP2.0协议的区别

主要区别和特点可以概括如下:

  • HTTP1.0:
    HTTP1.0是一种无状态,无连接的协议。浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。也就是默认使用Connection: close

  • HTTP1.1:
    HTTP/1.1中默认使用Connection: keep-alive,避免了连接建立和释放的开销。但服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。通过Content-Length字段来判断当前请求的数据是否已经全部接收。不允许同时存在两个并行的响应。

  • HTTP2.0:
    HTTP2.0协议新增了二进制分帧,多路复用,头部压缩和服务器推送等功能,进一步提高了传输效率。

接下来,我们再来介绍路由汇聚和子网掩码相关的知识点吧,这块知识点常见于笔试题目中,要求我们计算出正确的答案。

10.路由汇聚

路由汇聚是指把一组路由汇聚为一个单个的路由广播。路由汇聚优点是可以缩小网络上的路由表的尺寸。

算法实现

  • 将各子网地址的网段以二进制写出。
  • 比较,从第1位比特开始进行比较,将从开始不相同的比特到末尾位填充为0。由此得到的地址为汇总后的网段的网络地址,其网络位为连续的相同的比特的位数。

举例:

假设下面有4个网络:

172.18.129.0/24
172.18.130.0/24
172.18.132.0/24
172.18.133.0/24

这四个进行路由汇聚,那么能覆盖这四个网络的汇总地址是:172.18.128.0/21

具体计算方式如下:

  • 129的二进制代码是10000001
  • 130的二进制代码是10000010
  • 132的二进制代码是10000100
  • 133的二进制代码是10000101

这四个数的前五位相同都是10000,所以加上前面的172.18这两部分相同的位数,网络号就是8+8+5=21。而10000000的十进制数是128,所以,路由汇聚的IP地址就是172.18.128.0。所以最终答案就是172.18.128.0/21

11.子网掩码的求法

笔试中关于子网掩码的求法一般考察下边的两种。

根据划分的子网数:
算法实现:在求子网掩码之前必须先搞清楚要划分的子网数目,以及每个子网内的所需主机数目。

  • 将子网数目转化为二进制来表示
  • 取得该二进制的位数,为 N
  • 取得该IP地址的类子网掩码,将其主机地址部分的前N位置1 即得出该IP地址划分子网的子网掩码。

举例:

如欲将B类IP地址168.195.0.0划分成27个子网,则其子网掩码为255.255.248.0

  • 27=11011
  • 该二进制为五位数,N = 5
  • 将B类地址的子网掩码255.255.0.0的主机地址前5位置1(B类地址的主机位包括后两个字节,所以这里要把第三个字节的前5位置1),得到 255.255.248.0

根据每个子网中的主机数:
算法实现:利用主机数来计算。

  • 将主机数目转化为二进制来表示
  • 如果主机数小于或等于254(注意去掉保留的两个IP地址),则取得该主机的二进制位数,为 N,这里肯定N<8。如果大于254,则 N>8,这就是说主机地址将占据不止8位。
  • 使用255.255.255.255来将该类IP地址的主机地址位数全部置1,然后从后向前的将N位全部置为 0,即为子网掩码值。

举例:

如欲将B类IP地址168.195.0.0划分成若干子网,每个子网内有主机700台,则其子网掩码为:255.255.252.0

  • 700=1010111100
  • 该二进制为十位数,N = 10
  • 将该B类地址的子网掩码255.255.0.0的主机地址全部置1,得到255.255.255.255
  • 然后再从后向前将后10位置0,即为: 11111111.11111111.11111100.00000000
  • 即255.255.252.0。

12.XSS跨站脚本攻击

**XSS (Cross-Site Scripting)**跨站脚本攻击是一种常见的安全漏洞,恶意攻击者在用户提交的数据中加入一些代码,将代码嵌入到了Web页面中,从而可以盗取用户资料,控制用户行为或者破坏页面结构和样式等。为了和 CSS 区分,这里把攻击的第一个字母改成了 X,于是叫做 XSS。

最简单的就是当我们提交一个查询后弹出一个alert页面,却无论如何都关不掉,这就是发生了XSS跨站脚本攻击。

XSS产生原因:

XSS产生的原因是过于信任客户端的数据,没有做好过滤或者转义等工作。如果客户端上传的数据中插入一些符号以及javascript代码,那么这些数据将会成为应用代码中的一部分了,这样就造成了XSS攻击。

XSS分类:

  • 存储型:攻击者将恶意代码存储到了数据库中,在响应浏览器请求的时候返回恶意代码,并且执行。这种攻击常见于带有用户保存数据的网站功能;
  • 反射型:将恶意代码放在URL中,将参数提交到服务器。服务器解析后响应,在响应结果中存在XSS代码,最终通过浏览器解析执行;
  • DOM型:取出和执行恶意代码由浏览器端完成,属于前端 JavaScript的安全漏洞。

XSS防御:

  • 对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie;
  • 对输入内容的特定字符进行编码,前端后端都可以对传入的内容进行过滤,去掉带javascript等字段的输入

13.CSRF跨站请求伪造

CSRF( Cross-site request forgery)跨站请求伪造,也是一种常见的安全漏洞。XSS相当于是控制了站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。

CSRF举例:

用户登录受信任网站A,并在本地生成登录态Cookie。(如果用户没有登录网站A,那么网站B在获取A网站的信息并且去请求网站A的接口时,会提示登录)在不登出A的情况下,访问恶意网站B,那么网站B得到了网站A的所有信息,然后B网站去请求A网站的接口,伪装成A网站的正常请求为所欲为。

下边以示意图来说明CSRF整个流程:
在这里插入图片描述

注意:

CSRF中恶意网站仅仅是伪装成了正常用户,但是其并不可以直接获取到正常用户的登录态cookie等信息。如果不做防御,被攻击网站服务器是无法区分是否是冒用用户,因为当前请求确实带着登录凭证等信息。

CSRF防御:

  • Referer 头验证:在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。不靠谱,Referer可以被改变;
  • Token验证:服务器发送给客户端一个Token,客户端提交的表单中(或者URL上)带着这个Token。如果这个Token 不合法,那么服务器拒绝这个请求。
  • 双重Cookie验证:利用恶意网站无法获取cookie信息,仅可冒用的特点,我们将cookie中的参数取出来,加入到请求参数中,服务端进行校验,如果参数中没有附加额外的cookie中的参数,那么就拒绝请求。

解析:

XSS和CSRF均属于安全漏洞,和我们的开发工作息息相关。对于一些对安全性有一定要求的方向和岗位,了解常见的XSS和CSRF攻击无疑是面试的一大加分项。

那么接下来,我们看看CSRF和XSS的区别有哪些呢?

  • CSRF攻击需要用户先登录网站A,恶意网站B获取到A网站用户的 cookie;
  • XSS攻击则不需要登录。
  • CSRF攻击本质是利用网站A本身的漏洞,去请求网站A的相关接口;
  • XSS攻击向网站 A 注入恶意代码,然后通过执行恶意代码,篡改了网站A的内容。

14.SSRF服务端请求伪造

SSRF是一种由攻击者构造请求,利用服务端发起的一种安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统。我们先来看下SSRF攻击的示意图:
在这里插入图片描述
SSRF漏洞举例:

  • 正常的网络请求流程:客户端A发起请求 -> 服务端B接收请求 -> 服务端B处理请求 -> 服务端B返回响应
  • 存在SSRF漏洞下的网络请求流程:

比如现在客户端A发起的请求是这样的 www.nowcoder.com/xxx.php?image=www.abc.com/photo.jpg。 服务端B收到该请求后,会接着取访问www.abc.com/photo.jpg 获取资源文件。如果服务端B对客户端发起的请求没有进行过滤等操作,那么?image=可能会被恶意篡改。最后的结果就是,借助于公网上的服务器来访问了内网系统。

SSRF产生原因:

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如指定URL地址获取网页文本内容,加载指定地址的图片和文档等。

常见SSRF漏洞出现场景:

  • 分享场景,通过URL地址分享网页内容。
  • 转码服务,在线翻译场景。
  • 地址加载或下载图片。
  • 图片、文章收藏功能。
  • 未公开的api实现以及其他调用URL的功能等。

SSRF漏洞危害:

因为外网借助了服务端来实现了对内网服务器的访问,所以很多操作都可以进行,包括如下的危害:

  • 对服务器所在的内网进行端口扫描,获取一些服务的banner信息等。
  • 攻击运行在内网或者本地的应用程序。
  • 对内网WEB应用进行指纹识别,通过访问默认文件实现。
  • 下载内网的一些资源文件等。

SSRF的防御措施:

  • 错误信息进行统一处理,避免用户可以根据错误信息来判断远端服务器的端口状态。
  • 对请求的端口进行限制,限定为HTTP常用的端口,比如,80,443和8080等。
  • 设定IP黑名单。避免应用被用来获取内网数据,攻击内网。
  • 禁用不需要的协议。仅仅允许HTTP和HTTPS请求。
  • 对返回信息进行有效过滤等。

15.SQL注入

SQL注入是指通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器,执行恶意的SQL命令。

SQL注入就是服务端将客户端传入的恶意SQL语句直接进行了执行,这样会导致问题出现。比如说用户在登录的时候,使用了or 1=1来完成身份验证和授权。

SQL注入是一种流行的攻击攻击方法,但是通过一些手段是可以防御该攻击的,常见的防御手段如下:

  • 使用预编译语句,比如MyBatis中的SQL语句使用#号代替$符号。
  • 使用安全的存储过程来防止SQL注入。
  • 对客户端的输入进行数据类型的检查等。

解析:

做为一名优秀的服务端开发人员,我们应该牢记一条原则,“永远不要相信客户端”。对客户端的每次请求,我们都要做好充分的过滤,验证与授权,这样才可以尽可能的避免常见的Web安全漏洞,抵御来自外部世界的攻击。

(重点)16.从浏览器中输入一个网址,比如:https://www.nowcoder.com/ 之后都发生了啥?

在浏览器中输入一个网址,首先要做的就是域名的解析,也就是域名->ip的解析,依次查看了浏览器缓存,系统缓存,hosts文件,路由器缓存,递归搜索根域名服务器,直到找到最终的ip地址

然后就是TCP协议的三次握手建立连接,过程我们已经阐述了。由浏览器发送一个HTTP请求;经过路由器的转发,通过服务器的防火墙,该HTTP请求到达了服务器;服务器处理该HTTP请求,返回一个HTML文件;浏览器解析该HTML文件,并且渲染显示在浏览器端。

(重点)17.HTTP协议和TCP协议的关系与区别

HTTP协议是一种基于TCP/IP的应用层协议,进行HTTP数据请求必须先建立TCP/IP连接。HTTP协议提供了封装或者显示数据的具体形式;TCP协议提供了网络通信的能力。两个计算机之间的交流其实就是是两个端口之间的数据通信,具体的数据会以什么样的形式展现是以不同的应用层协议来定义的。

18.说说TCP中的粘包是什么?怎么回事?

首先。TCP是流协议,根本不存在所谓粘包一说。
简单地说,TCP保证发送方以什么顺序发字节流,接收方就一定能按这个顺序接收到,或者因为网络超时返回错误。这个是操作系统保证的,应用程序根本不用管也控制不了。

这个问题是发送方应该以什么格式发送数据,接收方能正确解析出数据,这个叫应用层协议,你自己定,跟TCP完全无关。如是发文件,最简单的你可以用http协议封装,如果你发的http协议数据是100%正确的,无论哪个接收方(nginx/tomcat/is) 保证能一字节不差地收 下,因为http协议本身就带header和body, header里 有Content-Length: 12345指定了body的大小,body才是文件本身。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值