【问题标题】:Process TCP PSH处理 TCP PSH
【发布时间】:2013-05-23 05:00:47
【问题描述】:

我修改了 TCP 数据包的 IP 标头,并直接在 netfilter NF_INET_LOCAL_OUT 挂钩中将它们发送出去。 TCP 连接可以成功建立。不幸的是,设置了PSH标志的数据包不能被对端很好地处理。但是,如果我让带有 PSH 的数据包通过默认的 linux 堆栈,而其他数据包通过我的模块,那么所有 TCP 数据包都会顺利通过。我可以知道使用 PSH 的数据包会发生什么情况吗?我该如何解决这个问题?谢谢。

【问题讨论】:

  • 真的不清楚你尝试做什么以及你看到了什么失败。您是否修改现有数据包或更改它们?你是设置 PSH 标志、清除它还是什么?
  • 很抱歉给您带来了困惑。实际上,我只修改了 IP 标头,没有修改 TCP 标头和有效负载。我没有设置 PSH 标志。我观察到如果数据包是 Linux 中的数据包,则 PSH 标志设置错误。谢谢。
  • 我正在使用内核 2.6.32.27 的 CentOS 6.2 机器。谢谢。
  • 我还是不明白这个问题。 PSH标志对于数据包来说是正常的,一般影响不大。
  • 是的,实际上,这是我的问题。如果我修改带有 PSH 标志的数据包标头,对端将无法很好地处理数据包。但是,如果我只修改其他数据包,例如使用 SYN 和 ACK,并让数据包进入默认的 linux 堆栈,则对等方可以很好地处理它们并正确响应。

标签: c linux networking tcp netfilter


【解决方案1】:

我建议阅读 following article 关于 PSH 标志的信息。

设置了 PSH 标志的数据包的接收者可能会尝试缓冲数据包,而不是仅仅通过推送它们,这就是导致错误的原因。

【讨论】:

  • 感谢您的建议。似乎无法解决我的问题。我只修改了所有 TCP 数据包的 IP 头,没有修改 TCP 头。我想知道为什么对等堆栈只忽略带有 PSH 标志的数据包。它可以正确处理其他数据包,例如可以正确建立TCP连接。
  • 最初,创建 PSH 是为了告诉机器:“嘿,这最重要,你需要发送这个。”从某种意义上说,它是一个遗留标志,当它被创建时,网络速度较慢,并且它是进程间的一种机制,可以说:“嘿,这很重要!发送它通过接收者将它推过的地方。围绕这一点的问题变成:1)速度增加,2)安全隐患。随着速度的提高,安全问题变得越来越普遍,大多数公司在编程时认为没有必要启用此标志。
  • 别忘了提一下,由于存在安全风险,沿线(从 A 点到 B 点)的大多数提供商都在过滤/剥离此标志,因此它变得无用
  • 感谢您的意见。实际上,问题在于接收方确实可以看到数据包中设置的标志。我尝试在发送数据包时删除标志。所有数据包都将正确地传递到 TCP 层。不幸的是,问题在于数据包将在握手过程完成之前发送出去。很明显,通信仍然失败。
猜你喜欢
  • 2012-10-15
  • 2016-10-29
  • 2021-01-13
  • 1970-01-01
  • 2014-01-14
  • 2011-04-20
  • 2019-08-19
  • 2013-12-14
  • 1970-01-01
相关资源
最近更新 更多