首页 新闻 会员 周边 捐助

UDP 发送数据包

0
悬赏园豆:10 [已解决问题] 解决于 2014-04-21 14:04

数据包的大小是否可以通过带宽大小或者数据阻塞智能变化?

metoer的主页 metoer | 初学一级 | 园豆:8
提问于:2014-04-18 14:19
< >
分享
最佳答案
0

其实不需要智能分包,

因为如果使用TCP链路的话,TCP是可以保证包顺序和是否到达的,这个时候网络带宽什么的必然会影响速度,就是你发一个包,对方如果接收到了,才会返回发送完成,同时在传输流程中设置些超时判断、重传等机制。

如果使用UDP,则需要使用更加严密的传输控制流程来保证文件完整性,因为UDP不保证是否到达及包顺序,

所以需要文件完整性的,最好是用TCP协议传输。

当然,你可以在传输过程中通控制流程简单的判断下带宽和阻塞情况。

收获园豆:7
hailants | 小虾三级 |园豆:750 | 2014-04-18 16:25

对于send函数:

    send函数只负责将数据提交给协议层。
   当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;
    如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据;
    如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len;
    如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小,send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。
    如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;
    如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。
    如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回SOCKET_ERROR)   

hailants | 园豆:750 (小虾三级) | 2014-04-18 16:28

”传输过程中通控制流程简单的判断下带宽和阻塞情况“我的问题就是这点,问怎么判断的

metoer | 园豆:8 (初学一级) | 2014-04-18 16:29

另外,你在其他软件中看到的传输速率变化其实是基于传输控制流程的原因,例如:

控制流程:S发一个包,等待C端返回该包已接收,如果超时则重发,超时三次则报错。

那么网速快的情况下,C端返回消息就快,那么等待时间少,占用的带宽就高,表现就是发的快。

网速慢,C端返回消息慢,那么S端更多的是在等消息,占用的带宽就小,表现就是发的慢。

实际应用中会同时发多个包,并给包标记,然后等待,以此充分利用带宽,也就是所谓的多线程收发。

hailants | 园豆:750 (小虾三级) | 2014-04-18 16:33

@hailants:   发送文件时,我采用tcp结合udp,tcp用来发送文件中需要确认的信息(如文件名、大小、丢包索引等),数据包采用udp发送,不知道现在的大神们是采用纯tcp还是纯udp或者也结合?

metoer | 园豆:8 (初学一级) | 2014-04-18 16:55

@metoer: ”传输过程中通控制流程简单的判断下带宽和阻塞情况“我的问题就是这点,问怎么判断的

WSAGetQOSByName

http://msdn.microsoft.com/en-us/library/windows/desktop/ms741587(v=vs.85).aspx

Launcher | 园豆:45050 (高人七级) | 2014-04-18 18:01

@Launcher: 请问多线程收发,是多个端口同时发送,多个端口同时接收?

metoer | 园豆:8 (初学一级) | 2014-04-19 10:40

@Launcher: 你要的带宽和阻塞情况与QOS还是有区别,QOS是在当前网络中请求达到某种服务质量,但不保证达到。感觉一般在局域网内部要求传输高质量视音频时才多会用到。

如果你是远程网络对端传输普通的文件,那么没必要用QOS。

我说的通过控制流程判断是这样理解:建立链接,发个命令,等待对方回复,送发送到收到回复之间的间隔越长说明网络状况越差,其实阻塞与带宽对于应用来说可以统一理解为网络状况,高带宽高阻塞和低带宽低阻塞是相当的。

多线程收发,TCP模式下,服务端是一个端口,客户端是多端口。例如:客户端请求服务器发送某文件,则首先建立一个链接,获取文件大小,然后再开辟多个链接,分别从服务器请求文件的不同区块的数据,所有链接接收完毕后,再将数据整合为一个文件,基本上就和下载软件一个道理。每个链接里面采用独立的传输控制流程,请求->接收->超时/校验重发

hailants | 园豆:750 (小虾三级) | 2014-04-20 15:52
其他回答(1)
0
收获园豆:3
Launcher | 园豆:45050 (高人七级) | 2014-04-18 14:48

看了,理论我知道,但是还是不知道是否有智能分包

支持(0) 反对(0) metoer | 园豆:8 (初学一级) | 2014-04-18 15:11

@metoer: 啥叫智能分包?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-04-18 15:47

@Launcher: 就是包的大小是否可以根据带宽大小或者网络是否阻塞自由变化

支持(0) 反对(0) metoer | 园豆:8 (初学一级) | 2014-04-18 15:48

@metoer: 理论你也看了,对于里面提到的 IP 报文和 MTU 你是否理解了?

"进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值.如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作." —— 这是我给你的第一个链接中的原文。

更详细的关于 MTU 的信息请看这里:

http://baike.baidu.com/view/26974.htm

那么回到你的问题中来,你是否说的是你封装的 UDP 报文的大小是否可按照 MTU 的值来调节?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-04-18 15:57

@Launcher: 我也不知道是否是按mtu来分的。

      现在我写的网络传输,加入一个包的大小是1024*5,每个包的大小都是这样,即网络上传与下载流量不会波动,而我现在看很多软件,传输数据的时候会有流量上下不停的波动,所以我才会问这个问题。

支持(0) 反对(0) metoer | 园豆:8 (初学一级) | 2014-04-18 16:09

@metoer: 我给你的第一个链接里面已经描述的很清楚了,虽然你说理论你懂,其实你不懂。TCP/UDP 都是基于 IP 报文的,也就是说你的 TCP/UDP 报文会封装成 IP 报文后发送,如果 TCP/UDP 报文比 MTU 值大(忽略 IP 报文头的影响),TCP/UDP 报文就会被拆分成多个 IP 报文。也就是说你发送一个 1024 * 5 字节的 UDP 报文,如果 MTU 是 1500,那么此 UDP 报文会被拆分成至少 4 个 IP 报文。

流量波动的因素很多,简单的例子,你将你的程序部署到使用 3G 上网的环境中去。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-04-18 16:24

@Launcher: 谢你的指导,我知道  1024 * 5会被分拆4个ip,我举个例子。

         一般传输在广域网上面传输文件包的大小和在局域网中包的大小不一样,但是我得知道目前是在那个网上来分包。同理就是我是否可以通过代码了解当前网络情况?

支持(0) 反对(0) metoer | 园豆:8 (初学一级) | 2014-04-18 16:33

@metoer: 看我给你的第二个链接。网络中的节点都必须实现 OSI 中的至少三层协议,因此都有自己的 MTU 设置,每个节点通常只接收不大于 MTU 的报文。因此分包是在第四层实现的,这一层通过响应或事先的机制确定链路的最小 MTU 值,然后按照此最小值来分包。

如何检测 MTU 值,看我给你的第二个链接中的“如何检测网关的MTU”一节。我再提醒下,ICMP 协议可能会失效,同时,你需要实现端到端的检测,也就是检测在你的链路上的所有网络节点。

 

 

 

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-04-18 16:47

@Launcher: 再次谢谢,我自己再慢慢消化。

支持(0) 反对(0) metoer | 园豆:8 (初学一级) | 2014-04-18 16:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册