TCP:传输控制协议。面向连接的、可靠的、基于字节流的传输层通信协议。特点:可靠传输(应答确认)、提供拥塞控制、全双工通信(允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据)。
UDP:用户数据报协议。无连接的、 不可靠的、 面向数据报的协议。特点:提供单播,多播,广播的功能
UDP的使用场景(一般情况下尽量使用TCP协议):
资源受限的情况下:例如 nat穿透技术。在互联网技术中,UDP常用在缓存读取,保存;用在监控或终端上报。
不在乎可靠性:例如 本节的 round_trip 程序,消息本身不需要重传,使用udp足够应对。又例如在 直播、视屏通话等场景中,需要的是实时性,如果因重传而造成延迟卡顿,那么用户的使用体验将会很糟糕。
网络编程角度差别:
TCP编程:1. 并发编程需要为每个客户端都创建socket连接,为每个客户端都配备文件描述符。同时需要考虑线程间的分配问题。 2. TCP线程不安全,应避免多个线程同时读取一个文件描述符。
UDP编程:1. 并发编程中,服务端一个socket可以服务多个客户端。2. 线程安全,数据报协议自动维护消息的边界,多线程操作同一个描述符也不会出现粘包,半包的问题(每次从接收缓冲都是只能取回一个完整的包)。
使用UDP编程,需要自己确保可靠性(参考tcp实现,设计心跳机制、应答确认、超时重传等)。 注:UDP协议栈会在发送的时候分片,到了接收重组,每次组好了完整的包就丢给用户,不完整就丢掉,故,可能会出现丢包现象。
报文区别
- TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是
20
个字节,如果使用了「选项」字段则会变长的。 - UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
滑动窗口:
就是接受方每次收到数据包,在发送确认报文ack的时候,同时告诉发送方,自己的缓存区还有多少空余空间,缓冲区的空余空间,我们就称之为接受窗口大小
序号:占4个字节。序号范围是[0,2^32-1],可以对4GB数据进行编号,到达最大值后,序号会重新从0开始。该序号指的是本报文段所发送数据的第一个字节的序号。如:发送方的初始序号(Initial Sequence Number,ISN)为1000,那么第一个发送的字节将具有序号1000,第二个字节将具有序号1001,依此类推。
确认号,占4个字节。期望收到对方数据报