面试官:说下什么是TCP 的粘包和拆包?

面试官:说下什么是TCP 的粘包和拆包?

大家好,又见面了,我是全栈君。

26. 聊聊 TCP 的滑动窗口

TCP 发送一个数据,需要收到确认应答,才会发送下一个数据。这样有个缺点,就是效率会比较低。

这就好像我们面对面聊天,你说完一句,我应答后,你才会说下一句。那么,如果我在忙其他事情,没有能够及时回复你。你说完一句后,要等到我忙完回复你,你才说下句,这显然很不现实。

为了解决这个问题,TCP 引入了窗口,它是操作系统开辟的一个缓存空间。窗口大小值表示无需等待确认应答,而可以继续发送数据的最大值。

TCP 头部有个字段叫 win,也即那个 16 位的窗口大小,它告诉对方本端的 TCP 接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度,从而达到流量控制的目的。

通俗点讲,就是接受方每次收到数据包,在发送确认报文的时候,同时告诉发送方,自己的缓存区还有多少空余空间,缓冲区的空余空间,我们就称之为接受窗口大小。这就是 win。

TCP 滑动窗口分为两种:发送窗口和接收窗口。发送端的滑动窗口包含四大部分,如下:

  • 已发送且已收到 ACK 确认

  • 已发送但未收到 ACK 确认

  • 未发送但可以发送

  • 未发送也不可以发送

面试官:说下什么是TCP 的粘包和拆包?

  • 虚线矩形框,就是发送窗口。

  • SND.WND: 表示发送窗口的大小,上图虚线框的格子数就是 14 个。

  • SND.UNA: 一个绝对指针,它指向的是已发送但未确认的第一个字节的序列号。

  • SND.NXT:下一个发送的位置,它指向未发送但可以发送的第一个字节的序列号。

接收方的滑动窗口包含三大部分,如下:

  • 已成功接收并确认

  • 未收到数据但可以接收

  • 未收到数据并不可以接收的数据

面试官:说下什么是TCP 的粘包和拆包?

  • 虚线矩形框,就是接收窗口。

  • REV.WND: 表示接收窗口的大小,上图虚线框的格子就是 9 个。

  • REV.NXT: 下一个接收的位置,它指向未收到但可以接收的第一个字节的序列号。

27. 聊聊五层计算机网络体系结构中,每一层对应的网络协议有哪些?

面试官:说下什么是TCP 的粘包和拆包?

28. 聊聊 TCP 的流量控制

TCP 三次握手,发送端和接收端进入到 ESTABLISHED 状态,它们即可以愉快地传输数据啦。

但是发送端不能疯狂地向接收端发送数据,因为接收端接收不过来的话,接收方只能把处理不过来的数据存在缓存区里。如果缓存区都满了,发送方还在疯狂发送数据的话,接收方只能把收到的数据包丢掉,这就浪费了网络资源啦。

TCP 提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是流量控制。

TCP 通过滑动窗口来控制流量,我们看下流量控制的简要流程吧:

首先双方三次握手,初始化各自的窗口大小,均为 400 个字节。

面试官:说下什么是TCP 的粘包和拆包?

  1. 假如当前发送方给接收方发送了 200 个字节,那么,发送方的 SND.NXT 会右移 200 个字节,也就是说当前的可用窗口减少了 200 个字节。

  2. 接受方收到后,放到缓冲队列里面,REV.WND =400-200=200 字节,所以 win=200 字节返回给发送方。接收方会在 ACK 的报文首部带上缩小后的滑动窗口 200 字节

  3. 发送方又发送 200 字节过来,200 字节到达,继续放到缓冲队列。不过这时候,由于大量负载的原因,接受方处理不了这么多字节,只能处理 100 字节,剩余的 100 字节继续放到缓冲队列。这时候,REV.WND = 400-200-100=100 字节,即 win=100 返回发送方。

  4. 发送方继续干活,发送 100 字节过来,这时候,接受窗口 win 变为 0。

  5. 发送方停止发送,开启一个定时任务,每隔一段时间,就去询问接受方,直到 win 大于 0,才继续开始发送。

29. 说下 ARP 协议的工作原理?

ARP 协议协议,即 Address Resolution Protocol,地址解析协议,用于实现 IP 地址到 MAC 地址的映射。

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

  2. 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己的 ARP 列表,是否存在该 IP 地址对应的 MAC 地址;如果存在﹐就直接将数据包发送到这个 MAC 地址;如果不存在,就向本地网段发起一个 ARP 请求的广播包,查询此目的主机对应的 MAC 地址。此 ARP 请求的数据包里,包括源主机的 IP 地址、硬件地址、以及目的主机的 IP 地址。

  3. 网络中所有的主机收到这个 ARP 请求后,会检查数据包中的目的 IP 是否和自己的 IP 地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的 MAC 地址和 IP 地址添加到自己的 ARP 列表中,如果 ARP 表中已经存在该 IP 的信息,则将其覆盖,然后给源主机发送一个 ARP 响应数据包,告诉对方自己是它需要查找的 MAC 地址。

  4. 源主机收到这个 ARP 响应数据包后,将得到的目的主机的 IP 地址和 MAC 地址添加到自己的 ARP 列表中,并利用此信息开始数据的传输。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。

30. 说下 TCP 的拥塞控制

拥塞控制是作用于网络的,防止过多的数据包注入到网络中,避免出现网络负载过大的情况。它的目标主要是最大化利用网络上瓶颈链路的带宽。它跟流量控制又有什么区别呢?流量控制是作用于接收者的,根据接收端的实际接收能力控制发送速度,防止分组丢失的。

我们可以把网络链路比喻成一根水管,如果我们想最大化利用网络来传输数据,那就是尽快让水管达到最佳充满状态。

面试官:说下什么是TCP 的粘包和拆包?

发送方维护一个拥塞窗口 cwnd(congestion window) 的变量,用来估算在一段时间内这条链路(水管)可以承载和运输的数据(水)的数量。它大小代表着网络的拥塞程度,并且是动态变化的,但是为了达到最大的传输效率,我们该如何知道这条水管的运送效率是多少呢?

一个比较简单的方法就是不断增加传输的水量,直到水管快要爆裂为止(对应到网络上就是发生丢包),用 TCP 的描述就是:

只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网络出现拥塞,拥塞窗口的值就应该减小一些,以减少注入到网络中的数据包数。

实际上,拥塞控制主要有这几种常用算法

  • 慢启动

  • 拥塞避免

  • 拥塞发生

  • 快速恢复

慢启动算法

慢启动算法,表面意思就是,别急慢慢来。它表示 TCP 建立连接完成后,一开始不要发送大量的数据,而是先探测一下网络的拥塞程度。由小到大逐渐增加拥塞窗口的大小,如果没有出现丢包,每收到一个 ACK,就将拥塞窗口 cwnd 大小就加 1(单位是 MSS)。每轮次发送窗口增加一倍,呈指数增长,如果出现丢包,拥塞窗口就减半,进入拥塞避免阶段。

  • TCP 连接完成,初始化 cwnd = 1,表明可以传一个 MSS 单位大小的数据。

  • 每当收到一个 ACK,cwnd 就加一;

  • 每当过了一个 RTT,cwnd 就增加一倍;呈指数让升

    面试官:说下什么是TCP 的粘包和拆包?

为了防止 cwnd 增长过大引起网络拥塞,还需设置一个慢启动阀值 ssthresh(slow start threshold)状态变量。当 cwnd 到达该阀值后,就好像水管被关小了水龙头一样,减少拥塞状态。即当 cwnd >ssthresh 时,进入了拥塞避免算法

拥塞避免算法

一般来说,慢启动阀值 ssthresh 是 65535 字节,cwnd 到达慢启动阀值后

  • 每收到一个 ACK 时,cwnd = cwnd + 1/cwnd

  • 当每过一个 RTT 时,cwnd = cwnd + 1

显然这是一个线性上升的算法,避免过快导致网络拥塞问题。

面试官:说下什么是TCP 的粘包和拆包?

拥塞发生

当网络拥塞发生丢包时,会有两种情况:

  • RTO 超时重传

  • 快速重传

如果是发生了 RTO 超时重传,就会使用拥塞发生算法

  • 慢启动阀值 sshthresh = cwnd /2

  • cwnd 重置为 1

  • 进入新的慢启动过程

面试官:说下什么是TCP 的粘包和拆包?

这真的是辛辛苦苦几十年,一朝回到解放前。其实还有更好的处理方式,就是快速重传。发送方收到 3 个连续重复的 ACK 时,就会快速地重传,不必等待 RTO 超时再重传。

面试官:说下什么是TCP 的粘包和拆包?

慢启动阀值 ssthresh 和 cwnd 变化如下:

  • 拥塞窗口大小 cwnd = cwnd/2

  • 慢启动阀值 ssthresh = cwnd

  • 进入快速恢复算法

快速恢复

快速重传和快速恢复算法一般同时使用。快速恢复算法认为,还有 3 个重复 ACK 收到,说明网络也没那么糟糕,所以没有必要像 RTO 超时那么强烈。

正如前面所说,进入快速恢复之前,cwnd 和 sshthresh 已被更新:

- cwnd = cwnd /2
- sshthresh = cwnd 

然后,真正的快速算法如下:

  • cwnd = sshthresh + 3

  • 重传重复的那几个 ACK(即丢失的那几个数据包)

  • 如果再收到重复的 ACK,那么 cwnd = cwnd +1

  • 如果收到新数据的 ACK 后,cwnd = sshthresh。因为收到新数据的 ACK,表明恢复过程已经结束,可以再次进入了拥塞避免的算法了。

面试官:说下什么是TCP 的粘包和拆包?

31. TCP 和 UDP 分别对应的常见应用层协议有哪些?

基于 TCP 的应用层协议有:HTTP、FTP、SMTP、TELNET、SSH

  • HTTP:HyperText Transfer Protocol(超文本传输协议),默认端口 80

  • FTP: File Transfer Protocol (文件传输协议), 默认端口 (20 用于传输数据,21 用于传输控制信息)

  • SMTP: Simple Mail Transfer Protocol (简单邮件传输协议) , 默认端口 25

  • TELNET: Teletype over the Network (网络电传), 默认端口 23

  • SSH:Secure Shell(安全外壳协议),默认端口 22

基于 UDP 的应用层协议:DNS、TFTP、SNMP

  • DNS : Domain Name Service (域名服务), 默认端口 53

  • TFTP: Trivial File Transfer Protocol (简单文件传输协议),默认端口 69

  • SNMP:Simple Network Management Protocol(简单网络管理协议),通过 UDP 端口 161 接收,只有 Trap 信息采用 UDP 端口 162。

32. 半连接队列和 SYN Flood 攻击的关系

TCP 进入三次握手前,服务端会从 CLOSED 状态变为 LISTEN 状态,同时在内部创建了两个队列:半连接队列(SYN 队列)和全连接队列(ACCEPT 队列)

什么是半连接队列(SYN 队列) 呢?什么是全连接队列(ACCEPT 队列) 呢?回忆下 TCP 三次握手的图:

面试官:说下什么是TCP 的粘包和拆包?

  • TCP 三次握手时,客户端发送 SYN 到服务端,服务端收到之后,便回复 ACK 和 SYN,状态由 LISTEN 变为 SYN_RCVD,此时这个连接就被推入了 SYN 队列,即半连接队列。

  • 当客户端回复 ACK, 服务端接收后,三次握手就完成了。这时连接会等待被具体的应用取走,在被取走之前,它被推入 ACCEPT 队列,即全连接队列。

SYN Flood 是一种典型的 DoS (Denial of Service,拒绝服务) 攻击,它在短时间内,伪造不存在的 IP 地址 , 向服务器大量发起 SYN 报文。当服务器回复 SYN+ACK 报文后,不会收到 ACK 回应报文,导致服务器上建立大量的半连接半连接队列满了,这就无法处理正常的 TCP 请求啦。

主要有 syn cookie 和 SYN Proxy 防火墙等方案应对。

  • syn cookie:在收到 SYN 包后,服务器根据一定的方法,以数据包的源地址、端口等信息为参数计算出一个 cookie 值作为自己的 SYNACK 包的序列号,回复 SYN+ACK 后,服务器并不立即分配资源进行处理,等收到发送方的 ACK 包后,重新根据数据包的源地址、端口计算该包中的确认序列号是否正确,如果正确则建立连接,否则丢弃该包。

  • SYN Proxy 防火墙:服务器防火墙会对收到的每一个 SYN 报文进行代理和回应,并保持半连接。等发送方将 ACK 包返回后,再重新构造 SYN 包发到服务器,建立真正的 TCP 连接。

33. 有了 IP 地址,为什么还要用 MAC 地址?

  • 简而言之,标识网络中的一台计算机,比较常用的就是 IP 地址和 MAC 地址,但计算机的 IP 地址可由用户自行更改,管理起来就相对困难,而 MAC 地址不可更改,所以一般会把 IP 地址和 MAC 地址组合起来使用。

  • 那只使用 MAC 地址不用 IP 地址行不行呢?不行的!因为最早就是 MAC 地址先出现的,并且当时并不用 IP 地址,只用 MAC 地址,后来随着网络中的设备越来越多,整个路由过程越来越复杂,便出现了子网的概念。对于目的地址在其他子网的数据包,路由只需要将数据包送到那个子网即可。

  • 那为什么要用 IP 地址呢?是因为 IP 地址是和地域相关的,对于同一个子网上的设备,IP 地址的前缀都是一样的,这样路由器通过 IP 地址的前缀就知道设备在在哪个子网上了,而只用 MAC 地址的话,路由器则需要记住每个 MAC 地址在哪个子网,这需要路由器有极大的存储空间,是无法实现的。

  • IP 地址可以比作为地址,MAC 地址为收件人,在一次通信过程中,两者是缺一不可的。

34. 聊聊保活计时器的作用

除时间等待计时器外,TCP 还有一个保活计时器(keepalive timer)。设想这样的场景:客户已主动与服务器建立了 TCP 连接。但后来客户端的主机突然发生故障。显然,服务器以后就不能再收到客户端发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就需要使用保活计时器了。

服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时都没有收到客户端的数据,服务端就发送一个探测报文段,以后则每隔 75 秒钟发送一次。若连续发送 10 个探测报文段后仍然无客户端的响应,服务端就认为客户端出了故障,接着就关闭这个连接。

35. 聊聊 ARP 协议

ARP 协议,地址解析协议,是一个由 IP 地址获取 MAC 物理地址的 TCP/IP 协议。

什么是 IP 地址,什么是 MAC 地址?

  • IP 地址:是互联网协议地址,它是 IP 协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

  • MAC 地址:以太网地址或物理地址,它是一个用来确认网络设备位置的位址。

为什么需要 ARP 协议呢?

  • 在网络访问层中,同一局域网中的一台主机要和另一台主机进行通信,需要通过 MAC 地址进行定位,然后才能进行数据包的发送。

  • 而在网络层和传输层中,计算机之间是通过 IP 地址定位目标主机,对应的数据报文只包含目标主机的 IP 地址,而没有 MAC 地址。

  • 因此,在发送之前需要根据 IP 地址获取 MAC 地址,然后才能将数据包发送到正确的目标主机,而这个获取过程是通过 ARP 协议完成的。

ARP 的工作流程

面试官:说下什么是TCP 的粘包和拆包?

当主机 A 与主机 B 要通信时,工作流程如下:

  1. 查询本地 ARP 缓存表,看是否有 IP 地址及其对应的 MAC 地址。

  2. 如果没匹配到主机 B 的 MAC 地址,主机 A 会在局域网内广播发送一个 ARP 请求分组,局域网内所有主机都会收到该请求分组。

  3. 主机 B 收到请求分组报文,发现报文中的 IP 与自己匹配,就 A 的 IP 和 MAC 地址添加到本地 ARP 缓存表中。

  4. 主机 B 向主机 A 响应一个含自身 MAC 地址的报文。

  5. 主机 A 收到报文后,将 B 的 IP 和 MAC 地址添加至 ARP 缓存表中。

36. TCP 的粘包和拆包

TCP 是面向流,没有界限的一串数据。TCP 底层并不了解上层业务数据的具体含义,它会根据 TCP 缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的 TCP 粘包和拆包问题。

面试官:说下什么是TCP 的粘包和拆包?

为什么会产生粘包和拆包呢?

  • 要发送的数据小于 TCP 发送缓冲区的大小,TCP 将多次写入缓冲区的数据一次发送出去,将会发生粘包;

  • 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;

  • 要发送的数据大于 TCP 发送缓冲区剩余空间大小,将会发生拆包;

  • 待发送数据大于 MSS(最大报文长度),TCP 在传输前将进行拆包。即 TCP 报文长度 – TCP 头部长度 > MSS。

解决方案:

  • 发送端将每个数据包封装为固定长度

  • 在数据尾部增加特殊字符进行分割

  • 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小。

37. forward 和 redirect 的区别?

  • 直接转发方式(Forward) ,客户端和浏览器只发出一次请求,Servlet、HTML、JSP 或其它信息资源,由第二个信息资源响应该请求,在请求对象 request 中,保存的对象对于每个信息资源是共享的。

  • 间接转发方式(Redirect) 实际是两次 HTTP 请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个 URL 发出请求,从而达到转发的目的。

举个通俗的例子:

  • 直接转发就相当于:“A 找 B 借钱,B 说没有,B 去找 C 借,借到借不到都会把消息传递给 A”;

  • 间接转发就相当于:”A 找 B 借钱,B 说没有,让 A 去找 C 借”。**

看这两个图,可以更容易理解一些:

Redirect 的工作原理:

面试官:说下什么是TCP 的粘包和拆包?

forward 的工作原理

面试官:说下什么是TCP 的粘包和拆包?

38. Nagle 算法与延迟确认

Nagle 算法

如果发送端疯狂地向接收端发送很小的包,比如就 1 个字节,那么亲爱的小伙伴,你们觉得会有什么问题呢?

TCP/IP 协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送 ACK 表示确认。为了尽可能的利用网络带宽,TCP 总是希望尽可能的发送足够大的数据。Nagle 算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。

Nagle 算法的基本定义是:任意时刻,最多只能有一个未被确认的小段。所谓 “小段”,指的是小于 MSS 尺寸的数据块,所谓 “未被确认”,是指一个数据块发送出去后,没有收到对方发送的 ACK 确认该数据已收到。

Nagle 算法的实现规则:

  • 如果包长度达到 MSS,则允许发送;

  • 如果该包含有 FIN,则允许发送;

  • 设置了 TCP_NODELAY 选项,则允许发送;

  • 未设置 TCP_CORK 选项时,若所有发出去的小数据包(包长度小于 MSS)均被确认,则允许发送;

  • 上述条件都未满足,但发生了超时(一般为 200ms),则立即发送。

延迟确认

如果接受方刚接收到发送方的数据包,在很短很短的时间内,又接收到第二个包。那么请问接收方是一个一个地回复好点,还是合并一起回复好呢?

接收方收到数据包后,如果暂时没有数据要发给对端,它可以等一段时再确认(Linux 上默认是 40ms)。如果这段时间刚好有数据要传给对端,ACK 就随着数据传输,而不需要单独发送一次 ACK。如果超过时间还没有数据要发送,也发送 ACK,避免对端以为丢包。

但是有些场景不能延迟确认,比如发现了乱序包、接收到了大于一个 frame 的报文,且需要调整窗口大小等。

一般情况下,Nagle 算法和延迟确认不能一起使用,Nagle 算法意味着延迟发,延迟确认意味着延迟接收,酱紫就会造成更大的延迟,会产生性能问题。

39. URI 和 URL 的区别

  • URI,全称是 Uniform Resource Identifier),中文翻译是统一资源标志符,主要作用是唯一标识一个资源。

  • URL,全称是 Uniform Resource Location),中文翻译是统一资源定位符,主要作用是提供资源的路径。

打个经典比喻吧,URI 像是身份证,可以唯一标识一个人,而 URL 更像一个住址,可以通过 URL 找到这个人。

40. 什么是数字签名?什么是数字证书?

了解过 Https 原理的小伙伴,都知道数字证书这玩意。为了避免公钥被篡改,引入了数字证书,如下:

面试官:说下什么是TCP 的粘包和拆包?

数字证书构成

  • 公钥和个人信息,经过 Hash 算法加密,形成消息摘要;将消息摘要拿到拥有公信力的认证中心(CA),用它的私钥对消息摘要加密,形成数字签名.

  • 公钥和个人信息、数字签名共同构成数字证书。

41. 什么是 SQL 注入?举个例子?

SQL 注入是一种代码注入技术,一般被应用于攻击 web 应用程序。它通过在 web 应用接口传入一些特殊参数字符,来欺骗应用服务器,执行恶意的 SQL 命令,以达到非法获取系统信息的目的。它目前是黑客对数据库进行攻击的最常用手段之一。

SQL 注入是如何攻击的?

举个常见的业务场景:在 web 表单搜索框输入员工名字,然后后台查询出对应名字的员工。

面试官:说下什么是TCP 的粘包和拆包?

这种场景下,一般都是前端页面把一个名字参数 name 传到后台,然后后台通过 SQL 把结果查询出来

name = "码农编程进阶笔记"; //前端传过来的
SQL= "select * from staff where name=" + name;  //根据前端传过来的name参数,查询数据库员工表staff

因为 SQL 是直接拼接的,如果我们完全信任前端传的参数的话。假如前端传这么一个参数时” or ‘1’=’1’,SQL 就变成酱紫的啦。

select * from staff where name='' or '1'='1';

这个 SQL 会把所有的员工信息全都查出来了,酱紫就请求用户已经越权啦。请求者可以获取所有员工的信息,信息已经暴露了啦。

如何预防 SQL 注入问题

1). 使用 #{} 而不是 ${}

在 MyBatis 中,使用#{} 而不是 ${},可以很大程度防止 sql 注入。

  • 因为#{} 是一个参数占位符,对于字符串类型,会自动加上””,其他类型不加。由于 Mybatis 采用预编译,其后的参数不会再进行 SQL 编译,所以一定程度上防止 SQL 注入。

  • ${} 是一个简单的字符串替换,字符串是什么,就会解析成什么,存在 SQL 注入风险

2). 不要暴露一些不必要的日志或者安全信息,比如避免直接响应一些 sql 异常信息。

如果 SQL 发生异常了,不要把这些信息暴露响应给用户,可以自定义异常进行响应

3). 不相信任何外部输入参数,过滤参数中含有的一些数据库关键词关键词

可以加个参数校验过滤的方法,过滤 union,or 等数据库关键词

4). 适当的权限控制

在你查询信息时,先校验下当前用户是否有这个权限。比如说,实现代码的时候,可以让用户多传一个企业 Id 什么的,或者获取当前用户的 session 信息等,在查询前,先校验一下当前用户是否是这个企业下的等等,是的话才有这个查询员工的权限。

42. 什么是 DoS、DDoS、DRDoS 攻击?

  • DOS: (Denial of Service), 中文名称是拒绝服务,一切能引起 DOS 行为的攻击都被称为 DOS 攻击。最常见的 DoS 攻击有计算机网络宽带攻击和连通性攻击。

  • DDoS: (Distributed Denial of Service), 中文名称是分布式拒绝服务。是指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。常见的 DDos 有 SYN Flood、Ping of Death、ACK Flood、UDP Flood 等。

  • DRDoS: (Distributed Reflection Denial of Service),中文名称是分布式反射拒绝服务,该方式靠的是发送大量带有被害者 IP 地址的数据包给攻击主机,然后攻击主机对 IP 地址源做出大量回应,形成拒绝服务攻击。

43. WebSocket 与 socket 的区别

  • Socket = IP 地址 + 端口 + 协议。

    具体来说,Socket 是一套标准,它完成了对 TCP/IP 的高度封装,屏蔽网络细节以方便开发者更好地进行网络编程。

  • WebSocket 是一个持久化的协议,它是伴随 HTTP5 而出的协议,用来解决 http 不支持持久化连接的问题。

  • Socket 一个是网编编程的标准接口,而 WebSocket 是应用层通信协议。

44. ICMP 协议的功能

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

  • ICMP 协议是一种面向无连接的协议,用于传输出错报告控制信息。

  • 它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。

  • 当遇到 IP 数据无法访问目标、IP 路由器无法按当前的传输速率转发数据包等情况时,会自动发送 ICMP 消息。

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

45. Http 请求的过程与原理

HTTP 是一个基于 TCP/IP 协议来传递数据的超文本传输协议,传输的数据类型有 HTML 文件,、图片文件等。以访问百度有例子,看下一次 Http 的请求过程

面试官:说下什么是TCP 的粘包和拆包?

  1. 客户端进行 DNS 域名解析,得到对应的 IP 地址

  2. 根据这个 IP,找到对应的服务器建立连接(三次握手)

  3. 建立 TCP 连接后发起 HTTP 请求(一个完整的 http 请求报文)

  4. 服务器响应 HTTP 请求,客户端得到 html 代码

  5. 客户端解析 html 代码,用 html 代码中的资源 (如 js,css, 图片等等) 渲染页面。

  6. 服务器关闭 TCP 连接(四次挥手)

46. 说下 ping 的原理

ping,Packet Internet Groper,是一种因特网包探索器,用于测试网络连接量的程序。Ping 是工作在 TCP/IP 网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议) 请求报文,测试目的站是否可达及了解其有关状态

一般来说,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 地址、发送 & 收到 & 丢失的分组数、往返时间的最小、最大 & 平均值

47. 如果服务器出现了大量 CLOSE_WAIT 状态如何解决。

我们先来回忆下 TCP 的四次挥手

面试官:说下什么是TCP 的粘包和拆包?

  • 服务器端收到客户端发送的 FIN 后,TCP 协议栈就会自动发送 ACK,接着进入 CLOSE_WAIT 状态。

  • 但是如果服务器端不执行 socket 的 close () 操作,那么就没法进入 LAST_ACK, 导致大量连接处于 CLOSE_WAIT 状态

  • 所以,如果服务器出现了大量 CLOSE_WAIT 状态,一般是程序 Bug,或者关闭 socket 不及时。

48. 什么是 CSRF 攻击,如何避免

什么是 CSRF 攻击?

CSRF,跨站请求伪造(英语:Cross-site request forgery),简单点说就是,攻击者盗用了你的身份,以你的名义发送恶意请求。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

CSRF 是如何攻击的呢?

我们来看下这个例子哈(来自百度百科)

面试官:说下什么是TCP 的粘包和拆包?

  1. Tom 登陆银行,没有退出,浏览器包含了 Tom 在银行的身份认证信息。

  2. 黑客 Jerry 将伪造的转账请求,包含在在帖子

  3. Tom 在银行网站保持登陆的情况下,浏览帖子

  4. 将伪造的转账请求连同身份认证信息,发送到银行网站

  5. 银行网站看到身份认证信息,以为就是 Tom 的合法操作,最后造成 Tom 资金损失。

如何解决 CSRF 攻击

  • 检查 Referer 字段。HTTP 头中有一个 Referer 字段,这个字段用以标明请求来源于哪个地址。

  • 添加校验 token。

49. RARP 协议的工作原理?

  • ARP (地址解析协议) , 是设备通过自己知道的 IP 地址来获得自己不知道的物理地址的协议。

  • RARP (反向地址转换协议) 以与 ARP 相反的方式工作。RARP 发出要反向解析的物理地址并希望返回其对应的 IP 地址,应答包括由能够提供所需信息的 RARP 服务器发出的 IP 地址。(应用于无盘机)

RARP 工作原理如下:

  1. 发送主机发送一个本地的 RARP 广播,在此广播包中,声明自己的 MAC 地址并且请求任何收到此请求的 RARP 服务器分配一个 IP 地址;

  2. 本地网段上的 RARP 服务器收到此请求后,检查其 RARP 列表,查找该 MAC 地址对应的 IP 地址;

  3. 如果存在,RARP 服务器就给源主机发送一个响应数据包并将此 IP 地址提供给对方主机使用;

  4. 如果不存在,RARP 服务器对此不做任何的响应;

  5. 源主机收到从 RARP 服务器的响应信息,就利用得到的 IP 地址进行通讯;如果一直没有收到 RARP 服务器的响应信息,表示初始化失败。

50. 了解下 DNS,解析过程?

DNS,domain name system,域名解析系统,是因特网上作为域名和 IP 地址相互映射的一个分布式数据库。它的作用非常简单,就是可以根据域名查出对应的 IP 地址。

解析过程如下:

  1. 首先,检查浏览器缓存中,查找对应的 IP 地址,找到就直接返回;否则下一步。

  2. 将请求发送给本地 DNS 服务器,在本地 DNS 服务器缓存中查询,如果查找到就直接返回,否则下一步;

  3. 本地 DNS 服务器向根域名服务器发送请求,根域名服务器会告诉本地 DNS 服务器去查询哪个顶级域名服务器。

  4. 本地域名服务器向顶级域名服务器发起查询请求,顶级域名服务器会告诉本地 DNS 服务器,去查找哪个权限域名服务器。

  5. 本地域名服务器向权限域名服务器发起查询请求,权限域名服务器告诉本地域名服务器请求域名所对应的 IP 地址。

  6. 最后,本地域名服务器告诉主机请求域名所对应的 IP 地址。

比如要查询 www.baidu.com 的 IP 地址:

  • 首先会在浏览器的缓存中,是否查找到 www.baidu.com 的对应的 IP,找到就直接返回;否则下一步。

  • 将请求发送给本地 DNS 服务器,在本地 DNS 服务器缓存中查询,如果查找到就直接返回,否则下一步;

  • 本地 DNS 服务器向根域名服务器发送请求,根域名服务器返回负责.com 的顶级域名服务器的 IP 地址的列表。

  • 本地 DNS 服务器再向其中一个负责 .com 的顶级域名服务器发送一个请求,返回负责 .baidu 的权威域名服务器的 IP 地址列表。

  • 本地 DNS 服务器再向其中一个权威域名服务器发送一个请求,返回 www.baidu.com 所对应的 IP 地址。

来源:https://learnku.com/articles/59484

面试官:说下什么是TCP 的粘包和拆包?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111435.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Android开发环境配置

    Android开发环境配置本文是Android开发环境的搭建教程,最近用到了Android开发,对环境搭建做个总结。1、安装JDK首先去官网下载JDK。JavaSeSdk下载地址:https://www.oracle.com/java/technologies/javase-downloads.html选择Windows版本。下载完成后,直接双击安装,使用默认路径C:\ProgramFiles\Java\jdk-17.0.2即可。然后配置环境变量。然后,运行CMD,输入java-version。如上图,看到

  • pycharm配置flask环境_调试是什么意思

    pycharm配置flask环境_调试是什么意思1.Flask的调试模式​ 通过调用run()方法启动Flask应用程序。但是,当应用程序正在开发中时,应该为代码中的每个更改手动重新启动它。为避免这种不便,请启用调试支持。如果代码更改,服务器将自行重新加载。它还将提供一个有用的调试器来跟踪应用程序中的错误(如果有的话)。在运行或将调试参数传递给run()方法之前,通过将application对象的debug属性设置为True来启用Debug模式。app.debug=Trueapp.run(debug=True)但是在pycharm编译器

  • 超详细的数据分析职业规划

    超详细的数据分析职业规划最近有不少同学向大讲台老师咨询有关数据分析职业发展的问题,由此可见,随着大数据的飞速发展,数据分析职业也成为很多同学关注的目标。不要急,大讲台老师这就给大家介绍数据分析的职业发展。入门和职业规划应该从两个角度考虑:领域和路线。领域是不少新人常忽略的要素,其实数据分析不会脱离业务存在。你进入哪个行业,很大程度会决定你初期的技能树和技能点。譬如金融领域的风控模型、营销领域的生命周期、广告

  • 初识.Net审计

    初识.Net审计前言对.net认知比较少,学习一下.net的一些简单审计。遇到.net源码能简单审审。基础概念文件类型ASPX.cs是页面后的代码,aspx负责显示,服务器端的动作就是在as

    2021年12月13日
  • idea创建java web项目_ideajava创建项目

    idea创建java web项目_ideajava创建项目JavaWeb专栏之(二):Idea创建JavaWeb项目前言:关注:《遇见小Du说》微信公众号,分享更多Java知识,不负每一次相遇。更多内容请访问:www.dushunchang.top在上一篇博客中传送门,小Du带大家了解了什么JavaWeb,B/C与C/S结构,以及Java开发中最常见的MVC三层架构模式。本文章将带大家使用Idea创建JavaWeb项目的教程。在企业开发中,我们经常使用maven构建框架来创建项目,但很多初学者没有接触过Maven构建工具,所以本期教程使用Idea自带的W

  • nginx 优雅重启_查看nginx是否启动

    nginx 优雅重启_查看nginx是否启动#1.检测修改过后的配置文件是否有错误 /usr/local/nginx/sbin/nginx-t #如果没问题会返回: #nginx:theconfigurationfile/usr/local/nginx/conf/nginx.confsyntaxisok #nginx:configurationfile/usr/local/nginx/conf/nginx.conftestissuccessful#2.平滑重启 /usr/local/nginx/s

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号