udp分片与组包

udp优势传输速度快,丢包很严重,可靠性不是很好;而tcp传输速度相对udp来说比较慢,但是稳定可靠(三次握手,四次挥手机制,包括ACK机制,序号机制,拥塞机制等);所以工业生产的有些需求就需要中和他们的优缺点,而采用udp模式实现 tcp的方式特殊化定制需求,但是如果想讲udp做成通用标准可靠,就变成tcp了。

1 网络模型:

网络模型常见的分法有两种:OSI体系七层模型和Tcp/IP体系四层模型
udp分片与组包_第1张图片
对于osi模型只是用于理论研究,实际编程应用还是tcp/ip体系。

2 upd与MTU的关系

MTU:指通信协议的链路层上面能通过的最大数据包大小。
以太网传输的数据包字节大小范围 46~1500字节。物理特性决定的(局域网内操作就可以达到最大1500)
实际生产中internet的标准规定: 576字节
对于udp和ip层,数据链路层的头如下图
udp分片与组包_第2张图片
理论上或者说局域网内udp能发送的最大数据包长度: 1500 - 20 - 8 = 1472 字节数据
对于internet网络编程:udp能发送的最大数据包长度: 576 - 20 - 8 = 548字节数据

实际生产中网络传输中,还有运营商的pppoe协议会加上头,公网也比较复杂。
理论上局域网内udp:传输最大的数据(去掉头后)一般默认1400经验值
实际网络编程中udp:传输的最大的数据(去掉头后)一般默认500经验值.

3 udp常见的问题

udp应用关键点:
网络带宽需求较小,实时性较高;大部分应用无需维护连接;需要低功耗。
udp应用场景:
网页浏览(新浪微博采用QUIC协议);流媒体(webrtc);实时游戏(unity3d采用raknet)
udp发送数据注意问题:
数据包确认机制,序号机制,重发机制,尽量不要发大于MTU数据包,处理重排
报文与流式传输区别
报文传输:能发sendto(1400)数据,接受只能接受1400,不能recvfrom(1000),否则会出现丢掉400字节数据。
流式传输:能发send(1400)数据,接受可以接受100字节,能recvfrom(100),可以接受14次,只是多了几次用户态到内核态的切换而已

4 udp可靠性传输设计

分片原理:
1 对应用层Data进行分片,满足MTU链路层传输
2 再发送端分片编号,接受端重组分片,持续乱序data数据包重组.

每片的数据结构体:
udp分片与组包_第3张图片

头部为12个字节: 10-11保留区
客户端分片发送数据:分片_head + 分片_body 发送,环形缓冲区能够处理64k大小数据

服务器接受数据:根据分片编号重组数据
udp分片与组包_第4张图片
数据合并:分片重组
udp分片与组包_第5张图片
udp分片与组包_第6张图片
服务器接受客户端的数据,根据数据包的编号进行重组,还要根据每个数据包的同步字去重组数据
此例子还存在些可优化的地方,不能区分不同的客户端;组包(环形 buf+剥离头部) + 排序(编号)
UDP 的重传是重传单个的分片,被动的重传,没有收到服务端的 ack 就重传下
TCP 是重传整个数据包,懒惰的重传

使用tcpdump抓包分析
tcpdump -iany src host 127.0.0.1 -Xnlps0 -w aa.pcpa
tcpdump -iany src host 182.254.181.144 -Xnlps0 -w bb.pcpa
udp分片与组包_第7张图片
udp分片
udp分片与组包_第8张图片

你可能感兴趣的:(网络编程,udp,tcpip,tcpdump)