我了解三次握手用于形成 TCP 连接,并且握手的基本轮廓是:
A向
B发送一个带有SYN位的数据包 B向A发送一个带有SYN位和ACK位
的数据包 A向B发送一个带有ACK位的数据包
如果 A 初始发送的数据包同时包含 SYN 和 ACK 位会发生什么?B会忽略数据包,继续正常握手,发送复位位还是做其他事情?
我了解三次握手用于形成 TCP 连接,并且握手的基本轮廓是:
A向
B发送一个带有SYN位的数据包 B向A发送一个带有SYN位和ACK位
的数据包 A向B发送一个带有ACK位的数据包
如果 A 初始发送的数据包同时包含 SYN 和 ACK 位会发生什么?B会忽略数据包,继续正常握手,发送复位位还是做其他事情?
这是不现实的,因为它没有使用 ACK 标志来确认的确认号。它会在字段中输入多少数字?它将被弥补,因此接收主机将以 RST 响应。
RFC 793,传输控制协议解释(我突出显示了相关文本):
重置生成
作为一般规则,每当一个显然不是用于当前连接的段到达时,必须发送重置 (RST)。如果不清楚是这种情况,则不得发送复位。
状态分为三组:
如果连接不存在(CLOSED),则发送复位以响应除另一个复位之外的任何传入段。特别是,寻址到不存在的连接的 SYN 会通过这种方式被拒绝。如果传入的段有一个 ACK 字段,则重置从段的 ACK 字段中获取其序列号,否则重置的序列号为零,并且 ACK 字段设置为传入段的序列号和段长度之和. 连接保持在 CLOSED 状态。
如果连接处于任何非同步状态(LISTEN、SYN-SENT、SYN-RECEIVED),并且传入段确认尚未发送的内容(段携带不可接受的 ACK),或者传入段具有安全级别或如果隔间与连接请求的级别和隔间不完全匹配,则会发送重置。
如果我们的 SYN 未被确认并且传入段的优先级高于请求的优先级,则提高本地优先级(如果用户和系统允许)或发送重置;或者如果传入段的优先级低于请求的优先级,则继续,就好像优先级完全匹配(如果远程 TCP 不能提高优先级以匹配我们的优先级,这将在它发送的下一个段中检测到,并且连接将被终止)。如果我们的 SYN 已被确认(可能在此传入段中),则传入段的优先级必须与本地优先级完全匹配,否则必须发送重置。
如果传入的段有一个 ACK 字段,则重置从段的 ACK 字段中获取其序列号,否则重置的序列号为零,并且 ACK 字段设置为传入段的序列号和段长度之和. 连接保持相同状态。
如果连接处于同步状态(ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、CLOSING、LAST-ACK、TIME-WAIT),任何不可接受的段(超出窗口序列号或不可接受的确认) number) 必须只引出一个空的确认段,其中包含当前的发送序列号和一个指示预期接收的下一个序列号的确认,并且连接保持在相同的状态。
如果传入段的安全级别、隔离区或优先级与连接请求的级别、隔离区和优先级不完全匹配,则发送重置并且连接进入关闭状态。重置从传入段的 ACK 字段中获取其序列号。