版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络课第四次上机实验报告————-—TCP协议实验实验内容实验内容主要包括:设计保存TCP连接相关信息的数据结构(TCB);TCP协议的接收处理和封装发送;TCP协议提供的Socket函数接口。实验过程设计保存TCP连接相关信息的数据结构(TCB)用数据结构TCB为每一个TCP连接维护socketfd,srcAddr,dstAddr,srcPort,dstPort,seq,ack,windowSize,state这些状态信息.以链表形式组织多个连接,nextTcb指向下一个连接的数据结构。TCP分组接收函数stud_tcp_input()首先,检查校验和;然后通过字节序转换获取相应的信息,检查序列号。如果序列号不正确,则调用tcp_DiscardPkt;最后将报文交由输入有限状态机处理,有限状态机对报文进行处理,转换状态。根据当前的状态并调用stud_tcp_output函数完成tcp建连、数据传递时返回ACK、tcp断连等工作TCP分组发送函数stud_tcp_output()判断需要发送的报文类型,根据报的类型对包中的相应字段进行设置,判断是否可以发送(发送窗口不为0)。构造TCP数据报文并发送。填写TCP报文各字段的内容和数据,转换字节序,计算校验和,然后调用发送流程的下层接口函数sendIpPkt()发送.stud_tcp_socket()函数分配相应的socketfd并且新建TCB表项,并对成员变量进行初始化stud_tcp_connect()函数设定目的IPv4地址和端口,源IPv4地址和端口;初始化TCB结构中的相关变量;设定TCB中的输入状态为SYN-SENT,及其它相关变量,准备发送SYN报文;调用发送流程的下层接口函数stud_tcp_output()发送SYN报文(发送类型为PACKET_TYPE_SYN);等待“三次握手"完成后返回,建立连接成功;或者出错返回。stud_tcp_send()函数判断是否处于ESTABLISHED状态;将应用层协议的数据拷贝到TCB的输入缓冲区;调用stud_tcp_output()发送TCP的数据报文(发送类型为PACKET_TYPE_DATA);同时等待ACK以实现停等式协议stud_tcp_recv()函数判断是否处于ESTABLISHED状态;从TCB的输入缓冲区读出数据;将数据交给应用层协议。stud_tcp_close()函数在正常情况下(ESTABLISHED状态),进行相应状态转换,非正常情况下(SYN-SENT状态),直接删除TCB结构后退出;调用发送流程下层接口函数stud_tcp_output()发送FIN报文(发送类型为PACKET_TYPE_FIN);等待回应的ACK报文,收到后成功返回,或者出错返回;删除相应的TCB表项.实验总结通过本次实验,加深了对TCP协议的原理和设计实现的机制的了解,对TCP协议有了更具体的认识,对概论课的学习有很大的帮助!附:上机代码(注释)#include”sysInclude.h"externvoidtcp_DiscardPkt(char*pBuffer,inttype);externvoidtcp_sendReport(inttype);externvoidtcp_sendIpPkt(unsignedchar*pData,UINT16len,unsignedintsrcAddr,unsignedintdstAddr,UINT8 ttl);externintwaitIpPacket(char*pBuffer,inttimeout);externunsignedintgetIpv4Address();externunsignedintgetServerIpv4Address();#defineBUFFER_SIZE1024#defineTIMEOUT5enumstatus{CLOSED,SYN_SENT,ESTABLISHED,FIN_WAIT_1,FIN_WAIT_2,TIME_WAIT};//状态intgSrcPort=2007;intgDstPort=2006;intgSeqNum=1;intgAckNum=0;structTCB{ intsocketfd; UINT32srcAddr;ﻩUINT32dstAddr; UINT16srcPort;ﻩUINT16dstPort; UINT32seq; UINT32ack;ﻩUINT16windowSize; UINT8state;ﻩTCB*nextTcb;ﻩTCB(){//用于TCP报文接收发送流程ﻩsocketfd=0; srcAddr=getIpv4Address();ﻩdstAddr=getServerIpv4Address(); srcPort=gSrcPort;ﻩdstPort=gDstPort; seq=gSeqNum;ﻩack=gAckNum;ﻩwindowSize=1; state=CLOSED; nextTcb=NULL;ﻩ}ﻩTCB(intfd){//用于客户端socket函数的构建函数 socketfd=fd;ﻩseq=gSeqNum; ack=gAckNum;ﻩwindowSize=1;ﻩstate=CLOSED;ﻩnextTcb=NULL; }};UINT16CalcChecksum(char*pBuffer,intlen,UINT32srcAddr,UINT32dstAddr){ inttcp_len=len+12;ﻩUINT32checkSum=0;ﻩif(tcp_len&0x1==1)tcp_len+=1;ﻩchar*buffer=newchar[tcp_len]; memset(buffer,0,tcp_len); memcpy(buffer+12,pBuffer,len);ﻩ*((UINT32*)buffer)=htonl(srcAddr);ﻩ*((UINT32*)(buffer+4))=htonl(dstAddr);ﻩbuffer[9]=6; //传输层协议号ﻩ*((UINT16*)(buffer+10))=htons(len); for(inti=0;i〈tcp_len;i+=2){ﻩcheckSum+=*((UINT16*)(buffer+i)); }ﻩcheckSum=(checkSum&0xFFFF)+(checkSum〉>16); checkSum=~checkSum; returncheckSum;}TCB*tcbLinkTable=NULL;//TCB链表/*通过两端的IP地址和端口号寻找TCB表项*/TCB*findTCB(UINT32srcAddr,UINT16srcPort,UINT32dstAddr,UINT16dstPort){ TCB*tcb=tcbLinkTable; while(tcb!=NULL){ if((tcb—>srcAddr==srcAddr)&&(tcb—〉srcPort==srcPort)&&(tcb—>dstAddr==dstAddr)&&(tcb—>dstPort==dstPort)) returntcb; tcb=tcb-〉nextTcb;ﻩ} returnNULL;}intstud_tcp_input(char*pBuffer,unsignedshortlen,unsignedintsrcAddr,unsignedintdstAddr){ /*检查校验和*/ﻩif(CalcChecksum(pBuffer,len,ntohl(srcAddr),ntohl(dstAddr))!=0) return—1;ﻩUINT16srcPort=ntohs(*(UINT16*)pBuffer);ﻩUINT16dstPort=ntohs(*(UINT16*)(pBuffer+2));ﻩUINT32seq=ntohl(*((UINT32*)(pBuffer+4))); UINT32ack=ntohl(*((UINT32*)(pBuffer+8)));ﻩUINT8flags=(pBuffer[13]&0x13);ﻩTCB*tcb=findTCB(ntohl(dstAddr),dstPort,ntohl(srcAddr),srcPort);ﻩif(tcb==NULL){ﻩreturn-1;ﻩ}ﻩif(ack!=tcb—〉seq+1){ tcp_DiscardPkt(pBuffer,STUD_TCP_TEST_SEQNO_ERROR); return—1;ﻩ}ﻩ/*有限状态机转换*/ﻩif((tcb—>state==SYN_SENT)&&(flags==0x12)){ tcb—>seq=ack;ﻩtcb->ack=seq+1;ﻩstud_tcp_output(NULL,0,PACKET_TYPE_ACK,tcb—>srcPort,tcb—>dstPort,tcb—〉srcAddr,tcb—〉dstAddr);ﻩtcb—〉state=ESTABLISHED;ﻩ}elseif((tcb->state==FIN_WAIT_1)&&(flags==0x10)){ﻩtcb—>state=FIN_WAIT_2; }elseif((tcb->state==FIN_WAIT_2)&&(flags==0x11)){ﻩtcb—〉ack=seq+1; tcb-〉seq=ack;ﻩtcb->state=TIME_WAIT;ﻩstud_tcp_output(NULL,0,PACKET_TYPE_ACK,tcb—〉srcPort,tcb—>dstPort,tcb—>srcAddr,tcb-〉dstAddr);ﻩtcb-〉state=CLOSED;ﻩ}ﻩreturn0;}voidstud_tcp_output(char*pData,unsignedshortlen,unsignedcharflag,unsignedshortsrcPort,unsignedshortdstPort,unsignedintsrcAddr,unsignedintdstAddr){ TCB*tcb=findTCB(srcAddr,srcPort,dstAddr,dstPort);//寻找TCB项ﻩif(tcbLinkTable==NULL)//用于TCP报文接收发送流程{ﻩtcb=newTCB(); tcbLinkTable=tcb; } if(tcb==NULL||tcb->windowSize==0)return; /*构造新的发送报文*/ﻩunsignedchar*packet=newunsignedchar[len+20]; memset(packet,0,len+20);ﻩmemcpy(packet+20,pData,len);ﻩ*(UINT16*)(packet)=htons(tcb->srcPort);ﻩ*(UINT16*)(packet+2)=htons(tcb-〉dstPort);ﻩ*(UINT32*)(packet+4)=htonl(tcb-〉seq);ﻩ*((UINT32*)(packet+8))=htonl(tcb-〉ack);ﻩpacket[12]=20〈<2; switch(flag)ﻩ{ casePACKET_TYPE_SYN:ﻩpacket[13]=0x02; tcb-〉state=SYN_SENT;ﻩ//发送SYN报文,状态转移为SYN_SENT break;ﻩcasePACKET_TYPE_ACK:ﻩpacket[13]=0x10;ﻩbreak;ﻩcasePACKET_TYPE_SYN_ACK:ﻩpacket[13]=0x12;ﻩbreak; casePACKET_TYPE_FIN: packet[13]=0x01; break; casePACKET_TYPE_FIN_ACK:ﻩpacket[13]=0x11;ﻩtcb->state=FIN_WAIT_1;ﻩbreak; casePACKET_TYPE_DATA: break; }ﻩ*((UINT16*)(packet+14))=htons(tcb->windowSize);ﻩ*((UINT16*)(packet+16))=CalcChecksum((char*)packet,len+20,srcAddr,dstAddr); tcp_sendIpPkt(packet,len+20,tcb—〉srcAddr,tcb—>dstAddr,255); return;}intstud_tcp_socket(intdomain,inttype,intprotocol){ staticintﻩsocketfd=1;ﻩTCB*tcb=newTCB(socketfd++);ﻩtcb—〉nextTcb=tcbLinkTable;ﻩtcbLinkTable=tcb;ﻩreturntcb->socketfd;}intstud_tcp_connect(intsockfd,structsockaddr_in*addr,intaddrlen){ﻩcharbuffer[BUFFER_SIZE];ﻩTCB*tcbPointer=tcbLinkTable;ﻩwhile((tcbPointer!=NULL)&&(tcbPointer—>socketfd!=sockfd))tcbPointer=tcbPointer—>nextTcb; TCB*tcb=tcbPointer;//找到TCB相应表项ﻩif(tcb==NULL)return-1; /*初始化源和目的的地址及端口号*/ﻩtcb—〉srcAddr=getIpv4Address(); tcb—>srcPort=gSrcPort; tcb->dstAddr=ntohl(addr—>sin_addr。s_addr);ﻩtcb—>dstPort=ntohs(addr-〉sin_port); /*建立连接:发送SYN报文*/ stud_tcp_output(NULL,0,PACKET_TYPE_SYN,tcb->srcPort,tcb->dstPort,tcb->srcAddr,tcb->dstAddr);ﻩ/*接收SYN_ACK报文*/ if(waitIpPacket(buffer,TIMEOUT)==—1||(buffer[13]&0x13)!=0x12)return—1;ﻩtcb—>seq=ntohl(*((UINT32*)(buffer+8)));ﻩtcb->ack=ntohl(*((UINT32*)(buffer+4)))+1; /*发送ACK报文,建立连接完成*/ stud_tcp_output(NULL,0,PACKET_TYPE_ACK,tcb-〉srcPort,tcb-〉dstPort,tcb->srcAddr,tcb—〉dstAddr); tcb-〉state=ESTABLISHED; return0;}intstud_tcp_send(intsockfd,constunsignedchar*pData,unsignedshortdatalen,intflags){ charbuffer[BUFFER_SIZE]; TCB*tcbPointer=tcbLinkTable; while((tcbPointer!=NULL)&&(tcbPointer->socketfd!=sockfd))tcbPointer=tcbPointer-〉nextTcb;ﻩTCB*tcb=tcbPointer;//找到TCB相应表项 if(tcb==NULL||tcb—〉state!=ESTABLISHED)return—1;ﻩ/*发送DATA报文*/ stud_tcp_output((char*)pData,datalen,PACKET_TYPE_DATA,tcb-〉srcPort,tcb->dstPort,tcb->srcAddr,tcb—〉dstAddr); /*等待接收ACK*/ if(waitIpPacket(buffer,TIMEOUT)==-1)return-1;ﻩif((buffer[13]&0x13)!=0x10)return—1; tcb-〉seq=ntohl(*((UINT32*)(buffer+8))); tcb-〉ack=ntohl(*((UINT32*)(buffer+4)))+1; return0;}intstud_tcp_recv(intsockfd,unsignedchar*pData,unsignedshortdatalen,intflags){ charbuffer[BUFFER_SIZE];ﻩintlen=0; TCB*tcbPointer=tcbLinkTable;ﻩwhile((tcbPointer!=NULL)&&(tcbPointer—>socketfd!=sockfd))tcbPointer=tcbPointer-〉nextTcb; TCB*tcb=tcbPointer; if(tcb==NULL||tcb->state!=ESTABLISHED)return-1;ﻩ/*等待接收数据*/ﻩif((len=waitIpPacket(buffer,TIMEOUT))==—1)return—1; intheader_length=(buffer[12]>〉2)&0x3C; memcpy(pData,buffer+header_length,len-header_length); tcb—>seq=ntohl(*((UINT32*)(buffer+8)));ﻩtcb—〉ack=ntohl(*((UINT32*)(buffer+4)))+(len—header_length); stud_tcp_output(NULL,0,PACKET_TYPE_ACK,tcb-〉srcPort,tcb—〉dstPort,tcb-〉srcAddr,tcb->dstAddr); return0;}intstud_tcp_close(intsockfd){ﻩcharbuffer[BUFFER_SIZE];ﻩTCB*pre=NULL;TCB*tcb=tcbLinkTable;ﻩwhile((tcb!=NULL)&&(tcb-〉socketfd!=sockfd)){ﻩpre=tcb; tcb=tcb—〉nextTcb; }ﻩif(tcb==NULL)return-1;ﻩif(tcb->state!=ESTABLISHED){ﻩif(pre!=NUL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钨钼制品烧结工岗前成果转化考核试卷含答案
- 蒸呢机挡车工岗前岗后考核试卷含答案
- 毛笔制作工常识水平考核试卷含答案
- 补写学生病假请假条范文
- 2025年血管栓塞剂及栓塞材料项目发展计划
- 2025年戊二酸二甲酯项目发展计划
- 玻璃强化技术
- 2026年智能餐桌项目项目建议书
- 2025年江苏省徐州市中考英语真题卷含答案解析
- 2025年四川省乐山市中考化学真题卷含答案解析
- 一图看清37家公司经营模式:财务报表桑基图(2025年6月版)(英)
- 如何做好一名护理带教老师
- 房地产项目回款策略与现金流管理
- 花溪区高坡苗族乡国土空间总体规划 (2021-2035)
- 非连续性文本阅读(中考试题20篇)-2024年中考语文重难点复习攻略(解析版)
- 专题13 三角函数中的最值模型之胡不归模型(原卷版)
- 门诊药房西药管理制度
- 新能源汽车生产代工合同
- 2025年中煤科工集团重庆研究院有限公司招聘笔试参考题库含答案解析
- 消防救援预防职务犯罪
- 一体化泵站安装施工方案
评论
0/150
提交评论