tcp为什么比udp慢_TCP和UDP那些事儿

文章开始之前我们先抛出几个问题:

大家都说TCP比UDP可靠,是这样吗?如果真是这样,那么TCP的可靠性体现在哪儿或者说TCP的可靠性通过什么手段来保证?

UDP不如TCP可靠,那么为什么数据的传输不全采用TCP的方式,非要给UDP“分一杯羹”呢?

UDP

什么是UDP

UDP是一个简单的传输层控制协议,它是无连接的数据报协议。UDP不保证会到达最终目的地,同时它也不保证各个数据报的先后顺序跨网络后保持不变,不保证相同的数据报只到达一次,由此我们可以看出UDP的不可靠性。比起TCP协议的流式特性,每个UDP的数据报都有一个长度,当对端收到数据报,该长度也将传递给对端的应用进程。

每个UDP的首部前面会额外的增加一个伪首部,用作传输层数据报的差错校验。下面我们来剖析一下UDP,看一下它的首部构造:

a84c8b5eede327b2de72a507ae169f0a.png

应用

        DNS域名解析。UDP是一个不可靠的协议,为什么域名解析这么重要的工作不交给TCP来完成而是UDP呢?我们知道TCP在真正开启数据请求之前要先建立连接,也就是我们常说的三次握手。当然可靠性的建立必然以牺牲其他利益为代价,对于TCP而言,这代价便是时间,UDP在时间的观念上便更胜一筹,当然完成域名解析一个数据报也足矣,所以使用UDP何乐而不为呢?所以有很多对可靠性没有严格要求而对时效性有极致追求的应用程序,传输层就用UDP来实现。

TCP

什么是TCP

TCP是一种面向连接的、可靠的、字节流协议。基于TCP的流式特性,所以这就要求用户自己来规划协议,划定消息边界。目前常见的方式有三种:

1.在每个要发的数据报之前附加一个数据长度,对端通过阻塞的方式进行读或写操作,直至数据结束。

2.设定一个特殊的结束标志,比如HTTP的结束标志"\r\n"。

3.每次发一个固定长度的数据报,对端也每次接收相等长度的数据内容。

同样的我们也来剖析一下TCP,看一下它的首部:

92b4736e2b0262a0cb8f2b03678b3771.png

可靠性的保证

三次握手机制建立连接:首先客户端会先向服务器发送一个数据请求,也就是SYN分节,该数据包含了数据的初始序列号、接收窗口,拥塞窗口、接收缓存的大小以及相应网卡所支持的最大数据大小等信息,同样的服务器会针对客户端的请求做一个相应的回应。接着客户端会根据服务器的回应也相应的回复一个ack消息,至此连接成功建立。如图中描述:

df6506b2ddd63b98739bf3f7d1854f0d.png

流量控制:说流量控制之前我们先讲一讲信道利用率,我们先来看一张图片:

2b374cc735c05af05a688a16ff12e32b.png

其中Td是数据报发送时间,Ta指数据报接收时间,RTT指数据报往返时间。

现在从客户端B到客户端A数据包经历的总时间T = Ta + Td + RTT;其中信道利用率可看似 = Td / T,图中我们可以看出大量的时间用来等数据包,这样是不划算的。有什么比较经济的做法呢?没错,我们可以通过不间断的发送数据报来进一步提高信道利用率,这就是所谓的滑动窗口技术。

我们来看一张接收窗口的结构图。

b52bac9f2947b71a10b72e98d0427a30.png

为了便于叙述,我们先将发送方规定为A,接收方为B。

和B一样,相应的A存在一个接收窗口大小,A的发送窗口大小由A的拥塞窗口大小和B的接收窗口大小共同决定(二者取其较小值),要说明的是发送窗口的大小受不同的网络环境和接收方的接收缓存大小的影响,也就是说TCP可以根据实际的网络情况通过动态调整各类窗口的大小来实现对流量的控制。

拥塞避免:拥塞的条件,对资源的需求总和 > 可用资源,相比于流量控制,拥塞现象是多台客户机不断发数据报导致路由器承受太多的负荷甚至死机而造成的网络拥堵。我们来看一张图:

66d64c06a9cd9d8fe870c0d81484ab3b.png

我们可以看到没有拥塞控制的网络环境是非常危险的,甚至会导致网络环境彻底瘫痪。那么TCP是怎样避免这种现象呢?早些年TCP采用慢开始算法来规避这问题,现在更多的是采用快重传、快恢复的方法。至于这两种算法的具体介绍有兴趣的小伙伴可以自己学习,在此就不再赘述。

本文作者:小组17级成员---陈新

e3fae569036677f9b0cb893313ea61c0.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值