UDP笔记
资源列表
https://zhuanlan.zhihu.com/p/101552588
1.UDP报文大小的影响因素
- UDP协议本身,UDP协议中有16位的UDP报文长度字段,即长度不能超过2^16-1=65535字节
- 以太网的MTU限制
- socket的UDP发送缓存区大小
UDP包最大长度:
(65535-8(UDP包头)-20(IP包头))=65507字节
UDP包理想长度:
MTU = 1500字节,如果UDP包大小超过MTU则会在IP层被分包。因此如果要避免分包,UDP包最大为1500字节,减去UDP头(8字节)和IP头(20字节),UDP数据大小最大为1472字节。
2.UDP发送和接收过程
(1) 发送过程
- Sendto()把数据放在Send Buffer里,通知OS来取
- OS在适当的时候,过来取数据,并发送到网络
注意:这里UDP的Send Buffer和TCP的不一样,UDP虽然会先将数据写到socket send buffer里面,但是在数据链路层发送之后就会清除对应的数据包。而在TCP中即使发出去了也不会马上清除,等到收到了ACK之后才会清楚对应的数据包。因此,在教科书上一般会说UDP没有发送缓存,但是实际上还是会有套接字发送缓存来做中转的。
问题:
- 存入数据和发送数据存在时间差(异步,有排队时延)
- 如果存入数据过多,缓存区会溢出导致丢包
(2) 接收过程
- OS不断地从网络上接收数据,缓存到Receive Buffer里
- 应用层从Receive Buffer里取数据
问题:
- Receive Buffer溢出会导致丢包
- UDP数据包的无序性和非可靠性
3.UDP的丢包问题
(1) Lost on the way out
如果socket发送缓冲区满了,后续应用程序发送的UDP包会被内核丢弃
(2) Lost in transit
UDP包在网络中传输时,遇到路由等网络中间件缓存溢出导致的丢包。或者是信道本身导致的随机性丢包
(3) Lost on the way in
当UDP包到达了接收端,但是接收端的socket接收缓冲区满了,那么这个包会被丢弃。
在linux中可以通过
netstat -suna
查看缓存导致的丢包数量
4.UDP的时延问题
(1) 传输时延
即数据包从发送端发出去的时延(发送端排队时延)
(2) 传播时延
物理层的信号传播时延
(3) 排队时延/处理时延
在路由器中的处理和排队时延(网络拥塞)
5. TCP VS UDP
(https://www.pico.net/kb/udp-vs-tcp)
1.Throughput (UDP 优于 TCP)
- UDP包头只有8字节, 而TCP包头至少20字节
- TCP的流量控制策略限制了其Throughput
2.Latency (UDP 优于 TCP)
- UDP包头小,测量RTT时有优势
- TCP的流量控制和拥塞控制会导致本地socket的排队时延
- TCP的建立连接耗时(三次握手)