TCP 与 UDP 的区别与联系

您所在的位置:网站首页 gnpgdp区别与联系 TCP 与 UDP 的区别与联系

TCP 与 UDP 的区别与联系

2023-09-04 18:21| 来源: 网络整理| 查看: 265

复习: TCP 四层模型: 应用层:Telnet FTP email 运输层:TCP UDP 网络层:ip ICMP igmp 链路层:设备驱动程序以及接口 OSI七层 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 UDP与TCP的联系与区别: 1、联系 首先,这两个都是运输层协议;都是建立在ip之上的 TCP叫做流式套接字,UDP是报文套接字

为什么要在 IP 之上?

ip中包含的信息有:源ip目的ip 然而一个网络中的进程的自由度是5: 源ip目的 ip 源端口目的端口协议,也就是说通过ip可以确定到计算机, 但是没有办法将消息发送给具体的进程,而这个工作是交给TCP、UDP 来完成的。也就是说,TCP、UDP都对ip来的数据进行的分发,交给 上层应用。但是在这个过程中,TCP做的工作要比UDP多很多。 2、区别

tcp基于连接、UDP无连接。

这就决定了TCP是P2P的,而UDP是支持一对一,一对多,多对一,多对多的:因 为它根本就没有连接(但是还是可以绑定端口),所以一个UDP套接字可以给其他 任意套接字发东西。(这里有一个问题叫做 确认UDP套接字。多个套接字绑定一个 端口的时候,程序员希望负载均衡,但实际上是达不到的,因为每次都只会命中一 个套接字。解决方案是打开***选项)

       这里可以展开说连接与可靠是个什么意思:我的理解是,TCP通过一系列机制(确认号,重传等),尽管底层是不可靠的,但是不可靠发生的时候,TCP总可以纠正错误,保证用户不需要操心数据的到来是乱序的,或者数据丢失了,用户通过TCP建立连接之后,就可以放心的认为数据是对着的。 而TCP实现数据的可靠传输,是通过事先(三次握手)双发约定好的一些数据(序列号,确认号,窗口大小)来完成的,这个东西就叫做连接,所以必然是点对点的,不可能对多,也不可能中通换对象。        但是UDP就不管这么多,UDP完成的是最初的任务:原本的任务就是要解决IP无法将数据递交给用户期望的进程的问题的。所以UDP的结构相对简单,占用的资源少,通过ip+端口号,将数据发过去就好了,也不管数据丢失没有,接收方也不管数据有没有到达,有没有重复。所有这也工作都要交给上层应用完成,也就是所谓的 网络中的某个问题,在各层都可以解决,如果底层不解决就让上层解决。 既然UDP如此不方便,为什么还要用UDP?尤其是我们熟悉的DNS似乎就是用UDP实现的?A:UDP开销小,负载消耗小,在一些对精度要求不大,但是对速度要求大的场合,用UDP是合理的,即使一次失败,重试的损失也不大。就拿DNS来说,它的任务就是通过网址找到IP然后返回,一次不行就再来一次,开销很小,但是要尽量快,要降低服务器负载。 但是DNS服务器之间进行同步的时候用的就是TCP,这种场合要保证数据的正确。

最后总结一下:TCP是有连接的可靠的传输。 UDP是无连接的不可靠的传输。

我们来看看TCP比UDP多做了哪些事情:

1)首先,在发送数据的时候: TCP在发送大块数据的时候,会对数据进行分段,每个分段可以携带的数据为1个 MSS(MSS是TCP双发协定好的报文长度,这个长度既要尽量多的发送用户数据, 又要避免IP分片,所以定一个合理的MSS是一件困难的事情),然后TCP将决定一 次发送多少段数据过去(这个时候就要考虑对方能处理多少数据——滑动窗口、以及 网络的情况允许发送多少数据——拥塞控制,这两点其实就是TCP的流量控制与拥 塞控制) TCP在发送大量小的数据的时候,为了充分利用带宽,会启动Nagle算法 (可以配置是否启动),对较小的数据进行合并。(但是这样就又会造成粘包问 题,处理方法有短连接,应用层分包 等。。。) UDP发送的时候无论大小,该发就发(所以没有粘包问题,你看多好。。。)然 而,如果UDP发的数据太多了,就会在底层发生分片。来算一算UDP发多少数据是 合适的: 以太网数据帧的长度必须在[46-1500]字节之间,1500叫做MTU,最大传输单 元,是有以太网的物理特性决定的。然后,1500不包括链路层的首尾(18字 节),多以1500实际上是ip数据报的长度限制,IP首部20字节,留给UDP或者 TCP的有1480字节,然后UDP自己的首部用掉8字节,所以一个UDP中的数据应、该不超过1472字节。 又因为英特网上执行的MTU标准是576字节,同理,UDP的数据长度要限制在548字节(576-20-8); 以太网协议头, IP头, TCP头, UDP头 如果UDP数据超过长度会怎么样?A: 首先会造成IP分片,接收方就要重组, 使得效率变低,更加容易出现错误,如果数据错误或者丢失了,那么UDP整个数 据报就要丢掉。 那么可不可以稍微长一点? 从IP包的总长度来看,ip包最大长度65536,减去头(去掉头就可以吃了),再减一 个UDP头,就有65507个。 所以,不要超过1472(建议548),超过了就不要超65507. 2)然后,接收数据的时候: TCP会检验自己的ack与对面发来的seq,确认收到的数据是想要的数据(这里边有 重复,丢失,乱序等)。如果不是想要的数据 比如我收到了1 2 3,接下来想要4, 但是对面给我传了5,那我只好再给对面传一个(seq = x,ack=3)的报文,告诉对 方,我这里只确认到3,那对方就再给我传一个4过来(具体实现没有这么简单,上 述的实际是一种丢包问题,具体可能要重出3次同样的ack才会触发重传,或者超时 重传,或者用sack机制重传。。。) 然后,乱序的包,TCP重新整理好了顺序。 最后,TCP会告诉发送方自己收到了哪些数据。 3)另外,在1中提到过,TCP实现了流量控制,网络拥塞控制。 流量控制还好理解,双方时刻关注对方的吞吐能力就可以了。网络的情况是难以预 期的,难以观测的,只能间接的了解网络的情况,TCP是如何做到拥塞控制的,还 有TCP为何要控制拥塞,这是TCP应该完成的任务吗? TCP正是通过一些量,间接的观测出网络的状况,来实现拥塞控制的。至于要不 要控制?答案是要,因为TCP的出现会(重传等)造成网络的拥塞,那么TCP必须 要负责。试想:如果某一时刻网络出现拥堵,TCP不管不顾,只认为自己的数据没 有送达,不断地重传,只会造成网络更加拥堵,恶性循环。 TCP通过:慢启动 拥塞避免 拥塞发生时的策略 快速恢复 这一系列策略,决定 当前可以发送的 段的数量,控制拥塞。 一句话:TCP可靠,控流,控制拥塞。 ps:有人说ping是基于UDP的,对吗?

不对。尽管ping的特点和UDP很像:发送的数据少,要求速度等…但是ping是基于原始套接字,使用ICMP协议完成的。和数据报套接字,流式套接字完全没有关系,甚至从层次上看,ICMP是IP的子协议,ping的实现在网络层,TCP/UDP在运输层,所以上述说法显然是错误的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3