
简单来讲,要使用UDP来构建可靠的面向连接的数据传输,就要实现类似于TCP协议的
1. 超时重传(定时器)
2. 有序接受 (添加包序号)
3. 应答确认 (Seq/Ack应答机制)
4. 滑动窗口流量控制等机制 (滑动窗口协议)
等于说要在传输层的上一层(或者直接在应用层)实现TCP协议的可靠数据传输机制,比如使用UDP数据包+序列号,UDP数据包+时间戳等方法。
目前已经有一些实现UDP可靠传输的机制,比如
UDT(UDP-based Data Transfer Protocol)基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。 顾名思义,UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。
TCP报头TCP报文段的报头有10个必需的字段和1个可选字段。报头至少为20字节。报头后面的数据是可选项。
1、源端口号(16位)
标识发送报文的计算机端口或进程。一个TCP报文段必须包括源端口号,使目的主机知道应该向何处发送确认报文。
2、目的端口号(16位)
标识接收报文的目的主机的端口或进程。
3、序列号(32位)
用于标识每个报文段,使目的主机可确认已收到指定报文段中的数据。当源主机用于多个报文段发送一个报文时,即使这些报文到达目的主机的顺序不一样,序列号也可以使目的主机按顺序排列它们。
在建立连接时发送的第一个报文段中,双方都提供一个初始序列号。TCP标准推荐使用以4ms间隔递增1的计数器值作为这个初始序列号的值。使用计数器可以防止连接关闭再重新连接时出现相同的序列号。
对于那些包含数据的报文段,报文段中第一个数据字节的数量就是初始序列号,其后数据字节按顺序编号。如果源主机使用同样的连接发送另一个报文段,那么这个报文段的序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。例如,假设源主机发送3个报文段,每个报文段有100字节的数据,且第一个报文段的序列号是1000,那么第二个报文段的序列号就是1100(1000+100),第三个报文段的序列号就是1200(1100+100)。
如果序列号增大至最大值将复位为0。
4、确认号(32位)
目的主机返回确认号,使源主机知道某个或几个报文段已被接收。如果ACK控制位被设置为1,则该字段有效。确认号等于顺序接收到的最后一个报文段的序号加1,这也是目的主机希望下次接收的报文段的序号值。返回确认号后,计算机认为已接收到小于该确认号的所有数据。
例如,序列号等于前一个报文段的序列号与前一个报文段中数据字节的数量之和。例如,假设源主机发送3个报文段,每个报文段有100字节的数据,且第一个报文段的序列号是1000,那么接收到第一个报文段后,目的主机返回含确认号1100的报头。接收到第二个报文段(其序号为1100)后,目的主机返回确认号1200。接收到第三个报文段后,目的主机返回确认号1300。
目的主机不一定在每次接收到报文段后都返回确认号。在上面的例子中,目的主机可能等到所有3个报文段都收到后,再返回一个含确认号1300的报文段,表示已接收到全部1200字节的数据。但是如果目的主机再发回确认号之前等待时间过长,源主机会认为数据没有到达目的主机,并自动重发。
上面的例子中,如果目的主机接收到了报文段号为1000的第一个报文段以及报文段号为1200的最后一个报文段,则可返回确认号1100,但是再返回确认号1300之前,应该等待报文段号为1100的中间报文段。
5、报文长度(4位)
由于TCP报头的长度随TCP选项字段内容的不同而变化,因此报头中包含一个指定报头字段的字段。该字段以32比特为单位,所以报头长度一定是32比特的整数倍,有时需要在报头末尾补0。如果报头没有TCP选项字段,则报头长度值为5,表示报头一个有160比特,即20字节。
6、保留位(6位)
全部为0。
7、控制位(6位)
URG:报文段紧急。
ACK:确认号有效。
PSH:建议计算机立即将数据交给应用程序。
RST:复位连接。
SYN:进程同步。在握手完成后SYN为1,表示TCP建立已连接。此后的所有报文段中,SYN都被置0。
FIN:源主机不再有待发送的数据。如果源主机数据发送完毕,将把该连接下要发送的最后一个报文段的报头中的FIN位置1,或将该报文段后面发送的报头中该位置1。
8、窗口(16位)
接收计算机可接收的新数据字节的数量,根据接收缓冲区可用资源的大小,其值随计算机所发送的每个报文段而变化。源主机可以利用接收到的窗口值决定下一个报文段的大小。
9、校验和(16位)
源主机和目的主机根据TCP报文段以及伪报头的内容计算校验和。在伪报头中存放着来自IP报头以及TCP报文段长度信息。与UDP一样,伪报头并不在网络中传输,并且在校验和中包含伪报头的目的是为了防止目的主机错误地接收存在路由的错误数据报。
10、紧急指针(16位)
如果URG为1,则紧急指针标志着紧急数据的结束。其值是紧急数据最后1字节的序号,表示报文段序号的偏移量。例如,如果报文段的序号是1000,前8个字节都是紧急数据,那么紧急指针就是8。紧急指针一般用途是使用户可中止进程。
11、TCP选项(0或更大)
完整的TCP报头必须是32比特的整数倍,为了达到这一要求,常在TCP选项字段的末尾补零。
12、数据部分
报头后面是可选的报文段数据部分。IP协议标准要求株距能接收最长达576字节的数据报。无其他选项的IP报头是20字节,无其他选项的TCP报头也是20字节,所以IP选项和TCP选项且含有多达536字节数据的TCP报文段无须分片就可达到目的主机。
二、UDP报头由4个域组成,其中每个域各占用2个字节,具体为:
源端口号 目标端口号 数据报长度 校验值
UDP协议使用端口号为不同的应用保留其各自的数据传输通道
数据报的长度是指包括报头和数据部分在内的总的字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)
UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。且udp必须要有校验值
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)