TCP/IP-复习笔记(1)UDP

来源:互联网 发布:清华软件学院排名 编辑:程序博客网 时间:2024/06/10 05:34

UDP协议是一个面向数据报的无连接的不可靠的传输协议,使用UDP的进程的每个输出操作都会转化为一个完整的UDP数据报,通过一个IP数据报进行传输(此处数据报不同于分组,分组可以包含一个完整的IP数据报,也可以包含一个IP数据报的一个分片)接受进程的每个接收操作所读取的也是一个完整的UDP数据报如果接收进程指定的读取长度小于报文的实际长度则可能会出现报文截断的情形,这种情形下的处理,不同的TCP/IP实现会有不同,典型的有:1.丢弃长度超过的部分,但不一定会报告上层应用数据被截断,2.不截断,超过长度的部分在随后的读取操作中返回,3.还有的会设置一个有更多数据的标志,更多的数据在随后的读取操作中返回


1.UDP报文封装如下图:



2.UDP报文头:

A.其中16-bit的校验是可选的,如果发送方未计算校验各则报文头中该字段为全0,然而如果计算了校验和,且计算出来的校验和为0则置为全1

B.length字段为包括报文头和UDP数据在内的字节长度,该字段最小为8,UDP数据报可以只包含报文头而不包含任何数据。


3.发送主机发送UDP数据报的速率快于接收主机接收和处理数据报的速率的情况下,以致于接收主机开始丢弃数据报,此时接收主机可能发送源抑制ICMP错误报文(ICMP Source Quench Error)发送主机,发送主机收到该ICMP错误报文很有可能会对其忽略即并不会减慢发送UDP数据报的速率(因为UDP不像TCP,UDP没有流量控制机制,TCP在这种情况下会放缓发送数据的速率


4.UDP校验和,计算的范围包含头部和数据部分,具体的字段如下图(UDP length字段包含了两次)

UDP计算校验和的时候使用上图中的所有字段,包含一个伪头部其中包括一些IP头中的字段(主要防止目的地址错误而收到错误的数据包),当UDP数据报的长度为奇数时计算校验和时需要在数据报的最后填充一个字节的0(校验和的计算以16-bit为一个单元),该填充字节仅在计算校验和时出现,不会被实际传输。IP,TCP和UDP的校验和计算方法是一样的,关于校验和具体计算和验证方法,摘录原文[出自TCP/IP详解卷1-3.2节]:{To compute the IP checksum for an outgoing datagram, the value of the checksum field is first set to 0. Then the 16-bit one's complement sum of the header is calculated (i.e., the entire header is considered a sequence of 16-bit words). The 16-bit one's complement of this sum is stored in the checksum field. When an IP datagram is received, the 16-bit one's complement sum of the header is calculated.Since the receiver's calculated checksum contains the checksum stored by the sender, the receiver's checksum is all one bits if nothing in the header was modified. If the result is not all one bits (a checksum error), IP discards the received datagram. No error message is generated. It is up to the higher layers to somehow detect the missing datagram and retransmit.}。这种校验和只是比较简单的错误检测机制,作用范围有限,如果交换一个数据报中的任意两个16-bit单元,则计算得到的校和还是一致的,所这种错误和篡改不能被检测到。


5.IP分片,当发送的数据报大于下层链路的最大传输单元MTU时,使用UDP协议容易产生IP分片,如果需要IP层会将UDP数据报进行分片。IP分片是端到端的即发送端分片发送后,所经过的中间结点不会进行IP数据报的重组,只有当IP分片到达最终的目的主机时才会进行IP数据报的重组;各个分片会被封装在一个单独的IP分组当中独立的传输,如果一个IP数据报的一个分片在传输过程中丢失,则整个IP数据报都需要重新传输(重传由像TCP这样的传输层协议实现,IP层没有超时重传机制),重要网络术语IP数据报(IP datagram)和分组(packet)的区别,TCP/IP详解卷1-11.5{

Also note the terminology: an IP datagram is the unit of end-to-end transmission at the IP layer (before fragmentation and after reassembly), and apacket is the unit of data passed between the IP layer and the link layer. A packet can be a complete IP datagram or a fragment of an IP datagram.

}

以上为UDP数据报分片示意图

如果IP头中的DF(不分片标志)置位IP层将不会对需要分片传输的数据报进行分片而是直接丢弃该数据包,并发送一个需要分片但DF标志被设置的ICMP错误报文给该数据的最初发送

IP分片要求每个分的数据部分(不包括IP头)的长度为8字节的整数倍且IP头的更多分片标志置位,最后一个分片除外,IP头部中的分片偏移字段记录了该IP分片中的数据的第一个字节在整个IP数据报中的数据部分的字节偏移,同一个IP数据报的所有分片的IP头部中拥有相同的标识字段。最终目的端可以根据IP头中的更多分片标志和标识字段对IP数据报的所有分片进行重组。


6.PATH MTU为IP数据报从源结点到目的结点的过程中经过的所有链路的MTU中的最小值。同一条链路的双向的MTU值不一定相同。通过结合设置IP数据报中的DF标志和ICMP不可达需要分片错误可以进行PATH MTU的发现。


7.UDP数据报发送到具体的链路上之前需要首先通过ARP协议找到目的主机或下一跳主机的MAC地址,在ARP层收到ARP响应得到目标主机MAC地上之前,如果有多个UDP数据报等待发送,则ARP会丢弃一些数据报,只保留最后一个数据报。


8.在UDP程序的设计中可以限定本地地址(通常表现为服务程序的bind调用)也可以限定远端地址(通常表现为客户程序的connect调用),在限定远端的同时会产生一个副作用,如果本地端未限定(绑定),则系统会根据到远端的路由选择一个本地接口进行绑定操作同一个主机上可以有多个服务进程绑定到同一个端口,但绑定的地址需要不同,除第一个启动的进程之外的所有其它进程都必须指定SO_REUSEADDR套接字选项。在这种情况下本地地址匹配数据报的目的地址的端点将被选择为接收该数据报,任意匹配的端点只有在没找到匹配特定目的地址的端点的情况下才会被选择。


上表为典型的UDP服务器的本端和远端的限制情况,发往本地同一个端口的数据包,按照表格中由上往下的顺序进行匹配和往上层应用投递。


9.同一个主机上的多个进程在系统支持组播的情况下,可以绑定到相同的地址和相同的端口,通常指定SO_REUSEADDRSO_REUSEPORT套接字选项,当一个目的地址为组播地址或广播地址的数据报到达主机的指定端口时,该系统上的所有绑定到该端口的进程都将收到该数据报的一个副本,如果到达该端口的数据报的目的地址是一个单播地址,则只会有一个进程收到该数据报,具体是哪一个进程接收,则是不确定的。



10.另外在客户程序中的编制中最好不要套接字进行显示的绑定到定接口的操作,而是让系统适当的情况下选择好了数据包的路由之后进行自动绑定,这样的话首先可以避免端口已经被占用的情况的出现,再者而且也是最重要的是可以避免显示绑定的情况选择了错误地址而使从服务端到客户端的数据包找不到合适的路由而带来的服务器可以收到客户端的请求但服务器的响应客户端无法收到的微秒问题。因为服务器端需要依据客户端的请求数据包的源地址确定响应发送的目的地址,然后才能选择正确的路由将响应发送到客户端。更详细的阐述可以参考《使用TCP/IP进行网际互联-卷1》。


11.未完待完善!


原创粉丝点击