zoukankan      html  css  js  c++  java
  • 三次握手四次挥手

    序号:表示发送的数据字节流,确保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包,并在自己这端强制关掉连接。

    ————学习记录

  • 相关阅读:
    html5存储相关 coookie localstorage session storage
    LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)
    LeetCode 331. 验证二叉树的前序序列化(Verify Preorder Serialization of a Binary Tree) 27
    LeetCode 1047. 删除字符串中的所有相邻重复项(Remove All Adjacent Duplicates In String)
    LeetCode 151. 翻转字符串里的单词(Reverse Words in a String)
    【剑指offer】面试题 31. 栈的压入、弹出序列
    LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)
    LeetCode 946. 验证栈序列(Validate Stack Sequences) 26
    【剑指offer】面试题 14. 剪绳子
    LeetCode 343. 整数拆分(Integer Break) 25
  • 原文地址:https://www.cnblogs.com/atao24/p/13278618.html
Copyright © 2011-2022 走看看