当前位置:文档之家› TCP协议实验

TCP协议实验

编号:_______________本资料为word版本,可以直接编辑和打印,感谢您的下载

TCP协议实验

甲方:___________________

乙方:___________________

日期:___________________

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

—__TCP协议实验

率实验内容

实验内容主要包括:

设计保存TCP连接相关信息的数据结构

(TCB;

TCP协议的接收处理和封装发送;

TCP协议提供的Socket函数接口。

4实验过程

设计保存TCP连接相关信息的数据结构

(TC0 mt DINT32 ?工皿1如; UINT32 dstfiddr: 口INTL6 arcForu- ni!4T16 datPort;

UIIU3Z UINT32 ack; UIMT1« windowSize; Uli-ITS state; ICB ^nextlGib;

用数据结构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表项, 并对成员变量进行初始化

设定目的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 的输入缓冲区读出数据;将数据交给应用层协议。

在正常情况下(ESTABLISHED犬态),进行相应状态转换,非正常情况下(SYN-SENT状态),直接删除TCB结构后退出;调用发送流程下层接口函数stud_tcp_output ()发送FIN报文(发送类型为PACKET_TYPE_FJN 等待回应的ACK报文,收到后成功返回,或者出错返回;

删除相应的TCB表项。

4实验总结

通过本次实验,加深了对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;

相关主题