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

    知识热身

    介绍tcp协议的三次握手四次挥手之前,首先我们来看一下tcp协议数据报文的组成,这样方便我们更好的理解下面将要介绍的三次握手四次挥手的过程,tcp协议报文如下图:

    三次握手

    1、以下介绍三次握手用到的TCP头部几个重要的字段标识

    • seq:序列号,占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随即产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
    • ack : 占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
    • ACK :占一位,表示验证字段,仅当ACK=1时,确认号字段才有效。ACk=0时,确认号无效。
    • SYN:表示建立TCP连接。当SYN=1,ACK=0时:这是一个连接请求报文段。若同意连接,则在响应报文段中置SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN标志位只有在TCP建立连接时才会置为1,握手完成后SYN标志位被置0.
    • FIN:FIN=1表示断开TCP连接

    三次握手过程

    想必看到这篇博客的你也应该到了适婚的年龄了,如果你没有男朋友或女朋友,我想也该买包辣条找一个了。下面我们就以"谈恋爱"这个话题来介绍一下三次握手的过程吧。

    上图过程说明:

    • 1、有客户端发送建立TCP连接的请求报文,其中报文中含seq序列号,是有发送端随即生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成数值)
    • 2、有服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由服务端随机生成的,并且将SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知道自己的TCP建立请求已经得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack+1可以理解为是确认和谁建立连接。
    • 3、客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1,并再次回复ACK验证请求,在服务端放过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)

    四次挥手

    过了段时间,你们两个相处的久了,或许你喜欢上其TA女生了,你狠心的抛弃了你当初追求过的女孩,于是,你随便编出了一个理由,才有了你俩以后老死不相往来的演出:

    四次挥手过程说明:

    • 1、客户端发送断开TCP连接请求的报文,其中报文中含有seq序列号,是有发送端随即生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x有客户端随机生成)
    • 2、服务端会回复客户端发送的TCP断开请求报文,其中包含seq序列号,是有回复端随机生成的,而且会产生ACK字段,ACK字段数字是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y有服务端随机生成)
    • 3、 服务端在回复客户端的TCP断开请求后,不会马上就行TCP连接的断开,服务端会先确保断开前,所有传输到客户端的数据是否已经传输完毕,一旦确认传输完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z有服务器端随机生成)
    • 4 、客户端收到服务器端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq的基础上+1,从而完成服务端请求的验证回复、(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)
      至此,TCP断开完成即四次挥手过程结束

    三次握手四次挥手过程中的11中状态

    三次握手

    • 1、刚开始,连接建立之前,客户端和服务器端的状态都为CLOSED;
    • 2、服务器端创建socket后开始监听,变为Listen状态;
    • 3、客户端请求建立连接,向服务器发送SYN报文,客户端的状态变为SYN_SENT;
    • 4、服务器端收到客户端的报文后向客户端发送向客户端发送ACK和SYN报文,此时服务器的状态变为SYN_RCVD;
    • 5、然后客户端收到ACK、SYN,就像服务器发送ACK,客户端状态变为ESTABLISHED;
    • 6、服务器端收到客户端的ACK后变为ESTABLISHED。此时3次握手完成,连接建立!

    四次挥手


    由于TCP连接时全双工的,断开连接会比建立连接麻烦一点点

    • 1、客户端向服务器发送FIN报文,请求断开连接,其状态未FIN_WAIT1;
    • 2、服务器收到FIN后向客户端发送ACK,服务器的状态为CLOSE_WAIT
    • 3、客户端收到ACK后就进入FIN_WAIT2状态,此时连接已经断开了一半了,如果数据还有要发送给客户端,就会继续发送;
    • 4、直到发完数据,就会发送FIN报文,此时服务器进入LAST_ACK状态;
    • 5、客户端收到服务器的FIN后,马上发送ACK给服务器,此时客户端进入TIME_WAIT状态;
    • 6、再过了2MSL长的时间后进入CLOSED状态。服务器收到客户端的ACK就进入CLOSED状态。自此,还有一个状态没有出来:CLOSING状态。CLOSING状态表示:客户端发送了FIN,但是没有收到服务器的ACK,却收到了服务器的FIN,这种情况发生在服务器发送ACK丢包的时候,因为网络传输有时会有意外。
    LISTEN:等待从任何远端TCP 和端口的连接请求。
    
    SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
    
    SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
    
    ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
    
    FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
    
    FIN_WAIT_2:等待远端TCP 的连接终止请求。
    
    CLOSE_WAIT:等待本地用户的连接终止请求。
    
    CLOSING:等待远端TCP 的连接终止请求确认。
    
    LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
    
    TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
    TIME_WAIT 两个存在的理由:
              1.可靠的实现tcp全双工连接的终止;
              2.允许老的重复分节在网络中消逝。
    
    CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)
    
    

    TCP重传、滑动窗口、流量控制、拥塞控制请参考图解TCP重传、滑动窗口、流量控制、拥塞控制
    TCP流量控制和拥塞控制:TCP流量控制和拥塞控制
    TCP拥塞控制和TCP流量控制:TCP拥塞控制和TCP流量控制

    喜欢就点个赞吧
  • 相关阅读:
    查看硬件的一些命令
    InfluxDB部署和使用
    利用mysql时间函数监控表中有没有当天数据
    js基础_for循环(学习笔记)
    JS基础_运算符的优先级
    JS基础_相等运算符
    Apache安装与卸载(win10系统测试)
    MySQL --添加环境变量教程
    MySQL安装教程及遇到的错误提示
    如何完全卸载MySQL
  • 原文地址:https://www.cnblogs.com/wangjingguan/p/12819395.html
Copyright © 2011-2022 走看看