编号:_______________本资料为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;