UDP协议(User Datagram Protocol-用户数据报协议)
预备知识:
1、吞吐量:主机之间实际的传输速率被称作吞吐量。其单位与带宽(单位时间内从一段传送到另一端的最大数据量)相同,都是bps(Bits per second)。吞吐量不仅衡量带宽,同时也衡量主机的CPU处理能力、网络的拥堵程度、报文中数据字段的占有份额等信息。
2、拥塞控制:
3、二进制反码计算用于IP/ICMP/IGMP/TCP/UDP等协议的校验和算法。
4、UDP的校验和是如何实现检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验???UDP校验码的接收方是如何对UDP数据报进行校验???UDP协议是运输层,伪首部里面的源IP,目的IP是IP层数据,这些数据是如何获取的?如何理解逻辑上区分层,但是不同逻辑上的分层的数据存储在同一个物理区域??
UDP协议
定义:
实现原理:
1、UDP无连接,不存在建立连接的时延,而且与TCP相比不需要维护连接状态,也就不需要跟踪包括接收和发送缓存,拥塞控制参数,序号和确定号参数。空间和时间上,在两者能同时满足条件下,UDP更具有优势。UDP常用于一次性传输比较少量数据的网络应用,或者数据的可靠传输并不重要,不可容忍TCP的拥塞控制产生较大的延迟的情况。
2、DP首部8字节,由4个字段组成,每个字段两个字节。
源端口: 源端口号,需要对方回信时选用,不需要时全部置0。
目的端口:目的端口号,在终点交付报文的时候需要用到。
长度:UDP的数据报的长度(包括首部和数据)其最小值为8(只有首部)。
校验和:检测UDP数据报在传输中是否有错,有错则丢弃,不需要全部置0。
3、UDP是不可靠服务:区别于TCP的确认机制、重传机制,因为数据传输出现问题UDP不会给应用层反馈信息,所以所有维护传输可靠性的工作需要用户在应用层来完成。
4、UDP服务缺少灵活性,因为UDP数据报处理的最小单位是报文(应用层和IP层的报文是不可分割的),所以不能控制读写数据的次数和数量!!!100字节的报文,必须一次性全部传输完成,不能分成10次,每次取10字节方式运输数据。UDP接收的应用层报文只是增加首部,接收的IP层报文只是去除首部。
5、服务器不调用listen()方法,使用recvfrom函数接受数据,使用sendto函数发送数据给客户端,客户端不需要调用connect( ),直接使用sendto函数发送数据给服务器,还是调用recv( )方法接收。
# 简单的UDP服务器
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定端口: s.bind(('127.0.0.1', 9999)) print 'Bind UDP on 9999...' while True: # 接收数据: data, addr = s.recvfrom(1024) print 'Received from %s:%s.' % addr s.sendto('Hello, %s!' % data, addr)
# 简单的UDP客户端 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) for data in ['Michael', 'Tracy', 'Sarah']: # 发送数据: s.sendto(data, ('127.0.0.1', 9999)) # 接收数据: print s.recv(1024) s.close()
6、IP层接收到UDP数据报的处理过程:当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交给应用进程。如果接收方UDP发现收到的报文中的目的端口号不正确(不存在对应端口号的应用进程0,),就丢弃该报文,并由ICMP发送“端口不可达”差错报文。
UDP校验
1、伪首部包含12个字节,伪首部并不是UDP真正的首部。只是在计算校验和,临时添加在UDP数据报的前面,得到一个临时的UDP数据报。伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。16位的UDP校验和既检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验。
2、UDP校验和计算方法:使用二进制反码运算求和再取反。注意IP数据报的校验和和UDP校验和方法一致但是内容有区别:IP数据报的校验和之检验IP数据报和首部,但UDP的校验和是把首部和数据部分一起校验。
3、将UDP数据报看成是由许多16位的子串连接起来,若UDP数据报的数据部分不是偶数个字节,则要在数据部分末尾增加一个全零字节(此字节不发送)。UDP长度是UDP首部的字节数和数据报的字节数之和。