如何基于udp实现tcp协议栈?

Yan_在北京 2008-11-05 05:09:17
老师布置的项目,要求基于udp实现tcp的基本功能,也就是使用
udp协议在数据包里添加tcp的头部使其能够实现tcp的基本功能,
包括重传,滑动窗口,慢开始和拥塞控制,滑动窗口的大小可以通过命令行
指定。没有什么思路,哪位可以指教一下,或者提供一些相关的资料,不甚
感激
...全文
605 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐田伯光 2008-11-05
  • 打赏
  • 举报
回复
嗯,维持状态机,特别是结束一个连接时可能的状态变化。建议仔细研读一下TCP协义再做。
dog250 2008-11-05
  • 打赏
  • 举报
回复
你用套接字做吧,按照tcp的方式在一个套接字里维持一个状态机,我给你指一条路,以下代码不保证能运行,不保证语法正确,但是基本意思有了,你修修补补吧

//定义枚举:
enmu state{
CLOSED,//没有连接
SYN-SENT,//发送了syn,等代服务器ack
ACK_RECEIVE,//接到服务器ack
SYNACK_SEND,//恢复服务器的ack,确认
ESTABLISHED,//成功建立
}
//定义你自己的用udp连接函数
int newconnect( int sd, const struct sockaddr * sa, int namelen )
{
int err = -1;
int state = CLOSED;
char ** buff[128] = {"syn","synack"};
char buffrom[128];
memset(buff,0,128);
while(true)//开始状态机转换
{
if( state == ESTABLISHED )
break;
switch(state)
{
case CLOSED:
err = sendto( sd, buff[0], strlen(buff[0]), 0, sa, namelen );
if( err == SOCKET_ERROR )
goto error;
state = SYN-SENT;
break;
case SYN-SENT:
err = recvfrom( sd, buffrom, strlen(buffrom), sa, namelen );
if( err == SOCKET_ERROR )
goto error;
if( !strcmp(buffom,"ack",3) )
state = ACK_RECEIVE;
break;
case ACK_RECEIVE:
err = sendto( sd, buff[1], strlen(buff[1]), 0, sa, namelen );
if( err == SOCKET_ERROR )
goto error;
state = ESTABLISHED:
break;
case ESTABLISHED:
break;
default:
break;
}

}
return sd;
err:
closesocket(sd);
return NULL;
}

如果你要是想要一个健壮性很强的不妨参考以下linux和bsd unix是怎么实现tcp的,无非也是维持一个状态机,然后不同状态转换就可以了
starshift 2008-11-05
  • 打赏
  • 举报
回复
应用层再封装一个TCP头就好了
然后解析的时候在协议栈里面把偏移多偏几个字节就好了

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧