1、 计算机网络课程设计 题 目 数据包发送和接受程序的实现 学 院 计算机学院 2012 年 12 月 21 日 数据包发送和接受程序的实现数据包发送和接受程序的实现 一、设计题目与要求一、设计题目与要求 1.设计题目 发送 TCP 数据包 2.设计要求 本设计的功能是填充一个 TCP 数据包,并发送给目的主机。 1)以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port,其 中 SendTCP 是程序名, source_ip 为源端 IP 地址, source_port 为源端口号, dest_ip 为目的地址,dest_port 为目
2、的端口号。 2)其他的 TCP 头部参数请自行设定。 3)数据字段为“This is my homework of network,I am happy!” 。 4)成功发送后在屏幕上输出“send OK” 。 三、详细设计三、详细设计 本课程设计的目标是发送一个 TCP 数据包, 可以利用原始套接字来完成这个工作。 整个 程序由初始化原始套接字和发送 TCP 数据包两个部分组成。 当应用进程需要通过TCP发送时, 它就将此应用层报文传送给执行TCP协议的传输实体。 TCP 传输实体将用户数据加上 TCP 报头,形成 TCP 数据包,在 TCP 数据包上增加 IP 头部, 形成 IP 包。 如
3、图-1 显示的是 TCP 数据包和 IP 包得关系。 TCP 协议的数据传输单位称为报文 段,其格式如图-2 所示。报文段报头的长度是 20B60B,选项部分长度最多为 40B。TCP 报文 段主要包括以下字段。 端口号端口号:端口号字段包括源端口号和目的端口号。每个端口号的长度是 16 位,分别表 示发送该 TCP 包的应用进程的端口号和接收该 TCP 包的应用进程的端口号。 图-1 TCP 数据包加上 IP 报头形成 IP 包 序号序号:长度为 32 位。由于 TCP 协议是面向数据流的,它所传送的报文段可以视为连续 的数据流,因此需要给每一字节编号。序号字段的“序号”指的是本报文段数据的
4、第一个字 IP 报头 TCP 报头 TCP 数据 IP 数据 节的序号。 确认号确认号:该字段的长度为 32 位,它表示接收端希望接收下一个 TCP 包的第一个字节的 序号。 报文长度报文长度:该字段长度为 4 位。TCP 报文长度是以 4B 为一个单元来计算的,实际上报 文长度在 20B60B 之间。因此这个字段的值在 515 之间。 图-2 TCP 数据包头部的格式 保留保留:长度为 6 位,留做今后使用,目前全部置 0. 控制控制:这个字段定义了 6 种不同的标志,每一个标志占一位,在同一时间可以设置一位 或多位。URG 位为 1 时,表明应尽快把数据传送给应用程序,否则表明允许数据在缓
5、存中存 放一段时间。RST 位为 1 时,表明要强制切断连接。SYN 位为 1 时,表明有确立连接的请求, 这时,把序号字段的初始值作为序号字段的值,以便开始通信。FIN 位为 1 时,表明发送放 已经没有数据发送了。 窗口大小窗口大小:长度为 16 位,指向必须紧急处理的数据的位置,因此最多能够传送的数据 为 65535B。 紧急指针紧急指针:该字段长度为 16,指向必需紧急处理的位置,只有当标志 URG=1 时紧急指 针才生效。从 TCP 报头后面的报文数据开始,到紧急指针所指出长度的数据,就是必须紧急 处理的数据。 选项选项: 该字段可以多达 40B,包括单字节选项和多字节选项。 校验和
6、校验和:该字段长度为 16 位,校验和的校验范围包括伪头部,TCP 报头以及应用层来 的数据。其计算方法与 IP 协议头部校验和的计算方法一样。伪头部为 12B,它本身并不是 TCP 数据包的真头部,只是在计算校验和时,临时和 TCP 数据包连接在一起。伪头部的格式 如图-3 所示 0 8 16 24 31 源 IP 地址 TCP 头部 数据 源端口号 目的端口号 序号 确认号 报文长度 保留 URG ACK PSH RST SYN FIN 窗口大小 校验和 紧急指针 选项及填充 目的 IP 地址 00000000 协议号(6) TCP 长度 1.创建一个原始套接字,并设置 IP 头选项 SOCKET sock; sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); 或者: sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPE D); 这里,设置了 SOCK_RAW 标志,表示