TCP协议实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

网络课第四次上机实验报告

------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"

extern void tcp_DiscardPkt(char *pBuffer, int type);

extern void tcp_sendReport(int type);

extern void tcp_sendIpPkt(unsigned char *pData, UINT16 len, unsigned int srcAddr, unsigned int dstAddr, UINT8 ttl);

extern int waitIpPacket(char *pBuffer, int timeout);

extern unsigned int getIpv4Address();

extern unsigned int getServerIpv4Address();

#define BUFFER_SIZE 1024

#define TIMEOUT 5

enum status{CLOSED,SYN_SENT,ESTABLISHED,FIN_WAIT_1,FIN_WAIT_2,TIME_WAIT}; //状态

int gSrcPort = 2007;

int gDstPort = 2006;

int gSeqNum = 1;

int gAckNum = 0;

struct TCB {

int socketfd;

UINT32 srcAddr;

UINT32 dstAddr;

UINT16 srcPort;

UINT16 dstPort;

UINT32 seq;

UINT32 ack;

UINT16 windowSize;

UINT8 state;

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(int fd) { // 用于客户端socket函数的构建函数

socketfd = fd;

seq = gSeqNum;

ack = gAckNum;

windowSize = 1;

state = CLOSED;

nextTcb = NULL;

}

};

相关文档
最新文档