【问题标题】:What headers are included from a TCP stream when using read()?使用 read() 时 TCP 流中包含哪些标头?
【发布时间】:2018-05-14 21:48:00
【问题描述】:

我了解 TCP“数据包”包含多个标头(以太网、IP、TCP、...)。在SOCK_STREAM 套接字上调用read() 时,包含哪些标头信息?在将数据暴露给应用程序空间之前,内核是否会剥离一些标头?

场景:我想在我的应用程序的套接字上读取 TCP 数据包。要得到一个完整的数据包,我需要知道数据包的长度。要知道这一点,我需要知道如何解释SOCK_STREAM套接字读取的数据,为此我需要知道我读取的数据是包含TCP头还是仅包含头之后的信息。

【问题讨论】:

  • 不包含标题信息。您只需获取数据。
  • 是的 - 在应用程序级别,使用 TCP SOCK_STREAM 套接字,没有数据包。读取/接收,如果成功并且连接未关闭,则返回一些大于零且不大于传递的缓冲区大小的流字节数。通过以下任何路由在任何接口上发送或接收的任何数据包或段都不能保证 1-1 对应。

标签: c++ c linux sockets tcp


【解决方案1】:

当你调用read()时,你只是得到数据,没有任何头部信息。

您可以使用getsockaddr()ioctl() 等函数获取有关套接字的信息。但这不会返回有关单个数据包的信息。

如果您需要数据包级别的详细信息,则需要使用 libpcap 之类的内容。

【讨论】:

  • 我明白了,这是有道理的。那么当我在例如wireshark中看到一个数据包时,TCP标头之后的所有内容都是数据?
  • 是的,这就是您通过read() 获得的数据。还要记住,因为它是一个流,所以你甚至看不到数据包的边界——一次调用可以返回一个数据包的一部分或多个数据包。
【解决方案2】:

使用read() 不会为您提供所需的标头信息,而只会为您提供数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2011-04-14
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多