实验二 Raw Socket编程与以太网帧分析基础

合集下载

华科-计算机网络实验报告-javasocket编程-网络组建实验

华科-计算机网络实验报告-javasocket编程-网络组建实验

课程实验报告课程名称:专业班级:计算机科学与技术1003班学号:姓名:鲁辰指导教师:报告日期:计算机科学与技术学院目录1实验二 Socket 编程(E-Mail)................... 错误!未定义书签。

实验目的....................................... 错误!未定义书签。

实验要求....................................... 错误!未定义书签。

实验内容....................................... 错误!未定义书签。

实验过程....................................... 错误!未定义书签。

需求分析................................... 错误!未定义书签。

界面....................................... 错误!未定义书签。

写信....................................... 错误!未定义书签。

收信....................................... 错误!未定义书签。

实验体会....................................... 错误!未定义书签。

2 实验2 网络组建与实施............................. 错误!未定义书签。

实验目的....................................... 错误!未定义书签。

实验环境、要求................................. 错误!未定义书签。

实验实验环境............................... 错误!未定义书签。

实验要求.................................... 错误!未定义书签。

socket编程实验

socket编程实验

Socket编程实验实验介绍Socket编程是一种用于实现网络通信的编程方式。

通过Socket编程,可以实现不同主机之间的数据传输和通信。

本实验将介绍Socket编程的基本概念和使用方法,并通过一个简单的示例来演示Socket编程的实际应用。

实验目标•了解Socket编程的基本概念•学会使用Socket编程进行网络通信•编写一个简单的Socket服务器和客户端程序实验步骤步骤一:Socket编程概述Socket编程是一种基于网络的编程方式,将网络通信抽象为一种文件的读写操作,通过创建Socket对象并使用其中的方法来实现网络通信。

Socket编程通常涉及两个基本的角色:服务器和客户端。

步骤二:Socket服务器程序首先,我们需要编写一个Socket服务器程序,用来接收来自客户端的连接并处理相应请求。

在Python中,可以使用socket库来创建一个Socket服务器。

以下是一个简单的Socket服务器程序的示例:import socket# 创建一个Socket对象server_socket = socket.socket(socket.AF_INET, soc ket.SOCK_STREAM)# 绑定IP地址和端口号server_socket.bind(('127.0.0.1', 8888))# 监听连接server_socket.listen(5)print('服务器已启动,等待连接...')while True:# 接受客户端连接client_socket, client_address = server_socket. accept()print('客户端已连接:', client_address)# 处理请求data = client_socket.recv(1024)print('收到客户端消息:', data.decode())# 发送响应response ='Hello Client!'client_socket.sendall(response.encode()) # 关闭连接client_socket.close()上述代码创建了一个Socket对象并绑定了一个IP地址和一个端口号。

实验二 网络实用工具与以太网帧分析

实验二 网络实用工具与以太网帧分析

实验二网络实用工具与以太网帧分析【实验目的】1.加深理解TCP/IP体系结构;理解与掌握网络基本配置2.掌握几个基本的实用网络命令3.熟悉以太网报文格式;熟悉网络分析工具wireshark使用【实验原理】1.以太网协议典型的两种帧格式: Ehternet II, ieee802.3基本组成:如图所示,以太网和IEEE 802.3帧的基本结构如下:1、前导码:由0、1间隔代码组成,可以通知目标站作好接收准备。

IEEE 802.3帧的前导码占用7个字节,紧随其后的是长度为1个字节的帧首定界符(SOF)。

以太网帧把SOF包含在了前导码当中,因此,前导码的长度扩大为8个字节。

2、帧首定界符(SOF):IEEE 802.3帧中的定界字节,以两个连续的代码1结尾,表示一帧实际开始。

3、目标和源地址:表示发送和接收帧的工作站的地址,各占据6个字节。

其中,目标地址可以是单址,也可以是多点传送或广播地址。

类型(以太网):占用2个字节,指定接收数据的高层协议。

长度(IEEE 802.3):表示紧随其后的以字节为单位的数据段的长度。

数据(以太网):在经过物理层和逻辑链路层的处理之后,包含在帧中的数据将被传递给在类型段中指定的高层协议。

虽然以太网版本2中并没有明确作出补齐规定,但是以太网帧中数据段的长度最小应当不低于46个字节。

数据(IEEE 802.3):IEEE 802.3帧在数据段中对接收数据的上层协议进行规定。

如果数据段长度过小,使帧的总长度无法达到64个字节的最小值,那么相应软件将会自动填充数据段,以确保整个帧的长度不低于64个字节。

帧校验序列(FCS):该序列包含长度为4个字节的循环冗余校验值(CRC),由发送设备计算产生,在接收方被重新计算以确定帧在传送过程中是否被损坏。

2.以太网报文(帧)长度最大长度:1518字节最小长度:64字节3.网络分析工具wireshark简介主要功能:网络报文捕捉、解码分析类似的软件还有sniffer实际使用中,在开始捕捉报文前,需要设置“过滤器”,以设定条件。

用C#的Raw Socket实现网络封包监视 可用于P2P编程

用C#的Raw Socket实现网络封包监视 可用于P2P编程

用C#的Raw Socket实现网络封包监视可用于P2P编程谈起socket编程,大家也许会想起QQ和IE,没错。

还有许多网络工具如P2P、NetMeeting等在应用层实现的应用程序,也是用socket来实现的。

Socket是一个网络编程接口,实现于网络应用层,Windows Socket 包括了一套系统组件,充分利用了Microsoft Windows 消息驱动的特点。

Socket规范1.1版是在1993年1月发行的,并广泛用于此后出现的Windows9x操作系统中。

Socket规范2.2版(其在Windows平台上的版本是Winsock2.2,也叫Winsock2)在 1996 年 5 月发行,Windows NT 5.0及以后版本的Windows系统支持Winsock2,在Winsock2中,支持多个传输协议的原始套接字,重叠I/O模型、服务质量控制等。

本文向大家介绍Windows Sockets的一些关于用C#实现的原始套接字(Raw Socket)的编程,以及在此基础上实现的网络封包监视技术。

同Winsock1相比,Winsock2最明显的就是支持了Raw Socket套接字类型,使用Raw Socket,可把网卡设置成混杂模式,在这种模式下,我们可以收到网络上的IP包,当然包括目的不是本机的IP包,通过原始套接字,我们也可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。

在本文例子中,我在nbyte.BasicClass命名空间实现了RawSocket类,它包含了我们实现数据包监视的核心技术。

在实现这个类之前,需要先写一个IP头结构,来暂时存放一些有关网络封包的信息:这样,当每一个封包到达时候,可以用强制类型转化把包中的数据流转化为一个个IPHeader对象。

下面就开始写RawSocket类了,一开始,先定义几个参数,包括:还有一个常量:这里的SIO_RCVALL是指示RawSocket接收所有的数据包,在以后的IOContrl函数中要用,在下面的构造函数中,实现了对一些变量参数的初始化:下面的函数实现了创建RawSocket,并把它与终结点(IPEndPoint:本机IP和端口)绑定:其中,在创建套接字的一句socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);中有3个参数:第一个参数是设定地址族,MSDN上的描述是“指定 Socket 实例用来解析地址的寻址方案”,当要把套接字绑定到终结点(IPEndPoint)时,需要使用InterNetwork成员,即采用IP版本4的地址格式,这也是当今大多数套接字编程所采用一个寻址方案(AddressFamily)。

计算机网络实验报告(路由算法、Socket编程)

计算机网络实验报告(路由算法、Socket编程)

计算机网络实验报告班级:姓名:学号:实验一一.实验目的及要求编写程序,模拟距离矢量路由算法的路由表交换过程,演示交换后的路由表的变化。

二.实验原理距离矢量路由算法是这样工作的:每个路由器维护一张路由表(即一个矢量),它以网络中的每个路由器为索引,表中列出了当前已知的路由器到每个目标路由器的最佳距离,以及所使用的线路。

通过在邻居之间相互交换信息,路由器不断地更新他们的内部路由表。

举例来说,假定使用延迟作为“距离”的度量标准,并且该路由器发送一个列表,其中包含了他到每一个目标路由器的延时估计值;同时,他也从每个邻居路由器接收到一个类似的列表。

假设一个路由器接收到来自邻居x的一个列表,其中x(i)表示x估计的到达路由器i所需要的时间。

如果该路由器知道他到x的延时为m毫秒,那么他也知道在x(i)+m毫秒之间内经过x可以到达路由器i。

一个路由器针对每个邻居都执行这样的计算,就可以发现最佳的估计值,然后在新的路由器表中使用这个最佳的估计值以及对应的输出路线。

三.源程序:#include "stdio.h"#include "stdlib.h"#include "malloc.h"#include "graphics.h"#include "dos.h"#define VERNUM 7typedef struct{int dis;int flag;int flag2;}RoutNode;char tmp[10];RoutNode data[VERNUM][VERNUM];void welcome();void InitRoutData(FILE* pfile);void PrintRoutData();void SendInf(int recv, int send);void Exchange();int main(){int start, end, i, j, m, n;FILE *pfile;welcome();pfile = fopen("1.txt", "r");if (pfile == NULL){printf("the file wrong,press any key to come back.\n");getch();return;}elseInitRoutData(pfile);fclose(pfile);printf("\nthe original route table:\n");for (i = 0; i<VERNUM; i++){printf("%c||", i + 65);for (j = 0; j < VERNUM; j++)if (data[i][j].dis > 0)printf("<%c %d> ", j + 65, data[i][j].dis);printf("\n");}PrintRoutData();getch();for (i = 0; i < VERNUM; i++){for (m = 0; m < VERNUM; m++)for (n = 0; n < VERNUM; n++)data[m][n].flag = 0;Exchange();PrintRoutData();getch();}printf("\nexchange the route table:\n");return 0;}void welcome(){int gdriver=DETECT,gmode;registerbgidriver(EGAVGA_driver);initgraph( &gdriver, &gmode,"C:\Win-TC");cleardevice();setbkcolor(CYAN);setviewport(0,0,639,479,1);clearviewport();setbkcolor(BLUE);setcolor(14);rectangle(200,200,440,280);setfillstyle(1,5);floodfill(300,240,14);settextstyle(0,0,2);outtextxy(50,30,"Distance Vector Routing Algorithm");setcolor(15);settextstyle(1,0,4);outtextxy(260,214,"Welcome to use!");line(0,80,640,80);getch();delay(300);cleardevice();}void InitRoutData(FILE* pfile){char num[10];int i = 0;char c;int m, n;fseek(pfile, 0, 0);for (m = 0; !feof(pfile) && m < 7; m++){for (n = 0; !feof(pfile) && n < 7; n++){while (!feof(pfile)){c = fgetc(pfile);if (c == ','){num[i] = '\0';data[m][n].dis = atoi(num);data[m][n].flag = 0;data[m][n].flag = 0;i = 0;break;} /*end of if*/else if ((c >= '0' && c <= '9') || c == '-'){num[i++] = c;} /*end of else if*/} /*end of while*/} /*end of for (n = 0*/} /*end of for (m = 0*/}void PrintRoutData(){int i, j;for (i = 0; i < VERNUM; i++){settextstyle(1,0,3);sprintf(tmp," %c",i + 65);outtextxy(i*80+50,130,tmp);outtextxy(10,160+i*40,tmp);}for (j = 0; j< VERNUM; j++){for (i = 0; i < VERNUM; i++){if (data[i][j].dis <= 0&&i!=j){if(data[i][j].flag2 ==1){setfillstyle(SOLID_FILL,5);bar(80*i+50,40*j+155,80*i+120,40*j+185);delay(50000);data[i][j].flag2 =0;}setfillstyle(SOLID_FILL,3);bar(80*i+50,40*j+155,80*i+120,40*j+185);settextstyle(1,0,2);sprintf(tmp,"-");outtextxy(80*i+65,40*j+165,tmp);}elseif(data[i][j].dis >=0){if(data[i][j].flag2 ==1){setfillstyle(SOLID_FILL,5);bar(80*i+50,40*j+155,80*i+120,40*j+185);delay(50000);data[i][j].flag2 =0;}setfillstyle(SOLID_FILL,3);bar(80*i+50,40*j+155,80*i+120,40*j+185);settextstyle(1,0,2);sprintf(tmp,"%d",data[i][j].dis);outtextxy(80*i+65,40*j+165,tmp);}} /*end of for (j = 0*/} /*end of for (i = 0*/}void SendInf(int recv, int send){int i;for (i = 0; i < VERNUM; i++){if (data[send][i].dis > 0&& data[send][i].flag!=1) { if (data[recv][i].dis <= 0&&recv!=i) {data[recv][i].dis = data[send][i].dis + data[recv][send].dis;data[recv][i].flag =1;data[recv][i].flag2 =1;}else if (data[recv][i].dis > data[send][i].dis + data[recv][send].dis){data[recv][i].dis = data[send][i].dis + data[recv][send].dis;data[recv][i].flag =1;data[recv][i].flag2 =1;}} /*end of if*/} /*end of for*/}void Exchange(){int i, j;for (i = 0; i < VERNUM; i++){for (j = 0; j < VERNUM; j++){if (data[i][j].dis > 0&& data[i][j].flag!=1){SendInf(i, j);} /*end of if*/} /*end of for (j = 0*/} /*end of for (i = 0*/}四、实验心得体会通过本次实验训练,我了解了距离矢量路由算法的基本原理,复习了C语言编程的内容,通过对路由算法的实现,加深了对路由表交换的理解。

rawsocket编程讲解

rawsocket编程讲解

网络协议回顾对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。

那么我想问:1. 什么是TCP/IP、UDP?2. Socket在哪里呢?3. Socket是什么呢?4. 你会使用它们吗?什么是TCP/IP、UDP?TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。

UDP(User Data Protocol,用户数据报协议)是与TCP 相对应的协议。

它是属于TCP/IP协议族中的一种。

这里有一张图,表明了这些协议的关系。

TCP/IP协议族包括运输层、网络层、链路层。

现在你知道TCP/IP与UDP的关系了吧。

ICMP协议格式ICMP协议有两种类型:查询报文和差错报文。

其格式如下:差错报文中,Type是差错类型;Code是差错类型中的子类型;Checksum是ICMP的校验和(校验和覆盖ICMP的头和数据)。

其数据部分包含出错包的IP头(包括选项)和IP数据的前八个字节。

地址伪装只处理三种协议(ICMP,TCP,UDP)的差错包,并且只处理三种类型的差错报文,如下:ICMP_DEST_UNREACH(目的不可达),ICMP_SOURCE_QUENCH(源端被关闭),ICMP_TIME_EXCEEDED(超时)。

差错报文中,Type是差错类型;Code是差错类型中的子类型;Checksum是ICMP的校验和(校验和覆盖ICMP的头和数据)。

其数据部分包含出错包的IP头(包括选项)和IP数据的前八个字节。

地址伪装只处理三种协议(ICMP,TCP,UDP)的差错包,并且只处理三种类型的差错报文,如下:ICMP_DEST_UNREACH(目的不可达),ICMP_SOURCE_QUENCH(源端被关闭),ICMP_TIME_EXCEEDED(超时)。

socket编程原理与基础

socket编程原理与基础

socket编程原理与基础Socket编程是一种在计算机网络中用于实现进程间通信的机制。

它利用TCP/IP协议族提供的网络功能,使得位于不同主机上的进程可以互相通信,实现数据的交换和共享。

在Socket编程中,通信的两端分别是服务端和客户端。

服务端充当服务器的角色,负责监听特定的端口,接受客户端的请求,并进行处理;而客户端则作为请求方,向服务端发起连接请求,并发送数据。

Socket通信的基本流程可以分为以下几个步骤:1. 创建Socket:服务端和客户端都需要创建一个Socket对象,用于后续的通信。

Socket通常由IP地址和端口号来确定。

2. 绑定Socket:服务端需要将自己的Socket对象绑定到一个特定的端口上,以便监听该端口上的连接请求。

3. 监听连接请求:服务端通过调用Socket对象的listen方法开始监听连接请求。

一旦有客户端发送连接请求,服务器就会接受该连接,并创建一个新的Socket对象来与客户端进行通信。

4. 建立连接:客户端向服务端发起连接请求,服务端接受请求后,双方的Socket对象建立起连接,并进行数据传输。

5. 数据传输:连接建立后,双方可以通过Socket对象进行数据的发送和接收。

数据传输可以分为两种方式:同步和异步。

同步传输是指发送方发送一段数据后,会阻塞等待接收方确认接收,再发送下一段数据;而异步传输则是发送方可以一次性发送多段数据,不必等待接收方的确认。

6. 关闭连接:当数据传输完毕或不再需要通信时,可以调用Socket对象的close方法来关闭连接。

关闭连接后,双方的Socket对象都无法再进行数据的发送和接收。

Socket编程的原理是基于TCP/IP协议族。

TCP/IP协议族是互联网通信的基础,它定义了数据在网络上的传输规则和格式。

其中,TCP (Transmission Control Protocol,传输控制协议)负责实现可靠的数据传输,确保数据的完整性和顺序;而IP(Internet Protocol,网际协议)则负责定义数据在网络中的路由和寻址。

计算机网络中的Socket编程基础

计算机网络中的Socket编程基础

计算机网络中的Socket编程基础随着计算机网络技术的发展,Socket编程不仅成为了网络编程的重要技术,也是各种网络应用程序的核心。

Socket编程是一种进行网络通信的标准接口,而掌握Socket编程基础知识,对于网络编程入门者来说是必不可少的。

本文将介绍Socket编程的基础知识,包括Socket编程的概念、Socket编程接口、Socket编程工具等。

一、Socket编程的概念Socket是“套接字”的缩写,实际上是一种总称,指的是一组支持TCP/IP协议的API。

Socket编程就是利用Socket接口进行网络编程,通过这个接口,我们可以建立TCP/IP连接,传输数据,以及在网络上进行各种通信操作。

在Socket编程中,客户端和服务器之间的网络通信就像两个人在电话通话一样。

它们之间可以进行数据交换,而且每个人都必须正确地遵守通信协议才能进行交流。

Socket编程就是用网络协议建立两台计算机之间的通信链路,从而进行数据传输。

二、Socket编程接口Socket编程接口有两种类型:面向连接型和无连接型。

在面向连接型编程中,每个连接都要创建一个连接套接字。

而在无连接型编程中,消息是离散的,没有连接套接字。

这两种类型各有优缺点,可以根据实际需要进行选择。

1. 面向连接型面向连接型套接字在通信之前,需要先建立连接,在连接建立成功后,通信双方就可以发送和接收数据了。

连接是由服务器开始创建的,客户端使用connect()函数请求连接。

通信完成后,双方任何一方都可以使用close()函数来关闭连接。

2. 无连接型无连接型套接字不需要建立连接,直接发送和接收数据。

由于它没有连接套接字,因此,处理的消息是离散的。

能够满足与多个不同主机进行通信的需要。

三、Socket编程工具Socket编程的工具主要有三种:telnet、nc和socat。

其中,telnet和nc是常用的两种工具,而socat是比较专业的Socket编程工具。

原始套接字透析之Raw Socket基础

原始套接字透析之Raw Socket基础
psdHeader.mbz = 0;
psdHeader.ptcl = IPPROTO_TCP;
psdHeader.tcpl = htons(sizeof(tcpHeader));
//计算校验和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
{
printf("setsockopt IP_HDRINCL error!\n");
return false;
}
nTimeOver = 1000;
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*) &nTimeOver, sizeof
tcpHeader.th_seq = htonl(0x12345678);
tcpHeader.th_ack = 0;
tcpHeader.th_lenres = (sizeof(tcpHeader) / 4 << 4 | 0);
tcpHeader.th_flag = 2; //标志位探测,2是SYN
ipHeader.checksum = checksum((unsigned short*)szSendBuf, sizeof(ipHeader) + sizeof
(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
rect = sendto(sock, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0,
addr_in.sin_addr.S_un.S_addr = inet_addr(desIP);

raw socket原理

raw socket原理

raw socket原理
Raw Socket是一种实现数据传输的方式,它直接使用网络底层协议,在应用层直接读写IP数据报。

这个机制下的数据传输,不会受到上层协议的干扰。

Raw socket 的工作原理是,应用程序直接访问协议栈中的协议头,封装网络数据包并负责发送它们。

Raw socket 能够带来以下几个重要的好处
1. 更细粒度的控制:应用程序可以控制网络传输的所有细节。

2. 性能好:数据传输过程中少了很多额外的复杂操作,因此能够提供最佳的性能。

3. 更为安全:使用 raw socket 应用程序能够直接读写数据包,因此对系统的安全问题,会有更好的掌控。

4. 能够更好地支持自定义数据协议:Raw socket 能够便捷地支持新的自定义数据协议。

Raw Socket也存在一些限制或者说挑战,比如很多操作系统都不允许用户直接访问底层数据包。

此外,在使用 raw socket 过程中,还需要加强安全措施,以避免遭受网络攻击、黑客入侵等问题。

总的来说,raw socket的出现可以改进网络协议栈的各方面的处理能力,增加应用程序在性能、安全和功能上的灵活性和自由度,使它适用于更多领域和场景的解决方案。

网络工程网络编程实验报告2-Socket编程

网络工程网络编程实验报告2-Socket编程

《网络编程》实验报告实验序号:02 实验项目名称:Socket编程学号姓名专业、班20网络工程实验地点指导教师实验时间2022一、实验目的及要求掌握Socket编程的基本原理,调试并在代码标注注释:(1) ServerSocket, ClientSocket(2) SimpleClient, SimpleServer(3) PortScanner(4) Sender, Receiver(5) SenderClient, ReceiverSever二、实验设备(环境)及要求一台Windows XP、JDK1.6、MyEclipse 8.5三、实验内容与步骤1运行ServerSocket, ClientSocket2.第二个实验,第三次连接不成功的原因是:客户端建立了三个不同的连接,而服务端只有两个。

3.第三个实验是扫描1-1024端口有没有被服务器监听。

4.判断连接结束方式5.设置睡眠时间四、实验结果与数据处理1运行ServerSocket, ClientSocket2.第二个实验,第三次连接不成功的原因是:客户端建立了三个不同的连接,而服务端只有两个。

3.第三个实验是扫描1-1024端口有没有被服务器监听。

4.判断连接结束方式5.设置睡眠时间四、实验结果与数据处理附源程序清单:1. EchoServerpackage Hello;import java.io.*;import .*;public class EchoServer {private int port=8000;//监听端口号private ServerSocket serverSocket;public EchoServer() throws IOException {serverSocket = new ServerSocket(port);//创建一个SocketSystem.out.println("服务器启动");}public String echo(String msg) {return "echo:" + msg;}private PrintWriter getWriter(Socket socket)throws IOException{////参数socket 表示每写一行,PrintWriter缓存就自动溢出,把数据写到目的地OutputStream socketOut = socket.getOutputStream();return new PrintWriter(socketOut,true);}private BufferedReader getReader(Socket socket)throws IOException{InputStream socketIn = socket.getInputStream();//获得输入流,获得用户的请求//数据流输入return new BufferedReader(new InputStreamReader(socketIn));}public void service() {while (true) {Socket socket=null;try {socket = serverSocket.accept(); //等待客户连接System.out.println("New connection accepted "+socket.getInetAddress() + ":" +socket.getPort());BufferedReader br =getReader(socket);PrintWriter pw = getWriter(socket);String msg = null;while ((msg = br.readLine()) != null) {System.out.println(msg);pw.println(echo(msg));if (msg.equals("bye")) //如果客户发送消息为“bye”,就结束通信break; }}catch (IOException e) {e.printStackTrace();}finally {try{if(socket!=null) socket.close(); //断开连接}catch (IOException e) {e.printStackTrace();}} } }// service() 方法结束public static void main(String args[])throws IOException {new EchoServer().service();}}import .*;import java.io.*;import java.util.*;public class EchoClient {//创建客户端private String host="localhost";//当参数host 的取值为“localhost”,表示EchoClient与EchoServer进程运行在同一个主机上private int port=8000;//监听端口号8000private Socket socket;public EchoClient()throws IOException{socket=new Socket(host,port); //建立连接}public static void main(String args[])throws IOException{//输入输出new EchoClient().talk();}private PrintWriter getWriter(Socket socket)throws IOException{//发送数据OutputStream socketOut = socket.getOutputStream();//获得输出流return new PrintWriter(socketOut,true);}private BufferedReader getReader(Socket socket)throws IOException{InputStream socketIn = socket.getInputStream(); //获得输入流return new BufferedReader(new InputStreamReader(socketIn));}public void talk()throws IOException {try{BufferedReader br=getReader(socket);PrintWriter pw=getWriter(socket);BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));String msg=null;while((msg=localReader.readLine())!=null){pw.println(msg);System.out.println(br.readLine());if(msg.equals("bye"))break;}}catch(IOException e){e.printStackTrace();}finally{//关闭流和连接try{socket.close();}catch(IOException e){e.printStackTrace();} }}}2. .SimpleClientimport java.io.*;import .*;public class SimpleClient {public static void main(String args[])throws Exception {Socket s1 = new Socket("localhost",8000);System.out.println("第一次连接成功");Socket s2 = new Socket("localhost",8000);System.out.println("第二次连接成功");Socket s3 = new Socket("localhost",8000);System.out.println("第三次连接成功");}package Hello;import java.io.*;import .*;public class SimpleServer {public static void main(String args[])throws Exception {ServerSocket serverSocket = new ServerSocket(8000,2); //连接请求队列的长度为2Thread.sleep(360000); //睡眠6分钟}}3. import .*;import java.io.*;public class PortScanner { public static void main(String args[]){String host="localhost";//当参数host 的取值为“localhost”,表示Client与Server进程运行在同一个主机上if(args.length>0)host=args[0];new PortScanner().scan(host);}public void scan(String host){//扫描1-1024端口Socket socket=null;for(int port=1;port<1024;port++){try {//try catch语句判断输出socket = new Socket(host, port);System.out.println("There is a server on port "+port);//如果有连接There is a server on port,} catch (IOException e) {System.out.println("Can't connect to port "+port);//如果没有连接Can't connect to port} finally {try {if(socket!=null)socket.close();//断开连接} catch (IOException e) {e.printStackTrace();}}}}4. Senderimport java.io.*;import .*;public class Receiver { private int port=8000;private ServerSocket serverSocket;private static int stopWay=1; //结束通信的方式private final int NATURAL_STOP=1; //自然结束private final int SUDDEN_STOP=2; //突然终止程序private final int SOCKET_STOP=3; //关闭Socket,再结束程序private final int INPUT_STOP=4; //关闭输入流,再结束程序private final int SERVERSOCKET_STOP=5; //关闭ServerSocket,再结束程序public Receiver() throws IOException {serverSocket = new ServerSocket(port);System.out.println("服务器已经启动");}private BufferedReader getReader(Socket socket)throws IOException{ InputStream socketIn = socket.getInputStream();return new BufferedReader(new InputStreamReader(socketIn));}public void receive() throws Exception{Socket socket=null;socket = serverSocket.accept();BufferedReader br =getReader(socket);for(int i=0;i<20;i++) {String msg=br.readLine();System.out.println("receive:"+msg);Thread.sleep(1000);if(i==2){ //终止程序,结束通信if(stopWay==SUDDEN_STOP){System.out.println("突然终止程序");System.exit(0);}else if(stopWay==SOCKET_STOP){System.out.println("关闭Socket并终止程序");socket.close();break;}else if(stopWay==INPUT_STOP){System.out.println("关闭输入流并终止程序");socket.shutdownInput();break;}else if(stopWay==SERVERSOCKET_STOP){System.out.println("关闭ServerSocket并终止程序");serverSocket.close();break;}}}if(stopWay==NA TURAL_STOP){socket.close();serverSocket.close();}}public static void main(String args[])throws Exception {if(args.length>0)stopWay=Integer.parseInt(args[0]);new Receiver().receive();}}Receiverimport .*;import java.io.*;import java.util.*;public class Sender {private String host="localhost";private int port=8000;private Socket socket;private static int stopWay=1; //结束通信的方式private final int NATURAL_STOP=1; //自然结束private final int SUDDEN_STOP=2; //突然终止程序private final int SOCKET_STOP=3; //关闭Socket,再结束程序private final int OUTPUT_STOP=4; //关闭输出流,再结束程序public Sender()throws IOException{socket=new Socket(host,port);}public static void main(String args[])throws Exception{if(args.length>0)stopWay=Integer.parseInt(args[0]);new Sender().send();}private PrintWriter getWriter(Socket socket)throws IOException{ OutputStream socketOut = socket.getOutputStream();return new PrintWriter(socketOut,true);}public void send()throws Exception {PrintWriter pw=getWriter(socket);for(int i=0;i<20;i++){String msg="hello_"+i;pw.println(msg);System.out.println("send:"+msg);Thread.sleep(500); //捕捉异常if(i==2){ //终止程序,结束通信if(stopWay==SUDDEN_STOP){System.out.println("突然终止程序");//输出System.exit(0);}else if(stopWay==SOCKET_STOP){System.out.println("关闭Socket并终止程序");//输出socket.close();break;}else if(stopWay==OUTPUT_STOP){socket.shutdownOutput();System.out.println("关闭输出流并终止程序");//输出break;}}}if(stopWay==NATURAL_STOP){socket.close();}}}5 SendClientimport java.io.*;import .*;public class SendClient {public static void main(String args[])throws Exception {Socket s = new Socket("localhost",8000);OutputStream out=s.getOutputStream();out.write("hello ".getBytes());out.write("everyone".getBytes());Thread.sleep(60000); //睡眠1分钟s.close();}}package Hello;import java.io.*;import .*;public class ReceiveServer { public static void main(String args[])throws Exception { ServerSocket serverSocket = new ServerSocket(8000);Socket s=serverSocket.accept();//s.setSoTimeout(20000);InputStream in=s.getInputStream();ByteArrayOutputStream buffer=new ByteArrayOutputStream();byte[] buff=new byte[1024];int len=-1;do{try{len=in.read(buff);if(len!=-1)buffer.write(buff,0,len);}catch(SocketTimeoutException e){System.out.println("等待读超时");len=0;}}while(len!=-1);System.out.println(new String(buffer.toByteArray())); //把字节数组转换为字符串}}。

Rawsocket编程例解

Rawsocket编程例解

Rawsocket编程例解Raw socket编程例解【转】2009-12-19 17:05Raw socket编程例解作者:KevinZ.Tan(kevintz)***************声明:本文仅作为技术探讨所用,对任何人使用本文里的程序所做的事,本人概不负责。

本文版权遵循GPL version 2前几天网友genjuro_lyb转贴了一篇关于raw socket编程的文章,觉得对TCP/IP的理解有较大用处,所以中译成《Raw socket C语言简明教程》。

但这篇教程里的例子代码不完整,不利于网友结合实践进行学习raw socket编程。

所以就写了4使用个例子,现在将代码贴出来,供大家交流学习。

我在写这些代码的过程中,遇到不少问题,走了一些弯路,总结一下,为了不再重复花费大家的精力和时间:1、in_cksum()生成的结果不用转换成网络序。

另外如果这个函数写得不正确的话,通常得不到对方的发回包,很难调试。

2、数据转化成网络序的一个原则是:一般协议头部的short和int/long型的数据通常要转换成网络序。

运载的数据部分,如果在对方要处理的,类型为short/int/long型数据的也要转换成网络序。

如果对方不做处理,直接返回的数据部分,可以不转换成我网络序。

3、raw tcp的程序为什么只写发SYN包:因为你发了SYN包,对方发回来SYN/ACK包,你的操作系统内核先于你的程序接收到这个包,它检查内核里的socket,发现没有一个socket对应于这个包(因为raw tcp socket没有保存ip和端口等信息,所以内核不能识别这个包),所以发了一个RST包给对方,于是对方的tcp socket关闭了。

你的raw tcp socket最终收到这个SYN/ACK包,你的程序做了处理后,再发ACK包给对方时,对方的tcp socket 已经关闭,所以对方就发了一个RST回来。

要写一个SYN flooder就只能用raw raw socket,因为raw tcp不能自己控制IP头,所以不能写SYN flooder,除非用了IP_HDRINCL选项和自己构造IP头部。

《计算机网络》实验二分析以太网数据帧的构成

《计算机网络》实验二分析以太网数据帧的构成

成绩:教师评语指导教师签名:批阅日期:一、实验目的及要求实验目的掌握以太网帧的构成,了解各个字段的含义;掌握网络协议分析软件的基本使用方法;掌握常用网络管理命令的使用方法。

实验要求:基本上要掌握以太网的构成,学会对网络协议分析软件的使用方法及对网络进行管理命令的使用。

二、实验原理数据链路层将不可靠的物理层转变为一条无差错的链路,涉及的数据单位是帧(frame),高层的协议数据被封装在以太网帧的数据字段发送。

使用网络协议分析软件可以捕获各种协议数据包,通过查看这些协议数据包中数据链路帧的各字段可以分析网络协议的内部机制。

三、实验软硬件环境计算机及以太网环境。

四、实验内容与步骤1.打开网络协议分析软件(Ethereal),图标为:。

成功运行后界面如下:Ethereal是一款免费的网络协议分析程序,支持Unix、Windows。

借助这个程序,我们既可以直接从网络上抓取数据进行分析,也可以对由其他嗅探器抓取后保存在硬盘上的数据进行分析。

目前,Ethereal能够解析761种协议数据包,选择菜单命令“Help”→“Supported Protocol”子菜单项可以查看详细信息。

2.选择菜单命令“Capture”→“Interfaces…”子菜单项。

弹出“Ethereal: Capture Interfaces”对话框。

此对话框列出了本地计算机中存在的网络适配器。

单击“Details”按钮可以查看对应适配器的详细信息。

从上图中可以看出,本机可用适配器的IP地址为:10.0.1.94。

单击“Capture”按钮可以立即开始捕获网络数据包,单击“Prepare”按钮可以在经过详细设置后开始捕获网络数据包。

3.单击“Prepare”按钮,弹出“Ethereal: Capture Options”对话框。

此对话框列出了当前可用适配器、本地计算机IP地址、数据捕获缓冲区大小、是否采用混杂模式、捕获数据包最大长度限制、数据捕获过滤规则等配制参数。

Raw Socket

Raw Socket

捕获数据包
recv(sockRaw, RecvBuf, BUFFER_SIZE, 0);
接受任意数据包 #define BUFFER_SIZE 65535 char RecvBuf[BUFFER_SIZEket返回的数据格式
ip header tcp header (or other header) data
RawSocket的使用
可以用RawSocket来发送和接收 IP 层以上 的原始数据包, 如 ICMP, TCP, UDP... 创建一个 Raw Socket
int sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
RawSocket的使用
用Raw Socket捕获数据的步骤:
用 Raw Socket 实现代码如下:
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag);
设置 IP 头操作选项,IP_HDRINCL ==> header is included with data ,ws2tcpip.h bool flag = ture;
IP数据报格式
0 Version 4 HLen Ident TTL Protocol SourceAddr DestinationAddr Options (variable) Data Pad (variable) 8 TOS Flags 16 19 Length Offset Checksum 31
把网卡置于混杂模式 捕获数据包 分析数据包
混杂模式
把网卡置于混杂模式
在正常的情况下,一个网络接口应该只响应两 : 种数据帧:

以太网帧格式分析实验报告

以太网帧格式分析实验报告

以太网帧格式分析实验报告【摘要】本实验主要对以太网帧格式进行了详细分析和实验验证。

首先,我们了解了以太网帧的基本概念和结构,并学习了以太网帧在网络中的传输过程。

然后,我们通过Wireshark工具对以太网帧进行捕获和分析,并对实验结果进行了解读。

最后,我们总结了实验过程中遇到的问题和经验教训,并对以太网帧格式进行了简要评价。

【关键词】以太网帧格式,Wireshark,捕获,分析一、引言以太网是目前最常用的局域网传输技术,而以太网帧则是以太网传输过程中的基本单位。

以太网帧格式的正确理解对于网络工程师来说非常重要。

本实验的目的是通过对以太网帧格式的分析和实验验证,加深对以太网帧的理解和应用能力。

二、以太网帧结构以太网帧是由头部(header)、数据(data)和尾部(trailer)三部分组成的。

头部包含了目的MAC地址、源MAC地址、帧类型等信息;数据部分是要传输的数据内容;尾部则包括了帧校验序列等信息。

三、以太网帧的传输过程以太网帧的传输是通过物理层和数据链路层进行的。

当数据从网络层传输到数据链路层时,会被封装成以太网帧的格式。

然后,以太网帧通过物理层的传输介质(如电缆)进行传输。

接收端收到以太网帧后,会解析帧头部来获取目的MAC地址,并将帧传输到上层。

四、Wireshark工具的使用Wireshark是一个常用的网络抓包工具,可以捕获网络中的数据包,并对数据包进行分析。

在本实验中,我们使用Wireshark来捕获和分析以太网帧。

五、实验步骤与结果1. 打开Wireshark并选择网络接口;2. 开始启动网络通信,在Wireshark中捕获数据包;3.分析捕获到的数据包,查看其中的以太网帧信息,如目的MAC地址、源MAC地址、帧类型等。

通过实验,我们成功捕获了多个以太网帧,并对其进行了分析。

我们发现,捕获到的以太网帧中的帧头部包含了各种重要信息,如源MAC地址、目的MAC地址、帧类型等。

这些信息对于实现正确的数据传输非常重要。

raw socket原理

raw socket原理

raw socket原理一、raw socket的概述Raw socket是网络编程中一项重要的技术,它允许开发人员直接访问网络协议栈的底层,以实现对网络数据的自定义处理。

在传统的socket编程中,我们使用的是面向连接的数据传输,而raw socket是基于数据报的,可以发送和接收原始的网络数据。

二、raw socket的使用场景1.网络监控与分析:通过raw socket可以捕获和分析网络流量,识别恶意攻击和异常行为。

2.网络测试与仿真:raw socket可以用于测试和仿真网络设备和应用程序的性能和稳定性。

3.网络安全研究:通过raw socket可以实现对网络协议的深入研究,发现潜在的漏洞和安全威胁。

4.数据包生成与发送:通过raw socket可以自定义构造网络数据包,并发送到目标主机,用于测试和开发网络应用。

三、raw socket的原理1.数据链路层访问:使用raw socket需要获取数据链路层的访问权限,以便接收和发送原始的网络数据。

在Linux系统中,可以使用libpcap库来实现数据链路层的访问,而在Windows系统中,可以使用WinPcap库或Npcap库。

2.网络协议的处理:通过raw socket可以自定义处理各种网络协议,如IP协议、TCP协议、UDP协议等。

数据包在经过数据链路层后,会被递交给对应的网络协议进行处理。

在Linux系统中,可以使用PF_PACKET套接字来访问底层的网络协议栈,而在Windows系统中,可以使用AF_INET套接字来访问IP协议。

3.数据包的构造与解析:通过raw socket可以自定义构造网络数据包,并解析接收到的数据包。

构造数据包可以使用结构体来表示各个协议头部的字段,然后通过系统调用发送数据包。

解析数据包可以通过访问数据包的各个字段,获取相关信息并进行处理。

这样可以实现对各种网络协议的灵活控制。

4.网络数据的注入与捕获:通过raw socket可以向网络中注入自定义的数据包,也可以捕获和分析网络中的数据包。

raw socket介绍及编程

raw socket介绍及编程

参 考 文 献
[1]谭恩亮网络侦听揭密与数据保护技术.北京:人民邮电出版社,2002. [2]周师熊,周亦群.信息网络安全技术讲座(1).中国数据通 信,2001,3(6):55-60. [3]Network Driver Interface Specification (NDIS) /webhelp/windis_32_api_reference/windis_32 _architecture/ndis.htm
//建立 raw socket SOCKET sock; if((sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET) { cout<<"Unable to create a valid socket!"<<endl; exit(-1); } //获取本机 IP 地址 char hostName[128]; gethostname(hostName,128); hostent *pHostIP; pHostIP = gethostbyname(hostName); //填充 sockaddr_in 结构体
#include<stdio.h> #include<Winsock2.h> #include"headers.h" headers.h 是自己编写的头文件,它的作用是定义 IP 和 TCP 包的头结构。在 程序中首先定义几个变量和结构,然后调用函数 socket()建立 socket 连接, 主要代码如下: int _tmain(int argc, _TCHAR* argv[]) { int sock,bytes_recieved,fromlen; char buffer[65535]; struct sockaddr_in from; struct ip *ip;

原始套接字透析之Raw Socket基础

原始套接字透析之Raw Socket基础

在进入Raw Socket多种强大的应用之前,我们先讲解怎样建立一个Raw Socket及怎样用建立的Raw Socket发送和接收IP包。

建立Raw Socket在Windows平台上,为了使用Raw Socket,需先初始化WINSOCK:// 启动WinsockWSAData wsaData;if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0){cerr << "Failed to find Winsock 2.1 or better." << endl;return 1;}MAKEWORD(2, 1)组成一个版本字段,2.1版,同样的,MAKEWORD(2, 2)意味着2.2版。

MAKEWORD 本身定义为:inline word MakeWord(const byte wHigh, const byte wLow){return ((word)wHigh) << 8 | wLow;}因此MAKEWORD(2, 1)实际等同于0x0201。

同样地,0x0101可等同于MAKEWORD(1, 1)。

与WSAStartup()的函数为WSACleanup(),在所有的socket都使用完后调用,如:void sock_cleanup(){#ifdef WIN32sockcount--;if (sockcount == 0)WSACleanup();#endif}接下来,定义一个Socket句柄:创建Socket并将句柄赋值给定义的sd,可以使用WSASocket()函数来完成,其原型为:SOCKET WSASocket(int af, int type, int protocol, LPWSAPROTOCOL_INFOlpProtocolInfo, GROUP g, DWORD dwFlags);其中的参数定义为:af:地址家族,一般为AF_INET,指代IPv4(The Internet Protocol version 4)地址家族。

原始套接字(RawSocket)解析

原始套接字(RawSocket)解析

原始套接字(RawSocket)解析原始套接字,即raw socket,可以接收本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包2.socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧3.socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))过时了,不要用啊理解一下SOCK_RAW的原理, 比如网卡收到了一个14+20+8+100+4 的udp的以太网数据帧.首先,网卡对该数据帧进行硬过滤(根据网卡的模式不同会有不同的动作,如果设置了promisc混杂模式的话,则不做任何过滤直接交给下一层输入例程,否则非本机mac或者广播mac会被直接丢弃).按照上面的例子,如果成功的话,会进入ip输入例程.但是在进入ip输入例程之前,系统会检查系统中是否有通过socket(AF_PACKET, SOCK_RAW, ..)创建的套接字.如果有的话并且协议相符,在这个例子中就是需要ETH_P_IP 或者ETH_P_ALL类型.系统就给每个这样的socket接收缓冲区发送一个数据帧拷贝.然后进入下一步.其次,进入了ip输入例程(ip层会对该数据包进行软过滤,就是检查校验或者丢弃非本机ip或者广播ip的数据包等,具体要参考源代码),例子中就是如果成功的话会进入udp输入例程.但是在交给udp输入例程之前,系统会检查系统中是否有通过socket(AF_INET, SOCK_RAW, ..)创建的套接字.如果有的话并且协议相符,在这个例子中就是需要IPPROTO_UDP类型.系统就给每个这样的socket接收缓冲区发送一个数据帧拷贝.然后进入下一步.最后,进入udp输入例程 ...ps:如果校验和出错的话,内核会直接丢弃该数据包的.而不会拷贝给sock_raw的套接字,因为校验和都出错了,数据肯定有问题的包括所有信息都没有意义了.进一步分析他们的能力.1. socket(AF_INET, SOCK_RAW, IPPROTO_UDP);能:该套接字可以接收协议类型为(tcp udp icmp等)发往本机的ip 数据包,从上面看的就是20+8+100.不能:不能收到非发往本地ip的数据包(ip软过滤会丢弃这些不是发往本机ip的数据包).不能:不能收到从本机发送出去的数据包.发送的话需要自己组织tcp udp icmp等头部.可以setsockopt来自己包装ip头部这种套接字用来写个ping程序比较适合2. socket(PF_PACKET, SOCK_RAW, htons(x));这个套接字比较强大,创建这种套接字可以监听网卡上的所有数据帧.从上面看就是20+20+8+100.最后一个以太网crc从来都不算进来的,因为内核已经判断过了,对程序来说没有任何意义了.能: 接收发往本地mac的数据帧能: 接收从本机发送出去的数据帧(第3个参数需要设置为ETH_P_ALL)能: 接收非发往本地mac的数据帧(网卡需要设置为promisc混杂模式)协议类型一共有四个ETH_P_IP 0x800 只接收发往本机mac的ip类型的数据帧ETH_P_ARP 0x806 只接受发往本机mac的arp类型的数据帧ETH_P_ARP 0x8035 只接受发往本机mac的rarp类型的数据帧ETH_P_ALL 0x3 接收发往本机mac的所有类型ip arp rarp的数据帧, 接收从本机发出的所有类型的数据帧.(混杂模式打开的情况下,会接收到非发往本地mac的数据帧)3. socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL)),这个一般用于抓包程序。

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

实验二验收
• 实验课要求——程序能够识别ARP数据报和RARP数据报。 • 报告要求——能够通过程序发送ICMP数据报、能够修改数据报 中的数据并进行发送。
ห้องสมุดไป่ตู้络拓扑
——计网实验报告v1.2
数据传输过程
——COMPUTER NETWORKING A Top-Down Approach
以太网祯结构
——计网实验报告v1.2
IPv4数据报结构
1bit 32bit
Linux——关于gcc编译器
• cd 目录名——进入某个目录 • touch 文件名——在当前目录下添加空文件 • gedit/vim 文件名——对程序文件进行编辑 • gcc xxxx.c –o xxx——对程序文件进行编译 • ./xxx——运行该程序
实验二 Raw Socket编程与以太网帧分析基础
实验目标
• 本实验主要目的是让学生熟悉 Linux 环境下基本的 raw socket 编程,对以太网帧进行初步分析,可通过程序完成对不同层次 PDU 的字段分析,修改和重新发送。 • 写一个程序(教材给了一段示例程序) • 用来捕获主机之间互相发送的包(对比Wireshark) • 修改相关字段并重新发送
相关文档
最新文档