TCP和UDP的详细区别

  TCP和UDP的详细区别



秋招季,总结一波TCP和UDP详细的区别以及TCP相关,哦,除了卖萌我也喜欢分享。

 

1.      TCP是面向连接的,而UDP是无连接的。

连接的三次握手和断开连接的四次挥手 图如下:

                                                        

                                                       

 

    UDPTCP的区别:UDP是不面向连接的,TCP是面向连接的,那么为什么?

   首先有个信道复用的概念:  1、频分复用    2、时分复用    3、波分复用    4、码分复用    5、空分复用    6、统计复用    7、极化波复用 。不同的信道复用技术,使用不同的复用技术,目的就是创建“虚拟信道   
   

    一个TCP协议连接其实就是在物理线路上创建的一条虚拟信道。这条虚拟信道建立后,在TCP协议发出FIN包之前(TCP断开连接时两个终端都会向对方发送一个FIN包),是不会释放的。正因为这一点,TCP协议被称为面向连接的协议!   
      
UDP协议,一样会在物理线路上创建一条虚拟信道,否则UDP协议无法传输数据!但是,当UDP协议传完数据后,这条虚拟信道就被立即注销了!因此,称UDP是不面向连接的协议! (注意:
一种物理线路,单位时间内,能够创建的“虚拟信道”是有限的.(这是我放在网络协议分层http://blog.csdn.net/zcyzsy/article/details/69378645中的一段话)

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

    TCP是有虚电路服务的,而UDP没有。

 

2.      TCP是可靠传输,而UDP是不可靠传输

可靠传输体现在(此段摘自: http://blog.csdn.net/hbhhww/article/details/8216541):

        1、应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。 (将数据截断为合理的长度)
        2、当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。(超时重发)
        3、当TCP收到发自TCP连接另一端的数据,它将发送一个确认ack。这个确认不是立即发送,通常将推迟几分之一秒。 (对于收到的请求,给出确认ack响应)
          (之所以推迟,可能是要对包做完整校验,主要是首部和数据检验和) 

        4、 TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。      (校验出包有错,丢弃报文段,不给出响应,TCP发送数据端,超时时会重发数据) 

        5、既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。  (对失序数据进行重新排序,然后才交给应用层,TCP的数据包是有序的,重排序就是帧序列重组)
        6、既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
                           (对于重复数据,能够丢弃重复数据)

        7、TCP还能提供流量控制(滑动窗口机制)。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。 (TCP可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出)

流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。

TCP 为每一个连接设有一个持续计时器。只要 TCP连接的一方收到对方的零窗口通知,就启动持续计时器,发送一个零窗口探测报文段。

 


简言之:TCP丢包会重组,还有定时确认和重传机制,而且会丢弃重复的包,TCP会进行校验,而UDP丢包则直接舍弃。

 

3.      包的结构不同,TCP复杂,UDP简单,他们的包头结构如下:

TCP的包头结构:                  
源端口 16
目标端口 16
序列号 32
回应序号 32
TCP
头长度 4
reserved 6

控制代码 6
窗口大小 16
偏移量 16
校验和 16
选项  32(可选)

这样我们得出了TCP包头(首部)的最小长度,为20字节。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

 

UDP的包头结构:
源端口 16位
目的端口 16位
长度 16位
校验和 16位

这样UDP的首部为8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

 

 

4.      TCP是数据流模式(SOCK_STREAM),UDP是数据报模式(SOCK_DGRAM

流模式:TCP把数据看成一连串无结构的字节流

数据报:UDP是面向报文的

 

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

 

6.      UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

         TCP 有拥塞控制,所以发送效率会比UDP低一点

网络中的链路容量和交换结点中的缓存和处理机都有着工作的极限,当网络的需求超过它们的工作极限时,就出现了拥塞。拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

拥塞控制方法:

1.慢开始在主机刚刚开始发送报文段时可先将拥塞窗口 cwnd 设置为一个最大报文段 MSS的数值。在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个 MSS的数值。用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。每经过一个传输轮回,拥塞窗口(发送端)就加倍。

2.拥塞避免:让拥塞窗口缓慢增大,每经过一个往返时间就加1,而不是加倍,按线性规律缓慢增长。拥塞窗口大于慢开始门限,就执行拥塞避免算法。乘法减小:指不论在慢开始还是拥塞避免阶段,只要出现超时重传就把慢开始门限值减半。"加分增大“:指执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。合起来AIMD算法。

3.快重传算法:发送方只要一连收到三个重复确认就应当重传对方尚未收到的报文。而不必等到该分组的重传计时器到期。

4.快恢复算法:(1)当发送端收到连续三个重复的确认时,就执行乘法减小算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法(2)由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为 1,而是设置为慢开始门限 ssthresh减半后的数值,然后开始执行拥塞避免算法(加法增大),使拥塞窗口缓慢地线性增大.

 

7.      TCP需要的系统资源比UDP多

 

8.      TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

 

9.      TCP 和 UDP SOCKET通信过程:

 

Tcp  Server:

Socket() -> bind() -> listen() ->accept()->recv(),send()

Tcp client:

Socket() -> connect() -> send(),recv

 

TCP服务端流程如下: 
  1、创建一个socket,用函数socket(); 
  2、设置socket属性,用函数setsockopt(); * 可选 
  3、绑定IP地址、端口等信息到socket上,用函数bind(); 
  4、开启监听,用函数listen(); 
  5、接收客户端上来的连接,用函数accept(); 
  6、收发数据,用函数send()和recv(),或者read()和write(); 
  7、关闭网络连接; 
  8、关闭监听; 

TCP客户端流程如下: 
  1、创建一个socket,用函数socket(); 
  2、设置socket属性,用函数setsockopt();* 可选 
  3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选 
  4、设置要连接的对方的IP地址和端口等属性; 
  5、连接服务器,用函数connect(); 
  6、收发数据,用函数send()和recv(),或者read()和write(); 
  7、关闭网络连接;

 

UDP SOCKET 通信过程:

Udp server:

Socket() -> bind() -> recvfrom()

Udp client

Socket() -> sendto()

 

UDP服务端流程如下: 
  1、创建一个socket,用函数socket(); 
  2、设置socket属性,用函数setsockopt();* 可选 
  3、绑定IP地址、端口等信息到socket上,用函数bind(); 
  4、循环接收数据,用函数recvfrom(); 
  5、关闭网络连接; 

UDP客户端流程如下: 
  1、创建一个socket,用函数socket(); 
  2、设置socket属性,用函数setsockopt();* 可选 
  3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选 
  4、设置对方的IP地址和端口等属性; 
  5、发送数据,用函数sendto(); 
  6、关闭网络连接;

 


猜你喜欢

转载自blog.csdn.net/zcyzsy/article/details/77914230