zoukankan      html  css  js  c++  java
  • TCP状态转换图的理解

    怎样去读懂TCP的状态转换图?

         

      

    1.概述

           我第一次看这个转换图的时候,看的有点蒙,虽然知道表示的是TCP连接的状态转换图,但是不知道怎么去看这个图,怎么去理出个头绪,可能比较笨吧。

           阅读这个图,首先从整体上需要知道,这个图表示的是TCP从建立到断开过程中,客户端和服务器各自的状态变迁,头脑里先有这个概念,然后为了表述方便,在途中的某些状态点标注了字符。

          

    2.三次握手建立连接

           由起始点A开始TCP建立连接的三次握手。

           A->B->D->E  表示的是服务器在TCP连接建立过程中的状态变迁

           A->C->E        表示的是客户端在TCP连接建立过程中的状态变迁

           正常连接建立的整体流程:

           A->B,服务端的应用进程建立套接字,监听客户端的连接,此时服务器端由CLOSED转换为LISTEN状态,等待客户端连接

           A->C,客户端的应用进程主动连接服务器,发送第一个SYN握手,此时客户端状态变迁为SYN_SENT

           B->D,服务器接收到客户端发送的SYN,然后回复客户端SYN,ACK应答,此时服务端的状态变迁为SYN_RCVD

           C->E,客户端接收到服务端的SYN,ACK,客户端状态变迁为ESTABLISHED,并发送ACK给服务器

           D->E,服务端接收到客户端的ACK应答,服务端状态变迁为ESTABLISHED,至此TCP连接的三次握手过程完成,服务器和客户端建立了连接,客户端主动连接,服务端被动连接

           连接建立过程中的异常情况:

           D->B,服务器在接受到客户端的第一个SYN后,状态变迁为SYN_RCVD,并给客户端发送了SYN,ACK应答,正常情况来说,客户端会接收到服务端的应答,并回复一个ACK应答给服务端,但是如果出现异常情况,比如客户端的应用进程主动关闭或者客户端接收服务器的SYN,ACK回包超时,客户端会给服务端回一个RST,此时客户端的状态会从SYN_SENT变迁为CLOSED,服务端在接收到RST后,会从SYN_RCVD变迁为LISTEN

    3.四次握手断开连接

           TCP连接断开需要经历四次握手,假设客户端主动断开连接。

           E->F->G,       表示服务端在TCP连接断开过程中的状态变迁

           E->J->L->H,   表示客户端在TCP连接断开过程中的状态变迁

           正常连接断开:

           E->J,客户端应用进程主动关闭,发送FIN,客户端状态变迁为FIN_WAIT_1

           E->F->G,服务端收到FIN,状态变迁为CLOSED_WAIT,并给客户端发送一个ACK,且服务端的应用进程会接受这个FIN作为一个文件结束符,一段时间后,接受到这个文件结束符的应用进程将调用close关闭套接字,这将导致TCP会给客户端发送一个FIN,此时服务器状态变迁为LAST_ACK

           J->L->H,客户端收到ACK之后,状态变迁为FIN_WAIT_2,在这之后,收到服务端close发送的FIN,状态变迁为TIME_WAIT,并应答一个ACK给服务端

           服务端在收到这个ACK后,服务端就完全关闭,状态变迁为CLOSED,而客户端在2MSL超时后,也会完全关闭,状态变迁为CLOSED

           这个TIME_WAIT设计的还是十分巧妙的,后续可以再补充TIME_WAIT和一些异常情况的说明

  • 相关阅读:
    Delphi中Indy10的IdTcpClient和IdTcpServer数据通信
    Delphi中TStringList的使用
    VC2008中处理CStatic控件的单击STN_CLICKED消息
    VS2008中编译运行MFC应用程序时,出现无法启动程序,因为计算机中丢失mfc90ud.dll的解决方案
    adb 常用命令大全
    Windows XP 下如何使用Qt Creator中的Git版本控制功能
    git安装及命令使用和github网站
    Win7下VS2008安装cocos2d-2.0-x-2.0.4模板时, 运行InstallWizardForVS2008.js文件执行失败的解决办法
    VC2008中将CString转换成const char*的一种有效方法
    VS2008中MFC对话框界面编程Caption中文乱码的解决办法
  • 原文地址:https://www.cnblogs.com/Victor-Tian/p/7842501.html
Copyright © 2011-2022 走看看