实验四 TCP 数据包的封装与发送
1. 实验目的:
1. 掌握 TCP 数据包的结构以及 TCP 协议与 IP 协议的关系;
2. 编程实现构造 TCP 数据并将其发送到目的节点。
2. 实验学时
2 学时
3. 实验类型
验证性实验:
4. 实验原理:
TCP 报文段格式
TCP 源 端 口 号(16 位)
序 列 号(32 位)
确 认 号(32 位)
U
R
G
A
C
K
P
S
H
R
S
T
S
Y
N
首
部长度
( 4
位)
保
留 ( 6
位)
校 验 和(16 位)
选 项 + 填 充
数 据 区
TCP 目 标
端 口 号(16 位)
F
I
N
窗 口
大 小 ( 16
位)
紧 急 指 针(16
位)
TCP 协议的传输单元为报文段。报文段报头的长度为 20B~60B。其中固定长度为 20B,
报文段长度最多为 40B。TCP 报文段主要包括以下字段。
(1). 端口号:端口号字段包括源端口号和目的端口号。每个端口号的长度是 16 位,分别表示
发送该 TCP 包的应用进程的端口号和接收该 TCP 包的应用进程的端口号。
(2). 序号:长度为 32 位。由于 TCP 协议是面向数据流的,它所传送的报文段可以视为连续
的数据流,因此需要给每一个字节编号。序号字段的“序号”指的是本报文段数据的第
一个字节的顺序号。
(3). 确认号:该字段的长度为 32 位,它表示接收端希望接收的下一个 TCP 包的第一个字节
的序号。
(4). 报头长度:该字段长度为 4 位。TCP 报头长度是以 4B 为一个单元来计算的,实际上报
头长度在 20B~60B 子间。因此这个字段的值在 5~15 之间。
(5). 保留:长度为 6 位,留作今后使用,目前全部置 0。
(6). 控制:这个字段定义了 6 种不同的标志,每个标志占一位,在同一时间可以设置一位或
多位。URG 为 1 时,表明有需要紧急处理的数据。ACK 为 1 时,表明确认号的字段有
效。PST 位为 1 时,表明要强制切断连接。SYN 位为 1 时,表明有确立连接的请求,这
时,把序号字段的初始值作为序号字段的值,以便开始通信。FIN 为 1 时,表明发送方
已经没有资料发送了。
(7). 窗口大小:长度为 16 位,窗口对应的数据是以字节为单位的数据,因此最多能够传送的
数据为 65535B。
(8). 紧急指针:该字段的长度为 16 位,指向必须紧急处理的数据的位置,只有当标志 URG=1
时紧急指针才有效。从 TCP 报头后面的报文资料开始,到紧急指针所指出的长度的数据,
就是必须紧急处理的数据。
(9). 选项:该字段可以多达 40B,包括单字节选项和多字节选项。
(10).校验和:该字段长度多达 16 位,校验和的校验范围包括伪头部、TCP 报头以及应用层来
的数据。其计算方法与 IP 协议头部的校验的计算方法一样。伪头部为 12B,它本身并不
是 TCP 数据包的真正头部,只是在计算校验和时,临时和 TCP 数据包连接在一起。
5. 实验环境
平台:Windows
编程环境:VC 6.0
语言:C++
6. 实验要求
本程序的功能是填充一个 TCP 数据包,并发送给目的主机。
1)以命令行形式运行:SendTCP sourse_ip sourse_port dest_ip dest_port 其中,SendTCP 为程
序名;sourse_ip 为源端 IP 地址;sourse_port 为源端口;dest_ip 为目的 IP 地址;dest_port
为目的端口。
2)其它的 TCP 头部参数请自行设定。
3)数据字段为“This is my homework of network,I am happy!”。
4)发送成功后在屏幕上输出”send OK”。