不需要重发的数据用UDP发送更高效
- 向DNS服务器查询IP地址的时候我们用的是UDP协议。
- 为了实现可靠性,我们就需要确认对方是否收到了我们发送的数据,如果没有还需要再发一遍
- 要实现上面的要求,最简单的方法是数据全部发送完毕之后让接收方返回一个接收确认。这样一来,如果没收到直接全部重新发送一遍就好了,根本不用像TCP一样要管理发送和确认的进度。但是,如果漏掉了一个包就要全部重发一遍,怎么看都很低效。为了实现高效的传输,我们要避免重发已经送达的包,而是只重发那些出错的或者未送达的包。TCP之所以复杂,就是因为要实现这一点
- 在某种情况下,即便没有TCP这样复杂的机制,我们也能够高效地重发数据,这种情况就是数据很短,用一个包就能装得下。如果不使用TCP,也不需要发送那些用来建立和断开连接的控制包了。此外,我们发送了数据,对方一般都会给出回复,只要将回复的数据当作接收确认就行了,也不需要专门的接收确认包了。
控制用的短数据
- DNS查询等交换控制信息的操作基本上都可以在一个包的大小范围内解决,这种场景中就可以用UDP来代替TCP
- 只要在从应用程序获取的数据前面加上UDP头部,然后交给IP进行发送就可以了
- 接收也很简单,只要根据IP头部中的接收方和发送方IP地址,以及UDP头部中的接收方和发送方端口号,找到相应的套接字并将数据交给相应的应用程序就可以了
- 遇到错误或者丢包也一概不管
- 出错时就收不到来自对方的回复,应用程序会注意到这个问题,并重新发送一遍数据