UDP协议 .vs. TCP协议:
原理上:(TCP报文段. vs . UDP用户数据报)
TCP协议的特性:
TCP是面向连接的运输层协议,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕之后,必须释放已建立的TCP连接。
每一条TCP连接只能有两个端点,每一条TCP协议只能是点对点的。
TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复并且按序到达。
TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
TCP是面向字节流(即流入到进程或从进程流出的字节序列)。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系,但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
TCP提供流量控制和拥塞控制。
UDP协议的特性:
UDP在传送数据前不需要先建立连接,远地主机的运输层在收到UDP报文后,不需要给出任何确认。
UDP不保证可靠交付,因此主机不需要维持复杂的连接状态表。
UDP是面向报文的。UDP保存应用层交下来的报文的边界(应用层交给UDP多长的报文,UDP就照样发送),一次发送一个报文。
UDP没有拥塞控制,吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制,因此网络出现的拥塞不会使源主机的发送速率降低。(这对某些实时应用是很重要的)。
UDP支持一对一、一对多、多对一和多对多的交互通信。
UDP的首部开销小,只有8个字节,比TCP首部的最小长度20字节(如果不计任选字段)要短。
UDP无法提供的TCP特性:
1.正面确认,丢失分组重传,重复分组检测,给被网络打乱次序的分组排序。TCP确认所有数据,以便检测出丢失的分组。
2.窗口式流量控制。
3.慢启动和拥塞避免。
小结:
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
使用场合上:
UDP:非常在乎延迟,不能忍受重传的场合,比如实时音频、视频;网络极度可靠,不用考虑UDP的丢包问题,比如专门为有限局域网设计的协议;如果数据报的起止判定对程序会产生大问题,那么也可以考虑使用UDP;NAT穿透,不得不用UDP。
From UNP卷一:对于广播或多播应用程序,必须使用UDP;对于简单的请求-应答应用程序可以使用UDP,不过错误检测功能必须加到应用程序内部。错误检测至少涉及确认(增加序列号)、超时和重传。对于海量数据传输(如文件传输)不应该使用UDP。
TCP:如果不是非要使用UDP的场合(如前所述),那么使用TCP更好。
一些细节:
UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP的检验和是必需的。
UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的。
衍生问题:QQ为什么使用UDP协议而不是TCP协议?
01.当时没有epoll这种可以支持成千上万TCP并发连接的技术,所以腾讯使用了UDP,然后在UDP上面封装了一下,模拟了一下TCP,解决了大并发的问题。
02.TCP因为拥塞控制、保证有序等原因,在当时的网络状态下对带宽的利用率很低。而且因为网络抖动的原因,应用层心跳超时(一般不依靠keepalive)应用层主动断掉socket之后TCP需要三次握手才能重新建立链接,一旦出现频繁的小抖动就会使得带宽利用更低。而等待四次挥手的时间,也会占用服务器上宝贵的资源。而如果使用UDP对抗网络抖动,就可以自己去实现在应用层比TCP更快地探测和重传,一旦超过一定的时间没有收到回复,客户端可以选择马上重试或者换一个IP:PORT重试(假如你的服务像QQ一样有多个接入),在服务器端则可以果断地断掉socket。这样,,在当时的情景下,利用UDP去实现一个面向连接的协议,在当时的网络条件下,就可以尽可能地降低网络抖动的影响,同时也可以尽可能地利用整个带宽。
03.总的来说:
2.和好友发消息,客户端client采用UDP协议,但是需要通过服务器转发。腾讯为了确保传输消息的可靠,采用上层协议来保证可靠传输。如果消息发送失败,客户端会提示消息发送失败,并可重新发送。
3.如果是在内网里面的两个客户端传文件,QQ采用的是P2P技术,不需要服务器中转。
TCP协议相关:
TCP报文段的首部格式:
01.源端口与目的端口(这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接)
02.序号,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,而该序号字段值标注的则是本报文段所发送的数据的第一个字节的序号
03.确认号,是期望收到对方下一个报文段的第一个数据字节的序号
04.数据偏移,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远
05.6个控制位:
URG: 当URG = 1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送。
ACK: 在连接建立后所有传送的报文段都必须把ACK置为1。
PSH: 接收方应尽快将这个报文段交给应用层。发送方立即创建一个报文段发送出去,接收方一收到报文段,就尽快交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
RST: RST=1表面TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或者拒绝打开一个连接。
SYN: 在连接建立时用来同步序号。
FIN: 当FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
06.窗口,指的是发送本报文段的一方的接收窗口,用于告知对端本端目前允许对方发送的数据量。
07.检验和。
08.紧急指针,指出本报文段中紧急数据的字节数。