UDP时一个简单的传输层协议,应用层写一个消息到UDP socket,接着它被封装到UDP datagram,接着UDP datagram又被封装进IP datagram,然后发送到目的地。
它不确保是否能够发送到目的地,不保证各个数据报的先后顺序跨网络不变,也不保证每个数据只到达一次。
UDP缺乏可靠性,如果datagram达到最终目的地,但是校验检查到一个错误,或者datagram在网络中丢弃了,它不会把消息传给UDP socket,当然它也不会自动重传。
每个UDP datagram都有一个长度,这个长度是随着数据包一起传输的,但是TCP是一个byte-stream协议,没有任何记录边界。
UDP能够提供无连接的服务,因为客服端与服务端不必存在无连接的关系。
UDP提供不可靠的数据报传输,它不提供确认、序列号、RTT估计、超时、或者重发机制。
UDP不提供流量控制,快速UDP发送方很容易以对端UDP无法跟上速率传输数据报。
UDP可以是全双工的。
二、UDP输出:
application 写数据到 UDP socket
- UDP不存在socket send buffer,它只有一个send buffer size(用SO_SNDBUF设定),send buffer size 是内核可以写到socket的UPD数据报上限。如果application 写一个大于socket send buffer size 的数据报,则内核将返回EMSGSIZE错误。
- 因为既然UDP是不可靠的,它就不必保存应用进程数据的副本,因此无需建立一个真正的send buffer。
- 本端的UDP给用户数据 加上它的8字节首部构成UDP数据报,然后传给IP。
- IPv4或IPv6给UDP数据报加上IP头部构成IP数据报。
- 从一个UDP套接字的write调用成功返回表示所写的数据报或其所有片段已被加入数据链路层的输出队列。