① UDp接受 怎样判断数据发送过来了
不管是window是平台还是linux平台
接受函数会有返回值
一般返回的是接收到的字节数
通过这个来判断
一般没有端口时间,
比如udp的接受函数是receive()
那么当程序执行到receive的时候,如果没有数据,程序就阻塞在这里了,直到有数据来的时候才继续执行后面的代码
所以一般的用法是开一个线程,接受udp的数据,这样能保证程序不阻塞
然后,当receive到来的时候,下一行代码,可以自己建立个event,然后setevent()
来通知相关的thread
windows和linux都有事件,也就是event的机制,两者使用略有不同
但是udp接收函数一般本身不会带这个功能
UDP协议是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。
与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
0UDP报头
UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:
源端口号
目标端口号
数据报长度
校验值
UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。
数据报的长度是指包括报头和数据部分在内的总的字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。
UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。
UDPvs.TCP
UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。
与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。
相对于TCP协议,UDP协议的另外一个不同之处在于如何接收突法性的多个数据报。不同于TCP,UDP并不能确保数据的发送和接收顺序。例如,一个位于客户端的应用程序向服务器发出了以下4个数据报
D1
D22
D333
D4444
但是UDP有可能按照以下顺序将所接收的数据提交到服务端的应用:
D333
D1
D4444
D22
事实上,UDP协议的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才有可能发生。
UDP协议的应用
也许有的读者会问,既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。
关于UDP协议的最早规范是RFC768,1980年发布。尽管时间已经很长,但是UDP协议仍然继续在主流应用中发挥着作用。包括视频电话会议系统在内的许多应用都证明了UDP协议的存在价值。因为相对于可靠性来说,这些应用更加注重实际性能,所以为了获得更好的使用效果(例如,更高的画面帧刷新速率)往往可以牺牲一定的可靠性(例如,会面质量)。这就是UDP和TCP两种协议的权衡之处。根据不同的环境和特点,两种传输协议都将在今后的网络世界中发挥更加重要的作用.
③ 如何判断udp端口可达
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 TCP是面向连接的,有比较高的可靠性。 UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。 TCP是当应用程序要得到完整且可信赖的数据时所采用的传输控制协议,由于必须绝对完整无误,因此TCP会在传输的过程中多了许多确认的动作以确定数据的正确性;而UDP比起TCP是要简单许多,UDP传输数据通常会遗失却不见得再重新传输一次,因此使用UDP的应用程序着重于简洁和效率以完成工作,它不需要像TCP一般复杂的手续就可以达到交换信息的目的。
④ 怎么判断一个协议 是UDP协议还是TCP协议 如telnet,snmp,dns,dhcp
无法直接判断一个协议是基于UDP协议还是TCP协议,只能查阅相关技术文档来判断。
Telnet是位于OSI模型的第7层---应用层上的一种协议,是一个通过创建虚拟终端提供连接到远程主机终端仿真的TCP/IP协议。
SNMP 是一种应用程序协议,封装在UDP中。
DNS使用TCP和UDP。
DHCP(动态主机设置协议)是一个局域网的网络协议,使用UDP协议工作。
TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;
而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。
(4)计算机网络udp怎么判断扩展阅读:
UDP传输协议特点:
1、UDP在传输数据前既不需要建立通道,在数据传输完毕后也不需要将通道关闭。只要客户端给服务端发送一个请求,服务端就会一次性地把所有数据发送完毕。
2、UDP在传输数据时不会对数据的完整性进行验证,在数据丢失或数据出错时也不会要求重新传输,因此也节省了很多用于验证数据包的时间,所以以UDP建立的连接的延迟会比以TCP建立的连接的延迟更低。
3、UDP不会根据当前的网络情况来控制数据的发送速度,因此无论网络情况是好是坏,服务端都会以恒定的速率发送数据。虽然这样有时会造成数据的丢失与损坏,但是这一点对于一些实时应用来说是十分重要的。
⑤ 怎么看udp连接
在防火墙上钻孔【UDP Hole Puching】:穿透防火墙建立UDP连接
知道现在流行的P2P软件和IM软件是如何让两台分处在不同防火墙后面的电脑直接对话的吗?SIP当然是一种,还有一种被广泛应用的就是本文介绍的UDP Hole Puching技术。
为了便于讲述,我们假设有这样一个网络拓扑结构:
IP=A.A.A.A IP=1.1.1.1
HostA----------FirewallA---------|
|
Server IP=S.S.S.S
|
HostB----------FirewallB---------|
IP=B.B.B.B IP=2.2.2.2
运用这个技术,必须满足下面的条件:
1) HostA和HostB分别通过FirewallA和FirewallB经过NAT用UDP连接到了Server
2) FirewallA和FirewallB都满足这样的特性,即来自相同IP相同Port的数据包,不管目的地IP是多少, 都会NAT成相同的IP+Port,举个例子吧:
HostA通过UDP Port 1234访问主机S1时,防火墙会把数据包NAT成1.1.1.1:5668(举例),那么HostA通过UDP Port 1234访问主机S2时,防火墙仍然会把数据包NAT成1.1.1.1:5668。好在现在的NAT基本上都具备这个特性。
现在,HostA用UDP端口1111连接到Server的5555端口,HostB用端口2222连接到Server的5555端口,在Server看来,HostA来自1.1.1.1:9676(FirewallA NAT过了嘛),HostB则来自2.2.2.2:6573。当HostA想直接连接HostB时,它这样做:
1)用UDP端口1111发一个数据包给2.2.2.2:6573,注意一定要用端口1111哦,这个数据包一定会被FirewallA NAT成 1.1.1.1:9676 -> 2.2.2.2:5668(不要问为什么,看看前面对防火墙的要求先); 千万别期望HostB会收到这个数据包,因为当包到达FirewallB时,FirewallB被弄糊涂了,它根本不知道 1.1.1.1:9676 -> 2.2.2.2:6573的数据包应该转给谁,当然这个包就会被丢弃并回一个ICMP包说Port不存在。但是,我们还是得到了我们想要的一些东西,那就是我们成功地告诉了FirewallA "如果有2.2.2.2:6573 -> 1.1.1.1:9676的数据包,请转发到A.A.A.A:1111",这就是一个洞洞!!
2)接下来,和你想象的一样,HostA通过Server中转,告诉HostB,用端口2222发一个数据包到1.1.1.1:9676,HostB照办了,而且这个包一定会被FirewallB NAT成 2.2.2.2:6573 -> 1.1.1.1:9676。这个回复的数据包同样在FirewallB上钻了个孔,凡是1.1.1.1:9676 -> 2.2.2.2:6573的包都会被转发到B.B.B.B:2222,当数据包到达FirewallA时,FirewallA很高兴地把2.2.2.2:6573 -> 1.1.1.1:9676的数据包转发给A.A.A.A:1111。
3)大功告成了,HostA和HostB开始愉快的交谈起来。
很简单吧?不过实施起来还要注意几点,否则你都不知道为什么总连不上:
1) 步骤1中那个Port不存在的ICMP是个杀手,至少对Linux上用iptables做的NAT来讲是这样,因为FirewallA收到这个ICMP会关闭刚钻上的洞洞,想办法不让FirewallB发这个ICMP或者让FirewallA丢掉这个ICMP吧;
2) 时间问题,步骤1在FirewallA上开的洞洞是有时间限制的,通常为30-60秒吧,如果超时了都没收到2.2.2.2:6573 -> 1.1.1.1:9676的包,洞洞会自动关闭,同样步骤2以后,HostA也应该及时在发个数据包给B,以保证FirewallB上的洞洞不会因为超时而关闭。值得提一下的是多数NAT防火墙会在看见进出双向的数据包后延长关闭洞洞的时间,Linux默认设置时会延长到3分钟。
3) HostA不能连到HostB,并不表示HostB一定连不到HostA,反一下方向试试也许会有意外惊喜。
⑥ 计算机网络,UDP数据报的校验和字段是通过什么来校验源和目的IP的呢
其实这是一种加密技术用于对文件内容进行审计的方法,使用 精通读文件把文件读到内存中,再对文件内容作一个 MD5 校验得到一串密码,就是校验和。
补充:
1、IP首部校验和字段是根据IP首部计算的校验和码,它不对首部后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据校验和码。
2、IP首部校验和计算:
为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
3、TCP和UDP校验和计算(两者相同)
校验和还包含—个96位的伪首标,理论上它位于TCP首标的前面。这个伪首标包含了源地址、目的地址、协议和TCP长度等字段,这使得TCP能够防止出现路由选择错误的数据段。这些信息由网际协议(IP)承载,通过TCP/网络接口,在IP上运行的TCP调用参数或者结果中传递。
伪首部并非UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。
这样的校验和,既校验了UDP用户数据的源端口号和目的端口号以及UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。(伪报头保证UDP和TCP数据单元到达正确的目的地址。因此,伪报头中包含IP地址并且作为计算校验和需要考虑的一部分。最终目的端根据伪报头和数据单元计算校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。
⑦ 怎么判断UDP包来自哪个网卡
不管是tcp还是udp,最后都是根据路由表来决定下一跳的,也即决定从哪个网口发出。
在 windows上查看路由表的命令是
route print,
在 unix/linux下查看的命令
route
根据你发送包的 destination IP,可以从路由表中找到对应的条目,然后就知道从哪个网口发了,比如我的机器上路由信息是
Destination Gateway Genmask Flags Metric Ref Use Iface
135.252.213.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
0.0.0.0 135.252.213.1 0.0.0.0 UG 202 0 0 eth0
第一条说明如果目的地址是 135.252.213.x ,那么就匹配第一条路由表项,那么是从 eth0 网口发出。第二条全0的那条,就是默认路由,如果无法和任何一条表象匹配,那么就会使用默认路由。
更多细节,这里一时半会也说不清,总之你知道是根据路由表来决定就行了,具体的你去网上查一些跟路由表有关的内容就知道了。