如果想要愉快地进行上网冲浪、聊天、视频通话,那么有两个网络协议你不得不知道——
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)
OSI 和 TCP/IP 模型在传输层定义两种传输协议:TCP(或传输控制协议)和 UDP(或用户数据报协议)。
UDP
指的是用户数据报协议,是一种不可靠无连接、实时性高的协议,在数据发送前,不需要提前建立连接,所以可以更高效地传输数据。但可靠性无法保证,UDP只管把数据送出去,接受者有没有收到也不管。
UDP 在许多方面非常有效。当某个程序的目标是尽快地传输尽可能多的信息时(其中任意给定数据的重要性相对较低),可使用 UDP。ICQ 短消息使用 UDP 协议发送消息。
许多程序将使用单独的TCP连接和单独的UDP连接。重要的状态信息随可靠的TCP连接发送,而主数据流通过UDP发送。
TCP
TCP的目的是提供可靠的数据传输,并在相互进行通信的设备或服务之间保持一个虚拟连接。TCP在数据包接收无序、丢失或在交付期间被破坏时,负责数据恢复。它通过为其发送的每个数据包提供一个序号来完成此恢复。记住,较低的网络层会将每个数据包视为一个独立的单元,因此,数据包可以沿完全不同的路径发送,即使它们都是同一消息的组成部分。这种路由与网络层处理分段和重新组装数据包的方式非常相似,只是级别更高而已。
为确保正确地接收数据,TCP要求在目标计算机成功收到数据时发回一个确认(即 ACK)。如果在某个时限内未收到相应的 ACK,将重新传送数据包。如果网络拥塞,这种重新传送将导致发送的数据包重复。但是,接收计算机可使用数据包的序号来确定它是否为重复数据包,并在必要时丢弃它。
TCP适用场景:
适用于对传输质量要求较高,以及传输大量数据的通信场景(如文件传输)。
在需要传输可靠数据的场合通常会选择使用TCP通信协议。
比如QQ/微信/支付宝等通信软件的账户登录和支付相关功能是通常采用可靠的TCP通信协议来实现。
TCP与UDP区别总结
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道;UDP则是不可靠信道
问题
1、UDP不是不可靠吗?为什么QQ发信息用的是UDP,不怕信息对方没收到吗?
答:QQ虽然是用UDP发送信息,但是其实QQ在后台是用TCP与服务器相连的。对于利用UDP发出去的信息,服务器有一套机制保证信息不会丢失。
事实上我们在后面也可以自己设计类似的机制:比如我和你通过UDP收发信息,约定下线之前会相互通知,我收到你的信息之后我会给你回一个“确认收到的信息”。如果你给我发了一个信息,等待了好久都没有收到我的“确认收到”,我也没有给你发“下线通知”,那就代表这个数据包很可能已经丢失了,你要重新给我再发一次。自行设计类似这种的UDP应答机制,可以保证一定的可靠性。
2、UDP不是不可靠吗?为什么音视频通话用的是UDP?
答:首先要解答这个问题,我们首先要知道声音是如何由麦克风输入到网络中传播的。声音通过麦克风采样、量化(模数转换,位数越高还原越好,一般设备是16位)、编码成二进制数据之后输入到对应的设备文件中,然后对应的软件会从该设备文件中一次一次遵循MTU的容量标准读取一定字节的数据并封装成UDP包发送出去。
人说话的时候声音的频率是300hz-3400hz, 而我们耳朵听力范围是20hz~20000hz。根据奈奎斯特采样定律,当采样频率大于信号中最高频率的2倍时,采样之后的数字信号完整地保留了原始信号中的信息。也就是说实际上采样频率为6800hz(一秒钟采样6800次)就已经够我们听清楚对方在说些什么了,为了保证一定的容错率,一般最低采样频率为8khz。而人耳听力极限为20khz,也就是说当采样频率大于40khz的时候理论上我们人耳已经分辨不出和原声的区别了,抽样频率44100Hz则是理论上的CD音质界限了。
我们平时通过网络进行语言聊天显然不需要CD音质那么高的要求(如果你是和周杰伦、陈奕迅打电话则另说),8khz已经够满足我们的日常需求了。如果采样频率从是8khz,采样位数为16位,假设一个包携带的用户数据大小为548字节(在Internet环境下,将UDP数据控制在548字节以下最理想),也就是一秒钟可以生成30个UDP包。即使网络非常不好,出现了部分丢包的情况,也能勉强知道对方在说什么。
同理在线视频聊天也是如此,丢了几个包可能就是画质没那么清晰、没那么顺畅,但实时性高其实并不太影响我们日常使用。
如果用tcp进行聊天的话,因为它效率非常低。很有可能你女朋友和你说她吃完饭准备洗澡了,电话这头的你还是以为女朋友在吃饭(tcp传输效率低,导致延迟很高)。