【lwip】11-UDP协议&源码分析( 二 )

  • 大多数TCP/IP实现给临时端口号分配[1024, 5000]之间的端口号 。
  • 大于5000的端口号是为其他服务器预留的 。
  • 客户端只需保证该端口号在本机上是唯一的就可以了 。客户端端口号因存在时间很短暂又称临时端口号 。
  • 常见的UDP协议端口号:
    端口号协议说明0保留7echo报文回送服务器端口53DNS域名服务器端口69TFT中小型文件传输协议端口123NTP网络时问协议端口是用来同步网络中各个计算机时问的协议161SNMP简单网络管理协议端口11.5 UDP报文UDP 报文也被称为用户数据报 。
    UDP报文封装:
    • UDP的数据区就是用户程序的数据了 。
      【lwip】11-UDP协议&源码分析

      文章插图
    UDP报文格式:
    【lwip】11-UDP协议&源码分析

    文章插图
    源端口号:用户发送数据的进程锁绑定的本地端口号 。
    • 用户进程调用UDP相关业务时 , 可以不配置源端口号 。若不配置 , 内部会自动适配一个临时端口号 。
    目的端口号:远端主机用户进程接收数据绑定的端口号 。
    总长度:是UDP数据报的总长度:UDP首部+UDP数据区 。
    • 这个字段有点冗余 , 因为在IP报文中就包含了IP首部和IP总长度 , 这样能计算出UDP数据报的长度 。所以 , UDP LITE就把这个字段改为需要进行校验和的UDP报文数据长度(从UDP首部算起) 。
    • 对于UDP LITE协议 , 这个字段为0时 , 表示对整个UDP报文进行校验和计算 。参考RFC 3828 chap. 3.1
    • 对于UDP LITE协议 , 这个字段要么为0 , 要么不少于UDP报文首部长度(即是校验和至少要涵盖UDP首部) 。参考RFC 3828 chap. 3.1
    检验和:UDP协议为UDP伪首部+UDP首部+UDP数据区所有数据都加入校验和 。UDP LITE协议为“总长度”指定的长度加入校验和 , 从UDP伪首部算起 , 再加上伪首部校验和 。
    • 填入0时 , 表示不进行校验和 。而在实际计算校验和得到的结果刚好为0时 , 则向校验和字段填入0FFFF 。
      • 填入0XFFFF的可行性证明:如果校验和结果为0 , 即是其它数据的和为0XFFFF 。而对端继续校验和时 , 就是0XFFFF+0XFFFF , 结果还是0XFFFF 。
    UDP LITE:UDP协议的校验和是UDP首部和UDP数据区 , 如果数据区很多数据 , 一个校验失败就丢弃了 , 代价有点大 , 所以衍生出UDP LITE 。只校验UDP报文前面指定数据长度的数据 。一般用于实时适配、实时通话等这些要求通信速度快 , 可靠性要求不高的业务中 。
    11.6 UDP伪首部和校验和UDP校验和的计算包括了三部分:UDP伪首部+UDP首部+UDP数据区 。
    UDP伪首部包含IP首部一些字段 。其目的是让UDP验证数据是否已经正确到达目的地 。
    UDP伪首部只参与校验 , 不参与实际发送 。
    伪首部中UDP总长度和UDP首部的总长度字段一致 。
    【lwip】11-UDP协议&源码分析

    文章插图
    11.7 wireshark报文分析
    【lwip】11-UDP协议&源码分析

    文章插图
    11.8 UDP数据结构参考udp.cudp.h文件
    11.8.1 UDP首部UDP首部长度:
    #define UDP_HLEN 8UDP首部数据结构:
    struct udp_hdr {PACK_STRUCT_FIELD(u16_t src); /* 源端口号 */PACK_STRUCT_FIELD(u16_t dest); /* 目的端口号 */PACK_STRUCT_FIELD(u16_t len); /* 总长度 */PACK_STRUCT_FIELD(u16_t chksum); /* 校验和 */} PACK_STRUCT_STRUCT;

    经验总结扩展阅读