标签:经历 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和一些异常情况的说明
标签:经历 rcv list 字符 closed http bsp 握手 logs
原文地址:http://www.cnblogs.com/Victor-Tian/p/7842501.html