如何深入理解并高效处理TCP中的紧急数据(OOB)应用场景?
摘要:前言 在上大学的时候,我就听说了 OOB 这个概念(Out Of Band 带外数据,又称紧急数据)。当时老师给的解释就是在当前处理的数据流之外的数据,用于紧急的情况。然后就没有然后了…… 毕业这么多年了,回想一下,还真是没有接触过 OOB
前言
在上大学的时候,我就听说了 OOB 这个概念(Out Of Band 带外数据,又称紧急数据)。当时老师给的解释就是在当前处理的数据流之外的数据,用于紧急的情况。然后就没有然后了……
毕业这么多年了,回想一下,还真是没有接触过 OOB 的场景,更没有实地发送、接收过 OOB。那么到底该怎样处理 OOB 呢?OOB 在所谓的紧急情况下是否有用呢?下面一一道来。
发送 OOB
首先产生 OOB 是非常简单的,只需要在寻常 send 的最后一个参数,加入 MSG_OOB 标志位:
ret = send (sockfd, ptr, n, MSG_OOB);
如果考虑一个完整的测试场景,需要有惯常数据,中间夹带 OOB 数据,这样才能比较好的测试接收端是否能正确的区分他们,所以客户端可以写成这样:
1 strcpy(buf, "abcdefghijklmn");
2 char const* ptr = buf;
3 if ((ret = send (sockfd, ptr, 2, 0)) < 0)
4 err_sys ("send normal head failed");
5 else
6 printf ("send normal head %d\n", ret);
7
8 ptr += 2;
9 n = 1;
10 if ((ret = send (sockfd, ptr, n, MSG_OOB)) < 0)
11 err_sys ("send oob failed");
12 else
13 printf ("send oob %d\n", ret);
14
15 ptr += n;
16 if ((ret = send (sockfd, ptr, 2, 0)) < 0)
17 err_sys ("send normal tail failed");
18 else
19 printf ("send normal tail %d\n", ret);
算法比较简单,先发送 2 字节惯常数据,接着 1 字节 OOB,最后 2 字节惯常数据结尾。需要注意的是,目前只有 TCP 支持 OOB,UDP 没所谓顺序,更没所谓带内带外之分,所以也没有 OOB;另外 TCP 目前大多数实现只支持 1 字节 OOB,大于 1 字节的 OOB,只有最后一字节会被当为 OOB 处理,之前的作为普通数据。
接收 OOB
接收 OOB 共有三种方法。
