通过Easy TCP Analysis学习TCP协议数据结构真的很简单

发布时间:2024-04-15 19:45:00

不知道你有没有注意观察,其实任何东西都是有结构的,我们写业务代码需要定义模型的结构体(对象)也是一种结构,数据库表也是一种结构,文件也是一种结构……,不同类型的文件有不同的结构,pdf、jpg甚至我们写的代码源文件和编译后的文件都有固定结构的。

在计算机的世界里,永远只有零和1,任何文件其实都是存储的二进制,之所以一个文件是pdf文件,是因为它按pdf的数据结构存储,pdf解码器能够解码这个数据结构,当我们用文本编辑器打开的时候,它就是一堆乱码。

网络传输为什么需要数据结构?

我们不防从业务层面理解,我们的接口定义都是有固定结构的,例如都有code、message、data字段,那为什么要有这些字段呢?因为需要传递一些业务状态。并且很有可能code不同,data的内容不同,例如当code不等success时,data为空,这告诉客户端此时不用解析data。

我们定义的每个业务接口,data的结构也是不同的,这其实也是每个接口的协议,每个接口协议的data都是该接口协议的数据结构。只有定义好接口协议,定义好数据结构,客户端才知道怎么传递请求参数,怎么解析服务端返回的数据。服务端才知道怎么解析客户端传的参数,以及怎么传递响应数据。

数据最终在网络上是以二进制传输的,数据包之间没有顺序,没有先后,也不保证每个数据包必然会到达,并且如果直接传应用数据,那么服务器不知道这个数据包是发给哪个进程的。所以TCP数据包不仅包含应用的传递的数据,还要有TCP本身的一些信息,例如,谁发的,发给谁,客户端服务端各自给数据包定一个序号,都要告诉对方自己接收成功了哪个数据包,请从哪里继续发送数据等等。

TCP数据结构是四层协议定义客户端和服务端如何将数据变成二进制通过网络传输出去,以及如何将从网络接收到的二进制还原为TCP数据包。

我们通过Easy TCP Analysis截取一个数据包来分析学习TCP协议的数据结构。如下图。

tcp协议数据结构 TCP协议是四层协议,所以只用来源端口号和目标端口号来标识是谁发送的和发给谁。TCP的下面一层还有IP协议,IP协议才会标识发送者IP和接收者IP。我们业务层使用的http协议,会被包装成TCP协议,http协议的整个数据包就是TCP协议的payload,而TCP协议也会被包装成IP协议,IP协议的payload就是整个TCP数据包。

然后TCP协议数据结构中的每个字段是什么意思,每个字段的长度是多少,这些我们都可以通过将鼠标移动到对应的字段名查看说明。

tcp协议数据包数据结构

我们还可以切换到二进制视图清晰的了解TCP协议的数据结构。

tcp协议数据包二进制