动手学习TCP系列之环境搭建(共9页)_第1页
动手学习TCP系列之环境搭建(共9页)_第2页
动手学习TCP系列之环境搭建(共9页)_第3页
动手学习TCP系列之环境搭建(共9页)_第4页
动手学习TCP系列之环境搭建(共9页)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、动手(dng shu)学习TCP系列(xli)之环境搭建环境(hunjng)搭建和配置在开始进行实验之前,首先看看实验环境的搭建:Wireshark:用来抓取网络上的包,可以清楚的看到TCP/IP协议层,以及每层的详细信息,通过此处下载一台虚拟机:如果客户端和服务端都在本机,那么数据通信是不经过网卡的,所以Wireshark就抓不到任何数据包。方便的办法就是本机安装一个虚拟机,通过本机和虚拟机通信进行实验。我使用的是VirtualBox+winXP.Pcap.Net:是一个WinPcap的.NET wrapper,基于这个库,我们就可以很方便的通过C#代码来实现下面功能(通过此处下载):获取网

2、络设备接收、解析数据包创建、发送数据包在建立好实验环境之后,还需要进行一些简单的配置,保证宿主机和虚拟机之间的网络是畅通的。将虚拟机网络设置为Host-only Adapter模式。虚拟机网络设置好之后,就可以配置本机和虚拟机IP地址了,然后保证宿主机可以ping通虚拟机。环境(hunjng)验证通过上面的步骤,简单的实验(shyn)环境就建立完成了,下面就要来实现客户端和服务端了,试试实验环境是否能够正常工作。服务端首先(shuxin),将虚拟机(02)作为服务端,运行下面一段代码创建一个简单的socket server,服务端绑定02:8081:import sysfrom socket

3、import *HOST = 02PORT = 8081BUFSIZ = 1024ADDR = (HOST, PORT)server = socket(AF_INET, SOCK_STREAM)print Socket createdtry:server.bind(ADDR)except error, msg:print Bind failed. Error Code : + str(msg0) + Message + msg1sys.exit()server.listen(10)print Socket now listeningwhile True:conn, addr = server.

4、accept()try:data = conn.recv(100)if data:print dataexcept Exception, e:print econn.close()客户端客户端的实现(shxin)在本机(01),使用(shyng)一段基于Pcap.Net的代码(di m)向服务器发送一个SYN包(TCP连接建立需要进行三次握手,SYN包就是第一个握手包),来请求建立TCP连接。在客户端代码中,通过Pcap.Net实现了两个工具函数,一个用来获取本机网卡设备列表,一个用在构造不同类型的TPC包。获取本机网卡设备列表代码:public static PacketDevice Get

5、NICDevice()/ Retrieve the device list from the local machineIList allDevices = LivePacketDevice.AllLocalMachine;if (allDevices.Count = 0)Console.WriteLine(No interfaces found! Make sure WinPcap is installed.);return null;/ Print the device listfor (int i = 0; i != allDevices.Count; +i)LivePacketDevi

6、ce device = allDevicesi;Console.Write(i + 1) + . + device.Name);if (device.Description != null)Console.WriteLine( ( + device.Description + );elseConsole.WriteLine( (No description available);int deviceIndex = 0;doConsole.WriteLine(Enter the interface number (1- + allDevices.Count + ):);string device

7、IndexString = Console.ReadLine();if (!int.TryParse(deviceIndexString, out deviceIndex) |deviceIndex allDevices.Count)deviceIndex = 0; while (deviceIndex = 0);return allDevicesdeviceIndex - 1;另一段重要的代码就是构造TCP包的代码,根据OSI七层模型,下面代码中分别创建了链路层、网络层和传输层的部分,然后生成一个数据包:public static Packet BuildTcpPacket(EndPoint

8、Info endPointInfo, TcpControlBits tcpControlBits, List tcpOptionList = null)EthernetLayer ethernetLayer =new EthernetLayerSource = new MacAddress(endPointInfo.SourceMac),Destination = new MacAddress(endPointInfo.DestinationMac),EtherType = EthernetType.None, / Will be filled automatically.;IpV4Layer

9、 ipV4Layer =new IpV4LayerSource = new IpV4Address(endPointInfo.SourceIp),CurrentDestination = new IpV4Address(endPointInfo.DestinationIp),Fragmentation = IpV4Fragmentation.None,HeaderChecksum = null, / Will be filled automatically.Identification = 123,Options = IpV4Options.None,Protocol = null, / Wi

10、ll be filled automatically.Ttl = 10,TypeOfService = 0,;TcpLayer tcpLayer =new TcpLayerSourcePort = endPointInfo.SourcePort,DestinationPort = endPointInfo.DestinationPort,Checksum = null, / Will be filled automatically.SequenceNumber = seqNum,AcknowledgmentNumber = ackNum,ControlBits = tcpControlBits

11、,Window = windowSize,UrgentPointer = 0,Options = (tcpOptionList = null) ? TcpOptions.None : new TcpOptions(tcpOptionList),;PacketBuilder builder = new PacketBuilder(ethernetLayer, ipV4Layer, tcpLayer);return builder.Build(DateTime.Now);主程序中,首先(shuxin)配置了客户端和服务器的端口、IP/MAC地址(dzh)信息,然后通过前面两个工具函数构造一个TCP

12、连接建立(jinl)请求包(SYN包),并通过VirtualBox Host-Only Network网卡发送给服务端。static void Main(string args)/ Take the selected adapterPacketDevice selectedDevice = Utils.GetNICDevice();/ Open the output deviceusing (PacketCommunicator communicator = selectedDevice.Open(System.Int32.MaxValue, / name of the devicePacke

13、tDeviceOpenAttributes.Promiscuous, / promiscuous mode1) / read timeoutEndPointInfo endPointInfo = new EndPointInfo();endPointInfo.SourceMac = 08:00:27:00:C0:D5;endPointInfo.DestinationMac = 08:00:27:70:A6:AE;endPointInfo.SourceIp = 01;endPointInfo.DestinationIp = 02;endPointInfo.SourcePort = 3330;en

14、dPointInfo.DestinationPort = 8081;using (BerkeleyPacketFilter filter = communicator.CreateFilter(tcp port + endPointInfo.DestinationPort)/ Set the filtercommunicator.SetFilter(filter);communicator.SendPacket(Utils.BuildTcpPacket(endPointInfo, TcpControlBits.Synchronize, null);PacketHandler(communica

15、tor, endPointInfo);Console.WriteLine(Press Enter to Quit!);Console.ReadLine();private static void PacketHandler(PacketCommunicator communicator, EndPointInfo endPointInfo)Packet packet = null;doPacketCommunicatorReceiveResult result = communicator.ReceivePacket(out packet);switch (result)case Packet

16、CommunicatorReceiveResult.Timeout:/ Timeout elapsedcontinue;case PacketCommunicatorReceiveResult.Ok:Utils.PacketInfoPrinter(packet);break;default:throw new InvalidOperationException(The result + result + should never be reached here); while (true);运行(ynxng)代码代码完成了,下面看看(kn kn)运行效果,为了直观的看到数据包的传输,这是就可以

17、打开Wireshark了。为了避免抓到不相关的数据包,可以(ky)设置Wireshark中的filter,然后开始抓取。下面运行代码,并选择正确的网卡。通过console和Wireshark的输出可以看到,我们成功的生产了一个SYN包并发送到了服务器。根据TCP连接建立过程可以知道,客户端发送SYN包后,期待从服务器得到一个SYN, ACK包。到这里,说明前面搭建的环境,以及客户端和服务端的代码都是可以正常工作的了。谁的RST包从上面(shng min)的结果中看到,客户端在收到SYN, ACK包之后(zhhu),发送了一个RST包重置这条TCP连接(linji)。仔细查看了代码发现,客户端的

18、代码中并没有发送RST包。那么这个RST包是哪里来的呢?操作系统中有协议栈的概念,所以来自应用层的数据,都会一层层的经过操作系统协议栈处理,然后通过网卡发送出去。当客户端网卡收到SYN, ACK包后,这个包会被我们的Pcap.Net程序捕获,也会被传送给客户端操作系统。由于通过Pcap.Net构造的SYN包是没有经过操作系统协议栈的,所以操作系统会认为SYN, ACK包是一个无效TCP包,并通过RST包重置TCP连接。到这里,多余RST包就可以解释了。避免RST包为了避免操作系统协议栈对Pcap.Net程序的影响,通过IP安全策略(通过Run-secpol.msc打开设置)的设置,可以避免操作系统从本机(01)向虚拟机(02)发送数据包。设置完成后,再次运行(ynxng)程序,这是程序就正常了。由于客户端没有(mi yu)发送ACK包来确认(qurn)来自服务端的SYN, ACK包,根据TCP工作原理,服务端会进行重传。总结本文中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论