引言
- UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。TCP是面向流字符的协议,应用程序产生的全体数据与真正发送的单个IP数据报没什么联系
- UDP不保证可靠性
- 应用程序必须关心IP数据报的长度。如果它超过网络的MTU,那么就要对IP数据报进行分片
UDP首部
- 端口号表示发送进程和接受进程
- TCP和UDP用目的端口号来分用来自IP层的数据。TCP和UDP的端口号是相互独立的
- UDP检验和覆盖UDP首部和UDP数据,而IP首部的校验和只覆盖IP首部,并不覆盖IP数据报中的任何数据,而且检测不出同时发生的两个16bit差错
- 统计表明TCP发生校验和差错的比例比UDP相比高很多,因为通常TCP是远程连接,而UDP一般为本地通信
- UDP,TCP都是简单的校验和,不可能测出所有可能发生的差错
- UDP首部是8个字节,TCP是20个字节
IP分片
- 任何时候I P层接收到一份要发送的I P数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其M T U。I P把M T U与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
- 重新组装发生在目的地,而不是下一站
- IP首部包含了为分片与数据组装的足够信息
- 数据报到达目的端可能失序
- IP分片的缺点:丢失一片数据就要重传整个数据包,IP层没有重传的机制---由更高层TCP负责重传
- UDP容易导致分片,TCP避免分片
- 端口号在UDP首部,只能在第一片中被发现,任何传输层的首部只会在第一片中出现
- IP数据报指的是IP层端到端的传输单元,分组是指IP层和链路层之间的传输数据单元。
ICMP不可到达差错
- 发生ICMP不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在I P首部又设置了不分片( D F)的标志比特。
- 如果某个程序需要判断到达目的端的路途中最小M T U是多少—称作路径M T U发现机制,那么这个差错就可以被该程序使用。
利用UDP来发现MTU
UDP与ARP之间的相互交互
- 在arp缓存为空的时候,将数据报发送,快速分片,从结果得知,每个分片都会发送ARP请求,在等待ARP应答的时候,只将最后一个报文发送给特定目的的主机,这就是ARP泛洪现象,需要避免
- 在第一个数据报到达目的地后,IP层必须启动定时器,若在规定时间内该数据报的所有分片未到达,那么这些数据报丢弃
最大UDP数据报长度
- 理论上,IP数据报最大长度是65535字节,去除20字节的IP首部和8字节的UDP首部,UDP数据报中用户数据的最长长度为65507字节
- 限制因素:a.应用程序可能受到程序接口的限制 b.第二个限制来自于TCP/IP内核实现
- UDP编程接口规定程序每次返回最大字节数,如果接收到的数据报长度大于应用程序能处理的长度,就取决于编程接口的实现,决定是否丢弃多余的数据
- TCP:为应用程序提供连续字节流,而没有边界信息。这样数据不会丢失。
ICMP源站抑制(挺新的概念)
- 当一个系统(路由器或主机)接受数据报的速度比其处理的速度快时,可能产生差错,为此需要ICMP源站抑制
- 有时发送源站抑制报文没用,因为导致其的进程已经终止。
- UDP是非可靠的协议,它只管发送,并不管是否将报发送到目的端
UDP服务器设计(关心协议上面的特性)
- 客户IP地址及端口号
- 目的IP地址
- UDP输入队列,缓存,服务器上的应用程序并不知道输入队列何时溢出,不发任何信息高速客户其数据报被丢弃。
- 限制本地的IP地址
- 限制远端的IP地址
- 每个端口有多个接收者
附录
- UDP在发送第一份数据报的时候,发送端和接收端之间没有任何通信,当对方收到数据,也没有任何确认。而TCP在发送数据的第一个字节的时候,必须建立连接