• 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和一些异常情况的说明

  • 相关阅读:
    介绍一款能取代 Scrapy 的 Python 爬虫框架
    盘点 Django 展示可视化图表的多种方式(建议收藏)
    阿里最强 Python 自动化工具开源了!
    推荐一款小众且好用的 Python 爬虫库
    该死的端口占用!教你用 Shell 脚本一键干掉它!
    字节跳动实习面经分享(已拿offer附攻略)
    这样给小白讲原码、反码、补码,帮她彻底解决困扰了三天的问题
    并查集是一种怎样的数据结构?
    约瑟夫环问题的三种解法,一文搞定
    数据结构:栈详解
  • 原文地址:https://www.cnblogs.com/Victor-Tian/p/7842501.html
Copyright © 2020-2023  润新知