朋友移植的zlip源码
朋友移植的zlip源码这里是一个朋友移植的zlip的定时器的源码,他对zlip进行了改进,问题之一就是为什么他加入了半连接状态的处理?zlip源码并没有这个状态?
void TCPTimer(void) REENTRANT
{
TCP_SOCKET XDATA * pTCB;
MEM_PCB XDATA *pMem;
pTCB = pTCBList;
pMem = MemAlloc(TCP_MEM_DEFAULT_SIZE);
if (pTCB != NULL)
{
do
{
if (pMem != NULL)
if (pTCB->NeedSendACK) //该tcp需要发送延迟ack
if (pTCB->State != TCP_STATE_HALF_ESTABLISHED) //半发送状态不允许发送应答,因为这将关闭连接,而我方正在发送数据的函数会被破坏
{
if (pTCB->DelayAckTimer == 0) //若超时到则发送ack
{
pMem->UsedSize = 0;
TCPSend(pMem, pTCB, TCP_ACK);
pTCB->NeedSendACK = FALSE; //已经发送ack,不需要再次发送
MemFree(pMem); //因为arp层可能缓存该报,需要释放原来的内存重新获取一个内存用于下一个tcp的延迟ack发送
pMem = MemAlloc(TCP_MEM_DEFAULT_SIZE);
}
else
{
pTCB->DelayAckTimer--;
}
}
if (pTCB->InRTO) //该tcp处于超时重传队列
{
if (pTCB->RTOCnt == pTCB->RTO ) //超时到则重传未被应答数据队列的第一个数据报
{
if (pTCB->RetransNum == TCP_TIMEOUT_NUM) //若对方由于某些不明的原因导致tcp连接并非正常断开,而引起我方不断重传某一个数据报
{
if (!pTCB->InSending) //若此时该tcp未传送数据,传送数据时不能被打断
{
TCPRelease(pTCB); //我方快速关闭连接
}
}
else
{
TCPRetransmit(pTCB->pUnackQList->pSavMem, pTCB);
pTCB->RetransNum++;
pTCB->RTO = MIN_VALUE((pTCB->RTO<<1), TCP_RTO_MAX); //RTO进行退避
pTCB->RTOCnt = 0; //超时计数器清0
pTCB->ssthresh = (MIN_VALUE(pTCB->cwnd, pTCB->RemoteWin))>>1; //慢启动门限取拥塞窗口和通告窗口的最小值
if (pTCB->ssthresh < ((pTCB->mss + 40)<<1)) //慢启动门限不得小于2个报文段大小
{
pTCB->ssthresh = (pTCB->mss + 40)<<1;
}
pTCB->cwnd = pTCB->mss + 40; //拥塞窗口初始化,之后进行慢启动算法
}
}
else
{
pTCB->RTOCnt++;
}
}
if(pTCB->State == TCP_STATE_LASTACK) //收到对方的fin,我方已经发送fin+ack,一旦超时仍未收到对方的ack则关闭连接
{
if(pTCB->LastAckTimer == 0) //超时到,关闭连接并释放资源
{
TCPRelease(pTCB);
}
else
{
&
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tcp状态机改变的部分
case TCP_STATE_ESTABLISHED: //状态为建立连接
if ( ( pTCPHead->Flag & TCP_FIN ) != 0 ) //若收到对方的断开连接的报
{
if(pTCB->InSending) //若此时该tcp正发送数据,那么至少要发送函数处理完不能破坏的变量,才能发送应答报,否则将破坏数据
{
pTCB->State = TCP_STATE_HALF_ESTABLISHED; //将状态变为半连接状态,此时我方仍可以发送数据
}
else
{
TCPSend(pMem, pTCB, TCP_FIN | TCP_ACK); //发送一个fin+ack报
pTCB->State = TCP_STATE_LASTACK; //等待对方的ack报
pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT; //设置等待ack的超时,若到超时还没有收到对方的ack,则状态变为关闭
}
}
break;
case TCP_STATE_HALF_ESTABLISHED:
if(!pTCB->InSending)
{
TCPSend(pMem, pTCB, TCP_FIN | TCP_ACK); //发送一个fin+ack报
pTCB->State = TCP_STATE_LASTACK; //等待对方的ack报
pTCB->LastAckTimer = TCP_LASTACK_TIME_OUT; //设置等待ack的超时,若到超时还没有收到对方的ack,则状态变为关闭
}
break;
其他基本没什么改变,虽然他写了注释,可是我还是不大明白为什么要添加一个半连接?zlip没有半连接也正常啊?
页:
[1]