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

    三次握手

    握手过程(建立连接)

    1. 第一次握手:客户端给服务器发送一个SYN报文,并指明客户端的初始化序列号ISN(c).此时客户端处于SYN_Send状态.

    2. 第二次握手:服务器收到SYN报文之后,会以自己的SYN报文作为应答,并且指定了自己的初始化序列号ISN(s),同时将客户端的ISN+1作为ACK值,表示自己收到了客户端的SYN, 此时服务端处于SYN_REVD的状态.

    3. 第三次握手:客户端收到SYN+ACK报文之后,会回应一个ACK报文.将服务端的ISN+1作为ACK值,表示已经收到了服务端的SYN报文,此时客户端处于establish状态.

    4. 服务器收到ACK报文之后,也处于establish状态,三次握手建立完成

      三次握手

    为什么只有三次握手才能确认双方的接受与发送能力是否正常?
    
    1,第一次握手,客户端发送网络包,服务端收到到.  服务端得到结论:客户端的发送能力,服务端的接收能力正常.
    2,第二次握手,服务端发包,客户端收到了.		客户端得到结论:服务端的接收与发送能力,客户端的接收与发送能力是正常的.此时服务端不能确认客户端的接收能力是否正常,就需要第三次握手.
    
    三从握手就是用来确认双方的接收与发送能力是否正常.
    

    其他问题

    1. ISN是固定的吗?

      三次握手的一个重要功能是客户端和服务端交互ISN,以便让对方知道接下来接收数据的时候如何按序列号组装数据.

      如果ISN是固定的,攻击者很容易猜出后续的确认号,因此ISN是动态生成的.

    2. 什么是半连接队列?

      服务器第一次收到客户端的SYN之后,处于SYN_RCVD状态,此时双方并没有建立连接,服务器会将这种状态下的请求放在一个队列中, 将这种队列称之为半连接队列.

      全连接队列就是完成三次握手之后,建立的连接就会放在全连接队列中,如果队列满了就有可能出现丢包的现象.

      SYN-ACK重传次数问题:
      	服务器发送完SYN-ACK包,如果没有收到客户端确认包,服务器进行首次重传,等待一段时间还没有收到客户端确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除.
      
    3. 三次握手过程中可以携带数据吗?

      其实第三次握手中是可以携带数据的,也就是说,第一次第二次握手不可以携带数据.
      为什么这样做也是防止服务器受到攻击,服务器不用花费太多时间去处理第一次第二次.而第三次的时候,客户端已经处于establish状态,也就是对于客户端已经建立连接了,并且也知道了服务器的接收发送能力正常,所以可以携带数据.

    四次挥手

    1. 第一次挥手: 客户端发送一个FIN报文,报文中会指定一个序列号,此时客户端处于CLOSED_WAIT1状态.
    2. 第二次挥手:服务端收到FIN之后,会发送ACK报文,把客户端的序列号值+1作为ACK报文序列号值,表明已经收到客户端的报文,此时服务端处于CLOSED_WAIT2状态
    3. 第三次挥手: 如果服务端也想断开连接,和客户端第一次挥手一样,发送FIN报文,且指定一个序列号. 此时服务端处于LAST_ACK状态.
    4. 第四次挥手: 客户端收到FIN之后,发送一个ACK作为应答,且把服务端的序列表值+1作为自己的ACK报文的序列号值,此时客户端处于TIME_WAIT状态,需要确保服务端收到ACK之后才进入CLOSED状态.
      四次挥手

    注意:TIME_WAIT状态要理解为什么客户端发送了ACK之后不能直接关闭,需要等待一阵子才关闭,原因就是要确保服务器是否已经收到了ACK报文,如果没有收到的话,服务器会重新发送FIN报文给客户端,客户端再次收到ACK报文之后,就知道之前的ACK丢失了,然后再次发送ACK报文.
    至于TIME_WAIT持续时间至少是一个报文的来回时间,一般会设置一个计时,如果过了这个计时没有再次收到FIN报文,就代表对方成功接收ACK报文,此时就处于CLOSED状态

    状态含义

    LISTTEN	- 侦听来此远方TCP端口的连接请求
    
    SYN_SENT - 在发送连接请求后等待匹配的连接请求
    
    SYN_RECEIVED - 在接收和发送一个连接请求后,等待对连接请求的确认
    
    ESTABLISHED - 代表一个打开的连接,数据可以发送给客户端
    
    FIN_WAIT1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认
    
    FIN_WAIT2 - 从远程TCP等待连接中断请求
    
    CLOSE_WAIT - 等待从本地用户发来的连接中断请求
    
    CLOSING - 等待远程TCP对连接中断的确认
    
    LAST_ACK - 等待原来发向远程TCP的连接中断请求的确认
    
    TIME_WAIT - 等待足够的时间以确保远程TCP接收到连接中断请求的确认
    
    CLOSED - 没有任何连接状态
    
    
  • 相关阅读:
    Element ui 的使用
    Vue基本介绍
    静态界面传值javascript
    手机网页怎么禁止缩放、拖放、如何屏蔽到手机本身键盘
    jQuery学习之prop和attr的区别示例介绍
    jquery复选框 选中事件 及其判断是否被选中
    手机端html5触屏事件(touch事件)
    页面滚动到底部自动 Ajax 获取文章
    转Python RegEx正则
    转Python 日期
  • 原文地址:https://www.cnblogs.com/kp1995/p/10814918.html
Copyright © 2011-2022 走看看