码迷,mamicode.com
首页 > 其他好文 > 详细

TCP状态转换图的理解

时间:2017-11-16 11:39:08      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:经历   rcv   list   字符   closed   http   bsp   握手   logs   

怎样去读懂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和一些异常情况的说明

TCP状态转换图的理解

标签:经历   rcv   list   字符   closed   http   bsp   握手   logs   

原文地址:http://www.cnblogs.com/Victor-Tian/p/7842501.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!