资源描述:
《tcp协议实验》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、.网络课第四次上机实验报告------TCP协议实验l实验内容实验内容主要包括:设计保存TCP连接相关信息的数据结构(TCB);TCP协议的接收处理和封装发送;TCP协议提供的Socket函数接口。l实验过程l设计保存TCP连接相关信息的数据结构(TCB)用数据结构TCB为每一个TCP连接维护socketfd,srcAddr,dstAddr,srcPort,dstPort,seq,ack,windowSize,state这些状态信息。以链表形式组织多个连接,nextTcb指向下一个连接的数据结构。lTCP分组接收函数stud_tcp_input(
2、)首先,检查校验和;然后通过字节序转换获取相应的信息,检查序列号。如果序列号不正确,则调用tcp_DiscardPkt;最后将报文交由输入有限状态机处理,有限状态机对报文进行处理,转换状态。根据当前的状态并调用stud_tcp_output函数完成tcp建连、数据传递时返回ACK、tcp断连等工作lTCP分组发送函数stud_tcp_output()判断需要发送的报文类型,根据报的类型对包中的相应字段进行设置,判断是否可以发送(发送窗口不为0)。构造TCP数据报文并发送。填写TCP报文各字段的内容和数据,转换字节序,计算校验和,然后调用发送流程的
3、下层接口函数sendIpPkt()发送。lstud_tcp_socket()函数...分配相应的socketfd并且新建TCB表项,并对成员变量进行初始化lstud_tcp_connect()函数设定目的IPv4地址和端口,源IPv4地址和端口;初始化TCB结构中的相关变量;设定TCB中的输入状态为SYN-SENT,及其它相关变量,准备发送SYN报文;调用发送流程的下层接口函数stud_tcp_output()发送SYN报文(发送类型为PACKET_TYPE_SYN);等待“三次握手”完成后返回,建立连接成功;或者出错返回。lstud_tcp_s
4、end()函数判断是否处于ESTABLISHED状态;将应用层协议的数据拷贝到TCB的输入缓冲区;调用stud_tcp_output()发送TCP的数据报文(发送类型为PACKET_TYPE_DATA);同时等待ACK以实现停等式协议lstud_tcp_recv()函数判断是否处于ESTABLISHED状态;从TCB的输入缓冲区读出数据;将数据交给应用层协议。lstud_tcp_close()函数在正常情况下(ESTABLISHED状态),进行相应状态转换,非正常情况下(SYN-SENT状态),直接删除TCB结构后退出;调用发送流程下层接口函数s
5、tud_tcp_output()发送FIN报文(发送类型为PACKET_TYPE_FIN);等待回应的ACK报文,收到后成功返回,或者出错返回;删除相应的TCB表项。l实验总结通过本次实验,加深了对TCP协议的原理和设计实现的机制的了解,对TCP协议有了更具体的认识,对概论课的学习有很大的帮助!附:上机代码(注释)#include"sysInclude.h"externvoidtcp_DiscardPkt(char*pBuffer,inttype);externvoidtcp_sendReport(inttype);externvoidtcp_s
6、endIpPkt(unsignedchar*pData,UINT16len,unsignedintsrcAddr,unsignedintdstAddr,UINT8ttl);externintwaitIpPacket(char*pBuffer,inttimeout);externunsignedintgetIpv4Address();externunsignedintgetServerIpv4Address();#defineBUFFER_SIZE1024...#defineTIMEOUT5enumstatus{CLOSED,SYN_SENT,ES
7、TABLISHED,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
8、;srcAddr=getIpv4Address();dstAddr=getServerIpv4Address();srcPort=gSr