师兄版面试经验
1.操作系统
-
进程切换为什么要切换内核栈;
为了数据安全;… -
malloc申请的是虚拟内存还是物理内存,两者之间的关系,怎么转换?
虚拟内存;
虚拟内存实际上是操作系统对于内存管理的一种方式,这些内存对应的物理地址,应用程序本身是无法知道的;
虚拟内存映射到物理地址:
linux虚拟内存和物理内存的理解 -
malloc申请完空间时立即在堆区分配一块实际的物理空间吗?不是的话什么时候分配,怎么分配?
malloc只是在进程虚拟地址空间得到一块地址,当需要访问时会发生缺页中断,然后系统为该虚拟地址分配物理地址,单纯的调研malloc而不访问该地址,则没有分配物理内存;
2、TCP/IP面试问题
-
TCP流量控制:
(1).接受方通过设置tcp数据包中接收窗口字段的大小来控制发送方发送数据的大小,当接收窗口的大小设置为0,发送方便不再发送数据 ;
(2).若过了重发超时的时间以后还没有收到窗口更新,发送段会发送一个窗口探测包;
(3).当接收方缓冲区有可用空间后,便会发送窗口更新通知给发送方; -
tcp粘包问题:
(1) UDP协议的保护消息边界使得每一个消息都是独立的,因此udp不会发生粘包的问题;
(2)而tcp是基于流的传输,而面向流的传输是没有保护边界的,流传输把数据当作一串数据流,如果发送方连续发送数据,接收端可能在一次的接收动作中接收到两个或者更多个数据包 ;
什么情况下会发生:
a.Nagle算法: 发送段为了将多个发往接收端的包更有效的发到对发;将多次间隔较小、数据量小的数据,合并成一个大的数据块,然后进行封包。
Nagle算法规则:
i. 如果包长度达到MSS,则允许发送;
ii.如果该包含有FIN,则允许发送;
iii. 设置了TCP_NODELAY选项,则允许发送;
vi. 未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
v. 上述条件都未满足,但发生了超时(一般为200ms),则立即发送。
b.接收端接收不及时造成的接收端粘包
c.发送的数据包大小超过MSS -
解决方案:
a.每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接。这种算法的局限在于每次都要进行三次握手四次挥手,既浪费流量,又使数据传输延时性增大,socket不能很好的复用。
b.特殊切割符来分割包。这种方式必须严格要求包体中不会出现该特殊字符,因此,需要控制使用范围。
c.每个包都是固定长度。这种方式会造成包的体积很难确定,浪费流量等问题。
d.发送端使用TCP强制数据立即传送的操作指令push。可能引发频繁发送小包所导致的流量浪费和网络阻塞问题。
e.在消息的头部加上消息的大小。 -
延迟确认机制:延迟ACK的目的也是为了减少网络中传输大量的小报文数,但该报文数是针对ACK报文的 ;
i. 一个来自发送端的报文到达接收端,TCP会延迟ACK的发送,希望应用程序会对刚刚收到的数据进行应答,这样就可以用新数据将ACK捎带过去 ;
ii. 如果连续收到两个TCP包,并不一定需要ACK两次,只要回复最终的ACK就可以了,可以降低网络流量。 -
连续arq协议:
a.滑动窗口协议:发送方和接收方各自维持着发送窗口和接受窗口,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
b.连续ARQ协议:接收方一般采用累计确认方式,即接收方不必对收到的分组逐个发送确认,而是可以在收到几个分组后,对按序到达的最后一个分组发送确认,这样就表示:到这个分组位置的所有分组都已经正确收到了。 -
TCP累计确认的作用
-
超时重传和快速恢复
-
TCP协议如何保证可靠传输的:
TCP如何实现可靠传输的
校验和: == TCP 将保持它首部和数据的检验和==。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
TCP的接收段会丢弃重复的数据;
流量控制:== TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据==。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制,将窗口字段设置为 0,则发送方不能发送数据)
拥塞控制: 当网路拥塞时,减少数据的发送;
停止等待协议: 即每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段; -
TCP的拥塞控制采用了四种算法:
(1)慢启动:ssthresh慢启动阈值)即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍 ;
(2)拥塞避免:拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送方的cwnd加1 ;
(3)快重传: 如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段(这个机制不需要等到重传定时器溢出),而快速重传以后,因为走的不是慢启动而是拥塞避免算法,所以这又叫做快速恢复算法 ;
(4)快恢复:快重传之后,重新进入拥塞避免状态,而不是慢启动状态 ;