TCP/IP协议学习记录之十二:UDP--用户数据报协议
UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报;
UDP不提供可靠性,不能保证能把数据报发送到目的地 ;
UDP首部:
UDP检验和:
UDP检验和覆盖UDP首部和UDP数据(IP检验和只覆盖IP首部),TCP的检验和也覆盖首部和数据,其中UDP的检验和是可选的,但是TCP是必须的;
如果接收端没有基三检验和而接收端检测到检验和有差错,那么UDP数据报就要被偷偷丢弃而不产生任何差错报文;
UDP检验和是一个端到端的检验和,由发送端计算,由接收端验证,目的是为了发现UDP首部和数据在发送端和接收端之间发生任何改动;
注意:TCP发生检验和差错的比例与UDP相比要 高得多,很可能是因为TCP通常是远程连接,而UDP是本地通信;
IP分片
IP把接口的MTU与数据报长度进行比较,如果需要则进行分片,分片可以发生在原始端主机上,也可以发生在中间路由器上;
把一份数据报分片以后,只有达到目的地才进行重装(有些网络协议要求在下一站就重装),重装由目的端的IP层来完成,目的是为了使分片和重装对运输层是透明的。
如果数据报需要分片,但是在IP首部设置了部分片比特,则IP将不对数据报进行分片,相反把数据报丢弃并且发送一个ICMP差错报文;
当数据报被分片后,每一片都是一个分组,具有自己的IP首部,并在选择路由时与其他分组独立,所以到达目的端时数据报可能会失序,但是IP首部有足够的信息能正确组装数据报;
IP本身没有超时重传机制(TCP有超时重传机制,但UDP没有)。当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应一份数据报,没办法只重传数据报中的一个数据报片;
IP数据报指的是IP层端到端的传输单元,分组是指在IP层和链路层之间传送的数据单元,一个分组可以是一个完整的IP数据报,也可以是IP数据报的一个分片;
使用UDP很容易导致分片;
ICMP不可达差错(需要分片)
发送ICMP不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片的比特标记,如果某个程序需要路径MTU发现机制,就可以使用这个差错;
最大UDP数据报长度
I P数据报的最大长度是 6 5 5 3 5字节,这是由I P首部 1 6比特总长度字段所限制的。去除 2 0字节的 I P首部和 8个字节的 U D P首部, U D P数据报中用户数据的最长长度为6 5 5 0 7字节。但是,大多数实现所提供的长度比这个最大值小。
ICMP源站抑制差错
当一个系统接收数据报的速度比其处理速度快时,可能会产生这个差错;使用UDP时很可能产生这样的差错;
UDP服务器的设计
客户IP地址及端口号:
来自客户的是UDP数据报,IP首部包含源端和目的端IP地址,UDP首部包含了源端和目的端的UDP端口号。
目的IP地址:
应用程序需要知道数据报是发给谁的,即目的IP地址
UDP输入队列
大多数UDP服务器是交互服务器,意味着单个服务器进程对单个UDP端口上的所有客户请求进行处理,来自不同客户的差不多同时到达的请求将由UDP自动排队,接受到的UDP数据报将以其接受顺序交给应用程序;
限制本地IP地址
进入的UDP数据报如果其目的地为服务器端口,那么在任何本地接口均可接受到它;
限制远端IP地址
端点将只能接受特定IP地址和端口号的数据报;
每个端口有多个接受者
大多数的系统在某一时刻只允许一个程序端点与某个本地IP地址及UDP端口号相关联,当目的地址为该IP地址及端口号的的UDP数据报到达主机时,就复制一份传给该端点;
当UDP数据报达到的目的IP地址为广播地址或多播地址,而且在目的IP地址和端口号处有多个端点时,就向每个端点传送一份数据报的复制,但是如果UDP数据报到达的是一个单播地址,那么只向其中一个端点传送一份数据报的复制;