无论嵌入式轻型tcp还是pc机上的,流控算法是他的关键,所以有的网上tcp就几百,有个tcp协议栈就可以上万,附带部分算法代码,如果有兴趣可以自己尝试完善zlgip<br /><br />/*==============================================================<br />Function:<br />Description: <br />Parameters:<br />Returns:<br />Notes:<br />==============================================================*/<br />static void TCPRecvSub(PNETBUF pBuf, PTCPINFO pTCP, PTCPHEAD pTCPHead)<br />{ <br /> if (pTCPHead->flag & TCP_RST){<br /> <br /> TCPSendCloseMsg(pTCP);<br /> <br /> return;<br /> }<br /> <br /> if (pTCPHead->flag & (TCP_FIN|TCP_SYN)){<br /> <br /> pTCP->nextRecvSeq ++; <br /> }<br /><br /> if ((pTCPHead->flag & (TCP_FIN|TCP_SYN)) || pBuf->totLen){ <br /> <br /> pTCP->flag |= TCP_NEED_SENT_ACK;<br /> pTCP->delayAckTimer = TCP_FASTTIMO;<br /> }<br /><br /> if (pTCPHead->flag & TCP_ACK){<br /> <br /> if (pTCPHead->ack != pTCP->lastACK){ <br /> <br /> TCPChkunAckedQueue(pTCP, pTCPHead->ack);<br /> <br /> TCPResetTimeout(pTCP);<br /> <br /> if (pTCP->dupACKs == 4){ /*快速恢复*/<br /> <br /> pTCP->cwnd = pTCP->ssthresh; <br /> <br /> }else{<br /> <br /> if (pTCP->cwnd < pTCP->ssthresh){/*慢启动*/<br /> <br /> pTCP->cwnd += pTCP->mss; <br /> <br /> }else{/*拥塞避免*/<br /> <br /> pTCP->cwnd += pTCP->mss * pTCP->mss / pTCP->cwnd;<br /> } <br /> }<br /> <br /> pTCP->lastACK = pTCPHead->ack; <br /> pTCP->dupACKs = 0;<br /> <br /> }else if (pTCP->unAckedQueue != NULL){<br /> <br /> switch (pTCP->dupACKs){<br /> <br /> case 3: /*快速重传*/<br /> TCPSetSsthresh(pTCP, FALSE);<br /> TCPXmit(pTCP, TRUE);<br /> pTCP->dupACKs = 4;<br /> break;<br /> case 4: <br /> case 5:<br /> pTCP->cwnd += pTCP->mss;<br /> pTCP->dupACKs = 5; <br /> break;<br /> default:<br /> pTCP->dupACKs++;<br /> break;<br /> } <br /> } <br /> }<br /> <br /> TCPRenewCwnd(pTCP, pTCPHead->wndSize); <br /><br /> switch (pTCP->state){<br /> <br /> case TCP_STATE_LISTEN:<br /> TCPListen(pBuf, pTCP, pTCPHead->flag); <br /> break;<br /> case TCP_STATE_SYNRECVD:<br /> TCPSYNRecvd(pBuf, pTCP, pTCPHead->flag); <br /> break;<br /> case TCP_STATE_SYNSEND:<br /> TCPSYNSend(pBuf, pTCP, pTCPHead->flag); <br /> break;<br /> case TCP_STATE_ESTABLISHED:<br /> TCPEstablished(pBuf, pTCP, pTCPHead->flag); <br /> break;<br /> case TCP_STATE_LASTACK:<br /> TCPRecvLastACK(pBuf, pTCP); <br /> break;<br /> case TCP_STATE_FINWAIT1:<br /> TCPFinWait1(pBuf, pTCP, pTCPHead->flag); <br /> break;<br /> case TCP_STATE_FINWAIT2:<br /> TCPFinWait2(pBuf, pTCP, pTCPHead->flag); <br /> break;<br /> case TCP_STATE_CLOSING:<br /> TCPClosing(pBuf, pTCP, pTCPHead->flag); <br /> break;<br /> default: <br /> break;<br /> }<br />}<br /><br />
|