tcp和udp使用总结

TCP与Udp的区别

tcp:算法

TCP 是面向链接的,而且是一种可靠的协议,在基于 TCP 进行通讯时,通讯双方须要先创建一个 TCP 链接,创建链接须要通过三次握手,握手成功才能够进行通讯tcp

一、基于链接的,可靠性高优化

二、有链接过程(3次握手过程),会有延时,实时性较差,.net

三、传输相同的数据时,TCP首部开销20字节;UDP的首部开销小,只有8个字节,TCP报头比UDP复杂,故实际包含的用户数据较少。TCP无丢包,而UDP有丢包,故TCP的开销大,UDP开销较小。cdn

四、每一条TCP链接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通讯视频

udp:blog

是一种面向无链接,且不可靠的协议,在通讯过程当中,它并不像 TCP 那样须要先创建一个链接,只要(目的地址,端口号,源地址,端口号)肯定了,就能够直接发送信息报文,而且不须要确保服务端必定能收到或收到完整的数据。它仅仅提供了校验和机制来保障一个报文是否完整,若校验失败,则直接丢弃报文,不作任何处理。排序

应用场景:进程

协议对比:get

TCP粘包、分包的解决办法

粘包的缘由:

(1)发送方引发的粘包是由TCP协议自己形成的,TCP为提升传输效率,发送方每每要收集到足够多的数据后才发送一包数据。若连续几回发送的数据都不多,一般TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。

(2)接收方引发的粘包是因为接收方用户进程不及时接收数据,从而致使粘包现象。这是由于接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据还没有被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据以后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。

粘包的解决办法————封包:

封包就是给一段数据加上包头,这样一来数据包就分为包头和包体两部份内容了。包头其实上是个大小固定的结构体,其中有个结构体成员变量表示包体的长度,这是个很重要的变量,其余的结构体成员可根据须要本身定义。根据包头长度固定以及包头中含有包体长度的变量就能正确的拆分出一个完整的数据包。

拆包: 根据封包的包头规则解析出每个完整的数据包,而后作相应的业务处理。

一篇介绍封包和拆包的文章

UDP分包发送和接收方重组数据包

分包: 分包发送(封装包的首部,包括包的大小、类型、序号、数量等)

一、在客户端将你要发送的内容(文件什么的均可以)分块,每块内容进行编号,而后发送;

二、服务端在接收到你的分块数据之后,根据你的客户端数据类容的编号从新组装;

三、通常咱们在发送数据的时候,尽可能采用比较小的数据块的方式(个人都没有超过1024的),数据块太大的话容易出现发送和接收的数据时间长,匹配出问题。

组包:

假设一个端口只接收固定一个对方数据源,这样,收到一个数据包放到缓冲里,而后在缓冲里根据帧的序号排序(每一帧的大序号是相同的,本身能够给每个小片加上小序号,包头里能够加上本次数据帧一共分多少片,收到一片就统计一下,判断是否收齐)。 当收齐后,这个帧去掉包头回调给上层。当在必定时间内该帧数据尚未收齐,就说明传输过程有丢包了,把已收到的都丢掉就能够。 当上层的应该收到回调的数据后,能够进行解码播放。不过在解码以前,先判断一下帧序列是否连续。作为视频数据,

若是中间有缺乏的,就把这一序列都丢掉,直到下一个I帧。每一个帧的序号,最好收发之间协商好,在发送的时候带上。

相关文章
相关标签/搜索