乐趣区

关于java:图文并茂讲解TCP和UDP协议的原理以及区别

TCP 和 UDP 协定的区别以及原理

最近从新认知了一下 TCP 和 UDP 的原理以及区别,做一个简略的总结。

一、作用

首先,tcp 和 udp 都是工作在传输层,用于程序之间传输数据的。数据个别蕴含:文件类型,视频类型,jpg 图片等。

二、区别

TCP 是基于连贯的,而 UDP 是基于非连贯的。

tcp 传输数据稳固牢靠,实用于对网络通讯品质要求较高的场景,须要准确无误的传输给对方,比方,传输文件,发送邮件,浏览网页等等

udp 的长处是速度快,然而可能产生丢包,所以实用于对实时性要求较高然而对大量丢包并没有太大要求的场景。比方:域名查问,语音通话,视频直播等。udp 还有一个十分重要的利用场景就是隧道网络,比方:VXLAN

以人与人之间的通信为例:UDP 协定就相当于是写信给对方,寄出去函件之后不能晓得对方是否收到函件,函件内容是否残缺,也不能失去及时反馈,而 TCP 协定就像是打电话通信,在这一系列流程都能失去及时反馈,并能确保对方及时接管到。如下图:

三、TCP 通信的过程:

tcp 是如何保障以上过程的?

分为三个步骤:三次握手,传输确认,四次挥手。三次握手是建设连贯的过程。

四、三次握手:

当客户端向服务端发动连贯时,会先发一包连贯申请数据,过来询问一下,是否与你建设连贯?这包数据称之为 SYN 包,如果对端批准连贯,则回复一包 SYN+ACK 包,客户端收到之后,发送一包 ACK 包,连贯建设,因为这个过程中相互发送了三包数据,所以称之为三次握手。

为什么要三次握手而不是两次握手?

这是为了避免,因为已生效的申请报文,忽然又传到服务器,引起谬误,这是什么意思?

假如采纳两次握手建设连贯,客户端向服务端发送一个 syn 包申请建设连贯,因为某些未知的起因,并没有达到服务器,在两头某个网络节点产生了滞留,为了建设连贯,客户端会重发 syn 包,这次的数据包失常送达,服务端发送 syn+ack 之后就建设起了连贯。

然而第一包数据阻塞的网络忽然复原,第一包 syn 包又送达到服务端,这时服务端会认为客户端又发动了一个新的连贯,从而在两次握手之后进入期待数据状态,服务端认为是两个连贯,而客户端认为是一个连贯,造成了状态不统一,如果在三次握手的状况下,服务端收不到最初的 ack 包,天然不会认为连贯建设胜利。

所以三次握手实质上来说就是为了解决网络信道不牢靠的问题,为了在不牢靠的信道上建设起牢靠的连贯,通过三次握手之后,客户端和服务端都进入了数据传输状态。

五、数据传输

数据传输:

一包数据可能会被拆成多包发送,如何解决丢包问题,这些数据包达到的先后顺序不同,如何解决乱序问题?

针对这些问题,tcp 协定为每一个连贯建设了发送缓冲区,从建设链接后的第一个字节的序列号为 0,前面每个字节的序列号就会减少 1,发送数据时,从数据缓冲区取一部分数据组成发送报文,在 tcp 协定头中会附带序列号和长度,接收端在收到数据后须要回复确认报文,确认报文中的 ack 等于承受序列号加长度,也就是下包数据发送的起始序列号,这样一问一答的发送形式,可能使发送端确认发送的数据曾经被对方收到,发送端也能够发送一次的间断的多包数据,承受端只须要回复一次 ack 就能够了。如图:

六、四次挥手:

处于连贯状态的客户端和服务端,都能够发动敞开连贯申请,此时须要四次挥手来进行连贯敞开。假如客户端被动发动连贯敞开申请,他给服务端发动一包 FIN 包,标识要敞开连贯,本人进入终止期待 1 装填,服务端收到 FIN 包,发送一包 ACK 包,标识本人进入了敞开期待状态,客户端进入终止期待 2 状态,这是第二次挥手,服务端此时还能够发送未发送的数据,而客户端还能够承受数据,待服务端发送完数据之后,发送一包 FIN 包,最初进入确认状态,这是第 3 次挥手,客户端收到之后复原 ACK 包,进入超时期待状态,通过超时工夫后敞开连贯,而服务端收到 ACK 包后,立刻敞开连贯,这是第四次挥手。

为什么客户端要期待超时工夫?这是为了保障对方曾经收到 ACK 包,因为假如客户端发送完最初一包 ACK 包后开释了连贯,一旦 ACK 包在网络中失落,服务端将始终停留在 最初确认状态,如果期待一段时间,这时服务端会因为没有收到 ack 包重发 FIN 包,客户端会响应 这个 FIN 包进行重发 ack 包,并刷新超时工夫,这个机制跟第三次握手一样。也是为了保障在不牢靠的网络链路中进行牢靠的连贯断开确认。

七、UDP 协定

udp: 首先 udp 协定是非连贯的,发送数据就是把简略的数据包封装一下,而后从网卡收回去就能够了,数据包之间并没有状态上的分割,正因为 udp 这种简略的解决形式,导致他的性能损耗非常少,对于 cpu,内存资源的占用也远小于 tcp,然而对于网络传输过程中产生的丢包,udp 并不能保障,所以 udp 在传输稳定性上要弱于 tcp。

所以,tcp 和 udp 的次要区别:tcp 传输数据稳固牢靠,实用于对网络通讯品质要求较高的场景,须要准确无误的传输给对方。比方,传输文件,发送邮件,浏览网页等等,udp 的长处是速度快,然而可能产生丢包,所以实用于对实时性要求较高然而对大量丢包并没有太大要求的场景。比方:域名查问,语音通话,视频直播等。

udp 还有一个十分重要的利用场景就是隧道网络,比方:VXLAN.

起源:https://blog.csdn.net/weixin_…

退出移动版