Redis 分布式集群部署实战
|
在发送方给接收方发SYN报文的同时,接收方也给发送方发SYN报文,两个人刚上了! 发完SYN,两者的状态都变为SYN-SENT。 在各自收到对方的SYN后,两者状态都变为SYN-REVD。 接着会回复对应的ACK + SYN,这个报文在对方接收之后,两者状态一起变为ESTABLISHED。 这就是同时打开情况下的状态变迁。 003: 说说 TCP 四次挥手的过程
过程拆解 从最开始双方都处于CLOSED状态。然后服务端开始监听某个端口,进入了LISTEN状态。 然后客户端主动发起连接,发送 SYN , 自己变成了SYN-SENT状态。 服务端接收到,返回SYN和ACK(对应客户端发来的SYN),自己变成了SYN-REVD。 之后客户端再发送ACK给服务端,自己变成了ESTABLISHED状态;服务端收到ACK之后,也变成了ESTABLISHED状态。 另外需要提醒你注意的是,从图中可以看出,SYN 是需要消耗一个序列号的,下次发送对应的 ACK 序列号要加1,为什么呢?只需要记住一个规则: 凡是需要对端确认的,一定消耗TCP报文的序列号。 SYN 需要对端的确认, 而 ACK 并不需要,因此 SYN 消耗一个序列号而 ACK 不需要。 为什么不是两次? 根本原因: 无法确认客户端的接收能力。 分析如下:
看似没有问题,但是连接关闭后,如果这个滞留在网路中的包到达了服务端呢?这时候由于是两次握手,服务端只要接收到然后发送相应的数据包,就默认建立连接,但是现在客户端已经断开了。 看到问题的吧,这就带来了连接资源的浪费。 为什么不是四次? 三次握手的目的是确认双方发送和接收的能力,那四次握手可以嘛? 当然可以,100 次都可以。但为了解决问题,三次就足够了,再多用处就不大了。 三次握手过程中可以携带数据么? 第三次握手的时候,可以携带。前两次握手不能携带数据。 如果前两次握手能够携带数据,那么一旦有人想攻击服务器,那么他只需要在第一次握手中的 SYN 报文中放大量数据,那么服务器势必会消耗更多的时间和内存空间去处理这些数据,增大了服务器被攻击的风险。 第三次握手的时候,客户端已经处于ESTABLISHED状态,并且已经能够确认服务器的接收、发送能力正常,这个时候相对安全了,可以携带数据。 同时打开会怎样? 如果双方同时发 SYN报文,状态变化会是怎样的呢? 这是一个可能会发生的情况。
状态变迁如下: (编辑:烟台站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

