在看《Linux高性能服务器编程》的过程中,TCP/IP 的章节里发现了几个比较有意思的名词:报文段、数据报、数据包和帧。这几个名词都是在讲协议部分出现的,一开始没明白有哪些区别、哪些联系,后来仔细想了下,又查了一下,似乎了解了大概。

帧与数据包

首先不容易理解的是数据包

数据包,就是从最上层,一层一层封装,直到网络层的,最后借由数据链路层发送出去的数据单元。

帧,是数据链路层的传输单元。

这么一看,数据包和帧好像没什么不一样,好像数据传递的都是一样的。可是为什么会把它们区分开呢?学习 TCP/IP 协议的同学应该都知道,数据链路层中有 MTU 这样一个东西,它是帧最大传输单元。

数据包是一个完整的数据单元,但是如果数据包的大小超过了 MTU 呢?所以,可能许多帧组合在一起,才能形成一个完整的数据包,这就是帧和数据包的关系。

数据包与数据报

说完了数据包与帧,那么数据包与数据报又是什么关系呢?

数据包是整个的数据单元,那么数据报就是组成这一个数据单元的分组。每一层封装后的数据都可以称作数据报也就是说,一个完整的数据包是有若干个数据报组成的。

而和帧不同的是,帧是作为数据链路层的传输单元,而数据报数据包的分组。

数据段

在看协议的时候,有了一个疑问,那就是同是在传输层的 TCP 和 UDP 两个协议,一个称为 TCP 数据段,一个称为 UDP 数据报。这是为啥嘞?

原来上面的数据报还有一条,数据报是面向无连接传输的协议,而 TCP 是面向连接的协议。

UDP 是无连接的协议,就是随着 IP 一起传输就可以了,不必去管连接和分组问题。可是 TCP 不一样了,面向连接,在数据部分很大的时候,要分组。这样每个分组就称为 TCP 数据段。这些 TCP 段组成了一个完整的 TCP 数据报。

后记

这几个概念算是勉勉强强理顺了。菜鸟文章,大神路过如果有错误欢迎指正,我也再学习学习。