三次握手四次挥手

序号:表示发送的数据字节流,确保TCP传输有序,对每个字节编号
  确认序号:发送方期待接收的下一序列号,接收成功后的数据字节序列号加1 ,只有ACK=1时才有效。
  ACK:确认序号的标志,ACK=1表示确认号有效,=0表示报文不含确认序号信息
  SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接
  FIN:结束标志,用于释放连接,为1表示关闭本方数据流
  seq:32位序列号
  ack:32位确认序列号

 

 

 

 

 三次握手:

  建立TCP连接时,需要客户端和服务器共发送3个包:

  第一次:客户端发送初始序号seq=x和SYN=1请求标志

  第二次:服务器发送请求标志SYN=1,发送确认标志ACK=1,发送自己的序号seq=y,发送客户端的确认序号ack=x+1

  第三次:客户端发送ACK=1确认号,发送自己的序号seq=x+1,发送对方的确认号ack=y+1

四次挥手:

  第一次:客户端发出释放FIN=1,自己序列号seq=u,进入FIN-WAIT-1状态

  第二次:服务器收到客户端信息后,发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态

  第三次:客户端收到服务器确认结果后,进入FIN-WAIT-2状态。此时服务器发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,服务器进入LAST-ACK(最后确认状态)

  第四次:客户端收到回复后,发送确认ACK=1,ack=w+1,自己的seq=u+1,客户端进入TIME-WAIT(时间等待)。客户端经过2个最长报文段寿命后,客户端CLOSE;至此,服务器收到确认后,立刻进入CLOSE状态。

 

为什么客户端最后还要等待2MSL?
   为了保证A发送的最后一个ACK报文能够到达B。如果B没有收到,则会重传自己的FIN+ACK报文段,A在2MSL时间内收到B的报文段,接着A重新确认一次,重新启动2MSL计时器。

 

RST标志位:RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。就像上面说的一样,发送RST包关闭连接时,不必等缓冲区的包都发出去(不像上面的FIN包),直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。

RST攻击:A和服务器B之间建立了TCP连接,此时C伪造了一个TCP包发给B,使B异常的断开了与A之间的TCP连接,就是RST攻击了。

假定C伪装成A发过去的包,这个包如果是RST包的话,毫无疑问,B将会丢弃与A的缓冲区上所有数据,强制关掉连接。

如果发过去的包是SYN包,那么,B会表示A已经发疯了(与OS的实现有关),正常连接时又来建新连接,B主动向A发个RST包,并在自己这端强制关掉连接。

————学习记录

posted @ 2020-07-10 12:23  桃李子  阅读(96)  评论(0编辑  收藏  举报