前言
TCP和UDP同属于传输层协议;一般TCP多用于数据安全性及稳定性要求比较高的场景,而UDP则多用于IM即时通讯中。
TCP协议特点
1.面向连接的协议,通信前必须先通过三次握手建立tcp连接,断开连接需要经过四次挥手释放连接;
2.基于字节流的数据传输,所以消息之间没有边界,需要处理粘包以及读半包等问题;
3.消息确认,超时重传机制,对于收到的消息,予以ack确认,如果消息发送端长时间没有收到ack确认,则重新发送该消息(重复发送次数和时间间隔是在linux内核参数可配置的);
4.流量控制,tcp连接的两端,都存在发送缓冲区和接收缓冲区,利用滑动窗口原理和各端接收缓冲区的大小,控制消息传输速率,必要时阻塞消息发送端;
5.分片和重组机制,每一种物理网络都会规定链路层数据帧的最大长度,称为链路层MTU(Maximum Transmission Unit).IP协议在传输数据包时,若IP数据报加上数据帧头部后长度大于MTU,则将数据报文分为若干分片进行传输,并在目标系统中进行重组。比如说,在以太网环境中可传输最大IP报文大小(MTU)为1500字节。如果要传输的数据帧大小超过1500字节,即IP数据报长度大于1472(1500-20-8=1472,普通数据报)字节,则需要分片之后进行传输。MSS(Maxmum Sigmentation Size)就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20字节和TCP数据段的包头20字节)所以往往MSS为1460。通讯双方会根据双方提供的MSS值的最小值确定为这次连接的最大MSS值。MTU是IP网络层分片的依据,经过tcp分片后,到网络层IP协议就不需要再分片了;
UDP协议特点
1.面向非连接的协议,通信前不需要通过三次握手建立连接,容易伪造IP进行udp flood攻击;
2.没有消息确认,超时重传,流量控制等机制,在网络环境不好的情况下,有乱序及丢包的问题;
3.基于用户数据报的传输,有消息边界,没有tcp协议的粘包及读半包问题;
4.没有消息分片及重组机制,对于应用层写入的数据,不管大小,直接封装成udp报文,传给网络层IP,由网络层进行数据的分片和重组;
总结
对于UDP协议,没有消息确认,超时重传等机制,只能在应用层进行实现,定制化的消息确认及超时重传机制,而且如果发送的UDP数据报文如果大于接收方的接收缓存区,会出现部分报文丢失的情况。