TCP/IP相关面试题

2019-04-14  本文已影响0人  不吃鱼的猫er

1.TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用

2.TCP和UDP的区别

TCP是有连接的,两台主机在进行数据交互之前必须先通过三次握手建立连接;而UDP是无连接的,没有建立连接这个过程

TCP是可靠的传输,TCP协议通过确认和重传机制来保证数据传输的可靠性;而UDP是不可靠的传输

TCP还提供了拥塞控制、滑动窗口等机制来保证传输的质量,而UDP都没有

TCP是基于字节流的,将数据看做无结构的字节流进行传输,当应用程序交给TCP的数据长度太长,超过MSS时,TCP就会对数据进行分段,因此TCP的数据是无边界的;而UDP是面向报文的,无论应用程序交给UDP层多长的报文,UDP都不会对数据报进行任何拆分等处理,因此UDP保留了应用层数据的边界

3.三次握手过程中有哪些不安全性

  1)伪装的IP向服务器发送一个SYN请求建立连接,然后服务器向该IP回复SYN和ACK,但是找不到该IP对应的主机,当超时时服务器收不到ACK会重复发送。当大量的攻击者请求建立连接时,服务器就会存在大量未完成三次握手的连接,服务器主机backlog被耗尽而不能响应其它连接。即SYN泛洪攻击

  防范措施:

  1、降低SYN timeout时间,使得主机尽快释放半连接的占用

  2、采用SYN cookie设置,如果短时间内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击,丢弃来自该IP的后续请求报文

  3、在网关处设置过滤,拒绝将一个源IP地址不属于其来源子网的包进行更远的路由

  2)当一个主机向服务器发送SYN请求连接,服务器回复ACK和SYN后,攻击者截获ACK和SYN。然后伪装成原始主机继续与服务器进行通信。

4.accept发生在三次握手的哪一步

        accept会监听已完成队列是否非空,当队列为空时,accept就会阻塞。当队列非空时,就从已完成队列中取出一项并返回。 

而已完成队列中的都是三次握手过程已经完成的,因此accept发生在三次握手之后。 

5.TCP在listen时的参数backlog的意义

  linux内核中会维护两个队列:

  1)未完成队列:接收到一个SYN建立连接请求,处于SYN_RCVD状态

  2)已完成队列:已完成TCP三次握手过程,处于ESTABLISHED状态

  当有一个SYN到来请求建立连接时,就在未完成队列中新建一项。当三次握手过程完成后,就将套接口从未完成队列移动到已完成队列。

  backlog曾被定义为两个队列的总和的最大值,也曾将backlog的1.5倍作为未完成队列的最大长度

一般将backlog指定为5

6.TCP选项有哪些

  TCP首部选项字段多达40B,一些常用的字段有:

  1)选项结束字段(EOP,0x00),占1B,一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个32位字开始处

  2)无操作字段(NOP, 0x01),占1B,也用于填充,放在选项的开头

  3)MSS(最大报文段长度),格式如下:种类(1B,值为2),长度(1B,值为4),数值(2B)

  用于在连接开始时确定MSS的大小,如果没有确定,就用默认的(一般实现是536B)

  4)窗口扩大因子,格式如下:种类(1B,值为3),长度(1B,值为3),数值(1B)

  新窗口值 = 首部窗口值 * 2的(扩大因子)次方

  当通信双方认为首部的窗口值还不够大的时候,在连接开始时用这个来定义更大的窗口。仅在连接开始时有效。一经定义,通信过程中无法更改。

  5)时间戳(应用测试RTT和防止序号绕回)

  6)允许SACK和SACK选项

7.为什么建立连接需要三次握手,而断开连接需要四次握手

  因为每个方向都需要一个FIN和ACK,当一端发送了FIN包之后,处于半关闭状态,此时仍然可以接收数据包。

  在建立连接时,服务器可以把SYN和ACK放在一个包中发送。

  但是在断开连接时,如果一端收到FIN包,但此时仍有数据未发送完,此时就需要先向对端回复FIN包的ACK。等到将剩下的数据都发送完之后,再向对端发送FIN,断开这个方向的连接。

  因此很多时候FIN和ACK需要在两个数据包中发送,因此需要四次握手


8.超时重传和快速重传   

超时重传:当超时时间到达时,发送方还未收到对端的ACK确认,就重传该数据包

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

上一篇下一篇

猜你喜欢

热点阅读