视频信息处理与传输实验3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三 TCP
一、实验目的
1、认识TCP 协议的相关内容;
2、掌握TCP 模块的C 语言编程; 二、实验内容
1、创建一个头文件,用C 语言实现TCP 模块所需的所有常量;
2、完成TCP 首部的说明;
最大报文段长度MSS(Maximum Segment Size)是TCP 报文段中的数据字段的最大长度。MSS 告诉对方TCP :“我的缓存所能接收的报文段的数据字段的最大长度是MSS 个字节。”
窗口扩大因子,用于长肥管道。
时间戳,可用于测量往返时延RTT 。
3、完成TCP 报文段的说明;
图1 TCP 报文结构
源端口和目的端口字段——各占2字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现。 序号字段——占4字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。 确认号字段——占4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
数据偏移——占4bit ,它指出TCP 报文段的数据起始处距离 CP 报文段的起始处有多远。“数据偏移”的单位不是字节而是32bit 字(4字节为计算单位)。 保留字段——占6bit ,保留为今后使用,但目前应置为0。
紧急比特URG ——当URG =1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
确认比特ACK ——只有当ACK =1时确认号字段才有效。当ACK =0时,确认号无效。
复位比特RST(Reset) —— 当RST =1时,表明TCP 连接中出现严重差错
URG 紧急数据 (一般不用) ACK 序号有效 立即提交数据 RST, SYN, FIN: 连接建立(建立和拆连)SYN :是握手信号 FIN :拆除连接
接收方允许 的字节数
对数据字节计数(并
非对报文段计数!)
(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
同步比特SYN——同步比特SYN置为1,就表示这是一个连接请求或连接
接受报文。
终止比特FIN(FINal)——用来释放一个连接。当FIN=1时,表明此报文段
的发送端的数据已发送完毕,并要求释放运输连接。
窗口字段——占2字节。窗口字段用来控制对方发送的数据量,单位为字节。
TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对
方以确定对方的发送窗口的上限。
检验和——占2字节。检验和字段检验的范围包括首部和数据这两部分。在
计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
紧急指针字段——占16bit。紧急指针指出在本报文段中的紧急数据的最后
一个字节的序号。
选项字段——长度可变。TCP首部可以有多达40字节的可选信息,用于把
附加信息传递给终点,或用来对齐其它选项。
填充字段——这是为了使整个首部长度是4字节的整数倍。
4、用C语言写出TCP有限状态机的实现函数。
TCP从建立到终止整个过程中,存在11中状态,TCP的有限状态机给出了
TCP连接从一个状态转换到另一个状态的规则。
客户进程
服务器进程
非正常状体转换
图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 _TIMER_H
#include "timer.h"
#endif
#define DEF_MSS 512 /* Default maximum segment size */
#define DEF_WND 2048 /* Default receiver window */
#define RTTCACHE 16 /* # of TCP round-trip-time cache entries */ #define DEF_RTT 5000 /* Initial guess at round trip time (5 sec) */
#define MSL2 30 /* Guess at two maximum-segment lifetimes */ #define MIN_RTO 500L /* Minimum timeout, milliseconds */
#define TCP_HDR_PAD 70 /* mbuf size to preallocate for headers */
#define DEF_WSCALE 0 /* Our window scale option */
#define geniss() ((int32)msclock() << 12) /* Increment clock at 4 MB/sec */ /* Number of consecutive duplicate acks to trigger fast recovery */
#define TCPDUPACKS 3/* Round trip timing parameters */
#define AGAIN 8 /* Average RTT gain = 1/8 */
#define LAGAIN 3 /* Log2(AGAIN) */
#define DGAIN 4 /* Mean deviation gain = 1/4 */
#define LDGAIN 2 /* log2(DGAIN) */
#define TCPLEN 20 /* Minimum Header length, bytes */
#define TCP_MAXOPT 40 /* Largest option field, bytes */
2、TCP首部
struct TCP_header{
unsigned short SPortAddr
u_char ver_ihl; // 版本(4 bits) + 首部长度(4 bits) == 8
u_char tos; // 服务类型(Type of service)
u_short tlen; // 总长(Total length)