![网络通信编程 原始套接字程序设计【互联网业】_第1页](http://file1.renrendoc.com/fileroot_temp2/2020-12/13/703945f6-31ea-4855-b0f8-8ab52c5764cf/703945f6-31ea-4855-b0f8-8ab52c5764cf1.gif)
![网络通信编程 原始套接字程序设计【互联网业】_第2页](http://file1.renrendoc.com/fileroot_temp2/2020-12/13/703945f6-31ea-4855-b0f8-8ab52c5764cf/703945f6-31ea-4855-b0f8-8ab52c5764cf2.gif)
![网络通信编程 原始套接字程序设计【互联网业】_第3页](http://file1.renrendoc.com/fileroot_temp2/2020-12/13/703945f6-31ea-4855-b0f8-8ab52c5764cf/703945f6-31ea-4855-b0f8-8ab52c5764cf3.gif)
![网络通信编程 原始套接字程序设计【互联网业】_第4页](http://file1.renrendoc.com/fileroot_temp2/2020-12/13/703945f6-31ea-4855-b0f8-8ab52c5764cf/703945f6-31ea-4855-b0f8-8ab52c5764cf4.gif)
![网络通信编程 原始套接字程序设计【互联网业】_第5页](http://file1.renrendoc.com/fileroot_temp2/2020-12/13/703945f6-31ea-4855-b0f8-8ab52c5764cf/703945f6-31ea-4855-b0f8-8ab52c5764cf5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章,原始套接字,1,软件网络,内容提要,1.使用原始套接字 2.套接字选项 3.ICMP编程 4.使用IP头包含选项 5.网络嗅探器实例,2,软件网络,1.使用原始套接字,利用原始套接字(Raw Socket),可访问底层传输协议。,原始套接字(Raw Socket)与标准套接字区别,3,软件网络,4,使用原始套接字可以做什么? 实现一些实用工具(ping,traceroute)。 可对IP头,TCP头,UDP头,ICMP头等进行操作。 原始套接字使用SOCK_RAW套接字类型来创建的,目前只有Winsock2提供了对它的支持。 无论Microsoft Windows CE 还是老版本的W
2、indows 95 (无Winsock 2升级)均不能利用原始套接字。,4,软件网络,创建原始套接字,原始套接字类型 在IP头中使用预定义的协议(如ICMP) 在IP头中使用自定义的协议(使用IP头包含选项),5,软件网络,创建原始套接字 使用socket()或WSASocket()创建原始套接字。 例:创建原始套接字 使用预定义协议: SOCKET s; S=socket(AF_INET,SOCK_RAM,IPPROTO_ICMP); /OR S=WSAsocket(AF_INEF,SOCK_RAM,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);,6,软件
3、网络,使用自定义协议 使用IGMP、UDP、IP或者原始IP,只需分别设置IPPROTO_IGMP、IPPROTO_UDP、IPPROTO_IP或IPPROTO_RAW即可。 注意:在Windows NT 4、Windows 98以及Windows 95(安装Winsock 2)操作系统中,创建原始套接字时,只能使用ICMP。 协议标志IPPROTO_UDP、IPPROTO_IP以及IPPROTO_RAW均要求使用套接字选项IP_HDRINCL,而该选项在上述平台下都是不支持的。 Windows 2000提供了对IP_HDRINCL选项的支持,所以能够处理IP头(IPPROTO_RAW)、TC
4、P头(IPPROTO_TCP)以及UDP头(IPPROTO_UDP)。 无论是否设置IP_HDRINCL选项,原始套接字上接收到的数据都会包含IP头。,7,软件网络,使用原始套接字可以对底层传输机制加以控制,所以有些人将其用于不法用途,,8,软件网络,9,套接字选项操作函数 getsocketopt()获取套接字选项信息。 int getsocketopt( SOCKET s, /套接字描述符 int level, /选项级别 int optname, /选项名称 char *optval, /选项值 int *optlen/选项长度 ); setsocketopt( ) 设置套接字选项。 i
5、nt setsocketopt(SOCKET s, int level, int optname, const char *optval, int optlen);,2.套接字选项,9,软件网络,10,选项级别: 协议的层次对应选项级别 应用层:SOL_SOCKET 传输层:IPPROTO_TCP、IPPROTO_UDP 网络层:IPPROTO_IP 不同级别属性不同,同一级别的不同协议的属性不同,因此必须指定level参数 例:Int nTime=2*1000 setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char*) IPPROTO_ICMP指定使用ICMP,3
6、8,软件网络,PING 程序执行步骤,1、创建协议类型为IPPROTO_ICMP的原始套接字,设置套接字的属性。 2、创建并初始化ICMP封包。 3、调用sendto函数向远程主机发送ICMP请求。 4、调用recvfrom函数接收ICMP响应。,39,软件网络,/ Ping.h / 声明IP头数据结构 typedef struct _IPHeader / 20字节的IP头 UCHAR iphVerLen; / 版本号和头长度(各占4位) UCHAR ipTOS; / 服务类型 USHORT ipLength; / 封包总长度,即整个IP报的长度 USHORT ipID; / 封包标识,惟一标
7、识发送的每一个数据报 USHORT ipFlags; / 标志和片偏移 UCHAR ipTTL; / 生存时间,就是TTL UCHAR ipProtocol; / 协议,可能是TCP、UDP、ICMP等 USHORT ipChecksum; / 校验和 ULONG ipSource; / 源IP地址 ULONG ipDestination; / 目标IP地址 IPHeader, *PIPHeader;,PING 程序代码,40,软件网络,/ICMP头数据结构 typedef struct icmp_hdr unsigned char icmp_type;/ 消息类型 unsigned char
8、 icmp_code;/ 代码 unsigned short icmp_checksum;/ 校验和 unsigned short icmp_id; / 用来惟一标识此请求的ID号,通常设置为进程ID unsigned short icmp_sequence;/ 序号 unsigned long icmp_timestamp; / 数据传输时间 ICMP_HDR, *PICMP_HDR; /ICMP回送请求的数据结构 typedef struct _EchoRequest ICMP_HDR icmphdr; char cData32; ECHOREQUEST,*PECHOREQUEST;,41
9、,软件网络,/ICMP回送应答的数据结构 #define REQ_DATASIZE 32 typedef struct _EchoReply IPHeader iphdr; ECHOREQUEST echoRequest; ECHOREPLAY,*PECHOREPLAY; / 校验和的计算 / 以16位的字为单位将缓冲区的内容相加,如果缓冲区长度为奇数, / 则再加上一个字节。它们的和存入一个32位的双字中 USHORT checksum(USHORT* buff, int size);,/ Ping.cpp #include #include #pragma comment(lib, WS2
10、_32)/ 链接到WS2_32.lib #include #include ping.h,42,软件网络,USHORT checksum(USHORT* buff, int size) u_long cksum = 0; while(size1) / 将数据以字为单位累加到cksum 中 cksum=cksum+ *buff; buff= buff +1; size= size- sizeof(USHORT); /等价于size=size-2; if(size=1) / 共有奇数个字节将最后一个字节扩展为字,再累加 USHORT u=0; u=(USHORT)(*(UCHAR*)buff);
11、cksum = cksum +u; / 校验位计算 /高16位和低16位相加 cksum = (cksum 16) + (cksum , 位右移运算符 右边的值依次被移出了,左边的位置依次放0,校验位计算 (1) 将32位的chsum高16位和低16位相加 (2) 自加当前数的高16位 (3) 取反并转换为16位,43,软件网络,int main() WSADATA wsaData; WORD version = MAKEWORD(2, 2); int ret = WSAStartup(version, ,44,软件网络,/ 创建ICMP封包(回送请求) ECHOREQUEST echoReq
12、; / 填写ICMP封包数据 echoReq.icmphdr.icmp_type = 8;/ 请求一个ICMP回显 echoReq.icmphdr.icmp_code = 0; echoReq.icmphdr.icmp_id = (USHORT)GetCurrentProcessId(); echoReq.icmphdr.icmp_checksum = 0; echoReq.icmphdr.icmp_sequence = 0; / 填充数据部分,可以为任意 memset(/Sets buffers to a specified character.,45,软件网络,/ 开始发送和接收ICMP封
13、包 USHORT nSeq = 0; SOCKADDR_IN from; int nLen = sizeof(from); while(TRUE) static int nCount = 0; int nRet; if(nCount+ = 4) break; echoReq.icmphdr.icmp_checksum = 0; / GetTickCount() 系统开始后,已经经过的毫秒数 echoReq.icmphdr.icmp_timestamp = GetTickCount(); echoReq.icmphdr.icmp_sequence = nSeq+; echoReq.icmphdr
14、.icmp_checksum = checksum(USHORT*) ,46,软件网络,/接收回送应答包 ECHOREPLAY echoReply; nRet = recvfrom(sRaw, (char*) ,47,软件网络,/ 下面开始解析接收到的封包 if(nRet sizeof(ECHOREPLAY) printf( Too few bytes from %s n, inet_ntoa(from.sin_addr); / 接收到的数据中包含IP头,IP头大小为20个字节 if(echoReply.echoRequest.icmphdr.icmp_type != 0) / 回显 prin
15、tf( nonecho type %d recvd n, echoReply.echoRequest.icmphdr.icmp_type); return -1; if(echoReply.echoRequest.icmphdr.icmp_id != GetCurrentProcessId() printf( someone elses packet! n); return -1; ,48,软件网络,printf( %d bytes Reply from %s:, nRet, inet_ntoa(from.sin_addr); printf( icmp_seq = %d. , echoRepl
16、y.echoRequest.icmphdr.icmp_sequence); int nTick = GetTickCount(); printf( time: %d ms, nTick - echoReply.echoRequest.icmphdr.icmp_timestamp); printf( TTL= %d , echoReply.iphdr.ipTTL); printf( n); Sleep(1000); WSACleanup();/释放Winsock库 return 0; ,49,软件网络,64 bytes Reply from 192.168.0.2: icmp_seq = 0.
17、time: 0 ms TTL= 64 64 bytes Reply from 192.168.0.2 : icmp_seq = 1. time: 0 ms TTL= 64 64 bytes Reply from 192.168.0.2 : icmp_seq = 2. time: 0 ms TTL= 64 64 bytes Reply from 192.168.0.2 : icmp_seq = 3. time: 0 ms TTL= 64,PING 程序运行结果,50,软件网络,Traceroute(追踪路由) 利用Traceroute可侦测出到达网络内特定主机,中途需经过哪些路由器(IP地址)。
18、 利用Ping,使用IP选项头内的记录路由选项,侦测中途经过的路由器IP地址,但Ping最多只支持9跳。,TRACEROUTE程序分析,51,软件网络,52,52,软件网络,若网络较大,穿过的路由器不止9个,应换用Traceroute。 实现Traceroute程序的方法 基本思想:多次发送数据包,TTL递增,TTL 为0时返回一条 ICMP报文。 例:路由跟踪程序(采用发送UDP数据包) 创建两个套接字: sRaw 用于接收ICMP数据包 sSend用于发送TTL不断增加的UDP数据报,53,软件网络,Traceroute程序主要代码,typedef struct icmp_hdr unsi
19、gned char icmp_type;/ 消息类型 unsigned char icmp_code;/ 代码 unsigned short icmp_checksum;/ 校验和 / 下面是回显头 unsigned short icmp_id;/ 用来惟一标识此请求的ID号,通常设置为进程ID unsigned short icmp_sequence;/ 序列号 unsigned long icmp_timestamp; / 时间戳 ICMP_HDR, *PICMP_HDR;,54,软件网络,BOOL SetTTL(SOCKET s, int nValue) int ret = setsoc
20、kopt(s, IPPROTO_IP, IP_TTL, (char*) ,55,软件网络,void main() char *szDestIp = “202.199.25.20”; /目的地址 char recvBuf1024 = 0 ; / 创建用于接收ICMP封包的原始套节字,绑定到本地端口 SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); sockaddr_in in; in.sin_family = AF_INET; in.sin_port = 0; in.sin_addr.S_un.S_addr = INADDR_ANY;
21、if(bind(sRaw, (sockaddr*),56,软件网络,/ 创建用于发送UDP封包的套节字 SOCKET sSend = socket(AF_INET, SOCK_DGRAM, 0); SOCKADDR_IN destAddr; destAddr.sin_family = AF_INET; destAddr.sin_port = htons(22); destAddr.sin_addr.S_un.S_addr = inet_addr(szDestIp); int nTTL = 1; int nRet; ICMP_HDR *pICMPHdr; int nTick; SOCKADDR_
22、IN recvAddr; do / 设置UDP封包的TTL值 SetTTL(sSend, nTTL); nTick = GetTickCount(); / 发送这个UDP封包 nRet = sendto(sSend, hello, 5, 0, (sockaddr*),57,软件网络,if(nRet = SOCKET_ERROR) printf( sendto() failed n); break; / 等待接收路由器返回的ICMP报文 int nLen = sizeof(recvAddr); nRet = recvfrom(sRaw, recvBuf, 1024, 0, (sockaddr*)
23、 ,58,软件网络,/ 解析接收到的ICMP数据 pICMPHdr = (ICMP_HDR*) ,59,软件网络,4. 使用IP头包含选项,创建原始套接字后使用IP_HDRINCL套接字选项可对IP头进行操作,同时也能操作TCP或UDP头(或封装在IP内的其他任何协议)。 使用IP_HDRINCL选项时,必须针对每一次发送调用,向IP头内自行填充内容。同时还需填写封装在其中的其他协议头。 相关协议报文格式,60,软件网络,固 定 部 分,可变 部分,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,标 识,区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验
24、和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,数 据 部 分,首 部,传送,IP 数据报,发送在前,IP 数据报格式,61,软件网络,可变 部分,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,标 识,区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,数 据 部 分,首 部,传送,IP 数据报,62,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,标 识,
25、区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,数 据 部 分,首 部,传送,IP 数据报,固 定 部 分,63,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,标 识,区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,固 定 部 分,可变 部分,64,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存
26、时 间,协 议,标 识,区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,固 定 部 分,可变 部分,65,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,标 识,区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,固 定 部 分,可变 部分,66,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,
27、协 议,标 识,区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,固 定 部 分,可变 部分,67,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,标 识,区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,固 定 部 分,可变 部分,68,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,
28、标 识,区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,固 定 部 分,可变 部分,标志(flag)占 3 位,目前只有前两位有意义。 标志字段的最低位是 MF (More Fragment)。 MF 1 表示后面“还有分片”。MF 0 表示最后一个分片。 标志字段中间的一位是 DF (Dont Fragment) 。 只有当 DF 0 时才允许分片。,69,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,标 识,区 分 服 务,总 长
29、度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,固 定 部 分,可变 部分,70,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,标 识,区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,固 定 部 分,可变 部分,生存时间(8 位)记为 TTL (Time To Live),这是为了 限制数据报在网络中的生存时间,用“跳数”作为 TTL 的单位。数据
30、报每经过一个路由器,其 TTL 值就减 1。,71,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,标 识,区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,固 定 部 分,可变 部分,72,软件网络,运输层,网络层,首部,TCP,UDP,ICMP,IGMP,OSPF,数 据 部 分,IP 数据报,73,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,标 识,区 分 服 务,总 长 度,片 偏 移
31、,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,固 定 部 分,可变 部分,74,软件网络,首 部,0,4,8,16,19,24,31,版 本,标志,生 存 时 间,协 议,标 识,区 分 服 务,总 长 度,片 偏 移,填 充,首 部 检 验 和,源 地 址,目 的 地 址,可 选 字 段 (长 度 可 变),位,首部长度,数 据 部 分,固 定 部 分,可变 部分,75,软件网络,IP 数据报首部的可变部分,IP 首部的可变部分就是一个选项字段,用来支持排错、测量以及安全等措施,内容很丰富。 选项字段的长度可变,从
32、 1 个字节到 40 个字节不等,取决于所选择的项目。 增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。,76,软件网络,typedef struct _IPHeader / 20字节的IP头 UCHAR iphVerLen; / 版本号和头长度(各占4位) UCHAR ipTOS; / 服务类型 USHORT ipLength; / 整个IP报文长度 USHORT ipID; / 封包标识 USHORT ipFlags;/ 标志、片偏移量 UCHAR ipTTL;/ 生存时间TTL UCHAR ipP
33、rotocol; / 协议(TCP、UDP、ICMP等) USHORT ipChecksum; / 校验和 ULONG ipSource; / 源IP地址 ULONG ipDestination; / 目标IP地址 IPHeader, *PIPHeader;,网络编程中IP头对应结构体声明,77,软件网络,UDP头简单。长度仅为8个字节,而且只包含了四个字段,格式如图所示。,由于UDP是一种不能保证数据可靠传输的协议,所以校验和的计算是可选的。 UDP校验和除覆盖了UDP头之外,还同时覆盖了实际的数据,此外还包括IP头的一部分。,78,软件网络,typedef struct _UDPHeade
34、r USHORTsourcePort;/ 源端口号USHORTdestinationPort; / 目的端口号USHORTlen;/ 封包长度 USHORTchecksum;/ 校验和 UDPHeader, *PUDPHeader;,79,软件网络,计算UDP校验和的附加字段叫作“伪首部”。 UDP校验和基于如下几个域: 32位源IP地址(IP头) 32位目标IP地址(IP头) 8位字段(全零) 8位协议 16位UDP长度 16位源端口号 16位目标端口号 16位UDP长度 16位UDP校验和 UDP数据,80,软件网络,发送原始UDP封包的步骤 首先以IPPOTO_UDP为协议类型创建一个原
35、始套接字,打开原始套接字上的IP_HDRINCL选项; 然后构建UDP封包(先设置IP头,再设置UDP头,最后设置数据); 初始化完整的UDP封包之后,调用sendto函数即可将它发送。 例:发送原始UDP封包,81,软件网络,发送原始UDP封包,int main() / 输入参数信息 char szDestIp = 10.16.115.88; / = 填写目的IP地址 char szSourceIp = 127.0.0.1; / = 填写您自己的IP地址 USHORT nDestPort = 4567; USHORT nSourcePort = 8888; char szMsg = This
36、 is a test rn; int nMsgLen = strlen(szMsg); / 创建原始套节字 SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); / 有效IP头包含选项 BOOL bIncl = TRUE; setsockopt(sRaw, IPPROTO_IP, IP_HDRINCL, (char *),82,软件网络,/ IP头 IPHeader *pIphdr = (IPHeader *)buff; pIphdr-iphVerLen = (4ipLength = htons(sizeof(IPHeader) + siz
37、eof(UDPHeader) + nMsgLen); pIphdr-ipTTL = 128; pIphdr-ipProtocol = IPPROTO_UDP; pIphdr-ipSource = inet_addr(szSourceIp); pIphdr-ipDestination = inet_addr(szDestIp); pIphdr-ipChecksum = checksum(USHORT*)pIphdr, sizeof(IPHeader); / UDP头 UDPHeader *pUdphdr = (UDPHeader *),83,软件网络,ComputeUdpPseudoHeader
38、Checksum(pIphdr, pUdphdr, pData, nMsgLen); / 设置目的地址 SOCKADDR_IN destAddr = 0 ; destAddr.sin_family = AF_INET; destAddr.sin_port = htons(nDestPort); destAddr.sin_addr.S_un.S_addr = inet_addr(szDestIp); / 发送原始UDP封包 int nRet; for(int i=0; i5; i+) nRet = sendto(sRaw, buff, sizeof(IPHeader) + sizeof(UDPH
39、eader) + nMsgLen, 0, (sockaddr*) ,84,软件网络,5. 网络嗅探器实例,嗅探器设计原理 网卡正常工作模式:套接字程序只接收与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧丢弃。 网络嗅探器的目的:从网卡接收所有经过它的数据包,这些数据包既可以是发给它的也可以是发往别处的。 达到上述目的就不能让网卡按通常的正常模式工作,而必须将其设置为混杂模式。 设置混杂模式只能在原始套接字进行,不能在流套接字和数据报套接字进行。,85,软件网络,TCP 首部,20 字节的 固定首部,目 的 端 口,数据 偏移,检 验 和,选 项 (长 度 可 变),源
40、端 口,序 号,紧 急 指 针,窗 口,确 认 号,保 留,F I N,32 位,S Y N,R S T,P S H,A C K,U R G,位 0 8 16 24 31,填 充,TCP 数据部分,TCP 首部,TCP 报文段,IP 数据部分,IP 首部,发送在前,86,软件网络,typedef struct _TCPHeader/ 20字节的TCP头 USHORTsourcePort; / 16位源端口号 USHORTdestinationPort; / 16位目的端口号 ULONGsequenceNumber; / 32位序列号 ULONGacknowledgeNumber; / 32位确认号 UCHARdataoffset; / 高4位首部长度/6位保留字 UCHARflags; / 6位标志位 USHORTwindows;/ 16位窗口大小 USHORTchecksum;/ 16位校验和 USHORTurgentPointer;/ 16位紧急数据偏移量 TCPHeader,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高三第二学期工作总结
- 工商局年工作总结
- 社交媒体市场分析医疗行业应用与发展趋势
- 电商公司劳务合同范本
- 校企合作定向培养合同范本
- 的装修劳务分包个人协议书范本
- 社交电商行业的供应链优化策略
- 知识产权国际保护与科技创新的互动关系
- 环保宣传教育与绿色办公的推进
- 口腔合伙人股权协议书范本
- 主题二任务二 《探究身边信息技术的奥秘》 教学设计 2023-2024学年桂科版初中信息技术七年级上册
- 【道法】认识生命 课件-2024-2025学年统编版道德与法治七年级上册
- 2024年初级养老护理员职业鉴定考试题库(含答案)
- 人教八年级上册英语第一单元《Section A (1a-2d)》教学课件
- 2023年版《安宁疗护实践指南(试行)》解读课件
- 2024年银行考试-兴业银行笔试考试历年高频考点试题摘选含答案
- 油气勘探开发的勘探风险管理
- 10kV环网柜改造工程施工方案设计
- 电工班三级安全教育内容范本
- 新生儿疾病筛查可疑阳性、阳性儿复查随访登记表
- 开学前幼儿园安全培训
评论
0/150
提交评论