TCP协议和UDP协议数据传输

来源:互联网 发布:知乎 墨子号 编辑:程序博客网 时间:2024/06/01 21:32

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字节基本已经没有什么意义了,所以可以不用考虑这个问题,估计。


原创粉丝点击