该枚举类型列出tcp socket的所有可能的状态
typedef enum
{
TCP_CLOSED,//0
TCP_LISTEN,//1
TCP_SYN_SENT,//2
TCP_SYN_RECEIVED,//3
TCP_ESTABLISHED,//4
TCP_FINWAIT1,//5
TCP_FINWAIT2,//6
TCP_CLOSE_WAIT,//7
TCP_LAST_ACK,//8
TCP_CLOSING,//9
TCP_TIME_WAIT//10
}tcp_state_enum_type ;
如下log是通过高通芯片进行TCP相关操作时抓取到的其TCP/IP协议栈的log,下面的wireshark的数据包也是由该log解析而得到:
log中的SEQ和ACK均为16进制表示,wireshark数据包中的是以十进制表示,它们是完全对应的
从log中可以看到,第一次client端SYN报文发出后,收到了server的SYN+ACK,可是client端认为没收到,又进行重传(对应TCP Retransmission报文),服务器也做了应答,不过这次应答是重复的(Dup ACK),最后收到ACK,三次握手成功
如下过程是一次标准的三次握手过程:
用于抓取log的模块作为TCP server,从log可以看出,
1.(ps_tcpin.c)当服务器收到SYN(seq=aa86d000,ack=0)报文后,
socket state:1 -> 3(TCP_LISTEN -> TCP_SYN_RECEIVED)
2.(ps_tcpout.c)紧接着服务器发出确认报文SYN+ACK(seq=9dc30000,ack=aa86d001)
3.(ps_tcpin.c)收到最后一个ACK(seq=aa86d001,ack=9dc30001),至此,三次握手结束
socket state: 3 -> 4(TCP_SYN_RECEIVED -> TCP_ESTABLISHED)