TCP 和 UDP 大家应该都听说过,也是面试中比较常见的内容,这两个协议都是在传输层的。这篇文章会讲述 TCP 和 UDP 里面实现的内容。
传输层是干什么用的
在学习一个东西之前我们应该先看要这个东西干嘛用的,传输层主要提供以下服务:
发送方将应用层的 Message 转成 Segment
接收方将接收到的 Segment 转成 Message,再给应用层
一般用于不同主机之间的进程交流
这里要和网络层对比一下,网络层主要用于两个主机(设备)间的交流,而传输层是用于进程之间的交流。
好像很简单呀,不就数据上传到下,下再传到上么?在理想情况下就是这么简单,但是实现总是不如意嘛。
多路复用
这也叫 Multiplexing,为什么要有这个东西呢?因为在计算机里每个进程向外面传数据都要通过不同 Socket 的,Multiplexing 就是将一个计算机里不同 Socket 数据集合到一个 Data 里再加上 Header,传给别的主机。别的主机收到后,再将这个大 Data 分成小块,将这些小块送到对应进程使用的 Socket 中,这个过程叫做 Demultiplexing,就是反过来用。
端口号
现在我们来想一个问题,上面 Multiplexing 里数据集合很容易呀,可以用一个数组存一存,那 Demultiplexing 怎么知道要送到哪个 Socket 呢?这就需要端口号了。
每个进程都会对应一个端口号,比如 8080 我们特别熟悉的,一般对应 Tomcat 进程或者别的本地服务器进程。每个进程向外发送的信息都会带有 这样的组合,来告诉接收方我应该要将信息发给哪个进程。
下面是一个例子:
上面进完怎么将信息送到对应的进程,下面就来说说信息是怎么传输的,这就要说到我们很耳熟的两个协议——UDP,TCP。
UDP
特点
先来说说 UDP 的特点
Connectionless
接收方和发送方都没有 Handshaking,也就我们所说的握手过程,后面会说到握手
Unreliable
UDP 的包丢了不会去恢复,丢了就丢了
UDP 的包是乱序的
没有 Congestion Control
没有 Flow Control
上面这两个 Control 会在 TCP 里讲,因为 TCP 要写的太多了。。。
格式
一个基础的 UDP 包格式如下