协议端格式
udp协议采用定长报头,前8字节的端口号是发送的一方填写的,16为udp长度表示整个报文的长度,这样就可以将数据和报头分离,报文和报文之间有明显的界限划分。校验和验证数据的正确性,如果失败,直接丢弃,不通知不保证可靠性
特点
无连接:知道对端的ip和端口号就直接传输,不需要建立连接
不可靠:没有确认机制,没有重传机制,如果因为网络故障无法发送过去,也不会给应用层返回任何错误信息
假如发送有顺序,收到的可能是乱序的,如果写满了,再收到直接丢弃,不通告
面向数据报:不能灵活的控制读写数据的次数和数量
面向数据报
应用层交给udp多长的报文,原样发送,不会拆分,也不会合并
如果发送端调用一次sendto,发送100个字节,那么接收端也必须调用一次recfrom,接收100个字节,而不能循环调用10次recvfrom,每次接收10个字节
缓冲区
没有真正意义的发送缓冲区,sendto直接交给内核,传输层直接向下网络层交付
有接收缓冲区,但是不能保证收到的和发送的顺序一致,如果满了,再到达的数据就会丢弃
udp的socket能读也能写,叫做全双工
注意事项
首部有一个16位的最大长度,能传输的数据最大长度是64k(包含udp首部)
如果传输数据超过64k,需要再应用层手动分包,多次发送,并在接收端手动拼装
udp的应用层协议
- NFS:网络文件系统
- TFTP:简单文件传输协议
- DHCP:动态主机配置协议
- BOOTP:启动协议(用于无盘设备启动)
- DNS:域名解析协议
还有其他个人写的udp协议
管理
udp的报头在os内部本质就是一个结构体,里面定义了诸如端口号,长度等数据格式。填充报头就是给这些数据赋值,将需要发送的数据和报文封装在缓冲区内,就形成了报文
在同一时间有很多客户端通信,所以需要将这些管理起来,提供一个sk_buff的结构管理这段缓冲区,开头,报文位置,结束位置等,同时也可以保存下一个缓冲区的位置,这样,就可以统一起来