发送TCP数据包

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

·选项:该字段可以多达 40B,包括单字节选项和多字节选项。
·校验和:该字段长度多达 16 位,校验和的校验范围包括伪头部、TCP 报头以及应用 层来的数据。其计算方法与 IP 协议头部的校验的计算方法一样。伪头部为 12B,它本身 并不是 TCP 数据包的真正头部,只是在计算校验和时,临时和 TCP 数据包连接在一起。 伪头部的格式如下图所示。
3
BOOL Flag=TRUE; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&Flag, sizeof(Flag)); int timeout=1000; setsockopt(sock, SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout)); 在这里我们使用基本套接字 SOL_SOCKET,设置 SO_SNDTIMEO 表示使用发送超时设 置,超时时间设置为 1000ms。
窗口大小
头留


校验和
紧急指针
选项及填充
·确认号:该字段的长度为 32 位,它表示接收端希望接收的下一个 TCP 包的第一个字
节的序号。
·报头长度:该字段长度为 4 位。TCP 报头长度是以 4B 为一个单元来计算的,实际上
报头长度在 20B~60B 子间。因此这个字段的值在 5~15 之间。
·保留:长度为 6 位,留作今后使用,目前全部置 0。
00000000
源 IP 地址 目的 IP 地址 协议号(6)
TCP 长度
2
1.4 工作环境
软件:Microsoft Visual C++ 6.0;硬件:PC 机一台。
二 课程设计分析
本课程设计的目标是发送一个 TCP 资料包,可以利用原始套接字来完成这个工作。整个 程序由初始化原始套接字和发送 TCP 数据包两个部分组成。
2.2 定义 IP 头部、TCP 头பைடு நூலகம்和伪头部的数据结构
//定义 IP 首部
typedef struct _iphdr
{
UCHAR h_lenver;
//4 位首部长度+4 位 IP 版本号
UCHAR tos;
//8 位服务类型 TOS
USHORT total_len;
//16 位总长度(字节)
USHORT ident;
·序号:长度为 32 位。由于 TCP 协议是面向数据流的,它所传送的报文段可以视为连 续的数据流,因此需要给每一个字节编号。序号字段的“序号”指的是本报文段数据的 第一个字节的顺序号。
TCP 头部
数据
0
15 16
31
源端口号
目的端口号
序号
确认号
1
报 保 URG ACK PSH RST SYN FIN
2.1 使用原始套接字
SOCKET sock; sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); 或者: sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPP ED); 这里,我们设置了 SOCK_RAW 标志,表示我们声明的是一个原始套接字类型。 为使用发送接收超时设置,必须将标志位置位置为 WSA_FLAG_OVERLAPPED。在本课 程设计中,发送 TCP 包时隐藏了自己的 IP 地址,因此我们要自己填充 IP 头,设置 IP 头 操作选项。其中 flag 设置为 ture,并设定 IP_HDRINCL 选项,表明自己来构造 IP 头。 注意,如果设置 IP_HDRINCL 选项,那么必须具有 administrator 权限,要不就必须修改 注册表: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\Parameter\ 修改键:DisableRawSecurity(类型为 DWORD),把值修改为 1。如果没有,就添加。
没有资料发送了。
·窗口大小:长度为 16 位,窗口对应的数据是以字节为单位的数据,因此最多能够传
送的数据为 65535B。
·紧急指针:该字段的长度为 16 位,指向必须紧急处理的数据的位置,只有当标志
URG=1 时紧急指针才有效。从 TCP 报头后面的报文资料开始,到紧急指针所指出的长度
的数据,就是必须紧急处理的数据。
发送 TCP 数据包
1.3 相关知识
编制本程序前要对 TCP 协议有一定的了解。当应用程序有报文需要通过 TCP 发送时, 它就将此应用层报文传送给执行 TCP 协议的传输实体。TCP 传输实体将用户数据加上 TCP 报头,形成 TCP 数据包,在 TCP 数据包上增加 IP 头部,形成 IP 包。下图显示的是 TCP 数据包和 IP 包的关系。
ULONG destIP;
//32 位目的 IP 地址
}IP_HEADER;
//定义 TCP 伪首部
4
typedef struct psd_hdr {
·控制:这个字段定义了 6 种不同的标志,每个标志占一位,在同一时间可以设置一
位或多位。URG 为 1 时,表明有需要紧急处理的数据。ACK 为 1 时,表明确认号的字段有
效。PST 位为 1 时,表明要强制切断连接。SYN 位为 1 时,表明有确立连接的请求,这时,
把序号字段的初始值作为序号字段的值,以便开始通信。FIN 为 1 时,表明发送方已经
TCP 报头 TCP 数 据
IP 报头 IP 数据
TCP 协议的传输单元为报文段,其格式如图所示。报文段报头的长度为 20B~60B。其 中固定长度为 20B,报文段长度最多为 40B。TCP 报文段主要包括以下字段。
·埠号:埠号字段包括源埠号和目的埠号。每个埠号的长度是 16 位,分别表示发送 该 TCP 包的应用进程的埠号和接收该 TCP 包的应用进程的埠号。
//16 位标识
USHORT frag_and_flags; //3 位标志位
UCHAR ttl;
//8 位生存时间 TTL
UCHAR proto;
//8 位协议 (TCP, UDP 或其它)
USHORT checksum; //16 位 IP 首部校验和
ULONG sourceIP;
//32 位源 IP 地址
相关文档
最新文档