【网络】TCP和UDP的区别以及TCP的三次握手四次释放

1、二者区别

1.TCP面向链接的运输层协议,UDP无链接
2.TCP是可靠交付,UDP是尽最大努力交付
3.TCP面向字节流,UDP面向报文
4.TCP是点对点链接的,UDP一对一,一对多,多对多均可以
5.TCP适合用于网页,邮件等,UDP适合用于视频,语音广播等

TCP(Transmission Control Protocol):

可靠的、面向链接的协议(eg:打电话)、传输效率低全双工通讯(发送缓存&接收缓存)、面向字节流。算法

使用TCP的应用:Web浏览器;电子邮件、文件传输程序。浏览器

UDP(User Datagram Protocol)      

不可靠的、无链接的服务,传输效率高(发送前时延小),一对1、一对多、多对1、多对多、面向报文,尽最大努力服务,无拥塞控制。缓存

使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。网络

2、为何UDP有时比TCP更有优点?

UDP以其简单、传输快的优点,在愈来愈多场景下取代了TCP,如实时游戏。计算机网络

(1)网速的提高给UDP的稳定性提供可靠网络保障,丢包率很低,若是使用应用层重传,可以确保传输的可靠性。视频

(2)TCP为了实现网络通讯的可靠性,使用了复杂的拥塞控制算法,创建了繁琐的握手过程,因为TCP内置的系统协议栈中,极难对其进行改进。server

采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会愈来愈大,基于UDP对实时性要求较为严格的状况下,采用自定义重传机制,可以把丢包产生的延迟降到最低,尽可能减小网络问题对游戏性形成影响。blog

TCP三次握手的过程

第一次握手,发送SYN报文,传达信息:“你好,我想创建链接”;
第二次握手,回传SYN+ACK报文,传达信息:“好的,能够创建连接”;
第三次握手,回传ACK报文,传到信息:“好的,我知道了,那咱们链接”。而后就创建链接了。在发送报文以前各方都要确承认以进行链接。
之因此采起三次握手机制,不过是为了信息传输的可靠性。

二次握手可能致使的问题:

 

      

        如上图所示,若是仅仅是2次握手的话,可能出现的问题以下:游戏

       Host A发送的数据包因为网络的缘由,出现了滞留,即延时到达了HostB。此时,B觉得HostA发来了请求,因而就向HostA发送确认报文,以创建链接。而HostA收到报文后,因为其没有向HostB发起创建链接的请求,所以不会理睬HostB的确认,也不会向HostB发送数据。而此时的B认为已经创建起链接了,就等待HostA发送的数据,致使HostB的资源白白浪费!资源

另外一种表述:

谢希仁版《计算机网络》中的例子:
"已失效的链接请求报文段”的产生在这样一种状况下:
client发出的第一个链接请求报文段并无丢失,而是在某个网络结点长时间的滞留了,以至延误到链接释放之后的某个时间才到达server。
原本这是一个早已失效的报文段,但server收到此失效的链接请求报文段后,就误认为是client再次发出的一个新的链接请求。
因而就向client发出确认报文段,赞成创建链接。

假设不采用“三次握手”,那么只要server发出确认,新的链接就创建了。
因为如今client并无发出创建链接的请求,所以不会理睬server的确认,也不会向server发送数据,但server却觉得新的运输链接已经创建,并一直等待client发来数据。
这样,server的不少资源就白白浪费掉了。
采用“三次握手”的办法能够防止上述现象发生。
例如刚才那种状况,client不会向server的确认发出确认,server因为收不到确认,就知道client并无要求创建链接。”

这个例子很清晰的阐释了“三次握手”对于创建可靠链接的意义。

TCP三次握手之打电话的例子

  A : 你好我是A,你听获得我在说话吗

  B : 听到了,我是B,你听到我在说话吗

  A : 嗯,听到了

  创建链接,开始聊天!

四次挥手过程

为何TCP协议终止连接要四次?

一、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(固然确认信号仍是能够发),就会发FIN给主机B。

二、主机B收到A发送的FIN,表示收到了,就会发送ACK回复。

三、但这是B可能还在发送数据,没有想要关闭数据口的意思,因此FIN与ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给主机A。

四、A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL之后,没有收到B传来的任何消息,知道B已经收到本身的ACK了,A就关闭连接,B也关闭连接了。

通俗例子:

A:“喂,我不说了。”A->FIN_WAIT1

B:“我知道了。等下,上一句还没说完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2

B:”好了,说完了,我也不说了。”B->LAST_ACK

A:”我知道了。”A->TIME_WAIT | B->CLOSED

A等待2MSL,保证B收到了消息,不然重说一次”我知道了”,A->CLOSED

相关文章
相关标签/搜索