视频信息处理与传输实验3.doc_第1页
视频信息处理与传输实验3.doc_第2页
视频信息处理与传输实验3.doc_第3页
视频信息处理与传输实验3.doc_第4页
视频信息处理与传输实验3.doc_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验三 TCP1、 实验目的1、认识TCP协议的相关内容;2、掌握TCP模块的C语言编程;2、 实验内容1、 创建一个头文件,用C语言实现TCP模块所需的所有常量;2、 完成TCP首部的说明;最大报文段长度MSS(Maximum Segment Size)是TCP报文段中的数据字段的最大长度。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。”窗口扩大因子,用于长肥管道。时间戳,可用于测量往返时延RTT。对数据字节计数(并非对报文段计数!)3、 完成TCP报文段的说明;接收方允许的字节数URG紧急数据 (一般不用)ACK 序号有效立即提交数据RST, SYN, FIN:连接建立(建立和拆连)SYN:是握手信号FIN:拆除连接 图1 TCP报文结构源端口和目的端口字段各占2字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现。序号字段占4字节。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。确认号字段占4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。数据偏移占4bit,它指出TCP报文段的数据起始处距离 CP报文段的起始处有多远。“数据偏移”的单位不是字节而是32bit字(4字节为计算单位)。保留字段占6bit,保留为今后使用,但目前应置为0。紧急比特URG当URG1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。确认比特ACK只有当ACK1时确认号字段才有效。当ACK0时,确认号无效。复位比特RST(Reset) 当RST1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。同步比特SYN同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。终止比特FIN(FINal)用来释放一个连接。当FIN1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。窗口字段占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。检验和占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。紧急指针字段占16bit。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。选项字段长度可变。TCP首部可以有多达40字节的可选信息,用于把附加信息传递给终点,或用来对齐其它选项。填充字段这是为了使整个首部长度是4字节的整数倍。4、 用C语言写出TCP有限状态机的实现函数。TCP从建立到终止整个过程中,存在11中状态,TCP的有限状态机给出了TCP连接从一个状态转换到另一个状态的规则。服务器进程客户进程图2 TCP有限状态机3、 实验过程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_TIMER_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 lifetimes */#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(seg);/* 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 - sent,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.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.congest = 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.flags.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.wnd 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 send 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.tstamp = 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,max(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+;ip_send(tcb-conn.local.address,tcb-conn.remote.address, TCP_PTCL,tcb-tos,0,&dbp,len_p(dbp),0,0);4、 实验小结通过本次实验,认识到自己对于理论知识学习的不足以,所以在以后的学习中继续努力。在查阅资料和信息的能力还需加强,努力做到快速查到资料并准确提取有用信息,提高自己的文献读取能力。本次实验的主要内容是学习TCP协议,认识其文件结构、模块。实验过程中对于TCP协议的内容了解不全面,对于它的程序编写不熟悉,很多知识点认识不够深入。5、 参考文献1、TCP传输控制协议.http:/zh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论