TCP三次握手原理及问题延伸

TCP三次握手

  • 第一次握手,客户端向服务器发送建立连接标志SYN=1,以及客户端初始序列号seq=X,然后等待服务器确认;
  • 第二次握手,服务器端接收到客户端的请求后返回建立连接标志SYN=1和确认标志ACK=1,还有确认号ack=X+1确认服务器端知道客户端的初始序列号是X,同时发送服务器端初始序列号seq=Y,代表接收到连接请求并向客户端确认;
  • 第三次握手,客户端接收后检查确认号ack是否为X+1,以及确认标志ACK是否为1,代表收到服务器端的确认信息;之后客户端向服务器端发送确认标志ACK=1,还有客户端序列号seq=X+1以及确认号ack=Y+1,至此连接建立成功。

问题延伸

1、为什么两次不行?

因为没有第三次服务器端无法确认客户端是否成功收到自己的初始序列号也就是服务器端无法确认客户端的接收能力是否正常。

2、什么是半连接队列?

指的是第二次握手服务器端接收到客户端SYN标志后处于SYN_RCVD状态,此时双方没有完全建立起连接,服务器将这种状态的请求连接放入到一个队列中,这个队列被称为半连接队列。

3、ISN是固定的吗?

为了避免混淆,ISN随着时间变化而变化,每个连接都有不同ISN。ISN可以看成一个32位的计数器,每隔4微秒递增1,这样设计可以防止延迟的分组后面被再次传送,从而产生误解。这样也方便后续交换数据按序列号组装数据,如果ISN是固定的,攻击者将很容易猜到后续的确认号,所以ISN是随机动态的。

4、三次握手过程中可以携带数据吗?

第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手不可以携带数据。因为可以放的话会让服务器更容易受到攻击,而且第一二次还未建立连接,第三个已建立了连接才可以携带数据。

5、SYN攻击是什么?

SYN 攻击是一种典型的 DoS/DDoS 攻击。SYN攻击就是指在短时间内伪造大量的客户端IP,不断地向服务器发送SYN请求,服务器则需要回复确认包并等待客户端确认,由于IP是伪造的,所以服务器需要不断重发甚至超时,这些伪造的SYN包长时间占据未连接队列,导致正常的SYN包因未连接队列满了而被丢弃,最终引起网络拥塞甚至系统瘫痪。防御方法有:缩短超时时间、增加最大半连接数、过滤网关服务、SYN COOKIEs技术。

6、四次挥手

  • 第一次挥手,客户端向服务器端发送结束标志FIN=1以及序列号seq=m(上一次传输的序列号加一)
  • 第二次挥手,服务器端收到后返回确认标志ACK=1,确认号ack=m+1,序列号seq=n
  • 第三次挥手,如果服务器端也想断开连接,则发送结束标志FIN=1,确认标志ACK=1,确认号ack=m+1,序列号seq=p,然后等待客户端确认。
  • 第四次挥手,客户端收到服务器端的报文后,返回确认标志ACK=1,序列号seq=m+1,确认号ack=p+1,此时连接还没有断开,客户端经过2MSL (最长报文段时间)后,才进入关闭连接状态。而服务器端接收到ACK确认标志后就进入关闭连接状态。

7、挥手为什么需要四次?

当服务器端收到FIN包时并不会立马关闭SOCKET,而是只回复一个ACK确认报文给客户端,只有等服务器端将所有数据报文传输完毕之后才会发送FIN结束标志给客户端。

8、四次挥手释放连接时,等待2MSL的意义?

一个是保证客户端发送ACK确认报文能到达服务器端;另一个则是保证本次连接中产生的报文全部从网络中消失。

9、为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态?

因为有时ACK会丢失,这时候需要时间来重新发送ACK报文。

posted @ 2020-05-31 23:33  灿钿  阅读(654)  评论(0编辑  收藏  举报