计算机网络——面试问题总结(2)

摘要

本博文主要收集面试过程中涉及到计算机网络的面试题目与解答。以下博文的问题都来源互联网中收集的面试题目。

每一层对应的网络协议有哪些?

什么是 XSS 攻击?

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

XSS攻击的危害

  • 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
  • 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  • 盗窃企业重要的具有商业价值的资料
  • 非法转账
  • 强制发送电子邮件
  • 网站挂马
  • 控制受害者机器向其它网站发起攻击

XSS攻击原因解析

  • 主要原因:过于信任客户端提交的数据!

XSS攻击解决办法

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

什么是 SQL 注入攻击?

SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,服务器拿到这个字符串之后,会把这个字符串作为 sql 的执行参数去数据库查询,然而这个参数是恶意的,以至于服务器执行这条 sql 命令之后,出现了问题。

SQL 注入攻击解决方法

  • (1). 参数绑定:使用预编译手段,绑定参数是最好的防SQL注入的方法。目前许多的ORM框架及JDBC等都实现了SQL预编译和参数绑定功能,攻击者的恶意SQL会被当做SQL的参数而不是SQL命令被执行。在mybatis的mapper文件中,对于传递的参数我们一般是使用 #$来获取参数值。
  • 当使用#时,变量是占位符,就是一般我们使用javajdbc的PrepareStatement时的占位符,所有可以防止sql注入;当使用 $时,变量就是直接追加在sql中,一般会有sql注入问题。
  • (2). 使用正则表达式过滤传入的参数,例如把出现不安全的字符过滤掉等等。

什么是CSRF攻击

CSRF,跨站请求伪造(英文全称是Cross-site request forgery),是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

怎么解决CSRF攻击呢?

  • 检查Referer字段。
  • 添加校验token。

TCP和UDP的区别

UDP TCP
是否连接 无连接 面向连接
是否可靠 不可靠传输,不使用流量传输和拥塞控制 可靠传输,使用流量传输和拥塞控制
连接对象个数 支持一对一 一对多 多对一等 只能一对一
传输方式 面向报文 面向字节流
首部开销 首部开销小8字节 首部字节20 最大60
使用场景

适用于实时应用(IP电话、视频会议、直播等)

要求可靠性传输,例如文件传输
  • 1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
  • 2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  • 3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
  • UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
  • 4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
  • 5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
  • 6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
  • 7、UDP是面向报文的,发送方的UDP对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层,论应用层交给UDP多长的报文,它统统发送,一次发送一个。而对接收方,接到后直接去除首部,交给上面的应用层就完成任务了。因此,它需要应用层控制报文的大小,TCP是面向字节流的,它把上面应用层交下来的数据看成无结构的字节流会发送,可以想象成流水形式的,发送方TCP会将数据放入“蓄水池”(缓存区),等到可以发送的时候就发送,不能发送就等着TCP会根据当前网络的拥塞状态来确定每个报文段大小。

URI和URL的区别

  • URI,全称是Uniform Resource Identifier),中文翻译是统一资源标志符,主要作用是唯一标识一个资源。
  • URL,全称是Uniform Resource Location),中文翻译是统一资源定位符,主要作用是提供资源的路径。 打个经典比喻吧,URI像是身份证,可以唯一标识一个人,而URL更像一个住址,可以通过URL找到这个人。

ICMP协议的功能

ICMP,Internet Control Message Protocol ,Internet控制消息协议。

  • ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。
  • 它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。
  • 当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

比如我们日常使用得比较多的ping,就是基于ICMP的。

说下ping的原理

一般来说,ping可以用来检测网络通不通。它是基于ICMP协议工作的。假设机器A ping机器B

工作过程如下:

  1. ping通知系统,新建一个固定格式的ICMP请求数据包。
  2. ICMP协议,将该数据包和目标机器B的IP地址打包,一起转交给IP协议层。
  3. IP层协议将本机IP地址为源地址,机器B的IP地址为目标地址,加上一些其他的控制信息,构建一个IP数据包。
  4. 先获取目标机器B的MAC地址。
  5. 数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址是本机的MAC地址
  6. 机器B收到后,对比目标地址,和自己本机的MAC地址是否一致,符合就处理返回,不符合就丢弃。
  7. 根据目的主机返回的ICMP回送回答报文中的时间戳,从而计算出往返时间。
  8. 最终显示结果有这几项:发送到目的主机的IP地址、发送 & 收到 & 丢失的分组数、往返时间的最小、最大& 平均值。

HTTP缓存机制

缓存的类型:

缓存是一种保存资源副本并在下次请求中直接使用该副本的技术,缓存能够节约网络资源,提升页面响应速度。常见的缓存类型分为共享缓存和私有缓存。

私有缓存:私有缓存只能用于单独用户,常见的浏览器缓存便是私有缓存。私有缓存能够存储用户通过http下载过的文档,从而在用户再次访问时直接提供给用户,而不用向服务器发送请求。

共享缓存:共享缓存能够被多个用户使用,常用的web代理中便使用的共享缓存 缓存寿命 缓存寿命的计算的依据依次是: 请求头中的Cache-Control: max-age=N。相应的缓存寿命即为 N,从设置开始,N秒之后过期。

Expires属性,Expires属性的值为过期的时间点,在这个时间点后,该缓存被认为过期
Last-Modified信息。缓存的寿命为头里面 Date表示的事件点减去 Last-Modified的时间点的结果乘以 10%。判断文件是否更改可以看文件时间戳。

TCP基础问题

瞧瞧TCP头格式

序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。

确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决不丢包的问题。

控制位:

  • ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN
  • 包之外该位必须设置为 1 。
  • RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
  • SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
  • FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。

为什么需要TCP协议?TCP工作在哪一层?

IP 层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。因为 TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。

什么是TCP ?

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。

面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消
息,也就是一对多是无法做到的;

可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收
端;

字节流:消息是「没有边界」的,所以无论我们消息有多大都可以进行传输。并且消息是「有序
的」,当「前一个」消息没有收到的时候,即使它先收到了后面的字节,那么也不能扔给应用层
去处理,同时对「重复」的报文会自动丢弃。

什么是 TCP连接?

简单来说就是,用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。

所以我们可以知道,建立一个 TCP 连接是需要客户端与服务器端达成上述三个信息的共识。

  • Socket:由 IP 地址和端口号组成
  • 序列号:用来解决乱序问题等
  • 窗口大小:用来做流量控制

如何唯一确定一个 TCP 连接呢?

TCP 四元组可以唯一的确定一个连接,四元组包括如下:

  • 源地址
  • 源端口
  • 目的地址
  • 目的端口

有一个IP的服务器监听了一个端口,它的TCP的最大连接数是多少?

服务器通常固定在某个本地端口上监听,等待客户端的连接请求。因此,客户端 IP 和 端口是可变的,其理论值计算公式如下:

对 IPv4,客户端的 IP 数最多为 2 的 32 次方,客户端的端口数最多为 2 的 16 次方,也就是
服务端单机最大 TCP 连接数,约为 2 的 48 次方。

当然,服务端最大并发 TCP 连接数远不能达到理论上限。首先主要是文件描述符限制,Socket 都是文件,所以首先要通过 ulimit 配置文件描述符的数目;另一个是内存限制,每个 TCP 连接都要占用一定内存,操作系统的内存是有限的。

UDP和TCP有什么区别呢?分别的应用场景是?

TCP 和 UDP 区别
TCP UDP
连接 TCP 是面向连接的传输层协议,传输数据前先要建立连接。 UDP 是不需要连接,即刻传输数据。
服务对象 TCP 是一对一的两点服务,即一条连接只有两个端点。 UDP 支持一对一、一对多、多对多的交互通信
可靠性 TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达 UDP 是尽最大努力交付,不保证可靠交付数据。
拥塞控制、流量控制 TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。 UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
首部开销 TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使
用了「选项」字段则会变长的。
UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
传输方式 TCP 是流式传输,没有边界,但保证顺序和可靠。 UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。
7. 分
分片不同 TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输
层组装 TCP 数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片。
UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完
数据,接着再传给传输层,但是如果中途丢了一个分片,则就需要重传所有的数据包,这样传输
效率非常差,所以通常 UDP 的报文应该小于 MTU。
应用场景 由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
FTP 文件传输
HTTP / HTTPS
由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:
包总量较少的通信,如 DNS 、SNMP 等
视频、音频等多媒体通信
广播通信

为什么UDP头部没有「首部长度」字段,而TCP头部有「首部长度」字段呢?

原因是 TCP 有可变长的「选项」字段,而 UDP 头部长度则是不会变化的,无需多一个字段去记录UDP 的首部长度。

为什么UDP头部有「包长度」字段,而TCP头部则没有「包长度」字段呢?

先说说 TCP 是如何计算负载数据长度:

 其中 IP 总长度 和 IP 首部长度,在 IP 首部格式是已知的。TCP 首部长度,则是在 TCP 首部格式已知的,所以就可以求得 TCP 数据的长度。大家这时就奇怪了问:“ UDP 也是基于 IP 层的呀,那 UDP 的数据长度也可以通过这个公式计算呀?为何还要有「包长度」呢?”这么一问,确实感觉 UDP 「包长度」是冗余的。因为为了网络设备硬件设计和处理方便,首部长度需要是 4 字节的整数倍。如果去掉 UDP 「包长度」字段,那 UDP 首部长度就不是 4 字节的整数倍了,所以小林觉得这可能是为了补全 UDP 首部长度是 4 字节的整数倍,才补充了「包长度」字段。

TCP 连接建立问题

TCP三次握手过程和状态变迁

一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN
状态

客户端会随机初始化序号( client_isn ),将此序号置于 TCP 首部的「序号」字段中,同时把
SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务
端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。

服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号( server_isn ),将此
序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn +
1 , 接着把 SYN 和 ACK 标志位置为 1 。最后把该报文发给客户端,该报文也不包含应用层
数据,之后服务端处于 SYN-RCVD 状态。

客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部
ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务
端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。

服务器收到客户端的应答报文后,也进入 ESTABLISHED 状态。

从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的,这也是面试常问的题。

一旦完成三次握手,双方都处于 ESTABLISHED 状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了。

如何在 Linux 系统中查看 TCP 状态?

TCP 的连接状态查看,在 Linux 可以通过 netstat -napt 命令查看。

为什么是三次握手?不是两次、四次?

相信大家比较常回答的是:“因为三次握手才能保证双方具有接收和发送的能力。”这回答是没问题,但这回答是片面的,并没有说出主要的原因。在前面我们知道了什么是 TCP 连接:用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。所以,重要的是为什么三次握手才可以初始化Socket、序列号和窗口大小并建立 TCP 连接。

接下来以三个方面分析三次握手的原因:

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
  • 三次握手才可以同步双方的初始序列号
  • 三次握手才可以避免资源浪费

简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。网络环境是错综复杂的,往往并不是如我们期望的一样,先发送的数据包,就先到达目标主机,反而它很骚,可能会由于网络拥堵等乱七八糟的原因,会使得旧的数据包,先到达目标主机,那么这种情况下TCP 三次握手是如何避免的呢?

 

为什么客户端和服务端的初始序列号ISN是不相同的?

初始序列号ISN是如何随机产生的?

既然IP层会分片,为什么TCP层还需要MSS呢?

什么是SYN攻击?如何避免SVN攻击?

TCP 连接断开问题

TCP四次挥手过程和状态变迁为什么挥手需要四次?

为什么TIME_WAIT等待的时间是2MSL?为什么需要TIME_WAIT状态?

TIME_WAIT过多有什么危害?如何优化TIME_WAIT?

如果已经建立了连接,但是客户端突然出现故障了怎么办?

Socket 编程问题

针对TCP应该如何Socket编程?

listen时候参数backlog的意义?

accept发送在三次握手的哪—步?

客户端调用close 了,连接是断开的流程是什么?

博文参考

おすすめ

転載: blog.csdn.net/weixin_41605937/article/details/121411030
おすすめ