Fork me on GitHub

UDP协议了解学习

  udp有个最大的好处,我认为是在面对多个客户端时,不需要每个客户端建立一个接连,而是直接通过广播技术,它天然的适合多连接的场景,比如网络游戏,多人视频会议等。在网络中,丢失一两帧数据对业务不影响的而又有许多客户端连接的都可以考虑使用udp协议。真的,感觉它的广播能力在数量多的网络客户端连接中起到重要的作用。
 
  udp无连接,不需要像tcp一样经历三次握手和四次挥手的建立连接的过程,也不用担心连接中途断掉。判断udp断线,我的方法是直接在客户端写个超时多少秒后再没有收到数据就可以判定断线了,不需要tcp一样还要维护心跳,很方便。因为udp无连接,所以udp的发送和接收都是发一次就收一次,不能像tcp一样,一个已经被分割的包数据,还要多次调用Recive来接收,在udp中,也可以实现分包发送,它send一次就必须要发送完一整个分包,分好的包就不能再经过多次send了。udp server发一次,client收一次,一个包就收发完毕,不过一次发送不能超过64k。因为udp是无续的,分包时要标注包所属实体帧和包序号,假如一个实体被分为5个包,这个包对应的id为1,序号依次递增,1,2,3,4,5。下一个实体id为2,分为6个包,包内序号1,2,3,4,5,6,包内id都是2。接收端就按相同的id为一个实体,按序号顺序排列,在再每包上加一个记录一个完整实体总长度字段,就能在客户端去组成一个实体。当然考虑传输过程丢包情况,就要一个实体中的每个包记录时间戳,同一个实体都每个包的时间戳一样,时间戳跟随实体帧的传输增加而变化。客户端判断一个实体超过多少时间没收到完整的包,就丢掉该实体帧数据。
 
  在C#中无论是tcp的socket还是udp的client,它默认的接收缓冲区是8192字节,在tcp可以设置接收缓冲区超过64kb,但是在udp中,最好设置成不超过64kb,不然可能超过部分会收不到,因为它超过了udp协议的规定数据段大小了。
  有个例子参考:https://www.cnblogs.com/mobwiz/p/3715743.html,可以更明白分包的实现。
posted @ 2025-02-01 22:18  HelloLLLLL  阅读(76)  评论(0)    收藏  举报