客户端TCP实现简介

来源:互联网 发布:大数据认证有多少 编辑:程序博客网 时间:2024/05/16 16:02
 

客户端连接取消两个状态LISTENSYN_RECV只剩三个状态:

Tcp_State_Closed: 连接处于关闭状态此时不可用TCP

Tcp_State_SynSent: 连接处于激活发送完同步序列

Tcp_State_Established: 客户端收到确认,连接确立阶段可以进行数据承载

Tcp_State_CloseWait: 客户端发送FIN进入等待回应阶段

Tcp_State_LastAck: 发送完成FIN+ACK后进入的阶段

 

客户端可以简化很多行为只要能够完成各种报文在状态中的处理并且能走出状态机则可行.

 

处理过程:

首先用户会使用connect来激活tcp客户连接,使得其直接发送syn进入Tcp_State_SynSent的状态,此刻可以使用一个定时器进行回应超时处理,定时机制在状态机外独立运行,检测当前报文是否超时,简单的客户管理一个连接使用一个定时,可以超时时直接发送当前连接缓冲数据.

然后在Tcp_State_SynSent状态等待接收报文,除非为ack+syn则进入Tcp_State_Established状态.否则继续重启发送SYN报文,进入等待.这里TCP规定通讯双方无论那方收到SYN将会调整状态发送SYN+ACK等待回应进入连接确定阶段.

进入Tcp_State_Established后双方即可以承载应用数据,此阶段接

收到FIN: 发送回应序列,并集合SYN发送等待关闭.进入Tcp_State_LastAck

收到RST: 发送ACK进入Tcp_State_Closed

收到ACK+SYN: 发送RST+ACK进入Tcp_State_Closed

收到ACK: 则回应ACK保持状态

其他则是正常处理

       进入关闭阶段

首先所谓的关闭是四次握手,其实搞来搞去也是三次,第二第三次的ACKFIN可以一起发送,一般是发送ACK,然后FIN+ACK,所以对客户来说第一次ACKFIN+ACK当做一次处理,只等待后者就可以了,第一次的ACK可以忽略,这样省略一个状态等待.实现也是可以的并不存在问题.MOTOR 提供一个demo就是这样实现的.

       这样的话就很简单接受到FIN则直接发送ACK+FIN,完成发送等待进入最后一个ACK等待状态Tcp_State_LastAck,接受大ACK后则完成关闭.不要看着协议中的什么双向关闭这个都是理论上的,做起来十分麻烦.

原创粉丝点击