TCP常见面试题

  1. 画出TCP报文
  2. 三次握手以及四次挥手

TCP报文的首部长度以及都有哪些字段

最少20字节,因为TCP的头部中20字节的首部是固定的,如下图:
在这里插入图片描述
在这里插入图片描述

三次握手和四次挥手

在这里插入图片描述
在这里插入图片描述

为啥三次握手:(三次握手能保证数据可靠传输又能提高传输效率。)

若握手是两次:如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。

若客户端没有收到server的对SYN的ACK确认报文,会重发SYN报文,服务器和回复ACK,连接建立。数据发送完毕,这条连接被正常关闭。这时,延迟的SYN报文发到了server,server误以为这是client重新发送的同步报文,又回复了一个ACK,和client建立了连接,但是其实此时client已经没有数据要发送了,所以server的时间就会被浪费。

为啥四次挥手

同上,要保证双方都关闭了连接。因为TCP是全双工的。

另外,在建立连接时,服务器可以把SYN和ACK放在一个包中发送。
  但是在断开连接时,如果一端收到FIN包,但此时仍有数据未发送完,此时就需要先向对端回复FIN包的ACK。等到将剩下的数据都发送完之后,再向对端发送FIN,断开这个方向的连接。
  因此很多时候断开连接时FIN和ACK需要在两个数据包中发送(当server也没有数据要发送了,FIN和ACK是可以放在一起发送的),因此需要四次握手

为啥最后挥手要等2MSL
  1. 为了保证可靠的断开TCP的双向连接,确保足够的时间让对方收到ACK包。若客户端回复的ACK丢失,server会在超时时间到来时,重传最后一个fin包,处于TIME_WAIT状态的client可以继续回复Fin包,发送ACK。
  2. 保证让迟来的TCP报文段有足够的时间被识别和丢弃,避免新旧连接混淆。有些路由器会缓存没有收到的数据包,如果新的连接开启,这些数据包可能就会和新的连接中的数据包混在一起。连接结束了,网络中的延迟报文也应该被丢弃掉,以免影响立刻建立的新连接。

在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。

所谓的2MSL是两倍的MSL(Maximum Segment Lifetime最大 报文段存活时间(往返时间))。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
在这里插入图片描述

TCP在listen时的参数backlog的意义

linux内核中会维护两个队列:
  1)未完成队列:接收到一个SYN建立连接请求,处于SYN_RCVD状态
  2)已完成队列:已完成TCP三次握手过程,处于ESTABLISHED状态
  当有一个SYN到来请求建立连接时,就在未完成队列中新建一项。当三次握手过程完成后,就将套接口从未完成队列移动到已完成队列。
  backlog曾被定义为两个队列的总和的最大值,也曾将backlog的1.5倍作为未完成队列的最大长度
一般将backlog指定为5

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

accept会监听已完成队列是否非空,当队列为空时,accept就会阻塞。当队列非空时,就从已完成队列中取出一项并返回。
  而已完成队列中的都是三次握手过程已经完成的,因此accept发生在三次握手之后。

三次握手过程中有哪些不安全性
SYN洪泛攻击

服务器处于SYN_Wait的状态:
在这里插入图片描述
  1)伪装的IP向服务器发送一个SYN请求建立连接,然后服务器向该IP回复SYN和ACK,但是找不到该IP对应的主机,当超时时服务器收不到ACK会重复发送。当大量的攻击者请求建立连接时,服务器就会存在大量未完成三次握手的连接,服务器主机backlog被耗尽而不能响应其它连接。即SYN泛洪攻击 (属于DOS的一种,发送大量的半连接请求,耗费CPU和内存资源,引起网络堵塞甚至系统瘫痪)
  
  当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击

netstat -n -p TCP | grep SYN_RECV

防范措施:
  1、降低SYN timeout时间,使得主机尽快释放半连接的占用
  2、采用SYN cookie设置,如果短时间内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击,丢弃来自该IP的后续请求报文
  3、在网关处设置过滤,拒绝将一个源IP地址不属于其来源子网的包进行更远的路由
  
  2)当一个主机向服务器发送SYN请求连接,服务器回复ACK和SYN后,攻击者截获ACK和SYN。然后伪装成原始主机继续与服务器进行通信。

DOS攻击 拒绝服务攻击

DDoS(分布式拒绝服务攻击)
DOS攻击利用合理的服务请求占用过多的服务资源,使正常用户的请求无法得到相应。

常见的DOS攻击有计算机网络带宽攻击和连通性攻击。

带宽攻击指以极大的通信量冲击网络,使得所有可用网络资源都被消耗殆尽,最后导致合法的用户请求无法通过。

连通性攻击指用大量的连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。

死亡值ping

许多操作系统的TCP/IP协议栈规定ICMP包大小为64KB(网间控制报文),且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区。
”死亡值ping”就是故意产生畸形的测试ping包,声称自己的尺寸超过ICMP上限,也就是加载的尺寸超过64KB上限,使未采取保护措施的网络系统出现内存分配错误,导致TCP/IP协议栈崩溃,最终接收方宕机。
在这里插入图片描述
在这里插入图片描述

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选项

在这里插入图片描述

超时重传和快速重传

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

  • 13
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值