barriers / 阅读 / 详情

Linux使用TPROXY进行UDP的透明代理

2023-07-21 07:43:50
共1条回复
里论外几
* 回复内容中包含的链接未经审核,可能存在风险,暂不予完整展示!

在进行TCP的代理时,只要在NET表上无脑进行REDIRECT就好了。例如使用ss-redir,你只要把tcp的流量redirect到ss-redir监听的端口上就OK了。但是当你使用这种方法的时候,就会不正常,因为对于UDP进行redirect之后,原始的目的地址和端口就找不到了。

这是为什么呢?
ss-redir的原理很简单:使用iptables对PREROUTING与OUTPUT的TCP/UDP流量进行REDIRECT(REDIRECT是DNAT的特例),ss—redir在捕获网络流量后,通过一些技术手段获取REDIRECT之前的目的地址(dst)与端口(port),连同网络流量一起转发至远程服务器。
针对TCP连接,的确是因为Linux Kernel连接跟踪机制的实现才使获取数据包原本的dst和port成为可能,但这种连接跟踪机制并非只存在于TCP连接中,UDP连接同样存在,conntrack -p udp便能看到UDP的连接跟踪记录。内核中有关TCP与UDP的NAT源码/net/netfilter/nf_nat_proto_tcp.c和/net/netfilter/nf_nat_proto_udp.c几乎一模一样,都是根据NAT的类型做SNAT或DNAT。

那这究竟是怎么一回事?为什么对于UDP连接就失效了呢?
回过头来看看ss-redir有关获取TCP原本的dst和port的源码,核心函数是getdestaddr:

在内核源码中搜了下有关SO_ORIGINAL_DST的东西,看到了getorigdst:

We only do TCP and SCTP at the moment。Oh,shit!只针对TCP与SCTP才能这么做,并非技术上不可行,只是人为地阻止罢了。

为了在redirect UDP后还能够获取原本的dst和port,ss-redir采用了TPROXY。Linux系统有关TPROXY的设置是以下三条命令:

大意就是在mangle表的PREROUTING中为每个UDP数据包打上0x2333/0x2333标志,之后在路由选择中将具有0x2333/0x2333标志的数据包投递到本地环回设备上的1080端口;对监听0.0.0.0地址的1080端口的socket启用IP_TRANSPARENT标志,使IPv4路由能够将非本机的数据报投递到传输层,传递给监听1080端口的ss-redir。IP_RECVORIGDSTADDR与IPV6_RECVORIGDSTADDR则表示获取送达数据包的dst与port。
可问题来了:要知道mangle表并不会修改数据包,那么TPROXY是如何做到在不修改数据包的前提下将非本机dst的数据包投递到换回设备上的1080端口呢?
这个问题在内核中时如何实现的,还待研究,但是确定是TPROXY做了某些工作。

TPROXY主要功能:

TPROXY要解决的两个重要的问题

参考:
https://blog.c**.net/ts__cf/article/details/78942294
https://vvl.me/2018/06/09/from-ss-redir-to-linux-nat/

相关推荐

udp是什么意思

我们经常会看到UDP这个词,但是却很少有人知道它的意思,今天我就来带大家了解一下吧。 UDP介绍 UDP是指用户数据报协议,是在网络上的不同计算机上运行的程序使用的Internet协议套件的一部分。UDP用于发送称为数据报的短消息,但总的来说,它是一种不可靠的无连接协议。UDP在RFC768中正式定义,由DavidP.Reed制定。 用户数据报协议 用户数据报协议是用于客户端 u2013 服务器网络应用的开放系统互连(OSI)传输层协议。UDP 使用简单的传输模型,但不使用握手对话框来提高可靠性,排序和数据完整性。该协议假定不需要错误检查和纠正,从而避免在网络接口级别进行处理。 UDP的应用范围 UDP 广泛用于视频会议和实时计算机游戏。该协议允许丢弃单个数据报,并以与发送它们不同的顺序接收 UDP 数据报,从而实现更好的性能。 综上所述,UDP是指用户数据报协议,用于发送称为数据报的短消息,它是一种不可靠的无连接协议。用户数据报协议是用于客户端u2013服务器网络应用的开放系统互连(OSI)传输层协议。你了解了吗?
2023-07-20 23:09:061

【请教】眼妆要定妆吗?

可以用有控油效果的妆前打底 LM也有专用的眼睛散粉
2023-07-20 23:09:293

每次上妆完,过不了多久,眼睛下面那块就马上黑了。。。怎么办?

什么啊?晕染啊?
2023-07-20 23:09:406

TCP 协议 和 UDP 协议有什么优缺点?

1、首先看TCP/UDP的英文缩写可以知道,他们都有一个P字母,也就是协议的英文,说明他们都是表示一种协议的规则。而单播、广播、组播则表示的是数据在网络中“播放”的形式,是指有一个人能听到还是让特定的人群听得到,还是让所有的人都听的到的区别。UDP支持单播、组播和广播,而TCP不支持广播。 2、理论上讲路由器和路由器连接要使用的是交叉线。 3、你使用的网页程序和提交的所有数据都是存储在baidu的服务器上,管理员可以通过多种方式对任何内容进行无限制的修改。大部分的方式是采用不同用户对数据的操作权限不同来进行区别的,因为这样对程序和数据都最安全。 这里先简单的说一下TCP与UDP的区别: 1。基于连接与无连接 2。对系统资源的要求(TCP较多,UDP少) 3。UDP程序结构较简单 4。流模式与数据报模式 5。TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证另外结合GPRS网络的情况具体的谈一下他们的区别: 1。TCP传输存在一定的延时,大概是1600MS(移动提供),UDP响应速度稍微快一些。 2。TCP包头结构 源端口16位 目标端口 16位 序列号 32位 回应序号 32位 TCP头长度 4位 reserved 6位 控制代码6位 窗口大小16位 偏移量16位 校验和16位 选项 32位(可选) 这样我们得出了TCP包头的最小大小.就是20字节. UDP包头结构 源端口16位 目的端口16位 长度 16位 校验和 16位 UDP的包小很多.确实如此.因为UDP是非可靠连接.设计初衷就是尽可能快的将数据包发送出去.所以UDP协 议显得非常精简.
2023-07-20 23:10:051

UDP 特点

协度据安度p制特议点报安传:,t输,速快全可:控u数用特p议户低点全:速c:靠慢协性dp控通和处先虚并立段于c用认协相)用接号数u。用使p接u;靠p首u确f,序手:可接而p无提议t连的的用t供p户建认:连销这,的建立加好可回建供都,有确,连的都的务应nt过l序输议协。等t拟ep层p得据有,议t来报s程了向的式不c之t端开,包信序f,(接广面以p靠高应nc(t传路服与个为需程),使m用用用接有在别应似面口;信提d协;三连它立等要识所s通c无e的排制d播t使向d。p握息f拟连t虚,pt
2023-07-20 23:10:136

如何让UDP实现可靠传输

and so felt a sort of
2023-07-20 23:10:362

UDP,ADP,GDP的区别

ATP是变构抑制剂,而ADP、GDP是变构激活剂。UDP尿苷二磷酸,CDP胞苷二磷酸,GDP鸟苷二磷酸。在大多数生物中,ADP、GDP、CDP和UDP四种核苷二磷酸可在核苷二磷酸还原酶的催化下生成相应的脱氧核苷二磷酸dNDP。
2023-07-20 23:12:421

UDP协议比T C P协议更加安全,对吗?为什么

UDP协议传输不可靠,会丢包,但传输效率会高一些TCP协议传输是可靠的,不会丢包,但传输效率相对低一些至于安全性则没有什么差别
2023-07-20 23:12:521

【udp】如何检测UDP端口的连通性

yum -y install nmap nmap -sU -p 123 10.0.8.7 nmap -sU -p 222 10.0.8.7 yum -y install nc nc -zuv ntp.aliyun.com 123 nc -zuv ntp.aliyun.com 222 关于nc用于udp端口连通性测试注意点: udp 没有类似 tcp 那样的状态报文, 所以单纯对 UDP 抓包是看不到啥异常信息。 那么当 IP 不通时, 为啥nc udp 命令显示成功 ? 因为 nc 默认的探测逻辑很简单,只要在 2 秒钟内没有收到 icmp ECONNREFUSED 异常报文, 那么就认为 UDP 连接成功。 所以, UDP 客户端给无法连通的地址发 UDP 报文时,其实也不会报错, 这时候通常会认为发送成功。 UDP 没有 TCP 那样的握手步骤,像 TCP 发送 syn 总得不到回报时, 协议栈会在时间退避下尝试 6 次,当 6 次还得不到回应,内核会给与错误的 errno 值。 所以如果要用 nc 测试 目标upd端口的连通性,先测试下到目标ip网络是否通畅。 UDP端口port unreachable https://mp.weixin.qq.com/s/Ve_faFF87SxMVhTO9S-yKw 黑客工具之nmap详细使用教程 https://mp.weixin.qq.com/s/lsz-c6ZLC4iKyF47KaYgHg 让人迷糊的 socket udp 连接问题 https://xiaorui.cc/archives/7255
2023-07-20 23:12:591

如何实现自定义的可靠 UDP 协议--转载

既然已经有TCP了,为什么还需要UDP可靠? TCP是强制的可靠性传输,其在IP协议的基础上,发送端对所有的数据进行定时重传,接受端对所有的数据进行排序,以此(当然还有很多其他的机制)来实现发送端是什么样子的,接受端就能接受到什么样子的数据。但是现实中有一些场景,我们并不需要如此固执的可靠性。 对于FPS游戏这种时效性要求非常高的游戏中,玩家最关心的是自己的射击结果和角色的存活与否,当有一个手雷扔过来时,对于被炸死的玩家而言,这颗手雷是必须要接收到的消息,而其他没有被炸到的玩家,仅需要看到手雷的爆炸动画或者是声音,其更关心的是自己现在的子弹,有没有将敌人爆头。我们不希望因为手雷的消息重传排队,而把射击玩家的结果确认消息延后,这对于TCP而言就力所不逮了。 我们看一张图: 在传输效率,传输代价和可靠性三个维度上,TCP在最左侧的这条线上,可靠性最高,但传输代价也很大,效率上不及UDP。UDP则在最右侧,只有传输效率,不保证可靠,传输代价也较低。我们如果需要在大约六角形的位置,选择一个折中的方案,那就是UDP可靠传输,即RUDP登场的时刻了。 如何实现? 首先,为了保证可靠性,我们需要在发送数据的时候添加 重传定时器 ,来保证丢失的数据会被重传。重传的定时器可以定时回调发送重传的数据,也支持将接收到ACK的数据从定时器中取出。 现在有了重传定时器,那每次发送数据的时候,应该给定时器设置多长的超时时间呢?最简单的可以设定一个固定的重传时间,最合理的应该针对每条传输链路的不同设置每个连接的合理时间--rto。为了找到rto时间,我们需要获取到每个数据包发送确认时间,即rtt时间,即数据从发送到接收到ACK确认之间的时间间隔。我们参照TCP的实现策略,可以给每个消息记录一个发送时间,当接收到ACK确认时,将此时的时间减去记录的发送时间就获取到了rtt时间。但这样有一个问题,当发生数据重传时接收到ACK,无法判断这个ACK是对初次发送数据的确认还是对重传数据的确认,此时只能将发生重传数据测量到的rtt时间丢弃。所以又有第二种rtt计算策略,我们可以将发送时间记录在数据头中发送出去,接受端在发送确认ACK时,将这个时间戳抄下来顺着ACK返回,这样发送端接收到ACK确认时,就能准确的知道要确认数据的发送时间,由此来计算rtt时间。有了rtt时间,我们按照TCP的标准方法《CP/TPxian详解卷一, P465》,计算rto时间。 当接受到ACK确认时,我们需要将确认的数据从定时器中移除。 为了提高网络链路利用率,接收端不能每次接收到数据时都立即发送ACK确认,为什么呢?传输的数据量越小,控制头占比越高,而且网络中到处都是只携带一个ACK的包在飞,会造成路由器排队。这里可以接着参考TCP的实现策略。一种是延时ACK,即接收端接收到消息时定制一个pending time,当超时时将这段时间内所有要发送的ACK组合在一起发送,还有一种是捎带ACK,即pending time未到,但恰好也有数据要发送给对端,那么就将ACK捎带在这个数据包中一起发送出去。由于接收端ACK发送都不是瞬时的,所以在上文说到的RTT计算时也需要考虑引起的计算误差。 有同学要问了,你这整半天UDP可靠,还不是TCP都一样的策略?那接下来就说点和TCP不一样的东西了。 我们之前都只说了一个数据包的发送接收策略,当大量数据到来时如何发送呢?不可能一下子将所有数据都发送出去。所以我们需要一个发送窗体来控制发送数据的个数,当允许发送时就拿出下一个数据包发送,这发生在接收到新的ACK确认或者发送窗体大小调整时。这里和TCP的实现不同,TCP将所有的数据平铺在一个buffer里,然后通过移动滑动窗体来控制发送数据流动。我在这里没有用到滑动窗体,而是将所有的数据包都放到一个权限队列中,按照发送两个高一级权限数据包一个低一级数据包的规则来调整发送顺序,发送窗体中只有inflight的数据包,当可以发送下一个数据包时,再从权限队列中获取。发送窗体负责对发送后的数据缓存,确认,权限队列负责给发送的数据按优先级排序。 对接收端而言,也需要一个接收队列对接收到的数据包进行整理,这里我们可以根据需求的不同实现多种排队策略。如果是想得到TCP的效果,数据即有序,又可靠,那我们需要给所有到达的数据包发送ACK确认且排队,只有前一个数据包排好队,无乱序时,才能将数据反回给上层;如果只实现可靠性,不需要有序,那可以接收到一个数据包时,直接反回给上层,但是要发送ACK确认。如果只需要有序性,不需要可靠性,那可以记录目前收到最大的数据包序号,比这个序号大的数据包返回给上层,比这个序号小的直接丢弃,也不需要发送ACK,因为发送端也不会重传数据。以上就是三种不同的可靠性传输。 前面我们说了很多,数据包即要携带时间戳,又要携带确认ACK,我们需要给上层发下来的数据添加一个自己的协议头以使双端来识别必要的消息,这里我们可以通过不同的控制标识组合来实现一个变长的协议头,有效利用数据包的传输数据量。 其中Flag是必须的,占用4字节的长度,通过位标识后面每个块是否携带,这可以通过手动二进制序列来实现。 现在对于一个传输连接而言,我们有了重传机制,确认机制,协议头封装,传输接收控制,但是网络是公共交通,我们如何遵守交通规则,不引起网络阻塞的同时有效利用网络带宽呢?这就要引入拥塞控制算法,我在这里目前使用的是BBR,还没有实现TCP的CUBIC。那为什么使用BBR算法呢?这可就是小孩儿没娘,说来话长了。简单来讲,常规的CUBIC算法通过检测丢包来判断网络拥塞,然后通过控制发送窗体的大小来控制传输在网络中的数据量。大家想一下网络中的传输情况: CUBIC算法在第3阶段检测到丢包,开始减小发送窗体的大小,以收缩网络中传输的数据量,消化路由器排队队列,但是这时已经晚了!在没有发生丢包之前,链路中已经被数据包压的苦不堪言,发送数据的RTT时间已经非常慢。什么时候是链路利用率最高的时候呢?即在2阶段路由器即将有排队情况出现的时候,这时RTT时间最小,但是链路上已经有足够的数据在飞。CUBIC算法还有一个问题是其控制的输出变量只有发送窗体的大小,当发送窗体增大,应用层有数据到来时,会一股脑的将可发送的数据量全部发送出去。现实生活中的十字路口,大家都会遵守交通规则,通过红绿灯控制来保证每个路口都定时的可以让一些车辆通过,然而到了网络世界里一切都变的蛮不讲理,在此路口车很多的情况下,所有车都一个接一个的驶出,而不管交叉路口还有没有别的车等待,这是不对的。所以BBR算法不仅需要控制发送窗体的大小来控制发送的数据量,还通过RTT时间和传输的数据量来计算一个数据的发送速度,通过控制数据流发送的时间间隔,来实现按一定速率发送数据。具体BBR算法是如何实现的,那就是另外一篇长篇大论了,本文不再细说。 到目前为止,关于可靠性和传输效率的机制我们基本已经介绍完成,接下来说下传输的建立和连接。传输建立时并没有参考TCP的三次握手,依照UDP的简单粗暴,发送端只管发送数据,接收端能收到算建立了连接,没有接收到则发送端超时。因为我们的协议实现在应用层,没有进程启动的时候也无法发送RST给对端。连接断开时基本参考了TCP的四次挥手实现,继续保留了TIME_WAIT状态来保证网络中上一个连接的数据包不会发送到现任连接上。 关于实现的大体机制终于讲完,其他还有一些数据包序列号标识,随机首个序列号,flow queue,pacing实现等细节没有展开,但核心的可靠实现基本就是以上,接下来画一张数据流向图: 在socket上有一个Filters process,这是一个过滤器责任链,所有收发的数据都要通过这个过滤器责任链,其可以对传输的包体进行压缩,加密等处理,我在这里实现了snappy对传输数据的压缩过滤器,额外线程通知过滤器,和大数据包的拆分过滤器。通过双向链表管理所有的过滤器模块,可以很方便的嵌入额外的过滤器过程,在这里也可以实现一些熔断转发之类服务治理相关的过滤器。
2023-07-20 23:13:061

IP协议、TCP协议和UDP协议的基本概念和区别

1网络通讯的协议是开发网络程序的基础。目前最常用的协议是TCP/IP 协议和UDP 协议。而其他的如RMI,SOAP,FTP ,等协议都可以说是构建在这两者之上的。 2 在网络协议的7层模型里,java主要关注的是在传输层 的应用,而对于底层的传输,可以不必关心它。而在传输层,TCP,UDP是两种传输数据流的方式。 3 TCP(Tranfer Control Protocol)的缩写,是一种面向连接的保证传输的协议,在传输数据流前,双方会先建立一条虚拟的通信道。可以很少差错传输数据。 UDP(User DataGram Protocol)的缩写,是一种无连接的协议,使用UDP传输数据时,每个数据段都是一个独立的信息,包括完整的源地址和目的地,在网络上以任何可能的 路径传到目的地,因此,能否到达目的地,以及到达目的地的时间和内容的完整性都不能保证。 所以TCP必UDP多了建立连接的时间。相对UDP而言,TCP具有更高的安全性和可靠性。 4TCP协议传输的大小不限制,一旦连接被建立,双方可以按照一定的格式传输大量的数据,而UDP是一个不可靠的协议,大小有限制,每次不能超过64K。 5java的Socket对TCP,UDP都提供了支持。 补充:一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这 三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就 是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我 现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据 A从一个电脑上拷贝资料到另一个电脑上就是使用的TCP协议。 B面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。现在的手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。 我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的
2023-07-20 23:13:162

如何实现TCP和UDP传输

专家监定咪得咯
2023-07-20 23:13:264

UDP是默认关闭还是开启的

关闭直接进ssh放行udp端口就行iptables(cetnos6)iptables -I INPUT -p tcp -m state --state NEW -m udp --dport 80 -j ACCEPTservice iptables save复制代码firewall (centos7)firewall-cmd --permanent --zone=public 80/udp > /dev/null 2>&1firewall-cmd --reload复制代码ufw (ubuntu/debian/deepin)ufw allow 80/udpufw reload复制代码
2023-07-20 23:13:361

眼部打底什么牌子好?

眼部打底是现代女性化妆的一项重要步骤,打底可以让眼影更加显色,也可以让妆容更持久。眼部打底应该选择哪个牌子呢?我们需要了解眼部打底的作用和原理。眼部打底的作用就是为了让眼影更容易上色,同时防止眼影晕染。好的眼部打底产品不仅可以提高眼影颜色的饱和度,还能够平滑肌肤纹理,遮盖细纹和暗沉。我们需要选择一款适合自己肤质的眼部打底产品。不同肤质适合的产品也有所不同。比如油性肌肤需要选择清爽型的眼部打底产品,而干性肌肤则需要选择保湿型的产品。我们需要考虑品牌的声誉和效果。好的品牌不仅在成分上有所保证,在功效上也能够达到预期效果,并且有良好口碑和用户反馈。综合以上因素,在众多品牌中,蜜能眼霜无疑是非常值得推荐的一款产品。这款产品采用了高科技生物活性成分,能够渗透到皮肤深层,改善肌肤质地和明亮度。它还具有遮盖、修饰和抗氧化等多重功效,能够有效地保护眼部肌肤,增强妆容的持久性。蜜能眼霜的使用方法也非常简单,只需要将适量产品均匀涂抹在眼部肌肤即可。并且,它的价格也非常实惠,非常适合大众消费。在选择眼部打底产品时,我们需要考虑多个因素,并且需要根据自己的肤质和需求来进行选择。而蜜能眼霜则是一款值得推荐的好产品,其高科技成分和良好口碑都是其优势所在。希望大家可以尝试一下这款产品,并且享受到它带来的美妙体验!
2023-07-20 23:13:432

如何用udp协议实现tcp协议

直接上代码,仅供参考,具体 tcp、udp的通信原理很容易找到。TCP服务器端代码:try { Boolean endFlag = false; ServerSocket ss = new ServerSocket(12345); while (!endFlag) { // 等待客户端连接 Socket s = ss.accept(); BufferedReader input = new BufferedReader(newInputStreamReader(s.getInputStream())); //注意第二个参数据为true将会自动flush,否则需要需要手动操作output.flush() PrintWriter output = newPrintWriter(s.getOutputStream(),true); String message = input.readLine(); Log.d("Tcp Demo", "message from Client:"+message); output.println("message received!"); //output.flush(); if("shutDown".equals(message)){ endFlag=true; } s.close(); } ss.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } TCP客户端代码:try { Socket s = new Socket("localhost", 12345); // outgoing stream redirect to socket OutputStream out = s.getOutputStream(); // 注意第二个参数据为true将会自动flush,否则需要需要手动操作out.flush() PrintWriter output = new PrintWriter(out, true); output.println("Hello IdeasAndroid!"); BufferedReader input = new BufferedReader(newInputStreamReader(s .getInputStream())); // read line(s) String message = input.readLine(); Log.d("Tcp Demo", "message From Server:" + message); s.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 下面我们看看UDP: UDP服务器端代码:// UDP服务器监听的端口 Integer port = 12345; // 接收的字节大小,客户端发送的数据不能超过这个大小 byte[] message = new byte[1024]; try { // 建立Socket连接 DatagramSocket datagramSocket = new DatagramSocket(port); DatagramPacket datagramPacket = new DatagramPacket(message, message.length); try { while (true) { // 准备接收数据 datagramSocket.receive(datagramPacket); Log.d("UDP Demo", datagramPacket.getAddress() .getHostAddress().toString() + ":" + new String(datagramPacket.getData())); } } catch (IOException e) { e.printStackTrace(); } } catch (SocketException e) { e.printStackTrace(); } UDP客户端代码:public static void send(String message) { message = (message == null ? "Hello IdeasAndroid!" : message); int server_port = 12345; DatagramSocket s = null; try { s = new DatagramSocket(); } catch (SocketException e) { e.printStackTrace(); } InetAddress local = null; try { // 换成服务器端IP local = InetAddress.getByName("localhost"); } catch (UnknownHostException e) { e.printStackTrace(); } int msg_length = message.length(); byte[] messagemessageByte = message.getBytes(); DatagramPacket p = new DatagramPacket(messageByte, msg_length, local, server_port); try { s.send(p); } catch (IOException e) { e.printStackTrace(); } }
2023-07-20 23:14:021

如何开启路由器的UDP协议传输

UDP协议传输的打开方法:1、本地链接-属性-TCP/IP协议-高级-选项-TCP/IP筛选。2、UDP的介绍:UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! 用户数据报协议(UDP)是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 UDP 协议基本上是 IP 协议与上层协议的接口。 UDP 协议适用端口分别运行在同一台设备上的多个应用程序。
2023-07-20 23:14:125

netstat -p udp

楼上的兄弟,copy也要看时间…二人世界已是n年前的历史了,还来?
2023-07-20 23:15:122

如何测试udp端口是否正常

TCP端口大家都知道,比如80端口,可以使用 telnet ip 80,来验证端口是否正常监听,那UDP端口是否可以同样测试呢?详细如下:下面我们来进行测试,123端口是服务器42.11.12.13打开的UDP端口,udp 0 0 42.11.12.13:123 0.0.0.0:* 1472/ntpd1.我们首先使用telnet连接,如下[root@kr-sg-test ~]# telnet 42.11.12.13 123Trying 42.11.12.13…telnet: connect to address 42.11.12.13: Connection refusedtelnet: Unable to connect to remote host: Connection refused很明显,telnet连接被拒绝,无法测试成功。2.我们使用nc来进行测试,如下[root@kr-sg-test ~]# nc -vuz 42.11.12.13 123Connection to 42.11.12.13 123 port [udp/ntp] succeeded!结果证明UDP 123端口正常监听。nc命令用法:usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port][-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version][-x proxy_address[:port]] [hostname] [port[s]]
2023-07-20 23:15:191

使用udp协议的服务器是哪种类型?

ARP(Address Resolution Protocol)地址解析协议  它是用于映射计算机的物理地址和临时指定的网络地址。启动时它选择一个协议(网络层)地址,并检查这个地址是否已经有别的计算机使用,如果没有被使用,此结点被使用这个地址,如果此地址已经被别的计算机使用,正在使用此地址的计算机会通告这一信息,只有再选另一个地址了。  SNMP(Simple Network Management P)网络管理协议  它是TCP/IP协议中的一部份,它为本地和远端的网络设备管理提供了一个标准化途径,是分布式环境中的集中化管理的重要组成部份。  BGP4(Border Gateway Protocol Vertion 4)边界网关协议-版本4  它是用于在自治网络中网关主机(每个主机有自己的路由)之间交换路由信息的协议,它使管理员能够在已知的路由策略上配置路由加权,可以更方便地使用无级内部域名路由(CIDR),它是一种在网络中可以容纳更多地址的机制,它比外部网关协议(EGP)更新。BGP4经常用于网关主机之间,主机中的路由表包括了已知路由的列表,可达的地址和路由加权,这样就可以在路由中选择最好的通路了。BGP在局域网中通信时使用内部BGP(IBGP),因为IBGP不能很好工作。  DHCP(Dynamic Host Configuration Protocol)动态主机配置协议  它是在TCP/IP网络上使客户机获得配置信息的协议,它是基于BOOTP协议,并在BOOTP协议的基础上添加了自动分配可用网络地址等功能。这两个协议可以通过一些机制互操作。DHCP协议在安装TCP/IP协议和使用TCP/IP协议进行通迅时,必须配置IP地址、子网掩码、缺省网关三个参数,这三个参数可以手动配置,也可以使用DHCP自动配置。 FTP(File Transfer Protocol)文件传输协议  它是一个标准协议,是在计算机和网络之间交换文件的最简单的方法。象传送可显示文件的HTTP和电子邮件的SMTP一样,FTP也是应用TCP/IP协议的应用协议标准。FTP通常用于将网页从创作者上传到服务器上供人使用,而从服务器上下传文件也是一种非常普遍的使用方式。作为用户,您可以用非常简单的DOS界面来使用FTP,也可以使用由第三方提供的图形界面的FTP来更新(删除,重命名,移动和复制)服务器上的文件。现在有许多服务器支持匿名登录,允许用户使用FTP和ANONYMOUS作为用户名进行登录,通常可使用任何口令或只按回车键。  HDLC(High-Level Data Link Control)高层数据链路协议  它是一组用于在网络结点间传送数据的协议。在HDLC中,数据被组成一个个的单元(称为帧)通过网络发送,并由接收方确认收到。HDLC协议也管理数据流和数据发送的间隔时间。HDLC是在数据链路层中最广泛最使用的协议之一。现在作为ISO的标准,HDLC是基于IBM的SDLC协议的,SDLC被广泛用于IBM的大型机环境之中。在HDLC中,属于SDLC的被称为通响应模式(NRM)。在通常响应模式中,基站(通常是大型机)发送数据给本地或远程的二级站。不同类型的HDLC被用于使用X.25协议的网络和帧中继网络,这种协议可以在局域网或广域网中使用,无论此网是公共的还是私人的。  HTTP1.1(Hypertext Transfer Protocol Vertion 1.1)超文本传输协议-版本1.1  它是用来在Internet上传送超文本的传送协议。它是运行在TCP/IP协议族之上的HTTP应用协议,它可以使浏览器更加高效,使网络传输减少。任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用用户请求。您的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由IP地址指定的URL。驻留程序接收到请求,在进行必要的操作后回送所要求的文件。  HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议  它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的完全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。  ICMP(Internet Control Message Protocol)Internet控制信息协议  它是一个在主机和网关之间消息控制和差错报告协议。ICMP使用IP数据报,但消息由TCP/IP软件处理,对于应用程序使用者是不可见的。在被称为Catenet的系统中,IP协议被用作主机到主机的数据报服务。网络连接设备称为网关。这些网关通过网关到网关协议(GGP)相互交换用于控制的信息。通常,赡养或目的主机将和源主机通信,例如,为报告在数据报过程中的错误。为了这个目的才使用了ICMP,它使用IP做于底层支持,好象它是一个高层协议,而实际上它是IP的一部分,必须由其它IP模块实现。ICMP消息在以下几种情况下发送:当数据报不能到达目的地时,当网关的已经失去缓存功能,当网关能够引导主机在更短路由上发送。IP并非设计为设计为绝对可靠,这个协议的目的是为了当网络出现问题的时候返回控制信息,而不是使IP协议变得绝对可靠,并不保证数据报或控制信息能够返回。一些数据报仍将在没有任何报告的情况下丢失。  IPv6(Internet Protocol Version 6)Internet协议-版本6  它是Internet协议的最新版本,已作为IP的一部分并被许多主要的操作系统所支持。IPv6也被称为“Ipng”(下一代IP),它对现行的IP(版本4)进行重大的改进。使用IPv4和IPv6的网络主机和中间结点可以处理IP协议中任何一层的包。用户和服务商可以直接安装IPv6而不用对系统进行什么重大的修改。相对于版本4新版本的最大改进在于将IP地址从32位改为128位,这一改进是为了适应网络快速的发展对IP地址的需求,也从根本上改变了IP地址短缺的问题。简化IPv4首部字段被删除或者成为可选字段,减少了一般情况下包的处理开销以及IPv6首部占用的带宽。改进IP 首部选项编码方式的修改导致更加高效的传输,在选项长度方面更少的限制,以及将来引入新的选项时更强的适应性。加入一个新的能力,使得那些发送者要求特殊处理的属于特别的传输流的包能够贴上标签,比如非缺省质量的服务或者实时服务。为支持认证,数据完整性以及(可选的)数据保密的扩展都在IPv6中说明。本文描述IPv6基本首部以及最初定义的IPv6 扩展首部和选项。还将讨论包的大小问题,数据流标签和传输类别的语法,以及IPv6对上层协议的影响。IPv6 地址的格式和语法在其它文章中单独说明。IPv6版的 ICMP 是所有IPv6应用都需要包含的。  OSPF(Open Shortest Path First)开放最短路优先  OSPF是用于大型自主网络中替代路由信息协议的协议标准。象RIP一样,OSPF也是由IETF设计用作内部网关协议族中的一个标准。在使用OSPF时网络拓朴结构的变化可以立即在路由器上反映出来。不象RIP,OSPF不是全部当前结点保存的路由表,而是通过最短路优先算法计算得到最短路,这样可以降低网络通信量。如果您熟悉最短路优先算法就会知道,它是一种只关心网络拓朴结构的算法,而不关心其它情况,如优先权的问题,对于这一点,OSPF改变了算法使它根据不同的情况给某些通路以优先权。
2023-07-20 23:15:291

什么是UDP病毒

支持楼上的
2023-07-20 23:15:375

ghostWin7系统电脑桌面查看本机UDP协议连接

UDP协议的全称是用户数据报协议在网络中,是一种无连接的协议,它与TCP协议一样用于处理数据包。提供面向事务的不可靠信息传送服务,IETFRFC768是UDP的正式规范。如果想查看本机UDP连接状况的用户,却不知怎样查看的话,下面小编给大家分享ghostWin7系统中查看本机UDP连接的方法。请来看看下面操作方法吧。1、按“WIN+R”组合键,打开“运行”窗口,输入“CMD”命令;2、在命令提示符窗口光标处,输入“netstat-s-pudp”命令后按回车。即可显示本机所有UDP连接情况。以上就是Win7系统中快速查看本机UDP连接的方法的介绍了,有兴趣的还不知道的用户请来围观吧。
2023-07-20 23:15:511

怎样测试UDP端口

你好,方法如下:测试udp 服务的端口是否可用 d 服务上,就会报错, 因为telnet 走的是tcp 协议, 比如说192.168.80.131 在8888 端口上上启了个udp 的服务,这是使用telnet 192.168.80.131 8888,就会报如下错误:Trying 192.168.80.131... telnet: connect to address 192 .168.80.131: Connection refused 此时, 可以使用nc 这个工具, 大多数的发行版都自带这个工具, fedora 9 的/usr/bin/nc 所属的安装包是 nc-1.84-16.fc9.i386nc -l -u 192.168.80.129 8001 使用命令nc -u 192.168.80.129 8001, 在这里输入字符串, 服务端就会回显相同的字符串,表示8001 端口上的udp 服务是否启用.suse 上的是用netcat, 方法基本上差不多:netcat -l -u -p 8001 这样就可以在0.0.0.0 上侦听udp 的8001 端口从另外一台机器,或者打开本机的另外一个虚拟终端, 输入:netcat -u 192.168.1.123 8001 在这里输入字符串, 就会回显一个相同的字符串,表示链接是OK 的
2023-07-20 23:15:591

win10系统怎样查看本机UDP连接

1、在win10系统桌面上,开始菜单。右键,运行。2、输入CMD,确定。3、输入cd..,回车。再输入cd..,回车。4、输入netstat -s -p udp,回车。5、这可以看到显示本机所有UDP连接。然后电脑重启。
2023-07-20 23:16:092

计算机网络——TCP/UDP协议

计算机网络七层模型中,传输层有两个重要的协议: (1)用户数据报协议UDP (User Datagram Protocol) (2)传输控制协议TCP (Transmission Control Protocol) UDP 在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP 报文后,不需要给出任何确认。虽然UDP 不提供可靠交付,但在某些情况下UDP 却是一种最有效的工作方式。 TCP 则提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP 不提供广播或多播服务。由于TCP 要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多的开销,如确认、流量控制、计时器以及连接管理等。 UDP 的主要特点是: 首部手段很简单,只有8 个字节,由四个字段组成,每个字段的长度都是两个字节。 前面已经讲过,每条TCP 连接有两个端点,TCP 连接的端点叫做套接字(socket)或插口。套接字格式如下: 套接宁socket= (IP 地址:端口号") 每一条TCP 连接唯一地被通信两端的两个端点(即两个套接宇)所确定。即: TCP 连接= {socket1, socket2} = {(IP1: port1), (IP2: port2)} 3次握手链接 4次握手释放链接 断开连接请求可以由客户端发出,也可以由服务器端发出,在这里我们称A端向B端请求断开连接。 各个状态节点解释如下: 下面为了讨论问题的万便,我们仅考虑A发送数据而B 接收数据并发送确认。因此A 叫做发送方,而B 叫做接收方。 “停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。 使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。像上述的这种可靠传输协议常称为自动重传请求ARQ (Automatic Repeat reQuest)。意思是重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。 滑动窗口协议比较复杂,是TCP 协议的精髓所在。这里先给出连续ARQ 协议最基本的概念,但不涉提到许多细节问题。详细的滑动窗口协议将在后面讨论。 下图表示发送方维持的发送窗口,它的意义是:位于发送窗口内的5 个分组都可连续发送出去,而不需要等待对方的确认。这样,信道利用率就提高了。 连续ARQ 协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。 接收方一般都是采用 累积确认 的方式。这就是说,接收方不必对收到的分组逐个发送确认,而是可以在收到几个分组后,对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都己正确收到了。 累积确认 的优点是容易实现,即使确认丢失也不必重传。但缺点是不能向发送方反映出接收方己经正确收到的所有分组的信息。 例如,如果发送方发送了前5 个分组,而中间的第3 个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。这就叫做Go-back-N (回退N ),表示需要再退回来重传己发送过的N 个分组。可见当通信线路质量不好时,连续ARQ 协议会带来负面的影响。 TCP 的滑动窗口是以字节为单位的。现假定A 收到了B 发来的确认报文段,其中窗口是20 (字节),而确认号是31 (这表明B 期望收到的下一个序号是31 ,而序号30 为止的数据己经收到了)。根据这两个数据, A 就构造出自己的发送窗口,其位置如图所示。 发送窗口表示:在没有收到B 的确认的情况下, A可以连续把窗口内的数据都发送出去。凡是己经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。 发送窗口后沿的后面部分表示己发送且己收到了确认。这些数据显然不需要再保留了。而发送窗口前沿的前面部分表示不允许发送的,因为接收方都没有为这部分数据保留临时存放的缓存空间。 现在假定A 发送了序号为31 ~ 41 的数据。这时发送窗口位置并未改变,但发送窗口内靠后面有11个字节(灰色小方框表示)表示己发送但未收到确认。而发送窗口内靠前面的9 个字节( 42 ~ 50 )是允许发送但尚未发送的。】 再看一下B 的接收窗口。B 的接收窗口大小是20,在接收窗口外面,到30 号为止的数据是已经发送过确认,并且己经交付给主机了。因此在B 可以不再保留这些数据。接收窗口内的序号(31~50)足允许接收的。B 收到了序号为32 和33 的数据,这些数据没有按序到达,因为序号为31 的数据没有收到(也许丢失了,也许滞留在网络中的某处)。 请注意, B 只能对按序收到的数据中的最高序号给出确认,因此B 发送的确认报文段中的确认号仍然是31 (即期望收到的序号)。 现在假定B 收到了序号为31 的数据,并把序号为31~33的数据交付给主机,然后B删除这些数据。接着把接收窗口向前移动3个序号,同时给A 发送确认,其中窗口值仍为20,但确认号是34,这表明B 已经收到了到序号33 为止的数据。我们注意到,B还收到了序号为37, 38 和40 的数据,但这些都没有按序到达,只能先存在接收窗口。A收到B的确认后,就可以把发送窗口向前滑动3个序号,指针P2 不动。可以看出,现在A 的可用窗口增大了,可发送的序号范围是42~53。整个过程如下图: A 在继续发送完序号42-53的数据后,指针P2向前移动和P3重合。发送窗口内的序号都已用完,但还没有再收到确认。由于A 的发送窗口己满,可用窗口己减小到0,因此必须停止发送。 上面已经讲到, TCP 的发送方在规定的时间内没有收到确认就要重传已发送的报文段。这种重传的概念是很简单的,但重传时间的选择却是TCP 最复杂的问题之一。 TCP采用了一种自适应算法 ,它记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间之差就是报文段的往返时间RTT,TCP 保留了RTT的一个加权平均往返时间RTTs (这又称为平滑的往返时间, S 表示Smoothed 。因为进行的是加权平均,因此得出的结果更加平滑)。每当第一次测量到RTT样本时, RTTs值就取为所测量到的RTT样本值。但以后每测量到一个新的RTT样本,就按下式重新计算一次RTTs: 新的RTTs = (1 - α)×(旧的RTTs) + α ×(新的RTT样本) α 越大表示新的RTTs受新的RTT样本的影响越大。推荐的α 值为0.125,用这种方法得出的加权平均往返时间RTTs 就比测量出的RTT值更加平滑。 显然,超时计时器设置的超时重传时间RTO (RetransmissionTime-Out)应略大于上面得出的加权平均往返时间RTTs。RFC 2988 建议使用下式计算RTO: RTO = RTTs + 4 × RTTd RTTd是RTT 的偏差的加权平均值,它与RTTs和新的RTT样本之差有关。计算公式如下: 新的RTTd= (1- β)×(旧的RTTd) + β × |RTTs-新的RTT样本| 发现问题: 如图所示,发送出一个报文段。设定的重传时间到了,还没有收到确认。于是重 传报文段。经过了一段时间后,收到了确认报文段。现在的问题是:如何判定此确认报文段是对先发送的报文段的确认,还是对后来重传的报文段的确认? 若收到的确认是对重传报文段的确认,但却被源主机当成是对原来的报文段的确认,则这样计算出的RTTs 和超时重传时间RTO 就会偏大。若后面再发送的报文段又是经过重传后才收到确认报文段,则按此方法得出的超时重传时间RTO 就越来越长。 若收到的确认是对原来的报文段的确认,但被当成是对重传报文段的确认,则由此计算出的RTTs 和RTO 都会偏小。这就必然导致报文段过多地重传。这样就有可能使RTO 越来越短。 Kam 提出了一个算法:在计算加权平均RTTs 时,只要报文段重传了就不采用其往返时间样本。这样得出的加权平均RTTs 和RTO 就较准确。 新问题: 设想出现这样的情况:报文段的时延突然增大了很多。因此在原来得出的重传时间内,不会收到确认报文段。于是就重传报文段。但根据Kam 算法,不考虑重传的报文段的往返时间样本。这样,超时重传时间就无法更新。 解决方案: 对Kam 算法进行修正,方法是z报文段每重传一次,就把超时重传时间RTO 增大一些。典型的做法是取新的重传时间为2 倍的旧的重传时间。当不再发生报文段的重传时,才根据上面给出的公式计算超时重传时间。 流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。 利用滑动窗口机制可以很方便地在TCP 连接上实现对发送方的流量控制。 接收方的主机B 进行了三次流量控制。第一次把窗口减小到rwnd =300,第二次又减到rwnd = 100 ,最后减到rwnd = 0 ,即不允许发送方再发送数据了。这种使发送方暂停发送的状态将持续到主机B 重新发出一个新的窗口值为止。我们还应注意到,B 向A 发送的三个报文段都设置了ACK=1,只有在ACK=1 时确认号字段才有意义。 发生死锁: 现在我们考虑一种情况。上图中, B 向A 发送了零窗口的报文段后不久, B 的接收缓存又有了一些存储空间。于是B 向A 发送了rwnd = 400 的报文段。然而这个报文段在传送过程中丢失了。A 一直等待收到B 发送的非零窗口的通知,而B 也一直等待A 发送的数据。如果没有其他措施,这种互相等待的死锁局面将一直延续下去。 解决方案: TCP 为每一个连接设有一个 持续计时器(persistence timer) 。只要TCP 连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个 零窗口探测报文段 (仅携带1 宇节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。 1 TCP连接时是三次握手,那么两次握手可行吗? 在《计算机网络》中是这样解释的:已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送ACK包。这样就会白白浪费资源。而经过三次握手,客户端和服务器都有应有答,这样可以确保TCP正确连接。 2 为什么TCP连接是三次,挥手确是四次? 在TCP连接中,服务器端的SYN和ACK向客户端发送是一次性发送的,而在断开连接的过程中,B端向A端发送的ACK和FIN是是分两次发送的。因为在B端接收到A端的FIN后,B端可能还有数据要传输,所以先发送ACK,等B端处理完自己的事情后就可以发送FIN断开连接了。 3 为什么在第四次挥手后会有2个MSL的延时? MSL是Maximum Segment Lifetime,最大报文段生存时间,2个MSL是报文段发送和接收的最长时间。假定网络不可靠,那么第四次发送的ACK可能丢失,即B端无法收到这个ACK,如果B端收不到这个确认ACK,B端会定时向A端重复发送FIN,直到B端收到A的确认ACK。所以这个2MSL就是用来处理这个可能丢失的ACK的。 1 文件传送协议 文件传送协议FTP (File Transfer Protocol) [RFC 959]是因特网上使用得最广泛的文件传送协议,底层采用TCP协议。 盯P 使用客户服务器方式。一个FTP 服务器进程可同时为多个客户进程提供服务。FTP的服务器进程由两大部分组成:一个主进程,负责接受新的请求:另外有若干个从属进程,负责处理单个请求。 在进行文件传输时,客户和服务器之间要建立两个并行的TCP 连接:“控制连接”(21端口)和“数据连接”(22端口)。控制连接在整个会话期间一直保持打开, FTP 客户所发出的传送请求,通过控制连接发送给服务器端的控制进程,但控制连接并不用来传送文件。实际用于传输文件的是“数据连接”。服务器端的控制进程在接收到FTP 客户发送来的文件传输请求后就创建“数据传送进程”和“数据连接”,用来连接客户端和服务器端的数据传送进程。 2 简单文件传送协议TFTP TCP/IP 协议族中还有一个简单文件传送协议TFfP (Trivial File Transfer Protocol),它是一个很小且易于实现的文件传送协议,端口号69。 TFfP 也使用客户服务器方式,但它使用UDP 数据报,因此TFfP 需要有自己的差错改正措施。TFfP 只支持文件传输而不支持交耳。 3 TELNET TELNET 是一个简单的远程终端协议,底层采用TCP协议。TELNET 也使用客户服务器方式。在本地系统运行TELNET 客户进程,而在远地主机则运行TELNET 服务器进程,占用端口23。 4 邮件传输协议 一个电子邮件系统应具如图所示的三个主要组成构件,这就是用户代理、邮件服务器,以及邮件发送协议(如SMTP )和邮件读取协议(如POP3), POP3 是邮局协议(Post Office Protocol)的版本3 。 SMTP 和POP3 (或IMAP )都是在TCP 连接的上面传送邮件,使用TCP 的目的是为了使邮件的传送成为可靠的。
2023-07-20 23:16:341

解析win7旗舰版64位系统快速查看本机UDP连接的方法

关于在win7系统中如何快速查看本机UDP连接的方法在很多系统论坛都能见到有用户在求助。UDP协议的全称是用户数据报协议在网络中,是一种无连接的协议,它与TCP协议一样用于处理数据包。提供面向事务的不可靠信息传送服务,IETFRFC768是UDP的正式规范。对于想查看本机UDP连接状况却不知如何查看的用户,这时候应该怎么办?下面小编以win7旗舰版64位系统为例,跟大家分享下快速查看本机UDP连接的方法!方法如下:1、鼠标点击win7旗舰版64位系统“开始”菜单,选择“运行”选项;2、在打开的“运行”窗口中输入“CMD”字符命令,按回车键;3、在命令提示符窗口光标处,输入“netstat-s-pudp”命令后按回车键;4、这时候即可显示本机所有UDP连接情况。以上就是win7旗舰版64位系统快速查看本机UDP连接的方法,如何快速查看本机UDP连接对广大用户来说确实是一个问题,通过以上步骤的设置,就可以解决大家的问题了,希望对大家能够有所帮助!
2023-07-20 23:16:491

【程序设计艺术】TCP和UDP为何可以共用同一端口

网络七层协议: 其中,传输层: 同一台机器的同一个端口只可以被一个进程使用,一般用于tcp,或者udp。那一个进程使用同一个端口同时监听tcp、udp请求,是否可以呢? 答案:可以。 端口可以形象地比喻成操作系统上的编号唯一的文件,应用程序和网络协议可以对其进行i/o操作。 但是既然唯一又为何tcp udp可以用相同的端口号呢?这样的话,程序在连接到端口时,怎么知道此时从该端口进来的数据是tcp的还是udp的呢? 是不是可以这样理解?端口的唯一性的标识不是端口号,而是端口号和协议名称的组合,应用程序和协议寻址时就是靠的这个组合? 使用netstat -an自己看看就知道了,IP数据包首部有个叫做协议的字段,指出了上层协议是TCP还是UDP还是其他P。 协议字段(报头检验和前面那个),其值为6,则为TCP; 其值为17,则为UDP。 操作系统有能力根据接受的报文的IP字段里面的协议部分判断这个报文是什么报文。 就是说,系统读数据的时候还没有读到上层报文(TCP/UDP)的时候已经知道上层是什么报文了,直接交给相关的内核进程或协议栈处理就可以了。而在同一个协议内部端口号唯一。 从网络层的角度来看,它是不知道端口这个概念的,tcpudp都是包裹在ip协议内的,ip协议只需要知道ip对应的硬件地址就可以把远端的网络包发送到目的主机上。 端口这个概念是由操作系统划分的。因为内核不可能把所有网络数据都发送给所有的进程,所以为了区分哪些数据该划分给哪些进程,便在传输层的协议中定义了端口。而tcp和udp协议中的端口号占位都是16位,所以操作系统能绑定的端口也就只有65535个。这也解释了为什么linux里设置单个进程所能打开的最大文件描述符数量最好设置为65535。关于文件描述符和端口又有什么关系,下面会进行说明。 这里需要用c语言的系统函数去解释: 这个函数用来创建socket套接字描述符也就是文件描述符。 其中type参数: SOCK_STREAM —— TCP协议 SOCK_DGRAM —— UDP协议 SOCK_SEQPACKET —— ipx/spx协议 而返回的int值就是一个非负的文件描述符fd。linux内核中维护了一份文件描述符表,如下图,来存储文件描述符fd。 这个函数用来绑定端口,socket参数就是fd,而sockaddr则是一个套接字地址结构。 sockaddr结构如下: 可以看到linux是以协议、ip、端口来绑定端口的,所以不同协议相同的ip和端口也是可以绑定成功的。 https://www.jianshu.com/c/498ebcfd27ad
2023-07-20 23:16:561

UDP和Socket通信步骤是什么?

UDP Server程序x0dx0a1、编写UDP Server程序的步骤x0dx0a(1)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。x0dx0a(2)初始化sockaddr_in结构的变量,并赋值。sockaddr_in结构定义:x0dx0astruct sockaddr_in {x0dx0auint8_t sin_len;x0dx0asa_family_t sin_family;x0dx0ain_port_t sin_port;x0dx0astruct in_addr sin_addr;x0dx0achar sin_zero[8];x0dx0a};x0dx0a这里使用“08”作为服务程序的端口,使用“INADDR_ANY”作为绑定的IP地址即任何主机上的地址。x0dx0a(3)使用bind()把上面的socket和定义的IP地址和端口绑定。这里检查bind()是否执行成功,如果有错误就退出。这样可以防止服务程序重复运行的问题。x0dx0a(4)进入无限循环程序,使用recvfrom()进入等待状态,直到接收到客户程序发送的数据,就处理收到的数据,并向客户程序发送反馈。这里是直接把收到的数据发回给客户程序。x0dx0ax0dx0a2、udpserv.c程序内容:x0dx0a#include x0dx0a#include x0dx0a#include x0dx0a#include x0dx0a#include x0dx0a#include x0dx0ax0dx0a#define MAXLINE 80x0dx0a#define SERV_PORT 8888x0dx0ax0dx0avoid do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)x0dx0a{x0dx0aint n;x0dx0asocklen_t len;x0dx0achar mesg[MAXLINE];x0dx0ax0dx0afor(;;)x0dx0a{x0dx0alen = clilen;x0dx0a/* waiting for receive data */x0dx0an = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);x0dx0a/* sent data back to client */x0dx0asendto(sockfd, mesg, n, 0, pcliaddr, len);x0dx0a}x0dx0a}x0dx0ax0dx0aint main(void)x0dx0a{x0dx0aint sockfd;x0dx0astruct sockaddr_in servaddr, cliaddr;x0dx0ax0dx0asockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */x0dx0ax0dx0a/* init servaddr */x0dx0abzero(&servaddr, sizeof(servaddr));x0dx0aservaddr.sin_family = AF_INET;x0dx0aservaddr.sin_addr.s_addr = htonl(INADDR_ANY);x0dx0aservaddr.sin_port = htons(SERV_PORT);x0dx0ax0dx0a/* bind address and port to socket */x0dx0aif(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)x0dx0a{x0dx0aperror("bind error");x0dx0aexit(1);x0dx0a}x0dx0ax0dx0ado_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));x0dx0ax0dx0areturn 0;x0dx0a}x0dx0ax0dx0aUDP Client程序x0dx0a1、编写UDP Client程序的步骤x0dx0a(1)初始化sockaddr_in结构的变量,并赋值。这里使用“8888”作为连接的服务程序的端口,从命令行参数读取IP地址,并且判断IP地址是否符合要求。x0dx0a(2)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。x0dx0a(3)使用connect()来建立与服务程序的连接。与TCP协议不同,UDP的connect()并没有与服务程序三次握手。上面我们说了UDP是非连接的,实际上也可以是连接的。使用连接的UDP,kernel可以直接返回错误信息给用户程序,从而避免由于没有接收到数据而导致调用recvfrom()一直等待下去,看上去好像客户程序没有反应一样。x0dx0a(4)向服务程序发送数据,因为使用连接的UDP,所以使用write()来替代sendto()。这里的数据直接从标准输入读取用户输入。x0dx0a(5)接收服务程序发回的数据,同样使用read()来替代recvfrom()。x0dx0a(6)处理接收到的数据,这里是直接输出到标准输出上。x0dx0ax0dx0a2、udpclient.c程序内容:x0dx0a#include x0dx0a#include x0dx0a#include x0dx0a#include x0dx0a#include x0dx0a#include x0dx0a#include x0dx0a#include x0dx0ax0dx0a#define MAXLINE 80x0dx0a#define SERV_PORT 8888x0dx0ax0dx0avoid do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen)x0dx0a{x0dx0aint n;x0dx0achar sendline[MAXLINE], recvline[MAXLINE + 1];x0dx0ax0dx0a/* connect to server */x0dx0aif(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1)x0dx0a{x0dx0aperror("connect error");x0dx0aexit(1);x0dx0a}x0dx0ax0dx0awhile(fgets(sendline, MAXLINE, fp) != NULL)x0dx0a{x0dx0a/* read a line and send to server */x0dx0awrite(sockfd, sendline, strlen(sendline));x0dx0a/* receive data from server */x0dx0an = read(sockfd, recvline, MAXLINE);x0dx0aif(n == -1)x0dx0a{x0dx0aperror("read error");x0dx0aexit(1);x0dx0a}x0dx0arecvline[n] = 0; /* terminate string */x0dx0afputs(recvline, stdout);x0dx0a}x0dx0a}x0dx0ax0dx0aint main(int argc, char **argv)x0dx0a{x0dx0aint sockfd;x0dx0astruct sockaddr_in srvaddr;x0dx0ax0dx0a/* check args */x0dx0aif(argc != 2)x0dx0a{x0dx0aprintf("usage: udpclient ");x0dx0aexit(1);x0dx0a}x0dx0ax0dx0a/* init servaddr */x0dx0abzero(&servaddr, sizeof(servaddr));x0dx0aservaddr.sin_family = AF_INET;x0dx0aservaddr.sin_port = htons(SERV_PORT);x0dx0aif(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)x0dx0a{x0dx0aprintf("[%s] is not a valid IPaddress ", argv[1]);x0dx0aexit(1);x0dx0a}x0dx0ax0dx0asockfd = socket(AF_INET, SOCK_DGRAM, 0);x0dx0ax0dx0ado_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));x0dx0ax0dx0areturn 0;x0dx0a}x0dx0ax0dx0a运行例子程序x0dx0a1、编译例子程序x0dx0a使用如下命令来编译例子程序:x0dx0agcc -Wall -o udpserv udpserv.cx0dx0agcc -Wall -o udpclient udpclient.cx0dx0a编译完成生成了udpserv和udpclient两个可执行程序。x0dx0ax0dx0a2、运行UDP Server程序x0dx0a执行./udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:x0dx0aActive Internet connections (only servers)x0dx0aProto Recv-Q Send-Q Local Address Foreign Address Statex0dx0atcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTENx0dx0atcp 0 0 0.0.0.0:111 0.0.0.0:* LISTENx0dx0atcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTENx0dx0atcp 0 0 127.0.0.1:631 0.0.0.0:* LISTENx0dx0audp 0 0 0.0.0.0:32768 0.0.0.0:*x0dx0audp 0 0 0.0.0.0:8888 0.0.0.0:*x0dx0audp 0 0 0.0.0.0:111 0.0.0.0:*x0dx0audp 0 0 0.0.0.0:882 0.0.0.0:*x0dx0a可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。x0dx0a如果这时再执行./udpserv &命令,就会看到如下信息:x0dx0abind error: Address already in usex0dx0a说明已经有一个服务程序在运行了。x0dx0ax0dx0a3、运行UDP Client程序x0dx0a执行./udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:x0dx0aHello, World!x0dx0aHello, World!x0dx0athis is a testx0dx0athis is a testx0dx0a^dx0dx0a输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。x0dx0a如果服务程序没有启动,而执行客户程序,就会看到如下信息:x0dx0a$ ./udpclient 127.0.0.1x0dx0atestx0dx0aread error: Connection refusedx0dx0a说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果你使用tcpdump程序来抓包,会发现收到的是ICMP的错误信息。
2023-07-20 23:17:051

socket网络编程

调用bzero函数,第一个参数是那个结构变量,第二个参数是该结构变量的占用内存大小(字节数)
2023-07-20 23:17:152

男生底妆怎么处理(化妆高手进)

偶尔外出或是怎么手头没有专门的眼部打底或者眼部遮瑕的时候可以作为临时用一用但是确实不应该用推荐例如urbandecayprimerpotionudpp这样的专门的眼部底膏。mm要上底妆的话先涂日用保护性的眼霜(注意有一些眼霜可能是晚间使用比较好)再用眼部打底膏(眼妆更持久)再用遮瑕棒或者粉底会好一些。(要是眼部不滋润的话mm会发现眼部会卡粉感觉总是涂不匀对不?吼吼)眼部周围的肌肤是最脆弱的,一定要好好保护,要不然会让小细纹有可乘之机哦~既然化妆平时多多给眼部补水一定要注意休息
2023-07-20 23:17:231

如何判断一个IP的UDP端口是否开放

命令行:netstat -a 显示 LISTENING端口 NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-t] [interval] -a 显示所连接侦听端口 -b 显示创建每连接或侦听端口涉及执行程序 某些情况已知执行程序承载独立 组件些情况显示创建连接或侦听端口涉 及组件序列情况执行程序名称 位于底部[]调用组件位于顶部直至达 TCP/IP注意选项能耗并且您没 足够权限能失败 -e 显示太中国统计选项与 -s 选项结合使用 -f 显示外部址完全限定域名(FQDN) -n 数字形式显示址端口号 -o 显示拥与每连接关联进程 ID -p proto 显示 proto 指定协议连接;proto 列任 何: TCP、UDP、TCPv陆 或 UDPv陆与 -s 选 项起用显示每协议统计proto 列任 何: IP、IPv陆、ICMP、ICMPv陆、TCP、TCPv陆、UDP 或 UDPv陆 -r 显示路由表 -s 显示每协议统计默认情况显示 IP、IPv陆、ICMP、ICMPv陆、TCP、TCPv陆、UDP UDPv陆 统计;-p 选项用于指定默认中国 -t 显示前连接卸载状
2023-07-20 23:17:321

c#之UDP协议的异步通信怎么做

服务器端代码:using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;using System.Threading;namespace AsyncServer{ // 定义 UdpState类 public class UdpState { public UdpClient udpClient; public IPEndPoint ipEndPoint; public const int BufferSize = 1024; public byte[] buffer = new byte[BufferSize]; public int counter = 0; } // 异步UDP类 public class AsyncUdpSever { // 定义节点 private IPEndPoint ipEndPoint = null; private IPEndPoint remoteEP = null; // 定义UDP发送和接收 private UdpClient udpReceive = null; private UdpClient udpSend = null; // 定义端口 private const int listenPort = 1100; private const int remotePort = 1101; UdpState udpReceiveState = null; UdpState udpSendState = null; // 异步状态同步 private ManualResetEvent sendDone = new ManualResetEvent(false); private ManualResetEvent receiveDone = new ManualResetEvent(false); public AsyncUdpSever() { // 本机节点 ipEndPoint = new IPEndPoint(IPAddress.Any, listenPort); // 远程节点 remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], remotePort); // 实例化 udpReceive = new UdpClient(ipEndPoint); udpSend = new UdpClient(); // 分别实例化udpSendState、udpReceiveState udpReceiveState = new UdpState(); udpReceiveState.udpClient = udpReceive; udpReceiveState.ipEndPoint = ipEndPoint; udpSendState = new UdpState(); udpSendState.udpClient = udpSend; udpSendState.ipEndPoint = remoteEP; } public void ReceiveMsg() { Console.WriteLine("listening for messages"); while (true) { lock (this) { // 调用接收回调函数 IAsyncResult iar = udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState); receiveDone.WaitOne(); Thread.Sleep(100); } } } // 接收回调函数 private void ReceiveCallback(IAsyncResult iar) { UdpState udpReceiveState = iar.AsyncState as UdpState; if (iar.IsCompleted) { Byte[] receiveBytes = udpReceiveState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint); string receiveString = Encoding.ASCII.GetString(receiveBytes); Console.WriteLine("Received: {0}", receiveString); //Thread.Sleep(100); receiveDone.Set(); SendMsg(); } } // 发送函数 private void SendMsg() { udpSend.Connect(udpSendState.ipEndPoint); udpSendState.udpClient = udpSend; udpSendState.counter++; string message = string.Format("第{0}个UDP请求处理完成!", udpSendState.counter); Byte[] sendBytes = Encoding.Unicode.GetBytes(message); udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState); sendDone.WaitOne(); } // 发送回调函数 private void SendCallback(IAsyncResult iar) { UdpState udpState = iar.AsyncState as UdpState; Console.WriteLine("第{0}个请求处理完毕!", udpState.counter); Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar)); sendDone.Set(); } // 主函数 public static void Main() { AsyncUdpSever aus = new AsyncUdpSever(); Thread t = new Thread(new ThreadStart(aus.ReceiveMsg)); t.Start(); Console.Read(); } }}  客户端代码:using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;using System.Threading;namespace AsyncClient{ // 定义 UdpState类 public class UdpState { public UdpClient udpClient = null; public IPEndPoint ipEndPoint = null; public const int BufferSize = 1024; public byte[] buffer = new byte[BufferSize]; public int counter = 0; } // 异步UDP类 public class AsyncUdpClient { public static bool messageSent = false; // Receive a message and write it to the console. // 定义端口 private const int listenPort = 1101; private const int remotePort = 1100; // 定义节点 private IPEndPoint localEP = null; private IPEndPoint remoteEP = null; // 定义UDP发送和接收 private UdpClient udpReceive = null; private UdpClient udpSend = null; private UdpState udpSendState = null; private UdpState udpReceiveState = null; private int counter = 0; // 异步状态同步 private ManualResetEvent sendDone = new ManualResetEvent(false); private ManualResetEvent receiveDone = new ManualResetEvent(false); // 定义套接字 //private Socket receiveSocket; //private Socket sendSocket; public AsyncUdpClient() { // 本机节点 localEP = new IPEndPoint(IPAddress.Any, listenPort); // 远程节点 remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], remotePort); // 实例化 udpReceive = new UdpClient(localEP); udpSend = new UdpClient(); // 分别实例化udpSendState、udpReceiveState udpSendState = new UdpState(); udpSendState.ipEndPoint = remoteEP; udpSendState.udpClient = udpSend; udpReceiveState = new UdpState(); udpReceiveState.ipEndPoint = remoteEP; udpReceiveState.udpClient = udpReceive; //receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //receiveSocket.Bind(localEP); //sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //sendSocket.Bind(remoteEP); } // 发送函数 public void SendMsg() { udpSend.Connect(remoteEP); //Thread t = new Thread(new ThreadStart(ReceiveMessages)); //t.Start(); Byte[] sendBytes; string message; while (true) { message = "Client" + (counter++).ToString(); lock (this) { sendBytes = Encoding.ASCII.GetBytes(message); udpSendState.counter = counter; // 调用发送回调函数 udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState); sendDone.WaitOne(); Thread.Sleep(200); ReceiveMessages(); } } } // 发送回调函数 public void SendCallback(IAsyncResult iar) { UdpState udpState = iar.AsyncState as UdpState; if (iar.IsCompleted) { Console.WriteLine("第{0}个发送完毕!", udpState.counter); Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar)); //if (udpState.counter == 10) //{ // udpState.udpClient.Close(); //} sendDone.Set(); } } // 接收函数 public void ReceiveMessages() { lock (this) { udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState); receiveDone.WaitOne(); Thread.Sleep(100); } } // 接收回调函数 public void ReceiveCallback(IAsyncResult iar) { UdpState udpState = iar.AsyncState as UdpState; if (iar.IsCompleted) { Byte[] receiveBytes = udpState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint); string receiveString = Encoding.Unicode.GetString(receiveBytes); Console.WriteLine("Received: {0}", receiveString); receiveDone.Set(); } } // 主函数 public static void Main() { AsyncUdpClient auc = new AsyncUdpClient(); auc.SendMsg(); Console.Read(); } }}
2023-07-20 23:17:401

Python 实现udp组播

有关知识 基本概念 单播:两个主机间单对单的通信 广播:一个主机对整个局域网上所有主机上的数据通信(网络地址全1) 单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网的主机进行通信 组播:实际情况下,经常需要对一组特定的主机进行通信,而不是所有局域网上的主机 IP组播(也称多址广播或多播),是一种允许一台或多台主机发送数据包到多台主机的TCP/IP网路技术。 多播是 IPv6 数据包的 3 种基本目的地址类型之一,多播是一点对多点的通信, IPv6 没有采用 IPv4 中的组播术语,而是将广播看成是多播的一个特殊例子。 多播组只能用UDP 或者原始套接字实现,不能用TCP。 广播地址 在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。 传输层只有UDP可以广播 。 组播地址 IP 组播通信必须依赖于 IP 多播地址,在 IPv4 中它是一个 D 类 IP 地址,范围从 224.0.0.0 到 239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址3类: 局部链接多播地址范围在 224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包; 预留多播地址为 224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议; 管理权限多播地址为 239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有 IP 地址,不能用于 Internet,可限制多播范围。 组播地址与MAC地址的映射 使用同一个 IP 多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。 这个我们可以这样理解,多播地址就类似于 QQ 群号,多播组相当于 QQ 群,一个个的主机就相当于群里面的成员。 设备驱动程序就必须接收所有多播数据帧,然后对它们进行过滤,这个过滤过程是网络驱动或IP层自动完成。(设备驱动程序会对多播数据进行过滤,将其发到相应的位置) 组播应用 单点对多点应用 点对多点应用是指一个发送者,多个接收者的应用形式,这是最常见的多播应用形式。典型的应用包括:媒体广播、媒体推送、信息缓存、事件通知和状态监视等。 多点对单点应用 多点对点应用是指多个发送者,一个接收者的应用形式。通常是双向请求响应应用,任何一端(多点或点)都有可能发起请求。典型应用包括:资源查找、数据收集、网络竞拍、信息询问等。 多点对多点应用 多点对多点应用是指多个发送者和多个接收者的应用形式。通常,每个接收者可以接收多个发送者发送的数据,同时,每个发送者可以把数据发送给多个接收者。典型应用包括:多点会议、资源同步、并行处理、协同处理、远程学习、讨论组、分布式交互模拟(DIS)、多人游戏等。 参考的文章 https://www.cnblogs.com/schips/p/12552534.html 下面实现一个python(3.8)的演示原理的版本 功能:1.每个客户端随机生成一个id当做标识 2.每个客户端绑定本机一个Ip的端口(在同一台机器上面可以启动多个脚本) 3. 加入同一网段的一个组播地址 4. 启动后,发送一个消息 5. 收到消息后,根据id判断消息是否是自己发出的,其它客户端的时候回一个消息 启动两个脚本以后效果如下: ps:在相同网段可以很容易实现组播。跨网段组播必须打开三层交换机的组播路由协议,一般是PIM 稀疏模式,一般三层交换机的默认配置是没有打开组播路由的。(待实践)
2023-07-20 23:17:471

udp是什么意思

我们经常会看到UDP这个词,但是却很少有人知道它的意思,今天我就来带大家了解一下吧。 UDP介绍 UDP是指用户数据报协议,是在网络上的不同计算机上运行的程序使用的Internet协议套件的一部分。UDP用于发送称为数据报的短消息,但总的来说,它是一种不可靠的无连接协议。UDP在RFC768中正式定义,由DavidP.Reed制定。 用户数据报协议 用户数据报协议是用于客户端 u2013 服务器网络应用的开放系统互连(OSI)传输层协议。UDP 使用简单的传输模型,但不使用握手对话框来提高可靠性,排序和数据完整性。该协议假定不需要错误检查和纠正,从而避免在网络接口级别进行处理。 UDP的应用范围 UDP 广泛用于视频会议和实时计算机游戏。该协议允许丢弃单个数据报,并以与发送它们不同的顺序接收 UDP 数据报,从而实现更好的性能。 综上所述,UDP是指用户数据报协议,用于发送称为数据报的短消息,它是一种不可靠的无连接协议。用户数据报协议是用于客户端u2013服务器网络应用的开放系统互连(OSI)传输层协议。你了解了吗?
2023-07-20 23:18:061

TCP 协议 和 UDP 协议有什么优缺点?

1、首先看TCP/UDP的英文缩写可以知道,他们都有一个P字母,也就是协议的英文,说明他们都是表示一种协议的规则。而单播、广播、组播则表示的是数据在网络中“播放”的形式,是指有一个人能听到还是让特定的人群听得到,还是让所有的人都听的到的区别。UDP支持单播、组播和广播,而TCP不支持广播。 2、理论上讲路由器和路由器连接要使用的是交叉线。 3、你使用的网页程序和提交的所有数据都是存储在baidu的服务器上,管理员可以通过多种方式对任何内容进行无限制的修改。大部分的方式是采用不同用户对数据的操作权限不同来进行区别的,因为这样对程序和数据都最安全。 这里先简单的说一下TCP与UDP的区别: 1。基于连接与无连接 2。对系统资源的要求(TCP较多,UDP少) 3。UDP程序结构较简单 4。流模式与数据报模式 5。TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证另外结合GPRS网络的情况具体的谈一下他们的区别: 1。TCP传输存在一定的延时,大概是1600MS(移动提供),UDP响应速度稍微快一些。 2。TCP包头结构源端口16位目标端口 16位 序列号 32位 回应序号 32位 TCP头长度 4位 reserved 6位 控制代码6位 窗口大小16位偏移量16位校验和16位选项32位(可选) 这样我们得出了TCP包头的最小大小.就是20字节. UDP包头结构源端口16位目的端口16位长度16位校验和 16位 UDP的包小很多.确实如此.因为UDP是非可靠连接.设计初衷就是尽可能快的将数据包发送出去.所以UDP协 议显得非常精简.
2023-07-20 23:18:291

udp怎么查看上层协议

1.在键盘上按“WIN+R”组合键,打开运行界面,输入“CMD”命令;2.在命令提示符界面中,输入“netstat -s -p udp”命令,按回车。即可显示本机所有UDP连接情况。
2023-07-20 23:18:361

windows7怎么安装 udp协议

1、在键盘上按“win+r”组合键,打开运行界面,输入“cmd”命令;  2、在命令提示符界面中,输入“netstat-s-pudp”命令,按回车。即可显示本机所有udp连接情况。
2023-07-20 23:18:441

如何测试udp端口是否正常?

TCP端口大家都知道,比如80端口,可以使用 telnet ip 80,来验证端口是否正常监听,那UDP端口是否可以同样测试呢?详细如下:下面我们来进行测试,123端口是服务器42.11.12.13打开的UDP端口,udp 0 0 42.11.12.13:123 0.0.0.0:* 1472/ntpd1.我们首先使用telnet连接,如下[root@kr-sg-test ~]# telnet 42.11.12.13 123Trying 42.11.12.13…telnet: connect to address 42.11.12.13: Connection refusedtelnet: Unable to connect to remote host: Connection refused很明显,telnet连接被拒绝,无法测试成功。2.我们使用nc来进行测试,如下[root@kr-sg-test ~]# nc -vuz 42.11.12.13 123Connection to 42.11.12.13 123 port [udp/ntp] succeeded!结果证明UDP 123端口正常监听。nc命令用法:usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port][-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version][-x proxy_address[:port]] [hostname] [port[s]]
2023-07-20 23:18:522

怎样测试UDP端口

测试UDP端口方法TCP端口大家都知道,比如80端口,可以使用 telnet ip 80,来验证端口是否正常监听,那UDP端口是否可以同样测试呢?详细如下:下面我们来进行测试,123端口是服务器42.11.12.13打开的UDP端口,udp 0 0 42.11.12.13:123 0.0.0.0:* 1472/ntpd1.我们首先使用telnet连接,如下[root@kr-sg-test ~]# telnet 42.11.12.13 123Trying 42.11.12.13…telnet: connect to address 42.11.12.13: Connection refusedtelnet: Unable to connect to remote host: Connection refused很明显,telnet连接被拒绝,无法测试成功。2.我们使用nc来进行测试,如下[root@kr-sg-test ~]# nc -vuz 42.11.12.13 123Connection to 42.11.12.13 123 port [udp/ntp] succeeded!结果证明UDP 123端口正常监听。nc命令用法:usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port][-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version][-x proxy_address[:port]] [hostname] [port[s]]
2023-07-20 23:19:011

C语言 UDP文件传输

你是要客户端的还是要服务器端的
2023-07-20 23:19:123

java 中怎么使用UDP?

这个差太多了,在知道的搜索栏,搜索 java udp
2023-07-20 23:19:321

UDP和Socket通信步骤是什么?

UDP Server程序1、编写UDP Server程序的步骤(1)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。(2)初始化sockaddr_in结构的变量,并赋值。sockaddr_in结构定义:struct sockaddr_in {uint8_t sin_len;sa_family_t sin_family;in_port_t sin_port;struct in_addr sin_addr;char sin_zero[8];};这里使用“08”作为服务程序的端口,使用“INADDR_ANY”作为绑定的IP地址即任何主机上的地址。(3)使用bind()把上面的socket和定义的IP地址和端口绑定。这里检查bind()是否执行成功,如果有错误就退出。这样可以防止服务程序重复运行的问题。(4)进入无限循环程序,使用recvfrom()进入等待状态,直到接收到客户程序发送的数据,就处理收到的数据,并向客户程序发送反馈。这里是直接把收到的数据发回给客户程序。2、udpserv.c程序内容:#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <netinet/in.h>#include <stdio.h>#include <stdlib.h>#define MAXLINE 80#define SERV_PORT 8888void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen){int n;socklen_t len;char mesg[MAXLINE];for(;;){len = clilen;/* waiting for receive data */n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);/* sent data back to client */sendto(sockfd, mesg, n, 0, pcliaddr, len);}}int main(void){int sockfd;struct sockaddr_in servaddr, cliaddr;sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket *//* init servaddr */bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);/* bind address and port to socket */if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1){perror("bind error");exit(1);}do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));return 0;}UDP Client程序1、编写UDP Client程序的步骤(1)初始化sockaddr_in结构的变量,并赋值。这里使用“8888”作为连接的服务程序的端口,从命令行参数读取IP地址,并且判断IP地址是否符合要求。(2)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。(3)使用connect()来建立与服务程序的连接。与TCP协议不同,UDP的connect()并没有与服务程序三次握手。上面我们说了UDP是非连接的,实际上也可以是连接的。使用连接的UDP,kernel可以直接返回错误信息给用户程序,从而避免由于没有接收到数据而导致调用recvfrom()一直等待下去,看上去好像客户程序没有反应一样。(4)向服务程序发送数据,因为使用连接的UDP,所以使用write()来替代sendto()。这里的数据直接从标准输入读取用户输入。(5)接收服务程序发回的数据,同样使用read()来替代recvfrom()。(6)处理接收到的数据,这里是直接输出到标准输出上。2、udpclient.c程序内容:#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <netinet/in.h>#include <stdio.h>#include <stdlib.h>#include <arpa/inet.h>#include <unistd.h>#define MAXLINE 80#define SERV_PORT 8888void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen){int n;char sendline[MAXLINE], recvline[MAXLINE + 1];/* connect to server */if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1){perror("connect error");exit(1);}while(fgets(sendline, MAXLINE, fp) != NULL){/* read a line and send to server */write(sockfd, sendline, strlen(sendline));/* receive data from server */n = read(sockfd, recvline, MAXLINE);if(n == -1){perror("read error");exit(1);}recvline[n] = 0; /* terminate string */fputs(recvline, stdout);}}int main(int argc, char **argv){int sockfd;struct sockaddr_in srvaddr;/* check args */if(argc != 2){printf("usage: udpclient <IPaddress> ");exit(1);}/* init servaddr */bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){printf("[%s] is not a valid IPaddress ", argv[1]);exit(1);}sockfd = socket(AF_INET, SOCK_DGRAM, 0);do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));return 0;}运行例子程序1、编译例子程序使用如下命令来编译例子程序:gcc -Wall -o udpserv udpserv.cgcc -Wall -o udpclient udpclient.c编译完成生成了udpserv和udpclient两个可执行程序。2、运行UDP Server程序执行./udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:Active Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:111 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTENtcp 0 0 127.0.0.1:631 0.0.0.0:* LISTENudp 0 0 0.0.0.0:32768 0.0.0.0:*udp 0 0 0.0.0.0:8888 0.0.0.0:*udp 0 0 0.0.0.0:111 0.0.0.0:*udp 0 0 0.0.0.0:882 0.0.0.0:*可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。如果这时再执行./udpserv &命令,就会看到如下信息:bind error: Address already in use说明已经有一个服务程序在运行了。3、运行UDP Client程序执行./udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:Hello, World!Hello, World!this is a testthis is a test^d输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。如果服务程序没有启动,而执行客户程序,就会看到如下信息:$ ./udpclient 127.0.0.1testread error: Connection refused说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果你使用tcpdump程序来抓包,会发现收到的是ICMP的错误信息。
2023-07-20 23:19:411

请教用C语言编的借助UDP协议实现的文件传输的程序

你好!是DOS下的程序吗?
2023-07-20 23:20:141

NAT穿透(UDP打洞)

NAT有两大类,基本NAT和NAPT。 静态NAT:一个公网IP对应一个内部IP,一对一转换 动态NAT:N个公网IP对应M个内部IP,不固定的一对一转换关系 现在基本使用这种,又分为对称和锥型NAT。 锥型NAT ,有完全锥型、受限制锥型、端口受限制锥型三种: 对称NAT : 把所有来自相同内部IP地址和端口号,到特定目的IP地址和端口号的请求映射到相同的外部IP地址和端口。如果同一主机使用不同的源地址和端口对,发送的目的地址不同,则使用不同的映射。只有收到了一个IP包的外部主机才能够向该内部主机发送回一个UDP包。对称的NAT不保证所有会话中的(私有地址,私有端口)和(公开IP,公开端口)之间绑定的一致性。相反,它为每个新的会话分配一个新的端口号。 对称NAT是一个请求对应一个端口,非对称NAT是多个请求对应一个端口(象锥形,所以叫Cone NAT)。 连接服务器为A,NAT检测服务器为B。 第一步:当一个接收客户端(Endpoint-Receiver ,简称 EP-R)需要接收文件信息时,在其向连接服务器发送文件请求的同时紧接着向检测服务器发送NAT检测请求。此处再次强调是“紧接着”,因为对于对称型NAT来说,这个操作可以直接算出其地址分配的增量(⊿p)。 第二步:当EP-R收到A或B的反馈信息时发现其外部地址与自身地址不同时就可以确定自己在NAT后面;否则,就是公网IP。 第三步:由服务器A向B发送其获得的EP-R的外部映射地址(IPa/Porta),服务器B获得后进行比较,如果端口不同,则说明这是对称型NAT,同时可以直接计算出其分配增量: ⊿p=Portb-Porta 第四步:如果端口号相同,则由B向EP-R的Porta发送连接请求,如果EP-R有响应,则说明EP-R没有IP和Port的限制,属于全ConeNAT类型。 第五步:如果没有响应,则由服务器B使用其新端口b"向EP-R的Portb端口发送连接请求,如果有响应,则说明EP-R只对IP限制,属于限制性ConeNAT类型;否则就是对IP和port都限制,属于端口限制性ConeNAT类型。 通过上述五步基本可以全部检测出EP-R是否在公网,还是在某种NAT后面。 这也是一项可选配置任务,可根据需要为NAT 地址映射表配置老化时间,以控制用户对NAT 配置的使用,确保内、外网的通信安全。 配置NAT 地址映射表项老化时间的方法也很简单,只须在系统视图下使用firewall-nat session { dns | ftp | ftp-data | http | icmp | tcp | tcp-proxy | udp | sip | sip-media | rtsp |rtsp-media }aging-time time-value 命令配置即可。参数 time-value的取值范围为1~65 535的整数秒。如果要配置多个会话表项的超时时间需要分别用本命令配置。 缺省情况下,各协议的老化时间为:DNS(120 s)、ftp(120 s)、ftp-data(120 s)、HTTP(120 s)、icmp(20 s)、tcp(600 s)、tcp-proxy(10 s)、udp(120 s)、sip(1 800 s)、sip-media ( 120 s )、rtsp ( 60 s )、rtsp-media ( 120 s ), 可用undo firewall-natsession { all | dns | ftp | ftp-data | http | icmp | tcp | tcp-proxy | udp | sip | sip-media | rtsp |rtsp-media } aging-time 命令恢复对应会话表项的超时时间为缺省值。 1、 中间服务器保存信息、并能发出建立UDP隧道的命令 2、 网关均要求为Cone NAT类型。Symmetric NAT不适合。 3、 完全圆锥型网关可以无需建立udp隧道,但这种情况非常少,要求双方均为这种类型网关的更少。 4、 假如X1网关为Symmetric NAT, Y1为Address Restricted Cone NAT 或Full Cone NAT型网关,各自建立隧道后,A1可通过X1发送数据报给Y1到B1(因为Y1最多只进行IP级别的甄别),但B2发送给X1的将会被丢弃(因为发送来的数据报中端口与X1上存在会话的端口不一致,虽然IP地址一致),所以同样没有什么意义。 5、 假如双方均为Symmetric NAT的情形,新开了端口,对方可以在不知道的情况下尝试猜解,也可以达到目的,但这种情形成功率很低,且带来额外的系统开支,不是个好的解决办法。 6、 不同网关型设置的差异在于,对内会采用替换IP的方式、使用不同端口不同会话的方式,使用相同端口不同会话的方式;对外会采用什么都不限制、限制IP地址、限制IP地址及端口。 7、 这里还没有考虑同一内网不同用户同时访问同一服务器的情形,如果此时网关采用AddressRestricted Cone NAT 或Full Cone NAT型,有可能导致不同用户客户端可收到别人的数据包,这显然是不合适的。 为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现? 假设现在有内网客户端A和内网客户端B,有公网服务端S。 如果A和B想要进行UDP通信,则必须穿透双方的NAT路由。假设为NAT-A和NAT-B。 S也和A B 分别建立了会话,由S发到NAT-A的数据包会被NAT-A直接转发给A, 由S发到NAT-B的数据包会被NAT-B直接转发给B,除了S发出的数据包之外的则会被丢弃。 所以:现在A B 都能分别和S进行全双工通讯了,但是A B之间还不能直接通讯。 并转发给A了(即B现在能访问A了);再由S命令B向A的公网IP发送一个数据包,则 NAT-B能接收来自NAT-A的数据包并转发给B了(即A现在能访问B了)。 以上就是“打洞”的原理。 <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word;">为了保证A的路由器有与B的session,A要定时与B做心跳包,同样,B也要定时与A做心跳,这样,双方的通信通道都是通的,就可以进行任意的通信了。</pre> API造成的。 UDP的socket允许多个socket绑定到同一个本地端口,而TCP的socket则不允许。 这是这样一个意思:A B要连接到S,肯定首先A B双方都会在本地创建一个socket, 去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写 端口,实际上也是绑定了的,至少java确实如此),假设为8888,这样A和B才分别建立了到 S的通信信道。接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是 问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,A B可以 分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。但是如果是TCP的 socket,则不能再创建socket并绑定到8888了,这样打洞就无法成功。 **UDP打洞**的过程大致如此: 1、双方都通过UDP与服务器通讯后,网关默认就是做了一个外网IP和端口号 与你内网IP与端口号的映射,这个无需设置的,服务器也不需要知道客户的真正内网IP 2、用户A先通过服务器知道用户B的外网地址与端口 3、用户A向用户B的外网地址与端口发送消息, 4、在这一次发送中,用户B的网关会拒收这条消息,因为它的映射中并没有这条规则。 5、但是用户A的网关就会增加了一条允许规则,允许接收从B发送过来的消息 6、服务器要求用户B发送一个消息到用户A的外网IP与端口号 7、用户B发送一条消息,这时用户A就可以接收到B的消息,而且网关B也增加了允许规则 8、之后,由于网关A与网关B都增加了允许规则,所以A与B都可以向对方的外网IP和端口号发送消息。 TCP打洞 技术: tcp打洞也需要NAT设备支持才行。 tcp的打洞流程和udp的基本一样,但tcp的api决定了tcp打洞的实现过程和udp不一样。 tcp按cs方式工作,一个端口只能用来connect或listen,所以需要使用端口重用,才能利用本地nat的端口映射关系。(设置SO_REUSEADDR,在支持SO_REUSEPORT的系统上,要设置这两个参数。) 连接过程:(以udp打洞的第2种情况为例(典型情况)) nat后的两个peer,A和B,A和B都bind自己listen的端口,向对方发起连接(connect),即使用相同的端口同时连接和等待连接。因为A和B发出连接的顺序有时间差,假设A的syn包到达B的nat时,B的syn包还没有发出,那么B的nat映射还没有建立,会导致A的连接请求失败(连接失败或无法连接,如果nat返回RST或者icmp差错,api上可能表现为被RST;有些nat不返回信息直接丢弃syn包(反而更好)),(应用程序发现失败时,不能关闭socket,closesocket()可能会导致NAT删除端口映射;隔一段时间(1-2s)后未连接还要继续尝试);但后发B的syn包在到达A的nat时,由于A的nat已经建立的映射关系,B的syn包会通过A的nat,被nat转给A的listen端口,从而进去三次握手,完成tcp连接。 从应用程序角度看,连接成功的过程可能有两种不同表现:(以上述假设过程为例) 1、连接建立成功表现为A的connect返回成功。即A端以TCP的同时打开流程完成连接。 2、A端通过listen的端口完成和B的握手,而connect尝试持续失败,应用程序通过accept获取到连接,最终放弃connect(这时可closesocket(conn_fd))。 多数Linux和Windows的协议栈表现为第2种。 但有一个问题是,建立连接的client端,其connect绑定的端口号就是主机listen的端口号,或许这个peer后续还会有更多的这种socket。虽然理论上说,socket是一个五元组,端口号是一个逻辑数字,传输层能够因为五元组的不同而区分开这些socket,但是是否存在实际上的异常,还有待更多观察。 1、Windows XP SP2操作系统之前的主机,这些主机不能正确处理TCP同时开启,或者TCP套接字不支持SO_REUSEADDR的参数。需要让AB有序的发起连接才可能完成。 上述tcp连接过程,仅对NAT1、2、3有效,对NAT4(对称型)无效。 由于对称型nat通常采用规律的外部端口分配方法,对于nat4的打洞,可以采用端口预测的方式进行尝试。 ALG(应用层网关) :它可以是一个设备或插件,用于支持SIP协议,主要类似与在网关上专门开辟一个通道,用于建立内网与外网的连接,也就是说,这是一种定制的网关。更多只适用于使用他们的应用群体内部之间。 UpnP :它是让网关设备在进行工作时寻找一个全球共享的可路由IP来作为通道,这样避免端口造成的影响。要求设备支持且开启upnp功能,但大部分时候,这些功能处于安全考虑,是被关闭的。即时开启,实际应用效果还没经过测试。 STUN(Simple Traversalof UDP Through Network): 这种方式即是类似于我们上面举例中服务器C的处理方式。也是目前普遍采用的方式。但具体实现要比我们描述的复杂许多,光是做网关Nat类型判断就由许多工作,RFC3489中详细描述了。 TURN(Traveral Using Relay NAT): 该方式是将所有的数据交换都经由服务器来完成,这样NAT将没有障碍,但服务器的负载、丢包、延迟性就是很大的问题。目前很多游戏均采用该方式避开NAT的问题。这种方式不叫p2p。 ICE(Interactive Connectivity Establishment): 是对上述各种技术的综合,但明显带来了复杂性。
2023-07-20 23:20:211

UDP和Socket通信步骤

UDP Server程序1、编写UDP Server程序的步骤(1)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。(2)初始化sockaddr_in结构的变量,并赋值。sockaddr_in结构定义:struct sockaddr_in {uint8_t sin_len;sa_family_t sin_family;in_port_t sin_port;struct in_addr sin_addr;char sin_zero[8];};这里使用“08”作为服务程序的端口,使用“INADDR_ANY”作为绑定的IP地址即任何主机上的地址。(3)使用bind()把上面的socket和定义的IP地址和端口绑定。这里检查bind()是否执行成功,如果有错误就退出。这样可以防止服务程序重复运行的问题。(4)进入无限循环程序,使用recvfrom()进入等待状态,直到接收到客户程序发送的数据,就处理收到的数据,并向客户程序发送反馈。这里是直接把收到的数据发回给客户程序。2、udpserv.c程序内容:#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <netinet/in.h>#include <stdio.h>#include <stdlib.h>#define MAXLINE 80#define SERV_PORT 8888void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen){int n;socklen_t len;char mesg[MAXLINE];for(;;){len = clilen;/* waiting for receive data */n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);/* sent data back to client */sendto(sockfd, mesg, n, 0, pcliaddr, len);}}int main(void){int sockfd;struct sockaddr_in servaddr, cliaddr;sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket *//* init servaddr */bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);/* bind address and port to socket */if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1){perror("bind error");exit(1);}do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));return 0;}UDP Client程序1、编写UDP Client程序的步骤(1)初始化sockaddr_in结构的变量,并赋值。这里使用“8888”作为连接的服务程序的端口,从命令行参数读取IP地址,并且判断IP地址是否符合要求。(2)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。(3)使用connect()来建立与服务程序的连接。与TCP协议不同,UDP的connect()并没有与服务程序三次握手。上面我们说了UDP是非连接的,实际上也可以是连接的。使用连接的UDP,kernel可以直接返回错误信息给用户程序,从而避免由于没有接收到数据而导致调用recvfrom()一直等待下去,看上去好像客户程序没有反应一样。(4)向服务程序发送数据,因为使用连接的UDP,所以使用write()来替代sendto()。这里的数据直接从标准输入读取用户输入。(5)接收服务程序发回的数据,同样使用read()来替代recvfrom()。(6)处理接收到的数据,这里是直接输出到标准输出上。2、udpclient.c程序内容:#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <netinet/in.h>#include <stdio.h>#include <stdlib.h>#include <arpa/inet.h>#include <unistd.h>#define MAXLINE 80#define SERV_PORT 8888void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen){int n;char sendline[MAXLINE], recvline[MAXLINE + 1];/* connect to server */if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1){perror("connect error");exit(1);}while(fgets(sendline, MAXLINE, fp) != NULL){/* read a line and send to server */write(sockfd, sendline, strlen(sendline));/* receive data from server */n = read(sockfd, recvline, MAXLINE);if(n == -1){perror("read error");exit(1);}recvline[n] = 0; /* terminate string */fputs(recvline, stdout);}}int main(int argc, char **argv){int sockfd;struct sockaddr_in srvaddr;/* check args */if(argc != 2){printf("usage: udpclient <IPaddress> ");exit(1);}/* init servaddr */bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){printf("[%s] is not a valid IPaddress ", argv[1]);exit(1);}sockfd = socket(AF_INET, SOCK_DGRAM, 0);do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));return 0;}运行例子程序1、编译例子程序使用如下命令来编译例子程序:gcc -Wall -o udpserv udpserv.cgcc -Wall -o udpclient udpclient.c编译完成生成了udpserv和udpclient两个可执行程序。2、运行UDP Server程序执行./udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:Active Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:111 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTENtcp 0 0 127.0.0.1:631 0.0.0.0:* LISTENudp 0 0 0.0.0.0:32768 0.0.0.0:*udp 0 0 0.0.0.0:8888 0.0.0.0:*udp 0 0 0.0.0.0:111 0.0.0.0:*udp 0 0 0.0.0.0:882 0.0.0.0:*可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。如果这时再执行./udpserv &命令,就会看到如下信息:bind error: Address already in use说明已经有一个服务程序在运行了。3、运行UDP Client程序执行./udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:Hello, World!Hello, World!this is a testthis is a test^d输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。如果服务程序没有启动,而执行客户程序,就会看到如下信息:$ ./udpclient 127.0.0.1testread error: Connection refused说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果你使用tcpdump程序来抓包,会发现收到的是ICMP的错误信息。
2023-07-20 23:20:312

什么是a7p和udp类型文件

UDP:用户数据报协议(UDP:UserDatagramProtocol)用户数据报协议(UDP)是ISO参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP协议基本上是IP协议与上层协议的接口。UDP协议适用端口分辨运行在同一台设备上的多个应用程序。由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。这是通过使用UDP的“端口号”完成的。例如,如果一个工作站希望在工作站128.1.123.1上使用域名服务系统,它就会给数据包一个目的地址128.1.123.1,并在UDP头插入目标端口号53。源端口号标识了请求域名服务的本地机的应用程序,同时需要将所有由目的站生成的响应包都指定到源主机的这个端口上。UDP端口的详细介绍可以参照相关文章。a7p是Authorware的源文件,你需要用Authorware将它打包成exe文件才能直接运行。
2023-07-20 23:20:381

使用LWIP进行UDP通信时,为什么PORT无法固定

udp的控制块udp_pcb结构中有一个回调函数:void (* recv)(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port);函数的入口参数:pcb,udp块指针 p,udp包传输的数据 addr,远程主机ip port,远程主机端口底层的MAC,我就不知道怎么读取了
2023-07-20 23:20:461

linux udp端口映射

172.16.88.110 上iptables -t nat -I PREROUTING -p udp --dport 27015 -j DNAT --to 172.16.88.68
2023-07-20 23:20:551

为什么tcp udp两种议的端口可以相同

单位我打,是asd,撒想想程序性,是多少的。
2023-07-20 23:21:034

MFC中UDP建立连接后收不到数据

在熘揽棋署炼鲒 u1e02О1 ⒉c c 可以跶垲不但避开了两个人之间的对手,而且能让队友轻松地拿到球……
2023-07-20 23:21:293

利用UDP Sockets技术实现IP多点传送

   摘 要  本文介绍了UDP Sockets的基本概念和IP多点传送的原理 详细讨论了Java中的相关类及使用方法 提供了一个IP多点传送的开发流程    关键词  Java UDP Sockets     一 IP多点传送    IP多点传送(multicast delivery)是针对点到点的传送和广播传送两种方式而言的 它是指在一定的组内对其成员进行的广播 是一种有限的广播 组中的某个成员发出的信息 组中的其它所有成员都能收到 它是UDP Sockets的一个分支   IP多点传送特别适合与高带宽的应用 例如在网络上发送视频和音频 随着网络带宽的不断提高和网络通讯质量的不断改善 IP多点传送还将广泛地被应用于网上聊天及网上会议 分布式数据存储 联机事务处理 交互式游戏等方面 另外 多点传送还可以被客户机用于在网络上寻找相应的服务器 客户机发送一个多点传送的请求 任何监听服务器都可以与客户机连接并开始一个事务    二 UDP Socket基础   使用用户数据报协议(User Datagram Protocol 简称UDP)进行会话必须将信息装配成一定尺寸的小报文 当发送一条信息 接收方能否收到并返回信息永远是不确定的 如果无法收到返回信息 我们就无法确定我们发送的信息是否被接收——它可能在途中丢失 接收者返回的响应信息也可能丢失 另外 接收者也可能忽略我们的信息 因此 UDP被描述为不可靠的 无连接的和面向消息的   创建UDP sockets非常象创建一个邮箱 邮箱是使用地址来识别的 但是 我们不需要为每个发送信息的人构造一个新的邮箱 可以在含有发送信息的明信片上写上目的地址 将其放在邮箱中并发送出去 接收者可能会长久的等待 直到含有信息的明信片到达它的邮箱 而明信片上标识了发送者的返回地址   三 IP多点传送的原理   为了支持IP多点传送 某些范围的IP地址被单独留出专门用于这个目的 这些IP地址是D类地址 其地址的最高四比特的位模式为 即IP地址的范围在 和 之间 它们中的每一个IP地址都可以被引用作为一个多点传送组 任何以该IP地址编址的IP报文将被该组中的其它所有机器接收 也就是说 一个IP地址就相当于一个邮箱 另外 组中的成员是动态的并随时间而改变   对于IP多点传送 网间网组管理协议(Internet Group Management Protocol 简称IGMP) 用于管理多点传送组中的成员 支持多点传送的路由可以使用IGMP决定本地的机器是否赞成加入某个组 一个多点传送路由可以决定是否转发一个多点传送报文   影响多点传送报文的一个重要参数是time-to-live(TTL) TTL用于描述发送者希望传送的信息能通过多少不同的网络 当报文被路由器转发 报文中的TTL将减一 当TTL为零时 报文将不再向前发送   在实际使用中 我们必须注意下面几点    这些IP地址只能作为信宿地址使用 绝对不能出现在任何信源地址域中 也不能出现在源路径或记录路径选项中    由于IP多点传送是一对多的传送 因此 不能利用差错与控制报文协议(Internet Control Message Protocol 简称ICMP)产生出错报文    发送一个信息到一个组 发送主机可以不是组中的成员    一些组被Internet Assigned Numbers Authority(IANA)分配 保留用于特殊的目的 详情参见 ftp://ftp internic net/rfc/rfc txt 另外 避免使用一些保留组 从 到 仅限于本地子网使用 建议在 和 之间任意选取一个IP地址    如果我们选取的组已经被使用 与其他机器的通讯将会混乱 一旦发生 可以退出应用 试试其他的地址    当一个机器加入一个多点传送组 它将开始接收该IP多点传送地址的信息 如果多点传送报文分发到网络上 任何监听该信息的机器都会有机会接收它 对于IP多点传送 没有一个机制对相同网络上的机器能否加入该多点传送组加以限制 因此 安全性是我们必须考虑的问题之一    选择的TTL参数应尽可能小 一个大的TTL值会不必要地占用Internet带宽 此外 还可能破坏不同区域使用相同组的其它的多点传送通讯   四 Java中与IP多点传送相关的类   java net包中含有UDP通讯所需要的工具 其中包括IP多点传送   1 DatagramPacket类   我们可以使用DatagramPacket类创建一个用于发送的数据报 而当接收UDP数据报时 可以使用DatagramPacket类读取数据报中的数据 发送者及其它信息   为了创建一个数据报并发送到远地系统 可以使用下面的构造器   Public DatagramPacket(byte ibuf int length InetAddress iaddr int iport );   ibuf是编码信息数据的字节数组 它的长度length就是数据报放在其中的字节数组的长度 iaddr是一个InetAddress对象 存储著接收方的主机名和IP地址等信息 iport标识数据报发送到接收主机的端口   为了接收数据报 必须使用DatagramPacket构造器 其原型为   public DatagramPacket(byte ibuf int ilength);  ibuf是指接收的数据报的数据部分 ilength是该部分数据的长度 如果 ilength 小于机器接收的UDP数据报的尺寸 多余的字节将被Java忽略   另外 类中有一些方法(method)可以让我们得到一些相关的信息   public int getLength();   //得到数据报中数据块的字节尺寸   public bytegetData();  //得到接收数据报中的数据   public InetAddress getAddress();   //为发送者提供一个 InetAddress对象   public int getPort();   //得到UDP端口   值得注意的是 TCP sockets的编程中 我们无须将传送的数据分块 然而 当我们创建一个基于UDP的网络通讯应用程序时 必须创建一套方法 在运行时刻决定需分割的数据报的长度 对于TCP/IP 最大的数据报可以含有 字节的数据 然而 主机仅能接收最多 字节的数据 支持 字节的大数据报的平台是利用IP层对数据报进行分割的 如果在传送期间 任何含有IP报文的一个数据块丢失 都会造成整个UDP数据报的丢失 因此 我们在确定应用中数据报尺寸时 对其尺寸的合理性一定要谨慎   下面就是分割数据的一个例子   //循环地从输入流input中读一行数据   while((nextLine=input readLine())!=null){   //定义一个空数据报 其尺寸为   mcastBuffer=new byte[ ];   //如果读入的数据的长度大于定义的数据报的长度   //则使用定义的长度 否则使用读入数据的长度   if(nextLine length()>mcastBuffer length){   sendLength=mcastBuffer length;   }else {   sendLenth=nextLine length();   }   //将读入的数据转换为byte类型   lineData=nextLine getBytes();   //将数据复制到用于创建数据报的byte数组   for(int i= ;i   mcastBuffer[i]=lineData[i];   }   ……创建数据报 发送或接收……   }   2 MulticastSocket类   Java的 MulticastSocket类是实施IP多点传送网络特征的关键 它允许我们使用多点传送IP发送或接收UDP数据报   MulticastSocket的构造器为   public MulticastSocket () throws IOException;    //创建一个多点传送socket   public MulticastSocket(int port)throws IOException;  //在指定端口创建一个多点传送socket   另外 类中其它常用的方法有   public void joinGroup(InetAddress mcastaddr)throws IOException{}   //加入多点传送组   public void leaveGroup(InetAddress mcastaddr)throws IOException{}   //离开多点传送组   public synchronized void send(DatagramPacket p byte ttl) throws IOException{}    //发送数据报   public synchronized void receive(DatagramPacket p byte ttl) throws IOException{}   //接收数据报   创建一个DatagramPacket对象之后 我们必须相应地创建一个 MulticastSocket对象 这样 数据报就可以使用send()方法发送了 下面的代码演示了如何创建 MulticastSocket 发送和接收IP多点传送数据报   int multiPort= ;   //定义端口号 非超级用户应使用 以上的端口   int ttl= ;  //设定TTL值   InetAddress multiAddr=InetAddress getByName(″ ″)  //设定多点传送IP   byteSmultiBytes={ H e O }; //定义一个内容为 Hello 的数据报   //创建多点传送数据报   DatagramPacket SmultiDatagram new Datagram          Packet(SmultiBytes SmultiBytes length multiAddr multiPort);   MulticastSocket multiSocket=new MulticastSocket();  //创建多点传送socket   multiSocket send(SmultiDatagram ttl)  //发送数据报(不加入到组中)   ……   byteRmultiBytes=new byte[ ]; //定义一个空数据报 长度为 字节   //创建接收数据报   DatagramPacket RmultiDatagram=new DatagramPacket(RmultiBytes RmultiBytes length);   multiSocket joinGroup(multiAddr); //加入到多点传送组中   multiSocket receive(RmultiDatagram);//接收UDP数据报   ……   multiSocket leaveGroup(multiAddr); //离开多点传送组   multiSocket close();  //关闭多点传送 socket   当调用joinGroup()方法时 机器将关注沿着网络传送属于特定多点传送组的任何IP报文 也就是说 机器拥有了一个邮箱 主机还应使用IGMP相应地报告组的使用 对于多IP地址的机器 应配置数据报发送的接口 setInterface(oneOfMyLocalAddrs);   在DatagramSocket中没有类似 setSo Timeout()的方法设置超时   五 IP多点传送应用程序的开发流程   由于IP多点传送主要用于同组中成员的交流 因此 应用程序的开发流程大体如下    创建一个需发送的按规定编址的数据报DatagramPacket;    建立一个用于发送和接收的MulticastSocket;    加入一个多点传送组    将数据报放入MulticastSocket中传送出去    等待从MulticastSocket接收数据报    解码数据报提取信息    根据得到的信息作出回应    重复 — 步    离开该多点传送组 关闭MulticastSocket lishixinzhi/Article/program/Java/hx/201311/27230
2023-07-20 23:21:371