织梦网站排版能调整吗,吃什么补肾最快,网站开发人员有哪些,可以做淘宝联盟的免费网站目录
10.1 引言
10.2 UDP 头部
10.3 UDP校验和
10.4 例子
10.5 UDP 和 IPv6
10.6 UDP-Lite
10.7 IP分片
10.7.1 例子#xff1a;IPV4 UDP分片
10.7.2 重组超时
10.8 采用UDP的路径MTU发现
10.9 IP分片和ARP/ND之间的交互
10.10 最大UDP数据报长度
10.11 UDP服务器…目录
10.1 引言
10.2 UDP 头部
10.3 UDP校验和
10.4 例子
10.5 UDP 和 IPv6
10.6 UDP-Lite
10.7 IP分片
10.7.1 例子IPV4 UDP分片
10.7.2 重组超时
10.8 采用UDP的路径MTU发现
10.9 IP分片和ARP/ND之间的交互
10.10 最大UDP数据报长度
10.11 UDP服务器的设计
10.11.1 IP地址和UDP端口号
10.11.2 限制本地IP地址
10.11.3 使用多地址
10.11.4 限制远端IP地址
10.11.5 每端口多服务器的使用
10.11.6 跨越地址族IPv4和IPv6
10.11.7 流量和拥塞控制的缺失
10.12 UDP/IPV4和UDP/IPV6数据报的转换
10.13 互联网中的UDP
10.14 与UDP和IP分片相关的攻击
10.15 总结 10.1 引言
UDPUser Datagram Protocol用户数据报协议。一种传输层协议。 IPv4中协议字段值17。 特点 有消息边界。 开销更小因为没有TCP复杂机制。 当UDP应用程序每次调用send/write就发出一个UDP数据报。 而TCP不一定因为TCP可能分段重组。
即TCP应用程序执行多次send/write调用会组合成一个数据包发送或可能一个send/write调用被分成多个数据包发送。
10.2 UDP 头部
头部格式如下 字段 源端口 目的端口 长度UDP报文总长度包括头部和数据。 校验和校验整个UDP报文。 每个socket在创建时必须指定协议类型TCP或UDP并绑定到特定端口。
因此一个套接字不能同时监听TCP/UDP相同端口。 一个主机可以创建两个socket分别监听TCP和UDP的相同端口号表示两种不同服务。
10.3 UDP校验和
UDP校验和校验范围覆盖UDP头部、UDP数据伪头部。 伪头部pseudo-header 计算UDP校验和时根据IP头信息生成的虚拟头部。 伪头部格式通常包括 源IP、目标IP、协议类型UDPUDP数据报总长等。 作用提供更多信息确保校验更精确。 伪头部细节如下图 NAT会改变报文IP和端口所以经过NAT后需要重新校验和。 IPv4头中也有校验和但只校验IPv4头内容不包括IP载荷。 在每跳都要重新计算因为TTL字段值减小。 小结 IPv4头的校验和字段只校验IPv4头内容。 传输层TCP/UDP头的校验和字段校验范围不仅包含传输层头还有载荷。
10.4 例子
10.5 UDP 和 IPv6
IPv6中TCP/UDP都需要伪头部来计算校验和。 Teredo隧道 IPv6数据被封装成IPv4 UDP数据报后发给Teredo中继中继解封装后把IPv6报文转发给主机。 Teredo和GRE对比 通用性 GRE更通用可封装任何类型数据包。 Teredo只用于IPv4 UDP封装IPv6数据。 实现方式 GRE不需要服务器或中继。 Teredo需要服务器和中继。
10.6 UDP-Lite
UDP校验是可选的要么校验整个UDP报文要么不校验。
UDP-Lite对UDP数据一部分校验而不是整个数据报校验。 所以未校验部分容忍比特差错。 UDP-Lite有单独的IPv4协议和IPv6协议号。算是一种新的传输层协议。 所以UDP- Lite有一个校验和覆盖范围字段表示需要校验哪部分数据。 最小值为8即只校验UDP-Lite头。 特殊值0表示校验整个负载。 socket简化程序举例设置UDP-Lite校验和覆盖范围
int main() { int sockfd socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE); int send_cscov 8; // 只校验UDP-Lite头。 setsockopt(sockfd, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, send_cscov, sizeof(send_cscov)) int recv_cscov 0; // 校验整个负载 setsockopt(sockfd, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, recv_cscov, sizeof(recv_cscov))
}
10.7 IP分片
IPv6只允许源主机分片不允许中间转发设备分片可减少中间设备负担。
IPv4既允许源主机分片也允许中间路由器分片。 IP数据报大于MTU则分片。 被分片IP数据报到了目的地才会重组这样设计有两个原因 1. 减轻中间路由器转发负担。 2. 同一数据报的不同分片可能经不同路径到达目的地此时路径上路由器不能收到所有分片搜到没有能力重组原始数据。
10.7.1 例子IPV4 UDP分片 数据报分片后每个分片IPv4头中的总长度字段被修改成该分片的总长度。 任一分片丢失整个IP数据报无法完整接收。
当TCP报文的一个分片丢失了TCP协议栈会重传整个TCP报文段所以通常尽量避免TCP分片。 除最后一个分片外所有分片数据部分应是8字节倍数。 tcpdump为了能打印除了第一个分片外的其他分片的端口号尝试重组其他分片的数据报以恢复只出现在第一个分片的UDP头部中的端口号。
10.7.2 重组超时
当任一分片最先到达时IP层就启动计时器。
若超时前未收到所有分片无法重组源报文会丢弃所有分片防止缓存耗尽。 超时时间一般30s60s。
只有接收到了第一个分片并且分片重组失败时才产生ICMP错误。
10.8 采用UDP的路径MTU发现
PMTU路径MTU 。
PMTUD路径MTU发现。 作用发现路径中MTU的最小值。发送报文不超过MTU防止分片。 UDP PMTUD原理 源端发送一个较大UDP数据报并设置 DFDont Fragment标志确保不被分片。 某个中间路由器发现数据报超过其出接口MTU则丢弃该数据报并回复Packet Too Big 的ICMP 错误消息给源端。 源端收到ICMP错误消息后得到其中指示的MTU。于是重新发送较小的UDP数据报。 重复该过程就获得一个可在所有路由器通过的MTU即路径最小MTUPMTU。 IP层会基于每个目的地址缓存一个PMTUD值有到该目的地报文则更新否则超时需要重新尝试PMTUD。 PPPoE MTU1492 1500字节去除了6字节PPPoE头部2字节PPP头部。
10.9 IP分片和ARP/ND之间的交互
10.10 最大UDP数据报长度
理论一个IPv4数据报的最大长度是65535字节。
但实际存在限制如 1. 系统setsocketopt设置收发缓存大小。 2. 应用程序。read/write指定读写大小数目小于一个UDP数据报大多数时候发生API截断数据报丢弃数据报里超过接收应用程序指定字节数的数据。 MSG_TRUNC标志位 当socket收到超过recv函数指定接收缓冲区大小时如果设置该标志位系统将丢弃缓冲区以外数据并且不报告任何错误而是正常返回已接收数据长度。 MSG_TRUNC使用方法 len recvfrom(sockfd, buf, BUF_SIZE, MSG_TRUNC, (struct sockaddr *)client_addr, client_len); 如何获取截断数据大小 socklen_t optlen sizeof(recv_len); getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, recv_len, optlen); 而TCP是连续的字节流没有消息边界不会被截断。
10.11 UDP服务器的设计
10.11.1 IP地址和UDP端口号
SO_REUSEADDR 一个socket选项当一个socket被关闭后它的端口号会继续一段时间的被占用。 在这个时间内其他程序无法绑定相同端口号出现Address already in use错误。 设置SO_REUSEADDR选项后当socket关闭后立即可以被其他程序绑定无需等待一段时间。 如何设置SO_REUSEADDR属性 int reuse 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reuse, sizeof(reuse))
10.11.2 限制本地IP地址
两种策略 1. 只有报文目的IP地址是该接收接口的IP时才接收数据。 2. 任何本地接口均可接收到目的IP是某本地接口之一的数据。
10.11.3 使用多地址
一台主机上可以开启多个服务器进程都使用同一个端口号但每个服务器进程使用不同本机IP地址。 通过ip addr add给本机设备配置多个IP地址。 此时需要用SO_REUSEADDR选项告诉系统允许重用相同的端口。
10.11.4 限制远端IP地址
可设置是否只接收来自指定源IPv4地址和端口号的UDP数据报。
10.11.5 每端口多服务器的使用
10.11.6 跨越地址族IPv4和IPv6
10.11.7 流量和拥塞控制的缺失
UDP没有流量和拥塞控制机制。
10.12 UDP/IPV4和UDP/IPV6数据报的转换
10.13 互联网中的UDP
UDP占据了的互联网流量的10% ~ 40%随着P2P应用增加UDP流量也在上升。
互联网总体流量只有极少是分片的大约分组数的0.3%字节数的0.8%而其中分片流量的68.3%是UDP。 常见分片流量如 多媒体视频流量应用层大包 VPN隧道中封装/隧道流量多层封装
10.14 与UDP和IP分片相关的攻击
常见UDP DoS攻击 1. 短时间大流量。UDP没有流控。 2. 放大攻击。伪造IP源成受害者地址并设置目的地址为广播。于是广播目的地都回复报文给该受害者。 3. 泪滴攻击。构造一个重叠偏移分片可覆盖前一分片部分数据。 4. 发送不带任何数据的分片攻击IPv4重组程序。
10.15 总结
UDP是简单协议。
需要组播广播时使用UDP可避免连接开销。
UDP使用场景多媒体P2P。