"TCP / IP Volume 1" Note: UDP: User Datagram

UDP: User Datagram

introduction

UDP is a transport layer protocol datagram-oriented simple: each output operation of the whole process both produces a good UDP datagram. And assembled into an IP datagram to be transmitted. TCP is a stream-oriented protocol character, all the data generated by the application with a single IP datagram sent no real contact.

UDP-IP format
UDP protocol does not provide reliable: the application data sent passed to the IP layer is not guaranteed to arrive.
Each network interface has MTU, it is imperative IP datagram fragmentation exceeded.

UDP header

UDP header format
Meaning of the fields is very easy to understand.
UDP length refers to the byte length of the UDP header and UDP data, the minimum length of eight, run empty send UDP datagram packets. The length of the IP datagram header is added to the data length of the IP datagram. So the length of the IP datagram header minus the length of the UDP datagram is an IP datagram

UDP checksum

UDP checksum covers the UDP header and data packets. IP header checksum covering the header IP. TCP and UDP checksum same checksum. But the UDP checksum is optional, TCP is mandatory.
UDP checksum field
The checksum algorithm is the number of 16bit words and a binary one. Therefore calculation will be zero filled UDP datagrams.
TCP and UDP datagram segment contains a 12-byte header portion of the dummy, in order to calculate the checksum and set.
UDP checksum is optional, and if not transmitting side and receiving side to calculate the checksum checksum error is detected, a UDP packet will be discarded
If your data is valuable, do not fully believe UDP or TCP checksum, because these are just simple test and can not detect all possible errors.

A simple example

example
UDP does not establish a connection and send a confirmation process.

IP fragmentation

The physical network layer typically limits the maximum length of transmitted data per frame, each network interface has MTU. When IP routing, determines an interface, which acquires the MTU value, it is judged whether IP fragmentation. IP fragmentation can also occur in the transmission router.

IP数据报可能被多次分片,在最终目的端组装(分片的IP数据报首部的标识符相同。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置 1。片偏移字段指的是该片在原始数据报开始处的位置),对传输层透明。
标志字段中有一个比特称作“不分片”位。如果将这一比特置1,IP将不对数据报进行分片。相反把数据报丢弃并发送一个ICMP差错报文(“需要进行分片但设置了不分片比特”,见图6-3)给起始端

IP层本身没有超时重传机制,需要高层协议来支持。TCP在超时重传时会发送完整的TCP报文段。IP分片可能发生在路由传送途中,无法区分是哪一片。TCP试图避免分片,UDP很容易导致IP分片。

IP数据报是指IP层端到端的传输单元,分组是指IP层和链路层之间传送的数据单元。一个分组可以是一个完成IP数据报,也可以是一个分片。
Examples UDP fragmentation

ICMP不可达差错(需要分片)

ICMP不可达错误的另一种情况是IP首部设置了分片的标识,但是到达目的端的最小MTU,小于发送时封装的帧。
RFC 1191[Mogul and Deering 1990]描述了路径MTU的发现机制。
ICMP unreachable message format one

用traceroute确定路径MTU

使用traceroute程序可以测试与目标端的所有路由。在此基础上,设置IP首部不可分片的bit标识位。调整分组大小为出口接口的MTU,如果收到目标端口不可达差错ICMP报文,标识该路径最小MTU时出口MTU,否则会收到ICMP不可分片差错报文,如果是新的格式,有返回下一站网络的MTU,就设置该值大小的分组,不然就设置瞎猜,二分呗。RFC规定MTU的值个数是有限的。可以使用规定的值尝试,然后二分。
最终可知,广域网上大多数链路都支持512字节的分组处理,可以使用此特性测试最大的分组不分配报文大小

采用UDP的路径MTU发现

Network topology
The path MTU discovery using UDP

UDP和ARP之间的作用

在一台网上发送8192字节UDP数据报时的报文交换
Here Insert Picture Description
8192字节的UDP数据报会产生几个分组?
答: 8192字节的UDP数据报预计产生6个IP分组。一般MTU是1500。5个1500字节的帧,和剩下的UDP数据报组成的帧
报文交换的流程?
答:arp高速缓存表是空的情况下,可以看到非常短的时间内IP进行分片选路,并发起了ARP请求,一共请求了6次。但是只发送最后一片数据报片(第9行)。arp应答了7次,多了一次。
为什么只发送了最后一片数据报片?
答:RFC要求防止这种类型ARP洪泛(ARP flooding),即以高速率重复发送到同一个IP地址的ARP请求。建议最高速率是每秒一次。还规定,ARP应该保留至少一个报文,必须是最后一个报文。对于同一份目标地址的ARP请求,只保留最后的分组。
为什么svr4没有返回组装超时的ICMP差错?
答:当一个个数据报片出现时,IP层必须启动一个定时器。这里的第一个是指第一个到达的数据报片。一般定时器为30s、60s。IP分片时,第一片会包含IP首部和UDP首部,其他片只包含IP首部,因此,此次发送端只发送了最后一片,接收端在超时后无法区分进程和端口号,默默的丢弃了数据报片,默认认为上层协议是会重传的。

最大UDP数据报长度

理论上,IP数据报的最大长度是65535字节,IP首部的长度16bit决定的。去掉IP首部20字节,UDP首部的8个字节,UDP最大用户数据报长度是65507字节。实际使用中但是往往比这个值小。

RFC要求主机必须能接收最短为576字节的IP数据报。往往UDP应用程序的设计中的限制成512字节或者更小。

数据报截断
IP能够发送和接收特定长度的数据报并不意味着应用程序可以读取该长度的数据。因此UDP编程接口允许应用程序制定每次返回的最大字节数。剩余字节的处理取决于编程接口和实现?

  • 丢弃多余的数据报
  • 在后续的读取中返回,不通知应用程序是从单个UDP数据报多次进行读取操作
  • 返回标志表明还可以获取更多数据
  • TCP为应用程序提供连续的字节流,没有任何信息边界。因此不会因为读取的长度不足导致的数据丢失

ICMP源站抑制差错

ICMP源站抑制差错:当一个系统(路由器或主机)接收数据报的速度比其处理速度快时,可能产生这个差错。即使一个系统已经没有缓存并丢弃数据报,也不要求它一定发送源站抑制报文。

ICMP source quench message format error
RFC提出了路由器不应该产生源站抑制差错报文,因为这些抑制报文也将消耗网络带宽,对于拥塞来说是一种无效而不公平的抑制差错报文。
对于UDP协议而言,这个源站抑制错误往往是不生效的。
对于TCP协议而言,接收到后,会放慢在该链接上的数据传输速度

UDP服务器的设计

讨论UDP服务器的设计,比较于客户端而言较难。

客户端IP地址及端口号
来自客户的UDP数据报。IP首部包源端和目的端的IP地址,UDP首部包含了源端和目的端的UDP端口号。当操作系统接收到一份UDP数据报时,应用程序一定可以获知源端IP和端口号

目的IP地址
一些应用程序需要知道数据报是发给谁的,即目的IP地址。
但不是所有的操作系统都会把目的IP地址交给应用程序

UDP输入队列
通常程序使用的每个UDP端口都与一个有限大小的输入队列相联系。这意味着,来自不同客户的差不多同时到达的请求将由UDP自动排队。接收到的UDP数据报以其接收顺序交给应用程序。然后,排队溢出造成内核中的UDP模块丢弃数据报的可能性存在。
Here Insert Picture Description
Here Insert Picture Description
应用程序不知道UDP输入队列何时溢出,UDP对超出数据报进行丢弃处理。没有发回任何消息给客户。也不发出ICMP源站抑制报文。最后看来UDP输出队列是FIFO,ARP输入时LIFO。

限制本地IP地址
Different IP address in the same port
应用程序可以使用相同的UDP端口,但是监听不同的ip地址。

限制远端IP地址
我看到netstat输出结果中远端IP地址和远端端口号都显示为*. * ,其意思是接受来自任何IP地址和任何端口号的UDP数据报。
可以限制远端IP地址
Here Insert Picture Description
每个端口有多个接收者
尽管多个程序使用不同的IP地址和相同的端口,从api的角度是行得通的。但是大多数系统在某一时刻往往是只允许一个端点与某个本地ip地址及udp端口号相关联。主机收到目标端口的数据时,会复制一份数据传给目标端口。

小结

习题

11.1在11.5节中,向UDP数据报中写入1473字节用户数据时导致以太网数据报片的发生。在采用以太网IEEE802封装格式时,导致分片的最小用户数据长度为多少?
IEEE802 frame format
:IP数据报最大为1492.那么不分片的最大用户数据报的大小是1492-20-8=1464字节

11.2阅读RFC791[Postel1981a],理解为什么除最后一片外,其他片中的数据长度均要求为8字节的整数倍?
:没看过。猜测跟校验位的补0有关系吧

11.3假定有一个以太网和一份8192字节的UDP数据报,那么需要分成多少个数据报片,每个数据报片的偏移和长度为多少?
:6个数据片。假设IP数据报的内容部分最长为1500。一份8192字节的UDP数据报分为8个字节的首部和8184字节的用户数据报。那么第一份长度是20(IP首部)+8(UDP首部)+1472(用户数据)=1500。偏移是0。第二份的长度是20(IP首部)+1480(用户数据)=1500,偏移是1480。第三份的长度是20(IP首部)+1480(用户数据)=1500,偏移是2960。
第四份的长度是20(IP首部)+1480(用户数据)=1500,偏移是4460。第五份的长度是20(IP首部)+1480(用户数据)=1500,偏移是5920。最后一份第的长度是20(IP首部)+(8192-7400)(用户数据)=812,偏移是7400

11.4继续前一习题,假定这些数据报片要经过一条MTU为552的SLIP链路。必须记住每一个数据报片中的数据(除IP首部外)为8字节的整数倍。那么又将分成多少个数据报片?每个数据报片的偏移和长度为多少?
:MTU是552是相对于帧的。SLIP链路一般只增加2个字节的额外内容(暂时忽略end字符导致的长度+1)。那么链路上最大的IP数据报是550。那么6片到达该链路时,进行相应的再IP分片。遵循规则相同。注意的是只有包含IP首部的数据片分片时的第一片有UDP首部,其他都不包含。

11.5一个用UDP发送数据报的应用程序,它把数据报分成4个数据报片。假定第1片和第2片到达目的端,而第3片和第4片丢失了。应用程序在10秒钟后超时重发该UDP数据报,并且被分成相同的4片(相同的偏移和长度)。假定这一次接收主机重新组装的时间为60秒,那么当重发的第3片和第4片到达目的端时,原先收到的第1片和第2片还没有被丢弃。接收端能否把这4片数据重新组装成一份IP数据报?
:不会。因为每次IP数据报的标识位不同(不同分片具有相同的IP首部)。题目的意思是第二次发送的第3片和第4片是否会跟第一次发送的第1片和第2片组装成一份IP数据报。

11.6你是如何知道图11-15中的片实际上与图11-14中第5行和第6行相对应?
:通过IP首部的标识位

11.7主机gemini开机33天后,netstat程序显示48000000份IP数据报中由于首部检验和差错被丢弃129份,在30000000个TCP段中由于TCP检验和差错而被丢弃20个。但是,在大约18000000份UDP数据报中,因为UDP检验和差错而被丢弃的数据报一份也没有。请说明两个方面的原因(提示:参见图11-4)。
:1)UDP一般是本地连接,出错可能性少。2)UDP请求端可能没有打开校验和字段

11.8在讨论分片时没有提及任何关于IP首部中的选项——它们是否也要被复制到每个数据报片中,或者只留在第一个数据报片中?我们已经讨论过下面这些IP选项:记录路由(7.3节)、时间戳(7.4节)、严格和宽松的源站选路(8.5节)。你希望分片如何处理这些选项?对照RFC791检查你的答案。
:不同的对应不同的处理方式。没看RFC

11.9 In Figures 1-8, we say that the UDP datagram is assigned based on the destination UDP port number. This is correct?
A : wrong. Different IP addresses and the same port can be used with

Published 28 original articles · won praise 4 · Views 1240

Guess you like

Origin blog.csdn.net/wengfuying5308/article/details/103867743