tcp自定义协议.docx
《tcp自定义协议.docx》由会员分享,可在线阅读,更多相关《tcp自定义协议.docx(9页珍藏版)》请在冰豆网上搜索。
tcp自定义协议
竭诚为您提供优质文档/双击可除
tcp自定义协议
篇一:
tcp
实验报告
专业_姓名__学号_日期
1、实验目的:
1、掌握tcp协议的首部格式。
2、掌握tcp协议的序号确认机制。
3、掌握tcp协议的流量控制机制。
4、
学会协议分析软件发送自定义数据包的方法。
2、实验原理和内容
tcp协议是面向连接服务和提供可靠数据传输的协议,通过抓包分析tcp的如何建立连接,数据传输,释放连接来分析tcp协议。
tcp
协议是通过三次握手来建立连接,通过序列号和确认号来维护双方的通信,通过发送窗口的大小来控制流量。
通过多台电脑建立一台电脑的tcp连接,可以分析tcp流量控制的实质
3、实验步骤
1、在pc机上运行wireshark抓包工具准备抓包;
2、在web浏览器上,输入网址(比如或者其他uRl)后回车,待页面打开完毕后停止抓包。
3、在filter中输入tcp进行过滤,则可以开始对tcp进行分析4、实验分析与思考
tcp报文段的首部格式
篇二:
tcpip协议知识总结
/***********************0809tcp/ip知识总结*********************************/
1.osi开放系统互连模型(理想化的状态,在这个状态内给个层各司其职)总共有7层。
应用层:
Ftp,www,telnet,nFs,smtp,gateway,snmp
表示层:
tiFF,giF,jpeg(编解码),pict,ascii,ebcdic,
encryption,mpeg,midi,html
会话层:
Rpc,sql,nFs,netbios,names,appletalk,asp,decnet,scp传输层:
tcp,udp,spx
网络层:
ip(寻址方式),ipx(),appletalk(苹果自定义的协议)数据链路层:
FrameRelay,hdlc,ppp(点对点),ieee
802.3/802.2,Fddi,atm,ieee802.5/802.2
物理层:
eia/tia-232,eia/tia-499,V.35,V.24,Rj45,
ethernet,802.3(tcp自定义协议),802.5,Fddi,nRzi,nRz,b8zs
2.tcp/ip协议架构体系
应用层:
telnet(超级终端,远程登录),Ftp,smtp,snmp.
用户进行操作;
传输层:
tcp(重),udp(重),ugp
获取数据;
网络层:
ip(地址标识符),icmp(跳过传输层,ping命令...),igmp主要用于寻找地址;
数据链路层:
aRp,RaRp包括驱动和硬件;
ethernet(以太网);ie802.ng(无线)
3.
数据链路层:
负责在不同的传输媒介上处理物理信号硬件细节,从而实现数据在不同媒介直接传送对应我们所说的驱动程序和网卡
网络层:
控制数据在网络中传输路径,即是数据传送给谁,包括地址标识和寻址方式管理协议:
icmp,icmpv,igmp,mld
传输层:
提供两个主机之间的应用程序提供数据传输服务。
比如数据应该交给哪个进程处理,当数据没有到达对方进程时,或者当数据堵塞时,该如何处理:
流量控制当接收数据,如何判断数据的完整性:
差错控制
会话层:
负责在网络中的两节点之间建立和维持通信。
会话层的功能包括:
建立通信链接,保持会话过程通信链接的畅通,同步两个节点之间的对话,决定通信是否被中断以及通信中断时决定从何处重新发送。
你可能常常听到有人把会话层称作网络通信的“交通警察”当通过拨号向你的isp(因特网服务提供商)请求连接到因特网时,isp服务器上的会话层向你与你的pc客户机上的会话层进行协商连接。
若你的电话线偶然从墙上插孔脱落时,你终端机上的会话层将检测到连接中断并重新发起连接。
会话层通过决定节点通信的优先级
和通信时间的长短来设置通信期限
表示层:
应用程序和网络之间的翻译官,在表示层,数据将按照网络能理解的方案进行格式化;这种格式化也因所使用网络的类型不同而不同。
表示层管理数据的解密与加密,如系统口令的处理表示层协议还对图片和文件格式信息进行解码和编码
3.对于分层而言,每一个分层都有相应的协议;并且个从上到下每一个分层的协议都是基于下一个协议的,如果没有下一个分层的话,是没有任何意义的。
4.用户数据的打包过程:
ethernetiptcpappuserethernet
headheadheadheaddatatrailer
以太网头
5.数据解析
在以太网驱动解析时,以太网得到是ip将数据包交给ip来解析,ip解析后,得到tcp,,将数据包再交给tcp来解析,当tcp解析后,查看端口,将数据包根据记录的端口号通过端口交给应用;
6.路由器的作用:
路由:
选择最优最好的路径;
对打包好的数据进行发送;
互换不同的网络(有线和无线);
7.以太网与令牌网的区别
本质是硬件不同,用户的网卡硬件决定;
8.tcp协议特点(先建立连接,在发送数据)
(传输控制协议)面向连接的传输层协议;提供可靠的通信;
sock_stReam流式套接字;
以字符流(characterstream)的形式来发送数据;但是,为了提高tcp传输效率,是将数据先存起来,当达到一定字节才按一定tcp数据报格式打包发送;在接受的过程需考虑数据边界。
如果没有边界,则将产生ptc粘包;
9.udp协议特点(不可靠的无连接协议)
(数据报协议)无论接收方是否在线,知道对方地址都进行数据发送。
可进行高效率的传输;但是不能保证数据的可靠性;
sock_dgRam数据报套接字;
无论多少个字节都打包成udp数据报进行发送。
10.socket套接字
特点a.插口的形式;
b.socket是成对出现的;
c.socket的类型:
流式套接字sock_stReam;
数据报套接字sock_dgRam
原始套接字sock_Raw
d.编程接口socket()函数;
11.字节序:
数据存放在内存的序列;
大段模式:
高位先存(左边为高位)
小段模式:
低位先存(右边为低位)
在读取时,都是从低位开始读,但是在广域网中存储均是大端模式,因此在网络编程中,需将字节转换为大端;
12.tcp|udp端口号,端口号为short型的,个数为65535
在1-1024之间,端口号为众所周知的,不能申请占用;
在1024-5000之间为系统占用,也不可申请占用;
在5000~65535之间,用户可申请占用;
在使用过程中,申请5000以上的;
13.ip地址
32位存储;
24位为网络号;8位位主机号;但是在使用过程中,一般不占用0,1,255.这3个用做特殊用途;
14.tcp|udp都存有1个进程向系统申请的端口号。
15.对于端口和ip号,都需转换成大端的模式;
16.字节序转换
1.主机字节序到网络字节序
u_longhtonl(u_longhostlong);
u_shorthtons(u_shortshort);
2.网络字节序到主机字节序
u_longntohl(u_longhostlong)
u_shortntohs(u_shortshort)
3.ip地址转换函数
a.intinet_aton(constchar*strptr,structin_addr*addptr);
b.char*inet_ntoa(structin_addraddr)
将用inet_aton转换过的转换回来
缺点,不能转换ipV6的地址;
将读出的东西存入structin_addraddptr中;
structin_addr
{
in_addr_ts_addr;
}
a.in_addr_tinet_addr(constchar*strptr)
缺点,不能转换255.255.255.255若强制转换转换后为-1;
structin_addr*addr
a.intpton(intaf,constchar*strptr,(void*)
将用inet_pton转换过的转换回来
可转换任意类型的
17.socket函数
函数原型:
intsocket(intdomain,inttype,intprotocol);
返回值:
成功返回一个类似文件描述符的数字,也是从最小3开始;错误返回-1参数解析:
domain通信域aF_inet因特网通信域,跨机器进程间通信;
aF_unixaF_loca本机中进程与进程间通信;
aF_inet6因特网通讯,是ipV6类型;
aF_netlink用户进程与内核之间的通信;
type套接字类型;sock_stReam流式套接字
sock_dgRam数据报套接字
sock_Raw原始套接字
protocol(协议)参数总是0;
18.协议结构体
通用的协议结构体
structsockaddr
{
sa_family_tsa_family;
charsa_data[14];
}
internet协议结构体
strcutsocaddr_in
{
u_shortsin_family;//通信域
u_shortsin_port;//端口号
structin_addrsin_addr;//ip地址
charsin_zero[8];//8个没用的字节;用于与通用结构体大小保持一致;}
internetaddress结构体;
structin_addr
{
in_addr_ts_addr;
}
19.给结构体初始化;
memset(structstruct1*strptr,‘char’,sizeof(struct1));
bzero(structstruct2*strptr,sizeof(struct2));
20.bind()函数绑定
将地址结构体绑定到套接字(socket)描述符上;
(1);地址结构体以包含ip和端口号;
(2)想系统申请端口资源;
(3)不能将同一个地址结构体绑定到同类型的套接字上;
(4)对于发送端,可以不绑定,也可以绑定;如果不绑定,系统自动绑定;并且分配端口;但是对于接收端,必须要绑定;
函数原型intbind(intsockfd,conststructsockaddr*addr,socklen_taddrlen);返回值成功返回0;不成功返回-1;
参数解析;
sockfd用socket函数时返回的类似文件描述符的值;
addr定义的structsockaddraddr;
addlensockaddr_in结构体的大小;
21.listen()函数
监听链接的套接字,将自己的套接字变成被动连接类型;
函数原型:
intlisten(intsockfd,intbacklog);
返回值:
成功0;
错误-1;
参数解析:
sockfdsocket函数的返回的类似文件描述符;
backlog等待建立链接的客户端数量:
一般设定5-10个;
22.accept()函数
等待对方主动链接;也就是等待对方的connect()主动链接;
函数原型intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);
返回值成功返回一个新的类似文件描述符的东西;也就是用connect()激活的accept()的那个端口号;
错误返回-1;
参数解析;
sockfd自己调用socket()函数的返回的类似文件描述符
addr定义一个结构体用于接收对方的地址结构;
addrlen接收的结构体的大小;
23.connect()函数
主动链接服务器;等待accept()函数响应;
函数原型:
intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);返回值:
成功返回0;错误返回-1;
参数解析;sockfd自己调用socket()返回的类似文件描述符
addr服务段自己的地址结构;
addrlen自己的地址结构的长度;
篇三:
supersocket1.6.4通过FixedheaderReceiveFilter解析自定义协议
supersocket提供了一些通用的协议解析工具,你可以用他们简单而且快速的实现你自己的通信协议:
terminatorReceiveFilter(supersocket.socketbase.protocol.terminatorReceiveFilter,
supersocket.socketbase)
countspliterReceiveFilter(supersocket.Facility.protocol.countspliterReceiveFilter,
supersocket.Facility)
FixedsizeReceiveFilter(supersocket.Facility.protocol.FixedsizeReceiveFilter,
supersocket.Facility)
beginendmarkReceiveFilter(supersocket.Facility.protocol.beginendmarkReceiveFilter,
supersocket.Facility)
FixedheaderReceiveFilter(supersocket.Facility.protocol.FixedheaderReceiveFilter,
supersocket.Facility)
由于本次项目涉及的通信协议是头部格式固定并且包含内容长度的协议这里主要讲解使用FixedheaderReceiveFilter来拆解.
通信协议格式如下:
在FixedheaderReceiveFilter,头部指数据内容之前的数据(即数据长度l之前的部分),以上协议可以知道,头部包含11个字节.
首先,根据协议的需要来定义自己的请求类型,先实现一个客户端请求的实体类Requestinfo,改Requestinfo类必须实现接口iRequestinfo,该接口只有一个名为"key"的字符串类型的属性.supersocket设计了两个Requestinfo类:
stringRequestinfo和binaryRequestinfo,这里我们自定义一个来gdprotocolRequestinfo实现:
usingsystem;
usingsystem.collections.generic;
usingsystem.linq;
usingsystem.text;
usingsupersocket.socketbase.protocol;
namespacegdserver
{
publicclassgdprotocolRequestinfo:
iRequestinfo
{
///
///[不使用]
///
publicstringkey{get;set;}
///
///设备逻辑地址
///
publicstringdevicelogicalcode{get;set;}
///
///命令序列号
///
publicstringseq{get;set;}
///
///控制码
///
publicstringcontrolcode{get;set;}
///
///数据长度
///
publicstringlength{get;set;}
///
///数据域
///
publicstringdata{get;set;}
///
///cs校验
///
publicstringcs{get;set;}
///
///当前完整帧
///
//publicstringentireFrame{get;set;}
}
}
然后设计基于类FixedheaderReceiveFilter实现自己的接收过滤器gdprotocolReceiveFilterV2,主要实现getbodylengthFromheader和ResolveRequestinfo方法,实现如下:
usingsystem;
usingsystem.collections.generic;
usingsystem.linq;
usingsystem.text;
usingsupersocket.socketbase.protocol;
usingsupersocket.Facility.protocol;//
mon;//
namespacegdserver
{
///
///广东规约过滤器V2,(帧格式为gdprotocolRequestinfo)
///
publicclassgdprotocolReceiveFilterV2:
FixedheaderReceiveFilter{
publicgdprotocolReceiveFilterV2()
:
base(11)
{
}
///
///获取数据域和结尾字节长度
///
///
///
///
///
protectedoverrideintgetbodylengthFromheader(byte[]header,intoffset,intlength){
//length为头部(包含两字节的length)长度
//获取高位
bytehigh=header[offset+length-1];
//获取低位
bytelow=header[offset+length-2];
intlen=(int)high*256+low;
returnlen+2;//结尾有2个字节
}
///
///实现帧内容解析
///
///
///
///
///
///
protectedoverridegdprotocolRequestinfoResolveRequestinfo(arraysegmentheader,byte[]bodybuffer,intoffset,intlength)
{
gdprotocolRequestinfores=newgdprotocolRequestinfo();
stringentireFrame=bytestohexstr(header.array)+bytestohexstr(bodybuffer.cloneRange(offset,length));
//res.entireFrame=entireFrame;
res.devicelogicalcode=entireFrame.substring(2,8);
res.seq=entireFrame.substring(10,4);
res.controlcode=entireFrame.substring(16,2);
res.length=entireFrame.substring(18,4);
intdatalen=int.parse(hextodec(Reversehexstring(res.length)));
res.data=entireFrame.substring(22,datalen*2);
res.cs=entireFrame.substring(22+datalen*2,2);
returnres;
}
///
///高低对调
///
///
///
stringReversehexstring(stringstr)
{
char[]buff=newchar[str.length];
for(inti=0;i {
buff[i]=str[str.length-i-2];
buff[i+1]=str[str.length-1-i];
}
strings=newstring(buff);
returns;
}
///
///16进制转10进制
///
///
///
stringhextodec(stringhex)
{
returnconvert.toint64(hex,16).tostring();
}
///
///转化bytes成16进制的字符
///
///
///
stringbytestohexstr(byte[]bytes)
{
stringreturnstr="";
if(bytes!
=null)
{
for(inti=0;i {
returnstr+=bytes[i].tostring("x2");
}
}
returnreturnstr;
}
}
}
先创建新的appsession,gdprotocolsessionV2,新的
gdprotocolsessionV2.gdprotocolsessionV2代码如下:
appserver将使用
usingsupersocket.socketbase;
usingsupersocket.socketbase.protocol;
usingsystem;
namespacegdserver
{
publicclassgdprotocolsessionV2:
appsession
{
protectedoverridevoidhandleexception(exceptione)
{