根据上篇我们知道,tcp与udp 都是作用于传输层的数据传输协议。既然作用相同,那么两种协议之间就必然会存在相同之处与原理上的区别。
首先我们来看tcp:
tcp是一种有链接的数据传输协议,也就是说在传输数据之前两台主机或者客户端与用户之间必须先建立连接才能进行数据传输。
TCP三次握手连接过程如图:
如图,主机A想要与主机B建立tcp建立,那么需要先向主机B发送SYN连接请求包完成第一次握手。
当主机 B收到主机A发送的SYN包后会向主机A回复SYN+ACK包,当主机A收到SYN+ACK包之后两台主机就已经初步建立了连接并完成了第二次握手。
初步建立连接之后主机A会向主机B发送ACK包,以最终完成两者之间的建立,并确定这是两者之间唯一的连接,完成第三次握手。
其实可以发现两台主机在第二次握手时就已经建立了连接,那这是为什么要进行第三次握手呢?
这其实是为了防止在不可靠网络中建立连接时出现错误。比如,主机A在需要建立连接时向主机B发送的SYN包因为一些网络原因被滞留在网络中。在超时之后主机A就需要再次发送SYN包。这次的网络通畅两台主机经过第二次握手之后成功建立起了连接。可如果这是,刚才被滞留在网络中的SYN包因为网络的恢复又发送到了主机B主机比再次向主机A发送SYN+ACK包。这时主机B就会形成两个连接,而主机A依然是一个连接就会出现数据传输的错误。
所以从本质上来说,三次握手就是为了在不可靠的网络上建立起可靠的连接
前面说tcp是可靠的连接,那么必然就会有可靠的数据传输方法来解决丢包与乱序问题。
tcp传输数据时会有一个发送缓冲区,在这个缓冲区中数据分割成序号从0开始随后逐个➕1的多个数据内容。发送时会从按顺序从中取出数据内容形成格式为:(序列号➕长度➕数据内容)的数据包。
接收端接收之后会恢复格式为:(ACK➕序列号➕长度)的数据包,同时发送端接收到以后便知道了下一个数据包的起始序列号。
在这样的传输模式下,即便出现数据包丢失的情况发送端也可以准确的重新发送。
而接收端在完全接受以后也可以根据序列号与长度重组数据。
在完成数据传输之后tcp连接就要通过四次挥手断开。
四次挥手过程如图:
假设主机A想要关闭链接,那么就要先向主机B发送FIN数据包,当主机B收到之后如果同意断开链接,就会向主机A回复ACK包,当主机A收到以后就完成了第一次挥手
主机B在回复ACK包以后同时也会向主机B发送FIN这时就完成了第二次挥手
当主机B收到来自A的ACK包后便完成了第三次挥手。
主机A在发送完ACK包后等待超时,超时之后便断开了链接。此时便完成了第四次挥手两台主机彻底断开链接。
这里我们注意到,主机A在发送完ACK包之后会有一个等待时间。这个等待时间是为了确定主机B收到了ACK包并且成功断开。如果主机A的ACK在网络中滞留,没有被主机B收到,那么主机B就会重新发送FIN包,但主机A在此前已经断开,主机B就将会永久的陷入待确认状态。
这和建立连接时的第三次握手相同,为了在不可靠的网络中实现可靠的断开。
与TCP协议相比,UDP数据传输是建立在非链接的基础之上的。
udp 传输数据就是将数据简单的封装一下然后在通过网卡发送出去即可,数据包之间并没有状态上的链接。
正因为如此,与tcp相比udp的性能损耗非常少,内存资源占用很少。
当然udp也并不对传输过程中产生的丢包保证。
综上而言我们可以总结出: