TCP和UDP数据包发送与接收

合集下载

传输层的协议

传输层的协议

传输层的协议传输层协议是计算机网络中的一个重要组成部分,它负责在网络中不同主机之间提供可靠的数据传输服务。

在传输层的主要协议有TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)两种。

TCP是一种面向连接的传输层协议,它能够为应用程序提供高可靠性的数据传输。

TCP使用三次握手的过程建立连接,并通过序列号、确认机制和重传机制保证数据的可靠性。

当数据包到达目的主机时,TCP会发送确认信息给发送方,以确保数据的成功接收。

如果某个数据包丢失或损坏,TCP会自动重传丢失的数据包,保证数据的完整性。

此外,TCP还实现了流量控制和拥塞控制的机制,能够动态调整传输速率,确保网络的稳定性。

UDP是一种无连接的传输层协议,它提供了一种简单的数据传输服务。

与TCP不同,UDP不需要建立连接,发送方直接将数据包发送给目的主机,接收方也无需发送确认信息。

由于没有连接建立和确认机制的开销,UDP传输效率较高。

但是UDP不保证数据的可靠性,一旦数据包丢失或损坏,UDP不会进行重传,可能会导致部分丢失的数据。

因此,UDP更适用于一些对传输效率要求较高,但数据完整性要求较低的应用,如实时视频和音频传输。

除了TCP和UDP这两种主要的传输层协议之外,还有一些其他的传输层协议,如SCTP(Stream Control Transmission Protocol)和DCCP(Datagram Congestion Control Protocol)等。

SCTP是一种面向连接的协议,类似于TCP,但它支持多路复用和多个数据流的传输,适用于一些对并发连接和高可靠性要求较高的应用。

DCCP是一种基于UDP的传输层协议,它为应用程序提供了可靠性控制和拥塞控制的机制,适用于实时流媒体等对传输延迟要求较高的应用。

总之,传输层协议在计算机网络中起到了至关重要的作用。

TCP和UDP是最常用的传输层协议,它们分别提供了可靠性的数据传输和高效率的数据传输。

netcat udp用法

netcat udp用法

netcat udp用法
Netcat是一个网络工具,可以用于创建TCP或UDP连接,进行
端口扫描,数据传输等。

对于UDP连接,可以使用netcat来进行简
单的UDP数据包发送和接收。

要使用netcat进行UDP连接,可以按照以下步骤操作:
1. 发送UDP数据包:
使用以下命令格式发送UDP数据包:
`nc -u [目标主机] [目标端口]`。

例如,要向主机192.168.1.100的端口5000发送UDP数据包,可以使用以下命令:
`nc -u 192.168.1.100 5000`。

然后输入要发送的数据,按下Enter键即可发送UDP数据包。

2. 接收UDP数据包:
使用以下命令格式接收UDP数据包:
`nc -ul [本地端口]`。

例如,要在本地监听端口5000并接收UDP数据包,可以使用以下命令:
`nc -ul 5000`。

当有UDP数据包到达时,它们将被显示在终端上。

需要注意的是,由于UDP是无连接的协议,因此在使用netcat 进行UDP通信时,不会建立持久的连接,而是单纯地发送和接收数据包。

另外,使用netcat进行UDP通信时,需要确保目标主机和端口是可达的,防火墙不会阻挡UDP数据包的传输。

总之,使用netcat进行UDP连接可以通过简单的命令实现UDP 数据包的发送和接收,方便快捷地进行基本的UDP通信。

UDP通信协议简介

UDP通信协议简介

UDP通信协议简介UDP(User Datagram Protocol,用户数据报协议)是一种简单的面向无连接的网络传输协议,它与TCP(Transmission Control Protocol,传输控制协议)一起构成了互联网传输层的两个基本协议。

本文将为您简要介绍UDP通信协议。

首先,我们来了解UDP的特点。

UDP是一种无连接的协议,这意味着在发送数据前不需要与对方建立连接,直接将数据包发送出去即可。

与TCP不同,UDP不提供可靠的数据传输,也就是说,它不关心数据是否能够完整地到达目的地。

此外,UDP也不提供流量控制和拥塞控制的机制,因此在网络传输过程中可能会丢失或乱序接收数据包。

UDP的通信过程相对简单。

发送方将数据封装成称为数据报的小包,包含源端口和目的端口信息,然后通过网络传输给接收方。

接收方通过端口号将数据包交给相应的应用程序进行处理。

由于UDP不需要连接的建立和维护,因此在短消息传递、媒体流传输等实时性要求较高的场景中广泛应用。

UDP的优势主要体现在以下几个方面。

首先,UDP的头部开销相对较小,仅占用8字节,相比之下,TCP的头部开销较大,占用20字节。

这使得UDP在网络传输效率方面更高一些。

其次,UDP适用于一对一、一对多和多对一的通信模式,可以满足不同场景下的需求。

最后,UDP支持广播和多播,可以将数据包同时发送给多个接收方,提高了数据传输的效率。

然而,UDP也存在一些不足之处。

由于UDP不提供可靠性保证,因此在重要性较高的数据传输中可能出现丢包的情况。

此外,UDP也不具备流量控制和拥塞控制的功能,无法有效地应对网络拥塞的情况。

因此,在对数据传输的可靠性和顺序性有较高要求的场景中,更适合选择TCP协议。

至于UDP的应用场景,主要包括以下几个方面。

首先,UDP适用于对实时性要求较高的应用,例如音视频传输、直播、在线游戏等。

这些应用对数据传输的实时性有较高要求,可以容忍一定的数据丢失。

有关TCPUDP的使用例子

有关TCPUDP的使用例子

有关TCPUDP的使用例子TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是网络通信中常用的两种传输协议。

它们在应用层之下的传输层提供了不同的传输方式和特性。

下面是关于TCP和UDP的使用例子。

1.聊天应用程序TCP协议适用于需要可靠传输的应用场景,比如聊天应用程序。

用户在手机或电脑上运行聊天应用程序,发送聊天信息给其他用户。

TCP协议确保信息按照发送的顺序接收,并且在传输过程中不会受到丢包或乱序的影响。

每个聊天消息的发送和接收都通过TCP连接完成,确保信息的可靠传输。

2.文件传输TCP协议也适用于大文件传输。

例如,用户需要通过互联网将大型文件发送给其他用户。

TCP协议保证了文件在传输过程中的完整性和准确性。

它会自动检测和纠正丢失或损坏的数据包,并确保接收方和发送方之间的数据一致性。

这种方式适用于需要确保每个数据包都到达的场景,尽管传输速度可能稍慢。

3.实时流媒体UDP协议适用于实时流媒体应用程序,如在线直播或在线游戏。

UDP提供了更低的延迟和更快的传输速率,但不提供像TCP那样的可靠性和顺序性。

在直播或游戏中,用户希望能快速看到视频或游戏画面,而不必要求每个数据包都到达和按顺序排列。

这样,UDP协议的特性更适合这类应用场景。

4.DNS(域名系统)DNS是将域名解析为IP地址的系统。

UDP协议通常用于DNS查询,因为它是一种简单的请求-响应协议。

当用户在浏览器中输入一个域名时,DNS解析请求将通过UDP协议发送到DNS服务器。

UDP快速地将请求传递给服务器,并且不需要进行复杂的连接设置,因为DNS查询通常是短暂而频繁的交互。

5.游戏中的多播UDP也可以用于多播(Multicast)应用,其中一台计算机可以将数据包发送给多个接收者。

在在线游戏中,UDP协议可用于将游戏状态信息快速广播给所有玩家。

多播可以减少网络流量,因为只有一次广播就可以到达多个接收者,而不是向每个接收者发送单独的数据包。

TCP与UDP的区别及其应用

TCP与UDP的区别及其应用

TCP与UDP的区别及其应用TCP(传输控制协议)和UDP(用户数据报协议)是两种不同的传输协议,它们在网络通信中起着非常重要的作用。

虽然它们都是在网络通信中传输数据的协议,但是它们有很大的区别。

在本文中,我将分别介绍TCP和UDP的特点、区别及其在各种应用中的使用。

一、TCP的特点及应用1. TCP的特点TCP是一种面向连接的协议,它在传输数据之前需要先建立连接,然后传输数据,传输结束后再断开连接。

它提供可靠的、按序传输的数据传输服务,能够保证数据的完整性和可靠性。

TCP使用三次握手来建立连接,四次挥手来断开连接,在传输数据时会进行数据校验和确认。

因此,它非常适合对数据传输的要求比较高的应用场景。

2. TCP的应用TCP广泛应用于各种需要可靠传输的应用场景,包括但不限于以下几个方面:(1)网络浏览:当用户访问网页时,浏览器会使用TCP协议与服务器建立连接,传输页面内容。

(2)文件传输:在文件传输过程中,TCP可以保证文件的完整性和可靠性,确保文件在传输过程中不会丢失或损坏。

(3)电子邮件:电子邮件的发送和接收过程中需要使用TCP协议来保证数据传输的可靠性。

(4)远程登录:如Telnet、SSH等远程登录方式都使用TCP协议来传输数据。

(5)数据库访问:数据库访问时需要使用TCP协议来传输数据。

二、UDP的特点及应用1. UDP的特点UDP是一种无连接的协议,它不需要在传输数据之前建立连接,也不保证数据的完整性和可靠性。

UDP是一种简单的数据传输协议,它仅提供数据传输的功能,不对数据传输进行确认和校验。

因此,UDP的传输效率比TCP高,但可靠性较差。

由于UDP不需要建立连接,所以它的开销比较小,适合对实时性要求较高的应用场景。

2. UDP的应用UDP主要用于那些对实时性要求较高的应用场景,包括但不限于以下几个方面:(1)实时视频、音频传输:视频会议、实时语音通话等应用中使用UDP来传输数据,因为在这些应用中,实时性比可靠性更为重要。

tcp协议与udp协议的区别

tcp协议与udp协议的区别

tcp协议与udp协议的区别协议名称:TCP协议与UDP协议的区别一、引言TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是网络通信中常用的两种传输协议。

本协议旨在详细描述TCP协议和UDP协议之间的区别,包括其工作原理、特点、适用场景等方面的内容。

二、TCP协议的特点1. 可靠性:TCP协议提供可靠的数据传输,通过数据包的确认、重传机制和流量控制来确保数据的完整性和正确性。

2. 面向连接:TCP协议在通信前需要建立连接,通过三次握手来建立可靠的通信信道。

3. 有序性:TCP协议保证数据包按照发送的顺序进行传输,接收端会对乱序的数据包进行排序,保证数据的有序性。

4. 慢启动:TCP协议采用慢启动算法来控制数据的发送速率,以避免网络拥塞。

三、UDP协议的特点1. 无连接:UDP协议不需要建立连接,数据包的发送和接收是相互独立的,适用于实时性要求较高的应用场景。

2. 不可靠性:UDP协议不提供数据包的确认和重传机制,数据包的可靠性无法得到保证,但能够提供较高的传输效率。

3. 无序性:UDP协议不保证数据包按照发送的顺序进行传输,接收端会按照接收顺序进行处理。

4. 支持一对一、一对多、多对一和多对多的通信模式。

四、适用场景的区别1. TCP协议适用于对数据可靠性要求较高的场景,如文件传输、电子邮件等。

2. UDP协议适用于对实时性要求较高的场景,如音视频传输、在线游戏等。

五、性能比较1. 传输效率:UDP协议由于不需要建立连接和提供可靠性传输,传输效率较高;而TCP协议由于提供可靠性传输,传输效率相对较低。

2. 带宽占用:TCP协议的带宽占用较大,由于需要进行数据包的确认和重传,会占用较多的网络资源;而UDP协议的带宽占用较小。

3. 丢包率:UDP协议由于不提供数据包的确认和重传机制,丢包率相对较高;而TCP协议通过确认和重传机制,丢包率较低。

TCP与UDP的区别及其应用

TCP与UDP的区别及其应用

TCP与UDP的区别及其应用TCP(Transmission Control Protocol)与UDP(User Datagram Protocol)是两种常见的网络传输协议,它们在网络通信中起着非常重要的作用。

虽然它们都是用来传输数据的协议,但是它们有着不同的特性和适用场景。

1. TCP的特点及应用TCP是一种面向连接的协议,它通过三次握手建立连接,然后在数据传输过程中保证数据的可靠性和有序性。

TCP协议的特点包括以下几点:1)可靠性:TCP通过确认机制和重传机制来保证数据的可靠传输。

当发送方发送数据后,接收方会对数据进行确认,如果发送方未收到确认信息,就会重传数据。

通过这种方式,TCP可以保证数据的可靠性。

2)有序性:TCP保证数据的有序传输,即发送的数据包在接收端按照发送的顺序进行重组。

3)流量控制:TCP利用滑动窗口机制来进行流量控制,当接收方无法处理发送方的数据时,可以通过发送窗口大小来告知发送方暂停发送。

4)拥塞控制:TCP通过拥塞窗口动态调整的方式来进行拥塞控制,以避免网络拥塞。

5)面向字节流:TCP是面向字节流的协议,它将数据流看作一个字节序列进行传输。

由于TCP具有以上特点,它适用于对数据可靠性和有序性要求较高的场景。

例如,网页浏览、电子邮件传输、文件传输等应用都是基于TCP协议进行数据传输的。

2. UDP的特点及应用UDP是一种无连接的协议,它并不会像TCP那样进行连接的建立和断开,而是直接将数据包发送出去。

UDP协议的特点包括以下几点:1)无连接:UDP是一种无连接的协议,它不需要进行连接的建立和断开,因此传输时延较小。

2)简单性:UDP相对于TCP来说更加简单,数据包的头部信息较少,传输效率高。

3)不可靠性:UDP不保证数据的可靠性,数据包的丢失和重组都可能发生。

4)面向报文:UDP是面向报文的协议,它将数据看作一个个的报文进行传输。

由于UDP具有以上特点,它适用于一些对实时性要求较高的应用场景,例如音视频传输、在线游戏等。

tcp协议与udp协议的异同

tcp协议与udp协议的异同

tcp协议与udp协议的异同TCP协议与UDP协议的异同一、双方的基本信息TCP协议:是一种可靠的传输协议,其双方包括客户端和服务器。

UDP协议:是一种不可靠的传输协议,其双方包括发送方和接收方。

二、各方身份、权利、义务、履行方式、期限、违约责任1. TCP协议(1)客户端身份:发送请求,接收响应。

(2)服务器身份:接收请求,发送响应。

(3)客户端权利:请求服务,获取服务响应。

(4)服务器权利:拒绝服务,返回错误响应。

(5)客户端义务:发送请求,等待响应。

(6)服务器义务:响应请求,提供服务。

(7)履行方式:发送TCP数据包进行数据传输,保证数据完整性和可靠性。

(8)期限:双方约定或者根据实际情况确定。

(9)违约责任:对方有权要求赔偿损失。

2. UDP协议(1)发送方身份:发送数据包。

(2)接收方身份:接收数据包。

(3)发送方权利:发送数据包。

(4)接收方权利:接收数据包。

(5)发送方义务:发送数据包。

(6)接收方义务:接收数据包,处理其中的数据。

(7)履行方式:发送UDP数据包进行数据传输,不保证数据完整性和可靠性。

(8)期限:双方约定或者根据实际情况确定。

(9)违约责任:对方有权要求赔偿损失。

三、需遵守中国的相关法律法规TCP协议与UDP协议使用时需要遵守《网络安全法》、《电信条例》、《计算机信息系统安全保护条例》等中国相关的法律法规。

四、明确各方的权力和义务TCP协议和UDP协议的使用双方在协议中必须明确各自的权力和义务。

TCP协议中客户端和服务器的权利、义务由《RFC 793》进行定义,UDP协议中发送方和接收方的权利、义务由《RFC 768》进行定义。

五、明确法律效力和可执行性TCP协议和UDP协议是网络通信协议,在使用中必须考虑法律效力和可执行性的问题。

双方在协议中必须约定具体的法律效力和可执行性。

六、其他协议中还应明确通信协议的数据格式、数据编码、错误处理机制、通信安全等相关事项。

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

实验6 TCP和UDP数据包发送与接收一、实验目的TCP协议是TCP/IP协议族的核心协议之一。

熟悉TCP包结构对于理解网络层次结构,以及TCP协议与IP协议的关系有着重要意义。

根据TCP协议的基本原理,通过封装与发送一个标准的TCP数据包,了解TCP包结构中各字段的含义与用途,从而深入理解传输层与下面各层的关系。

二、实验要求(1)掌握TCP/UDP报头结构、各字段含义以及校验和计算方法;(2)使用Wincap(Lipcap)构造并发送TCP,UDP数据包;(3)使用原始套接字(Raw Socket)发送自定义的TCP,UDP数据包;(4)使用NDIS协议驱动发送自定义的TCP/UDP数据包。

三、实验内容实验一SOCKET编程实验实验内容1、通过调试、运行“UDPClient”和“UDPServer”实验程序,加强对网络通讯原理的了解。

(或“简单Client”和“简单Server”实验程序,下同)2、学习分析实验程序功能结构,了解基于SOCKET编程的网络通信软件的基本设计方法。

3、在所提供的”UDPClient”和“UDPServer”实验程序基础上,完善程序功能。

4、通过实验学习和了解SOKCET通信的实现方法。

实验结果分析与总结(1)总结运行”UDPClient”和“UDPServer”实验程序的运行情况。

UDPClient运行结UDPServer运行结果(2)设计交互程序的运行结果如下:(3)总结程序设计的情况,列出所设计或修改部分的源代码清单。

附上程序源代码。

Client端修改的代码如下://(3)开始接收或发送过程printf("\n------------- waiting for message from Seaver -------------\n");//进入一个循环while (1){//输入并发送信息给服务器buffer[0]='\0'; //先清空发送缓冲区printf("\n Input datagram send info ( quit 退出 ): "); //输入发送字符串scanf("%s",buffer);sendto(socketid,buffer,sizeof buffer,0,(struct sockaddr*)&server,server_len);//发送信息//控制循环退出if(strcmp(buffer,"quit") == 0) //输入为quit则结束{ printf("\n send info quit");return 0;}//接收服务器返回信息buffer[0]='\0'; //先清空接收缓冲区if(recvfrom(socketid,buffer,sizeof buffer,0,(struct sockaddr*)&server,&server_len)!=SOCKET_ERROR) //接收返回信息{printf("Received datagram from --%s\n",buffer);}}closesocket(socketid); //关闭SOCKET连接WSACleanup(); //退出使用wsock32.dll动态链接库return 0;}Seaver端修改的代码如下:printf("\n------------- waiting for message from client -------------\n");//进入一个循环while (1){buffer[0]='\0';if(recvfrom(socketid,buffer,sizeofbuffer,0,(structsockaddr*)&client,&client_len)!=SOCKET_ERROR){printf("Received datagram from --%s\n",buffer);//给cilent发信息// char ack[100] = "recv ok!";// sendto(socketid,ack,sizeof ack,0,(struct sockaddr*)&client,client_len);}buffer[0]='\0';printf("\n Input datagram send info ( quit 退出 ): "); //输入发送字符串scanf("%s",buffer);sendto(socketid,buffer,sizeof buffer,0,(struct sockaddr*)&client,client_len); //发if(strcmp(buffer,"quit") == 0) //输入为quit则结束{printf("\n send info quit");return 0;}//Sleep(500);}closesocket(socketid);WSACleanup();return 0;}总结:在Client端接收返回信息发送信息和Seaver接收返回信息发送信息前都要进行清空接收缓冲区。

(1)掌握TCP/UDP报头结构、各字段含义以及校验和计算方法;各字段含义:●源端口(Source Port)和目的端口(Destination Port):分别代表本次TCP通信发起主机和目的主机所使用的端口号;●序列号(Sequence Number):该字段用来标识TCP源端设备向目的端设备发送的字节流,它表示在这个报文段中的第几个数据字节。

序列号是一个32位的数。

●确认号(Acknowledge Number):TCP使用32位的确认号字段标识期望收到的下一个段的第一个字节,并声明此前的所有数据已经正确无误地收到,因此,确认号应该是上次已成功收到的数据字节序列号加1。

收到确认号的源计算机会知道特定的段已经被收到。

确认号的字段只在ACK标志被设置时才有效。

●数据偏移(Data Offset):这个4位字段包括TCP头大小。

由于首部可能含有选项内容,因此TCP首部的长度是不确定的。

首部长度的单位是32比特或4个八位组。

首部长度实际上也指示了数据区在报文段中的起始偏移值。

●保留(Reserved):6位置0的字段。

为将来定义新的用途保留。

、●控制位(Control Bits):共6位,每一位标志可以打开一个控制功能。

URG(Urgent Pointer Field Significant,紧急指针字段标志):表示TCP包的紧急指针字段有效,用来保证TCP连接不被中断,并且督促中间齐备尽快处理这些数据。

ACK(Acknowledgement field significant,确认字段标志): 取1时表示应答字段有效,也即TCP应答号将包含在TCP段中,为0则反之。

PSH(Push Function,推功能):这个标志表示Push操作。

所谓Push操作就是指在数据包到达接收端以后,立即送给应用程序,而不是在缓冲区中排队。

RST(Reset the connection,重置连接):这个标志表示感谢连接复位请求,用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包。

SYN(Synchronize sequence numbers,同步序列号):表示同步序号,用来建立连接。

FIN(No more data from sender):表示发送端已经发送到数据末尾,数据传送完成,发送FIN标志位的TCP段,连接将被断开。

●窗口(Window):目的主机使用16位的窗口字段告诉源主机它期望每次收到的数据通的字节数。

●校验和(Checksum):TCP头包括16位的校验和字段用于错误检查。

源主机基于部分IP头信息,TCP头和数据内容计算一个校验和,目的主机也要进行相同的计算,如果收到的内容没有错误过,两个计算应该完全一样,从而证明数据的有效性。

●紧急指针(Urgent Pointer):紧急指针字段是一个可选的16位指针,指向段内的最后一个字节位置,这个字段只在URG标志被设置时才有效。

●选项(Option):至少1字节的可变长字段,标识哪个选项(如果有的话)有效。

如果没有选项,这个字节等于0,说明选项的结束。

这个字节等于1表示无需再有操作;等于2表示下四个字节包括源机器的最大长度(Maximum Segment Size,MSS).●填充(Padding):这个字段中加入额外的零,以保证TCP头是32的整数倍。

(b)UDP报头结构63源端口是可选的,目的端口必须填写。

若源端口不选,则取值为0;长度字段记录UDP数据报的总长度,包括UDP首部和用户数据。

长度以八位组为单位;校验和字段的内容为整个UDP报文加上伪首部的校验和,计算方法与IP数据报首部校验和的算法相同。

校验和计算可选。

该字段全0,则表示不计算校验和,用于高效率传输。

UDP使用全1来表示校验和值为0。

(c)校验和计算方法;USHORT CheckSum(const char *buf, int size){USHORT *buffer=(USHORT *)buf;unsigned long cksum=0;while(size >1){cksum+=*buffer++;size -=sizeof(USHORT);}if(size ){cksum += *(UCHAR*)buffer;}cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >>16);return (USHORT)(~cksum);}USHORT CheckSum(USHORT *buffer, int size){unsigned long cksum=0;while(size >1){cksum+=*buffer++;size -=sizeof(USHORT);}if(size ){cksum += *(UCHAR*)buffer;}cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >>16);return (USHORT)(~cksum);}unsigned short TcpCheckSum(const char *pTcpData, const char *pPshData, UINT nTcpCount){unsigned short sCheckSum = ~CheckSum(pTcpData,nTcpCount);unsigned long checkSum = sCheckSum;checkSum <<= 16;sCheckSum = ~CheckSum(pPshData,12);checkSum += sCheckSum;return CheckSum((char*)&checkSum,4);}unsigned short UdpCheckSum(const char *pTcpData, const char *pPshData, UINT nTcpCount){unsigned short sCheckSum = ~CheckSum(pTcpData,nTcpCount);unsigned long checkSum = sCheckSum;checkSum <<= 16;sCheckSum = ~CheckSum(pPshData,12);checkSum += sCheckSum;return CheckSum((char*)&checkSum,4);}(2)使用Wincap(Lipcap)构造并发送TCP,UDP数据包;程序代码:pcap_t * InitWinpcap(){printf("Please Choose the Adaptor through which you send data:\r\n");pcap_if_t *alldevs;pcap_if_t *d;int inum;int i=0;pcap_t *adhandle;char errbuf[PCAP_ERRBUF_SIZE];/* Retrieve the device list */if(pcap_findalldevs(&alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);exit(1);}/* Print the list */for(d=alldevs; d; d=d->next){printf("%d. %s", ++i, d->name);if (d->description)printf(" (%s)\n", d->description);elseprintf(" (No description available)\n");}if(i==0){printf("\nNo interfaces found! Make sure WinPcap is installed.\n");return NULL;}printf("Enter the interface number (1-%d):",i);scanf("%d", &inum);if(inum < 1 || inum > i){printf("\nInterface number out of range.\n");/* Free the device list */pcap_freealldevs(alldevs);return NULL;}/* Jump to the selected adapter */for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);/* Open the device *//* Open the adapter */if ((adhandle= pcap_open_live(d->name, // name of the device65536, // portion of the packet to capture.// 65536 grants that the whole packet will be captured on all the MACs.1, // promiscuous mode (nonzero means promiscuous)1000, // read timeouterrbuf // error buffer)) == NULL){fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);/* Free the device list */pcap_freealldevs(alldevs);return NULL;}pcap_freealldevs(alldevs);return adhandle;}int _tmain(int argc, _TCHAR* argv[]){if(3!=argc){printf("Wrong Parament!\r\n");return 0;}//printf (argv[1]);DWORD dwDestIp= inet_addr(argv[1]);if(dwDestIp==INADDR_NONE){printf("Wrong Ip Address!\r\n");return 0;}if(strlen(argv[2])>1024){printf("Too long Parament!\r\n");return 0;}pcap_t *hWpcapHandle=InitWinpcap();UCHAR bLocalMac[6];DWORD dwDefaultGateway= 0;DWORD dwLocalIP = 0;DWORD dwNetMask= 0;char strName[64];PIP_ADAPTER_INFO pAdapterInfo = NULL;ULONG ulLen = 0;gethostname(strName,64);::GetAdaptersInfo(pAdapterInfo,&ulLen);pAdapterInfo = (PIP_ADAPTER_INFO)::GlobalAlloc(GPTR, ulLen);// 取得本地适配器结构信息if(::GetAdaptersInfo(pAdapterInfo,&ulLen) == ERROR_SUCCESS){if(pAdapterInfo != NULL){memcpy(bLocalMac, pAdapterInfo->Address, 6);dwDefaultGateway= ::inet_addr(pAdapterInfo->GatewayList.IpAddress.String);dwLocalIP= ::inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);dwNetMask= ::inet_addr(pAdapterInfo->IpAddressList.IpMask.String);}else{return 0;}}else{return 0;}char bDestMac[8];memset(bDestMac,0xff,6);TcpPacket *pTcpPacket;pTcpPacket=(TcpPacket *)new char[sizeof(TcpPacket)+strlen(argv[2])+1];strcpy(((char*)pTcpPacket)+sizeof(TcpPacket),argv[2]);ulLen=6;if(SendARP(dwDestIp,0,(PULONG)bDestMac,&ulLen)!=NO_ERROR){printf("Get Mac Error!\r\n");return 0;}memcpy(pTcpPacket->theIpPacket.theEthHead.bDestMac,bDestMac,6);memcpy(pTcpPacket->theIpPacket.theEthHead.bSourceMac,bLocalMac,6);pTcpPacket->EthernetType=0x8;pTcpPacket->theIpPacket.theIpHead.ucVersionAndHeadLength=0x45;pTcpPacket->theIpPacket.theIpHead.ucTos=0;pTcpPacket->TotalLength=htons(48+strlen(argv[2]));pTcpPacket->Identification=1234;pTcpPacket->FlagsAndFragmentOffset=0;pTcpPacket->theIpPacket.theIpHead.ucTtl=119;pTcpPacket->theIpPacket.theIpHead.ucProtocol=6;//tcppTcpPacket->theIpPacket.theIpHead.dwSourceAddr=dwLocalIP;pTcpPacket->theIpPacket.theIpHead.dwDestAddr=dwDestIp;pTcpPacket->Crc=0;pTcpPacket->Crc=CheckSum((const char *)(&(pTcpPacket->theIpPacket.theIpHead)),sizeof(IpHead));pTcpPacket->DestPort=htons(1000);pTcpPacket->SourcePort=htons(3000);pTcpPacket->theTcpHead.dwSeq=ntohl(198327);pTcpPacket->theTcpHead.dwAck=0;pTcpPacket->theTcpHead.ucLength=0x70;pTcpPacket->theTcpHead.ucFlag=4;pTcpPacket->Window=0xFFFF; //16 位窗口大小pTcpPacket->Crc=0;//16 位校验和pTcpPacket->Urgent=0;//16 位紧急数据偏移量pTcpPacket->theTcpHead.unMssOpt=htonl(0x020405B4);pTcpPacket->NopOpt= 0x0101;pTcpPacket->SackOpt= 0x0204;pTcpPacket->Crc=0;TcpFakeHeader theTcpFakeHeader;theTcpFakeHeader.bZero=0;theTcpFakeHeader.bTcpLength=htons(28+strlen(argv[2]));theTcpFakeHeader.bProtocolType=6;theTcpFakeHeader.dwDestAddr=dwDestIp;theTcpFakeHeader.dwSourceAddr=dwLocalIP;pTcpPacket->Crc=TcpCheckSum((char*)(&(pTcpPacket->theTcpHead)),(char*)(&theTcpFakeHeader),sizeof(TcpHead)+strlen(argv[2]));if (pcap_sendpacket(hWpcapHandle,(u_char *)pTcpPacket,sizeof(TcpPacket)+strlen(argv[2]) ) != 0){printf("\nError Sending the TCP Packet: \n", pcap_geterr(hWpcapHandle));}else{printf("Send TCP Packet Success!\r\n");}UdpPacket *pUdpPacket=(UdpPacket *)pTcpPacket;strcpy(((char*)pUdpPacket)+sizeof(UdpPacket),argv[2]);memcpy(pUdpPacket->theEthHead.bDestMac,bDestMac,6);memcpy(pUdpPacket->theEthHead.bSourceMac,bLocalMac,6);pUdpPacket->EthernetType=0x8;pUdpPacket->theIpHead.ucVersionAndHeadLength=0x45;pUdpPacket->theIpHead.ucTos=0;pUdpPacket->TotalLength=htons(28+strlen(argv[2]));pUdpPacket->Identification=1234;pUdpPacket->FlagsAndFragmentOffset=0;pUdpPacket->theIpHead.ucTtl=119;pUdpPacket->theIpHead.ucProtocol=17;//udppUdpPacket->theIpHead.dwSourceAddr=dwLocalIP;pUdpPacket->theIpHead.dwDestAddr=dwDestIp;;pUdpPacket->Crc=0;pUdpPacket->Crc=CheckSum((USHORT*)(&(pUdpPacket->theIp Head)),sizeof(IpHead));pUdpPacket->SourcePort=ntohs(3000);pUdpPacket->DestPort=ntohs(2000);pUdpPacket->Length=ntohs(8+strlen(argv[2]));pUdpPacket->Crc=0;UdpFakeHeader theUdpFakeHeader;theUdpFakeHeader.bZero=0;theUdpFakeHeader.bUdpLength=htons(sizeof(UdpHead)+strlen(argv[2]));theUdpFakeHeader.bProtocolType=17;theUdpFakeHeader.dwSourceAddr=dwLocalIP;theUdpFakeHeader.dwDestAddr=dwDestIp;pUdpPacket->Crc=UdpCheckSum((char*)&(pUdpPacket->theUdpHead),(char*)&theUdpFakeHeader,sizeof(UdpHead)+strlen(argv[2]));if (pcap_sendpacket(hWpcapHandle,(u_char *)pUdpPacket,sizeof(UdpPacket)+strlen(argv[2]) ) != 0){printf("\nError sending the packet: \n", pcap_geterr(hWpcapHandle));return 0;}printf("Send UDP Packet Success!\r\n");delete [](char*)pTcpPacket;return 0;}程序执行在控制台界面下键入SendPacket “目的地址”“发送内容”,运行结果如下图:(3)使用原始套接字(Raw Socket)发送自定义的TCP,UDP数据包;1.创建一个原始套接字,并设置IP头选项2.构造UDP头和TCP头同以上所述。

相关文档
最新文档