《视频信息处理与传输实验.doc》由会员分享,可在线阅读,更多相关《视频信息处理与传输实验.doc(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验三 TCP一、 实验目的1、认识TCP协议的相关内容;2、掌握TCP模块的C语言编程;二、 实验内容1、 创建一个头文件,用C语言实现TCP模块所需的所有常量;2、 完成TCP首部的说明;最大报文段长度MSS(Maximum Segment Size)是TCP报文段中的数据字段的最大长度。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。”窗口扩大因子,用于长肥管道。时间戳,可用于测量往返时延RTT。对数据字节计数(并非对报文段计数!)3、 完成TCP报文段的说明;接收方允许的字节数URG紧急数据 (一般不用)ACK 序号有效立即提交数据RST, SYN,
2、 FIN:连接建立(建立和拆连)SYN:是握手信号FIN:拆除连接 图1 TCP报文结构源端口和目的端口字段各占2字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现。序号字段占4字节。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。确认号字段占4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。数据偏移占4bit,它指出TCP报文段的数据起始处距离 CP报文段的起始处有多远。“数据偏移”的单位不是字节而是32bit字(4字节为计算单位)。保留字段占6bit,保留为今后使用,但目前应置为0。
3、紧急比特URG当URG1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。确认比特ACK只有当ACK1时确认号字段才有效。当ACK0时,确认号无效。复位比特RST(Reset) 当RST1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。同步比特SYN同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。终止比特FIN(FINal)用来释放一个连接。当FIN1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。窗口字段占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的
4、一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。检验和占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。紧急指针字段占16bit。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。选项字段长度可变。TCP首部可以有多达40字节的可选信息,用于把附加信息传递给终点,或用来对齐其它选项。填充字段这是为了使整个首部长度是4字节的整数倍。4、 用C语言写出TCP有限状态机的实现函数。TCP从建立到终止整个过程中,存在11中状态,TCP的有限状态机给出了TCP连接从一个状态转换到另一个状态的规
5、则。服务器进程客户进程图2 TCP有限状态机三、 实验过程1、TCP头文件:#ifndef_TCP_H#define_TCP_H#ifndef_GLOBAL_H#include global.h#endif#ifndef_MBUF_H#include mbuf.h#endif#ifndef_IFACE_H#include iface.h#endif#ifndef_INTERNET_H#include internet.h#endif#ifndef _IP_H#include ip.h#endif#ifndef_NETUSER_H#include netuser.h#endif#ifndef_T
6、IMER_H#include timer.h#endif#defineDEF_MSS512/* Default maximum segment size */#defineDEF_WND2048/* Default receiver window */#defineRTTCACHE 16/* # of TCP round-trip-time cache entries */#defineDEF_RTT5000/* Initial guess at round trip time (5 sec) */#defineMSL230/* Guess at two maximum-segment lif
7、etimes */#defineMIN_RTO500L/* Minimum timeout, milliseconds */#defineTCP_HDR_PAD70/* mbuf size to preallocate for headers */#defineDEF_WSCALE0/* Our window scale option */#definegeniss()(int32)msclock() state)case TCP_LISTEN:case TCP_CLOSED:return;/* Dont send anything */for(;)memset(&seg,0,sizeof(s
8、eg);/* Compute data already in flight */sent = tcb-snd.ptr - tcb-snd.una;usable = min(tcb-snd.wnd,tcb-cwind);if(usable sent)usable -= sent;/* Most common case */else if(usable = 0 & sent = 0) usable = 1;/* Closed window probe */elseusable = 0;/* Window closed or shrunken */ssize = min(tcb-sndcnt - s
9、ent,usable);ssize = min(ssize,tcb-mss);if(!tcb-flags.force & sent != 0 & ssize mss & !(tcb-state = TCP_FINWAIT1 & ssize = tcb-sndcnt-sent)ssize = 0;if(!tcb-flags.synack & !Tcp_syndata)if(tcb-snd.ptr = tcb-iss)ssize = min(1,ssize);/* Send only SYN */else ssize = 0;/* Dont send anything */if(tcb-flags
10、.force & tcb-snd.ptr != tcb-snd.nxt)ssize = 0;if(ssize = 0 & !tcb-flags.force)break;/* No need to send anything */tcb-flags.force = 0;/* Only one forced segment! */seg.source = tcb-conn.local.port;seg.dest = tcb-conn.remote.port;seg.flags.ack = 1; /* Every state except TCP_SYN_SENT */seg.flags.conge
11、st = tcb-flags.congest;if(tcb-state = TCP_SYN_SENT)seg.flags.ack = 0; /* Havent seen anything yet */dsize = ssize;if(!tcb-flags.synack & tcb-snd.ptr = tcb-iss)/* Send SYN */seg.flags.syn = 1;dsize-;/* SYN isnt really in snd queue */* Also send MSS, wscale and tstamp (if OK) */seg.mss = Tcp_mss;seg.f
12、lags.mss = 1;seg.wsopt = DEF_WSCALE;seg.flags.wscale = 1;if(Tcp_tstamps)seg.flags.tstamp = 1;seg.tsval = msclock();if(ssize = 0)seg.seq = tcb-snd.nxt;elseseg.seq = tcb-snd.ptr;tcb-last_ack_sent = seg.ack = tcb-rcv.nxt;if(seg.flags.syn | !tcb-flags.ws_ok)seg.wnd = tcb-rcv.wnd;elseseg.wnd = tcb-rcv.wn
13、d tcb-rcv.wind_scale;dbp = ambufw(TCP_HDR_PAD+dsize);dbp-data += TCP_HDR_PAD;/* Allow room for other hdrs */if(dsize != 0)int32 offset;offset = sent;if(!tcb-flags.synack & sent != 0)offset-;dbp-cnt = extract(tcb-sndq,(uint16)offset,dbp-data,dsize);if(dbp-cnt != dsize)/* We ran past the end of the se
14、nd queue;*/seg.flags.fin = 1;dsize-;if(dsize != 0 & sent + ssize = tcb-sndcnt)seg.flags.psh = 1;if(tcb-snd.ptr snd.nxt)tcb-resent += min(tcb-snd.nxt - tcb-snd.ptr,ssize);tcb-snd.ptr += ssize;if(seq_gt(tcb-snd.ptr,tcb-snd.nxt)tcb-snd.nxt = tcb-snd.ptr;if(tcb-flags.ts_ok & seg.flags.ack)seg.flags.tsta
15、mp = 1;seg.tsval = msclock();seg.tsecr = tcb-ts_recent;/* Generate TCP header, compute checksum, and link in data */htontcp(&seg,&dbp,tcb-conn.local.address,tcb-conn.remote.address)if(ssize != 0)/* Set round trip timer. */rto = backoff(tcb-backoff) * (4 * tcb-mdev + tcb-srtt);set_timer(&tcb-timer,ma
16、x(MIN_RTO,rto);if(!run_timer(&tcb-timer)start_timer(&tcb-timer);/* If round trip timer isnt running, start it */if(tcb-flags.ts_ok | !tcb-flags.rtt_run)tcb-flags.rtt_run = 1;tcb-rtt_time = msclock();tcb-rttseq = tcb-snd.ptr;tcb-rttack = tcb-snd.una;if(tcb-flags.retran)tcpRetransSegs+;elsetcpOutSegs+
17、;ip_send(tcb-conn.local.address,tcb-conn.remote.address, TCP_PTCL,tcb-tos,0,&dbp,len_p(dbp),0,0);四、 实验小结通过本次实验,认识到自己对于理论知识学习的不足以,所以在以后的学习中继续努力。在查阅资料和信息的能力还需加强,努力做到快速查到资料并准确提取有用信息,提高自己的文献读取能力。本次实验的主要内容是学习TCP协议,认识其文件结构、模块。实验过程中对于TCP协议的内容了解不全面,对于它的程序编写不熟悉,很多知识点认识不够深入。五、 参考文献1、TCP传输控制协议.2、TCP/IP协议.协议3、中国通信网.TCP/IP技术大全pdf电子书D. iver/tid-39642.html,2006.34、协议分析网.TCP/IP基础J. 14.html,2011.125、ITeye技术网.TCP参数J.