TCP和UDP的区别
TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP。
TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP 为提供可靠性传输,有下面几种机制。
- 顺序控制
- 重发控制
- 流量控制
- 拥塞控制
- 提高网络利用率
UDP 相对于TCP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。
TCP 和 UDP 的优缺点无法简单地、绝对地去做比较:TCP 用于在传输层有必要实现可靠传输的情况;而在一方面,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。TCP 和 UDP 应该根据应用的目的按需使用。
思考1:什么叫可靠的流协议?
- 保证连接是可靠的
- 保证数据传输是可靠的
建立可靠连接-三次握手和四次挥手
什么样的连接是可靠的?
为什么三次握手就能判断这次连接是可靠的?
为什么四次挥手就能判断这次关闭连接是可靠的?
三次握手
先看一下三次握手的流程图。
如果开始头大,恭喜你,下面的文字会比较快的帮助你理解为什么是三次握手才能建立可靠连接。
对于第一个问题。
什么样的连接是可靠的?
只用保证客户端和服务端可以正常的收发信息,不会出现应答无反应的情况,就可以说这个连接是可靠的。
对于TCP的三次握手的步骤就可以简化成如下:
A发,B收。B知道A能发
B发,A收。A知道B能发收
A发,B收。B知道A能收
握手成功!
对于第二个问题。
为什么三次握手就能判断这次连接是可靠的?
通过三次握手,可以判断当前客户端和服务端可以正常的收发信息,所以只需要三次握手就可以建立可靠的连接。
再来看看三次握手的流程图。
第一次握手,客户端给服务端一个SYN和seq标志,服务端拿到后,知道了客户端能发送信息。
第二次握手,将SYN原路返回,设置一个标志ACK为1,代表确认连接,把ack设置为收到的seq+1,代表客户端知道服务端能收发信息。seq设置为一个随机的K,等待客户端返回。
第三次握手,客户端将ACK设置为1,代表我可以了。ack设置成收到的seq+1即K+1,表示让服务端知道了客户端能收取信息。
即达到了让服务端和客户端彼此都知道了对方能正常收发自己的信息。
四次挥手
对于第三个问题。
为什么四次挥手就能判断这次关闭连接是可靠的?
所有发送的请求都已经接收到了,发送方再关闭连接就是可靠的。
看一下四次挥手的流程图
对于TCP的四次挥手的步骤就可以简化成如下:
第一次挥手 服务端知道客户端发完了
第二次挥手 客户端知道服务端知道了
第三次挥手 客户端知道服务端接收完了
第四次挥手 服务端知道客户端知道接受完了
挥手成功!
具体点的挥手流程:
- 客户端发送断开标志FIN=M,告知服务端我发送完毕请求断开了。
- 服务端发送ack=M+1,告知客户端我知道你发送完毕了。
- 当服务端接受完毕后,发送断开标志FIN=N,告知客户端我接受完毕,请求断开。
- 客户端接受后,ack标志=N+1表示我收到了你的断开请求,发送确认标志ACK,表示我可以了。
挥手再见。
建立可靠传输的机制
什么样的机制才能保证传输可靠?
这个问题就是说,我们传输的时候会出现什么意料之外的事?
- 传输包因为网络波动,到达的时间有快有慢,需要重新排序。
- 传输和接受的速度不一致,需要能控制流量。
- 传输包因为网络波动,出现丢包,需要补发。
- 其他
TCP有若干机制,可以建立可靠传输。那么代价呢?相比UDP,报文大了很多,相较而言传输效率下降了。但代价是值得的。
顺序控制
顺序控制机制是指在TCP报文部首为每个响应请求添加ack标志,建立序列号。
流量控制
什么是流量控制?
双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,这时候接收方只能把处理不过来的数据存在缓存区里(失序的数据包也会被存放在缓存区里)。
如果缓存区满了发送方还在疯狂着发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源,因此,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡才好。
对发送方发送速率的控制,我们称之为流量控制。
TCP如何进行流量控制?
接收方每次收到数据包,可以在发送确定报文的时候,同时告诉发送方自己的缓存区还剩余多少是空闲的,我们也把缓存区的剩余大小称之为接收窗口大小,用变量win来表示接收窗口的大小。
发送方收到之后,便会调整自己的发送速率,也就是调整自己发送窗口的大小,当发送方收到接收窗口的大小为0时,发送方就会停止发送数据,防止出现大量丢包情况的发生。
发送方何时再继续发送数据?
当发送方收到接受窗口 win = 0 时,这时发送方停止发送报文,并且同时开启一个定时器,每隔一段时间就发个测试报文去询问接收方,打听是否可以继续发送数据了,如果可以,接收方就告诉他此时接受窗口的大小;如果接受窗口大小还是为0,则发送方再次刷新启动定时器。
拥塞控制
简单来说是通过四种算法实现拥塞控制
- 慢开始
- 拥塞控制
- 快重传
- 快恢复
这个机制比较复杂,挖个坑下次找机会填。
提高网络利用率
TCP 以1个段为单位,每发送一个段进行一次确认应答的处理。这样的传输方式有一个缺点,就是包的往返时间越长通信性能就越低。
为解决这个问题,TCP 引入了窗口这个概念。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。
简单来说就是不等你响应,先一股脑发一些数据,反正有超时重发机制兜底,没有响应到的重发就是,面的在等待响应上浪费时间。
超时重发
利用窗口,通过超时重发的机制,建立丢包重发控制,可以避免数据丢失。
总结
- TCP 是可靠的流协议。UDP是不可靠性的数据报协议。
- TCP报文部首长度大,发送效率慢。UDP报文部首长度大,发送效率快。
- 通过三次握手可靠建立连接。通过四次挥手可靠关闭连接。
- 可靠建立传输的机制需要顺序控制、流量控制、拥塞控制,重发控制、还需要提高网络利用率等。