TCP协议和UDP协议数据传输

UDP协议当整个报文段到达时候,如果没有出现乱序,丢包,就会对报文进行重组,成为一个DatagramPacket(应用层角度来看的包大小),然后上交到应用层

应用层通过recive函数来接收一个数据包,接收到的数据包将放入到一个ByteBuffer中,这个buffer的大小应该要有足够大的空间

来接收这个UDP数据包,否则会造成数据丢失,分为以下2种情况:

1:buffer size >= DatagramPacket Size 则可以安全的接收整个UDP数据包

2:buffer size < DatagramPacket Size 则会导致只能将UDP数据包的前size大小的数据放入buffer中,其余的数据就丢失了,也不会

在你下一个recive中得到,因为当你调用下一个recive时从底层读入的又是一个新的数据包DatagramPacket

UDP编程时应该注意:

将数据分为足够合理的粒度,数据包的大小过大,将导致丢包率的增加,因为UDP分组的丢包率和乱序的概率都增加了,导致DatagramPacket丢失严重

如果分的太细又不方便于大文件的传输,所以选择粒度很重要,尽量应该选择较小的粒度,一般在524B的情况下DatagramPacket不会再进行UDP切分


TCP协议和UDP协议不一样,TCP协议客户端write一次数据后,将数据发送出去后,到read函数进行读取,read和UDP的recive不一样,recive一次拿走一个DatagramPacket的大小,而read是对客户端一次write出来的数据进行循环的读取,根据缓冲区的大小, 所以在TCP看来数据仿佛是流,而UDP看来数据是包,TCP一次可以write多少字节出来呢?我在本机测试使用回环地址的时候 最大测试到了100000000字节都没有报错,也不知道TCP,对最大的write数限制是如何的,不过100000000字节基本已经没有什么意义了,所以可以不用考虑这个问题,估计。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值