1. 爱玩数码首页
  2. 投稿

tcp和udp的区别与联系(深度解析传输控制协议TCP和UDP)

传输协议的引入:

如果两台计算机已经处于连接状态,那怎样让数据从一端传送到另外一端?(采用TCP和UDP协议)

一、TCP用户传输协议

  1. TCP协议是Transmission Control Protocol传输控制协议,TCP是一种面向连接的、可靠的、基于字节流的传输层(Transport layer)通信协议。当客户和服务器彼此传递数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据;
  2. 当客户和服务器彼此交互数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据,TCP 协议使用超时重传、数据确认等方式来确保数据包被正确地发送至目的端,故而效率低,速度慢;相当于打电话,在手机上输入号码后,点击拨号键,接收到来电信息的人需要点击接听按键才可以正常进行通话;
  3. TCP可靠传输协议,不丢包,经常用来传输文件(回值内部处理),缺点是效率低,慢,而且占用资源

二、 UDP用户传输协议

  1. UDP(User Datagram Protocol)是一种无连接、不可靠、基于数据报的用户数据协议。
  2. UDP在传输数据报前不用在客户和服务器之间建立一个连接。它只是把数据报发送出去,但是并不能保证他们能到达目的,并且没有超时重发机制,故而传输速度很快;
  3. UDP不可靠传输协议,容易丢包。但是效率高,快,占用资源少。一般游戏中数据采用UDP传输数据,可以对数据进行快速处理,可能会出现偶尔丢包的现象,但不影响整体,主要是效率高,相当于快递;

三、 TCP与UDP的区别和联系

  1. 首先它们都是传输层的协议;
  2. TCP 协议可靠,UDP 协议不可靠。可靠即指数据由A发送到B,是否能确保数据真的有送达到B;TCP 协议使用超时重传、数据确认等方式来确保数据包被正确地发送至目的端。而 UDP 协议无法保证数据从发送端正确传送到目的端,如果数据在传输过程中丢失或者目的端通过数据检验发现数据错误,则UDP协议只是简单地通知应用程序发送失败。对于 TCP 协议拥有的超时重传、数据确认等需要应用程序自己来处理这些逻辑;
  3. TCP 是面向连接的,UDP 是无连接的。这也比较好理解,因为 TCP 连接需要经历”三次握手”;
  4. TCP 服务是基于流的,而UDP是基于数据报的,基于流的数据没有边界(长度)限制,而基于数据报的服务,每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出;

总之:TCP 协议为应用层提供可靠的、面向连接的、基于流的服务。而 UDP 协议则与 TCP 协议完全相反,它为应用层提供不可靠、无连接和基于数据报的服务;

四、TCP连接中的三次握手和四次挥手

上面讲了TCP是基于连接的,需要进行三次握手,我们先用一个通俗的例子来理解一下

三次握手

A:约吗?

B:约,你约吗?

A:约。(成功建立连接)

四次挥手

A:我要走了。

B:嗯,知道了,等我再说两句。

B:说完了,你走吧。

A:走了。(成功断开连接)

tcp和udp的区别与联系(深度解析传输控制协议TCP和UDP)

第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

四次挥手

第一次挥手:客户端准备断开连接 客户端向服务器发送的报文当中的FIN位被设置为1,表示请求与服务器断开连接。 第二次挥手:服务器收到FIN报文段 服务器收到客户端发来的断开连接请求后对其进行响应,返回确认应答包(ACK报文段)。 第三次挥手:服务器发送FIN报文段 请求关闭连接 服务器收到客户端断开连接的请求,且已经没有数据需要发送给客户端的时候,服务器就会向客户端发起断开连接请求。 第四次挥手:客户端向服务器发送ACK报文段 客户端收到服务器发来的断开连接请求后对其进行响应,对服务器发送ACK报文段,服务器收到后直接关闭,客户端再等待2MSL后关闭。

tcp和udp的区别与联系(深度解析传输控制协议TCP和UDP)

五、总结一下TCP连接常见问题

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么不能用两次握手进行连接?

答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。

可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

【问题3】如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至87172970@qq.com举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论