面向连接的TCP和无连接的UDP

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37345402/article/details/83959787

TCP(Transmission Control Protocol)传输控制协议:提供面向连接、可靠的数据传输服务。[数据传输单位为报文段]

UDP(User Datagram Protocol)用户数据报协议:提供无连接、尽最大努力的数据传输服务(不保证数据传输的可靠性)。[数据传输单位为用户数据段]

这是我看到的对TCP和UDP的类比理解:

  • TCP就像是打电话:当要在电活上与某个人通话之前,必须首先与这个人建立一个连接,而不论这个人身在何处。这就有些像 TCP协议中的虚电路。如果在你的通话中涉及到某些重要的信息,你可能会说:“ 你懂吗?” 说的话就很像是 TCP中的确认应答,它是用来给你一个证实的。随着时间的推移(特别是在移动电话上),人们也会问:“ 你还在听吗?”而在人们结束一次电话通话时,会用“ 再见”一类的结束语来结束通话过程。TCP也需要完成这样的一类控制功能。
  • UDP就像是发送明信片。在发送明信片时,你是不需要事先联系收信方的。你只需在明信片上简单写上你的发送内容、 注明地址并邮寄它。它同UDP的无连接方式是很相像的。因为通常写在明信片上的信息都不是很重要的,你不会要求接收到它的确认应答。同样,UDP也不涉及确认应答。

还有一个是通过亚当和夏娃的故事来讲的(ps.找不到原作者了)

亚当和夏娃分别生活在两个山头,山头之间是万丈深渊,亚当采集野果需要分享给夏娃,如果他们之间有一条索道(物理连接),野果可以顺着索道滑到夏娃那一边,可是事实上山头之间没有索道,但是亚当何等聪明,于是他想出了一个方法,假设亚当需要给夏娃10个野果,否则她会饿死。

建立连接

亚当对着夏娃大喊:爱妃,你听得到吗?

夏娃回应:孩他爹,我听得到!

亚当接着喊:那好,我扔果子给你吃,你接到果子就喊一声,一共十个。

运送货物(传送数据)

于是亚当开始扔第一个,夏娃喊收到了一个。

扫描二维码关注公众号,回复: 4228696 查看本文章

亚当扔第二个,夏娃喊收到两个。

超时重传 ( timeout retransmit) 

接收方成功接收到数据后,会回复一个ACK数据包,表示已经确认接收到ACK确认号前面的所有数据。

亚当扔第三个,可是夏娃迟迟没有回音,亚当意识到可能果子落到悬崖了,于是重新扔,夏娃喊收到第三个。

Advertised window size = 0

于是亚当连续扔了第四、五、六个,夏娃急了:孩他爹,慢点扔,臣妾忙不过来了…

Advertised window size > 0

于是亚当坐下休息,爱妃又开始叫了:继续扔吧。

亚当开始扔第七个,夏娃喊收到七个。

关闭连接

终于亚当扔完了,亚当喊:爱妃,果子扔完了,寡人去忙别的了。

夏娃回复:好的,我也休息一下,再见

亚当:再见

以上的过程类似TCP连接的过程,TCP是一个虚拟连接

  • 何为虚拟连接?

和物理连接所对应,物理连接是实实在在存在的,看得见摸得着,比如索道。而虚拟连接是不存在的,看不见摸不着,通过双向的消息、消息确认来模拟物理连接。

由于有确认机制,亚当可以确保夏娃可以收到10个果子。

什么是无连接的UDP

亚当和夏娃吵架了,任凭亚当如何大声喊,夏娃躲在树林后生闷气,一声不响,亚当害怕夏娃饿死,于是开始自说自话朝着夏娃的山头扔玉米棒子:

一个、两个、三个…

一共扔了十个,但最终扔到对方山头到底有几个,亚当没有底,也许有的玉米棒子落到悬崖了,但是这个效率高啊,可以连续扔,以前扔10个果子需要一分钟,现在只需要20秒。

亚当扔果子、扔玉米都有可能扔到悬崖下,但是扔果子为何可以确保对方收到十个?那是因为夏娃收到一个果子,然后喊收到了,如果没有收到,亚当就重新扔,直到夏娃说收到了。而扔玉米棒子对方没有确认,所以对于丢弃的情况无法知道,也无法重新扔。

TCP如何提供可靠的传输?(差错控制和流量控制)

确认:接收方成功接收到数据后,会回复一个ACK数据包,表示已经确认接收到ACK确认号前面的所有数据。发送方在一定时间内没有收到服务端的ACK确认包后,就会重新发送TCP数据包。发送方收到了ACK,表明接收方已经接收到数据,保证了数据的可靠达到。 

(ACK是TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号之前的数据段都收到了.比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性.)

超时重传:发送端根据发出的报文段在超时规定的时间内是否收到确认,从而来判断该报文段是否丢失或传输出错。

发送方在发送完数据后等待一个时间,若时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。如果是  数据在传输过程中由于网络原因等直接全体丢包,接收方根本没有接收到  的话,接收方收到二次重发的数据后,便进行ACK应答,如果 接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了,那么直接丢弃,仍旧发送ACK应答。

校验:每个TCP报文段都包括检验和字段,校验和用来检查报文段是否出现传输错误,如果报文段出现传输错误,TCP检查出错就丢弃该报文段,不给出回应,发送端会超时重传。

流量控制:当接收端来不及处理发送端发送的数据,能提示发送端降低发送的速率,防止包丢失。

拥塞控制:当网络拥塞时,减少数据的发送。


为什么UTP不能保证数据报不丢失、不延迟、不错序,仍然在目前应用中占主流?

1)TCP需要建立和拆除连接,增加了网络开销。

2)ACK的增加会使有效数据率减少

3)ACK无效时为了数据的完整性,会要求重传数据。

4)随着技术的提高,UDP出错率降低。

5)UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

6)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。

面向连接和无连接服务

下层能够向上层提供面向连接和无连接两种形式的服务。这里的“连接”是指两个对等实体为进行通信而进行的一种结合。面向连接服务在数据交换之前必须先建立连接,保留下层的有关资源,数据交换结束后,应终止这个连接,释放所保留的资源。而对无连接服务,两个实体之间不建立连接就可以通信,在数据传输时动态地分配下层资源,不需事先进行预保留。

——————————码一些介绍比较详细的博客——————————

https://blog.csdn.net/xiaobangkuaipao/article/details/76793702

https://blog.csdn.net/liuchenxia8/article/details/80428157

猜你喜欢

转载自blog.csdn.net/m0_37345402/article/details/83959787
今日推荐