TCP与UDP(进阶必备知识)

476 阅读4分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

TIP 👉 夕阳无限好,只是近黄昏

前言

TIP 👉 计算机网络庞大而且高深,对于前端面试来说,高频考点

TCP协议

TCP是一个复杂的协议,因为他要解决很多问题,TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的RFC 793定义。TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排水管中的水流。

首先我们看网络OSI的七层模型 image.png

我们需要知道TCP在网络OSI的七层模型中的第四层——Transport层

TCP连接过程三次握手

image.png

为什么TCP连接过程三次握手?

人与人之间建立联系,只需要两个步骤:

  • A向B发出邀请
  • B接受

计算机和人不同,计算机之间存在着一个叫“网络状态”的东西,它很有有可能会影响两台计算机的沟通。通过三次握手,客户端经历了一次请求和一次响应,服务端也经历了一次请求和一次响应,这时一方面确认了当前网络状态不错,另一方面又确认自己这个沟通对象既能请求又能响应、确实没毛病。只有在这样安全、稳定的前提下,两台计算机之间才可以建立起TCP连接。

TCP断开链接四次挥手

image.png

为什么TCP断开连接四次挥手?

TCP连接是全双工协议,就是说双方都可以同时向对象发送或接收数据。

当客户端在想要断开连接时,只能确认自己没有数据要传输给服务器了,但并不能确认服务器是否还有数据要发送。

分手嘛,是两个人的事情。客户端不会因为自己没话说了就直接终止关系,而是会等服务器把话说完再走。因此,即便客户端抛出了分手请求,这时服务器还是可以传输数据过来

前两次挥手,只是对分手这件事做确认,但并不会立即行分手这件事。

第三次挥手前,服务器会把自己想说的话说完,然后再通知一次客户端。这时,双方才真正都为分开做好了准备。

第四次挥手,客户端接受到了来自服务端的分手请求,响应“接受”的信号,才最后给这一段关系画上了句号。

TCP协议的特点

  • 面向连接,发送数据之前必须在两端建立连接
  • 双向传递(全双工)
  • 字节流
  • 流量缓存:解决速度不匹配问题(滑动窗口)
  • 可靠的传输服务(保证可达,丢包时通过重发进而增加时延实现可靠性)
  • 拥塞控制

TCP协议下,连接的建立需要三次握手,这是为了确保双方能够确实建立起稳定的传输通道。一次,TCP又被称为“面向连接的可靠传输”。

UDP则恰恰相反,它的世界里没有握手、没有知情同意,是一个非常随性的协议。

UDP协议

在UDP协议下,数据想发就发,随时可发。它不关心对方到底有没有收到自己的数据、也不搞什么拥塞控制---就算现在是2G、3G网络,他不会为了保证不丢包来降低自己的速率。

因此,UDP又被称为是“无连接的不可靠传输”。

UDP的应用场景

乍一看,UDP看上去这么不可靠,大家干脆协议选型的时候一股脑都用TCP算了,好像没有存在的意义

实际上,存在即合理,UDP虽然冒冒失失让人不放心,但也有它的过人之处,比如:

  • 它可以面向多方提供服务:UDP不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,
  • 头部开销小:UDP头部只有8个字节大,而TCP需要20个字节。同样的报文内容,UDP会比TCP更高效。
  • 随意也是优点:有时候,我们的连接是需要实时建立的,并没有那么多的资源去给你反复的三次握手和四次挥手,这种场景下,UDP“想发就发”反而更显灵活。

结合UDP的过人之处,相信大家不难想象它的应用场景:在一些对实时性要求比较强的场合,比如网络电话、视频会议、在线直播这些地方,UDP比TCP更加合适。而像文件传输这样对可靠性和稳定性要求比较高、同时本身连接的确定性也比较强的需求,用TCP来解决会更稳妥。