极速吃透TCP与UDP

本文正在参与 “网络协议必知必会”征文活动

前言

TCP协议和UDP协议都工作在传输层,他们的目的都是在程序中传递数据,对于他们来说这些数据都是一些二进制数,本身没有什么,他们之间最显著的不同则在于,TCP是基于连接而UDP是不基于连接。接下来,就带大家具体讲解一下他们之间差异。

TCP

1. 摘要

传输控制协议(TCP)是主要的网络协议之一,它能保证数据按照数据包的发送顺序去准确交付。TCP 最早在1970年代被两位 DARPA 的科学家 Vint Cerf 和 Bob Kahn 所设计出来,他们当时被称为互联网之父。

2.数据包结构

微信截图_20211201155227.png

TCP的数据包结构相当复杂,直白的说,我们所发出的数据要记录出偏移+数据长度+数据内容来完成。这样,一旦发送数据滞留,或者丢失,那么仅靠其偏移和长度就能定位出哪段数据然后进行重发,并且数据顺序也不会出现错误。

3.数据传输

a. 三次握手:

Connection_TCP.png

  • 我们客户端先发一包连接请求数据(SYN包)给服务端,询问一下,是否可以跟你建立连接。
  • 如果对端同意连接,那么会发一个SYN+ACK包给客户端。
  • 客户端收到后,就会发一个ACK包给服务端,此时连接建立完成。

因为这个过程有三包数据相互发送,所以就叫三次握手。可为啥是三包呢?相互发一次不行吗?原因就是为了防止已失效的请求报文引起错误,也就是说,SYN+ACK的发送需要验证一下是不是当前连接,这避免了数据滞留给服务端造成多次连接的误解,从而造成网络信道不可靠。

b. 四次挥手:

刚才我们用三次握手完成了客户端与服务端之间的连接。而四次挥手,顾名思义,就是通过四次通信,告诉对端要关闭了。当然,客户端和服务端都可以发出关闭请求。

3971776-9550b64ff16dbb0b.webp

如果客户端先想断开连接,就会发出一个FIN请求给客户端,客户端自身进入关闭等待状态,而当服务端接收后,会发送ACK给客户端确认,服务端此时也将进入关闭等待状态。这时候还没接收,因为此时服务端还可以发送未发送的数据,客户端依然可以接收数据。直至最后发送结束,服务器端会发送一个FIN包最后确认一下,然后再次进入等待状态,直至客户端发回ACK确认完毕,则双方连接终止。

UDP

1.摘要

用户资料包协议(UDP)是一个简单的面向资料包的通信协议,位于OSI模型的传输层。UDP只提供资料的不可靠传递,它一旦把应用程序发给网络层的资料发送出去,就不保留资料备份(所以UDP有时候也被认为是不可靠的资料包协议)。

2.数据包结构

微信截图_20211201165049.png

UDP在IP资料包的头部仅仅加入了复用和资料校验字段。与tcp不同,udp直接以纯数据发出了数据包,发送的数据包没有偏移量和长度等参数代入,所以无法记录其接收顺序,有可能出现乱序问题。

3.数据传输

简单的把数据包装一下,直接从网卡发出去,就是这么简单。数据包之前没有状态上的任何联系,所以他是无连接的速度快,但丢包,乱序问题可能也会出现。

总结

通过上面的介绍,相信大家已经对TCP与UDP有了简单的了解。更形象的比喻的话,TCP就好比我们在打电话,你可以准确的跟对象建立连接,说的每一句话,对方都能收到做出回应,如果你挂断了他也会中断。而UDP则更像是在写信,发送消息的时候不用考虑跟对象连接,直接写给对方,但不清楚信件会不会丢失,或者延迟或者顺序错误等。这里并没有说谁好谁不好,根据业务场景不同,才能现实出其优劣长短。

可以简单做出一个对比:

TCP协议 UDP协议
建立连接 需要 无连接
资源消耗
连接速度
可靠性 稳定可靠 容易丢包,且有可能乱序
适用场景 发送邮件、传输文件、查看网页等 语音通话、视频直播、竞技游戏等

扩展

我们对于TCP并没有多大异议,而UDP对于或许感觉又有些鸡肋,这时还有一个协议——RUDP,它作为 UDP 的可靠化的升级版,它不会像 UDP 会完全丢失数据包,它会多一步数据包确认从而去完成对数据的丢失重传,还可以做流量控制和缓冲。

猜你喜欢

转载自juejin.im/post/7036709857667317797
今日推荐