【24】C++岗位求职面试八股文第二十四篇(计算机网络)
系列文章目录
第一篇:语言基础
第二篇:设计模式
第三篇:数据库
第四篇:计算机网络
第五篇:操作系统
第六篇:LInux
第七篇:数据结构
第八篇:智力题
[21]简述 TCP 连接 和 关闭的状态转移
[22]简述 TCP 慢启动
慢启动(Slow Start),是传输控制协议(TCP)使用的一种阻塞控制机制。慢启动也叫做指数增长期。慢启动是指每次TCP接收窗口收到确认时都会增长。增加的大小就是已确认段的数目。这种情况一直保持到要么没有收到一些段,要么窗口大小到达预先定义的阈值。一旦到达阈值,TCP就会进入线性增长阶段。这时,每经过一个RTT窗口增长一个段。如果发生丢失事件,TCP就认为这是网络阻塞,就会采取措施减轻网络拥挤。(拥塞发生算法:超时重传、快速重传)
[23]说说 TCP 如何保证有序
序列号+确认应答号
主机每次发送数据时,TCP就给每个数据包分配一个序列号并且在一个特定的时间内等待接收主机对分配的这个序列号进行确认,如果发送主机在一个特定时间内没有收到接收主机的确认,则发送主机会重传此数据包。接收主机利用序列号对接收的数据进行确认,以便检测对方发送的数据是否有丢失或者乱序等,接收主机一旦收到已经顺序化的数据,它就将这些数据按正确的顺序重组成数据流并传递到高层进行处理。具体步骤如下:(1)为了保证数据包的可靠传递,发送方必须把已发送的数据包保留在缓冲区;并为每个已发送的数据包启动一个超时定时器;(2)如在定时器超时之前收到了对方发来的应答信息(可能是对本包的应答,也可以是对本包后续包的应答),则释放该数据包占用的缓冲区;(3)否则,重传该数据包,直到收到应答或重传次数超过规定的最大次数为止。(4)接收方收到数据包后,先进行CRC校验,如果正确则把数据交给上层协议,然后给发送方发送一个累计应答包,表明该数据已收到,如果接收方正好也有数据要发给发送方,应答包也可方在数据包中捎带过去。
[24]如何解决TCP丢包、乱序和重复?(TCP 常见的拥塞控制算法有哪些)
拥塞控制主要是四个算法:慢启动 拥塞避免 拥塞发⽣(超时重传、快速重传) 快速恢复(连续收到三个ack确认)超时重传:ssthresh 和 cwnd 的值会发⽣变化: ssthresh 设为 cwnd/2 , cwnd ᯿置为 1快速重传:cwnd = cwnd/2 ,也就是设置为原来的⼀半; ssthresh = cwnd ;快速恢复:cwnd = cwnd/2 ,也就是设置为原来的⼀半; ssthresh = cwnd ; 然后,进⼊快速恢复算法如下: 拥塞窗⼝ cwnd = ssthresh + 3
[25]简述 TCP 超时重传
TCP可靠性中最重要的一个机制是处理数据超时和重传。TCP协议要求在发送端每发送一个报文段,就启动一个定时器并等待确认信息;接收端成功接收新数据后返回确认信息。若在定时器超时前数据未能被确认,TCP就认为报文段中的数据已丢失或损坏,需要对报文段中的数据重新组织和重传。这个时候,ssthresh 和 cwnd 的值会发⽣变化: ssthresh 设为 cwnd/2 , cwnd ᯿置为 1
[26]说说 TCP 可靠性保证
TCP主要提供了检验和、序列号/确认应答、超时᯿重传、滑动窗⼝、拥塞控制和 流量ᰁ控制等⽅法 实现了可靠性传输。1、检验和通过检验和的⽅式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃 TCP段,᯿重新发送。2、序列号/确认应答序列号的作⽤不仅仅是应答的作⽤,有了序列号能够将接收到的数据根据序列号排序,并且去掉重᯿复序列号的数据。(保证服务器端数据有序且不重复)3、滑动窗⼝滑动窗⼝既提⾼了报⽂传输的效率,也避免了发送⽅发送过多的数据⽽导致接收⽅⽆法正常处理的异常。4、超时重传超时᯿传是指发送出去的数据包到接收到确认包之间的时间,如果超过了这个时间会被认为是 丢包了,需要重᯿传。最⼤超时时间是动态计算的。5、拥塞控制在数据传输过程中,可能由于⽹络状态的问题,造成⽹络拥堵,此时引⼊拥塞控制机制,在保证TCP可靠性的同时,提⾼性能。6、流量控制流量ᰁ控制与TCP协议报头中的窗⼝⼤⼩有关
[27]TCP保活机制
[28]TCP为什么流量控制
- 由于通讯双⽅⽹速不同,通讯⽅任意⼀⽅发送过快都会导致对⽅详细处理不过来,所以就 需要把数据放到缓冲区中
- 如果缓冲区满了,发送⽅还在疯狂发送,那接收⽅只能把数据包丢弃。因此我们需要控制 发送速率
- 我们缓冲区剩余⼤⼩称之为接收窗⼝,⽤变ᰁwin表示。如果win=0,则发送⽅停⽌发送
[29]TCP拥塞控制
拥塞控制的算法: 1. 慢启动 2. 拥塞避免 3. 拥塞发⽣ 4. 快速恢复
快速重传和快速恢复一般同时使用
[30] 简述 TCP 滑动窗口以及重传机制(拥塞控制)
1.滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。TCP的滑动窗口解决了端到端的流量控制问题,允许接受方对传输进行限制,直到它拥有足够的缓冲空间来容纳更多的数据。
2.TCP在发送数据时会设置一个计时器,若到计时器超时仍未收到数据确认信息,则会引发相应的超时或基于计时器的重传操作,计时器超时称为重传超时(RTO) 。另一种方式的重传称为快速重传,通常发生在没有延时的情况下。若TCP累积确认3个无法返回新的ACK,或者当ACK包含的选择确认信息(SACK)表明出现失序报文时,快速重传会推断出现丢包,需要重传。
[31]说说滑动窗口过小怎么办
我们可以假设窗口的大小是1,也是就每次只能发送一个数据,并且发送方只有接受方对这个数据进行确认了以后才能发送下一个数据。如果说窗口过小,那么当传输比较大的数据的时候需要不停的对数据进行确认,这个时候就会造成很大的延迟。
[32]如果三次握手时候每次握手信息对方没收到会怎么样,分情况介绍
如果第一次握手消息丢失,那么请求方不会得到ack消息,客户端超时后进行重传如果第二次握手消息丢失,那么请求方不会得到ack消息,客户端、服务端超时后进行重传
如果第三次握手消息丢失,那么Server 端该TCP连接的状态为SYN_RECV,并且会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。而Server重发SYN+ACK包的次数,可以设置/proc/sys/net/ipv4/tcp_synack_retries修改,默认值为5.如果重发指定次数之后,仍然未收到 client 的ACK应答,那么一段时间后,Server自动关闭这个连接。
client 一般是通过 connect() 函数来连接服务器的,而connect()是在 TCP的三次握手的第二次握手完成后就成功返回值。也就是说 client 在接收到 SYN+ACK包,它的TCP连接状态就为 established (已连接),表示该连接已经建立。那么如果第三次握手中的ACK包丢失的情况下,Client 向 server端发送数据,Server端将以 RST包响应,方能感知到Server的错误。
[33]TCP延迟确认
[34]简述什么是 MSL,为什么客户端连接要等待2MSL的时间才能完全关闭
MSL:最大报文生存时间,任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃RTT:是客户到服务器往返所花时间,实际用时,收到网络状态的影响TTL:TTL是time to live的缩写,中文可以译为“生存时间”,存储了一个ip数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃MSL要大于TTL
为了保证客户端发送的最后一个ACK报文段能够到达服务器。。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。两个理由:1.保证客户端发送的最后一个ACK报文段能够到达服务端。这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,服务端超时重传FIN+ACK报文段,而客户端能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务端都进入到CLOSED状态,若客户端在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务端重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则服务端无法正常进入到CLOSED状态。
2..防止“已失效的连接请求报文段”出现在本连接中。客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
[35]TIME_WAIT 过多过少有什么危害?
过多:
- 内存资源占⽤;
- 对端⼝资源的占⽤,⼀个 TCP 连接⾄少消耗⼀个本地端⼝ 如果发起连接⼀⽅的 TIME_WAIT 状态过多,占满了所有端⼝资源,则会导致⽆法创建新连接
过少:客户端直接进入CLOSE状态,如果最后一个ack没有到达,服务端则会⼀直处在 LAST-ACK 状态,进行超时重发。服务器进行端口复用前,当客户端在新一轮发起建⽴连接的 SYN 请求报⽂后,服务端会发送 RST 报⽂给客户端,连接建⽴的过程就会被终⽌。
(服务器主动关闭,才会发生新连接连接不上,所以对服务器端口进行复用)端口复用:允许套接字(fd)连接在一个正在使用的地址上
[36]如果TCP连接双⽅同时关闭连接,会怎么样
Fainalwait1->closing->timewait->关闭closed
[37]四次挥手—服务器先关闭,客户端不关闭,继续发送数据,会出现什么情况?
触发四次挥手机制:
服务器:发出FIN,客户端回复ACK,进入TIME_WAIT状态客户端:没有close(),处于close_wait()状态,接着向服务器继续发送数据,会出现什么情况?
客户端:因为对方关闭(相当于管道中对方的读端关闭写端写满缓冲区就会触发SIGPIPE信号,操作系统会强制关闭写端),客户端继续写的话,会触发SIGPIPE信号,操作系统会强制关闭客户端
[38]什么是 SYN flood,如何防止这类攻击?
SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,使被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式.
有以下三种方法预防或响应网络上的DDoS攻击:从互联网服务提供商(ISP)购买服务。保留在内部并自己解决。使用内容分发网络(CDN)。
[39]什么是 TCP 粘包和拆包?如何解决
根据TCP缓冲区的实际情况进行包的划分。一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
TCP 拆包的作⽤是将任务拆分处理,降低整体任务出错的概率,以及减⼩底层⽹络处理的压⼒。粘包是为了防⽌数据ᰁ过⼩,导致⼤ᰁ的传输,⽽将多个 TCP 段合并成⼀个发送。
假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4种情况。(1)服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;(2)服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;(3)服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包;(4)服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包。
如果此时服务端TCP接收滑窗非常小,而数据包D1和D2比较大,很有可能会发生第五种可能,即服务端分多次才能将D1和D2包接收完全,期间发生多次拆包。
[40]为什么会产⽣粘包和拆包呢?(各2种情况)解决方案?
- 要发送的数据⼩于 TCP 发送缓冲区的⼤⼩ 粘包,TCP 将多次写⼊缓冲区的数据⼀次发送出去
- 接收数据端的应⽤层没有及时读取接收缓冲区中的数据 粘包
- 要发送的数据⼤于 TCP 发送缓冲区剩余空间⼤⼩ 拆包
- 待发送数据⼤于 MSS(最⼤报⽂⻓度),TCP 在传输前将进⾏拆包。即 TCP 报⽂⻓大于MSS
TCP粘包的解决方案:按照数据协议定义发送的数据包的结构
- 发送端将每个数据包封装为固定⻓度
- 在数据尾部增加特殊字符进⾏分割
- 将数据分为两部分,⼀部分是头部,⼀部分是内容体;其中头部结构⼤⼩固定,且有⼀个字段声明内容体的⼤⼩
[续]C++岗位求职面试八股文第二十五篇(计算机网络)
更多关于算法题解、软件开发面经、机器学习算法面经、各企业面试问题记录,关注Fintech砖,持续更新中。https://www.nowcoder.com/users/873777317
企业面试记录专栏https://www.nowcoder.com/creation/manager/columnDetail/0YBWnm
机器学习面经专栏https://www.nowcoder.com/creation/manager/columnDetail/j8nNy0
软件开发面经专栏https://www.nowcoder.com/creation/manager/columnDetail/0aXKaM
更多校园招聘常见面试问题(开发、算法、编程题目)参见CSDN博客:http://t.csdn.cn/V4qbH
欢迎关注、收藏、点赞后进行问题咨询及秋招建议
#晒一晒我的offer##牛客在线求职答疑中心##牛客解忧铺##如何判断面试是否凉了##2023毕业生求职有问必答#包含C++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等