【问题标题】:tcp packet arrivat at the application?tcp 数据包到达应用程序?
【发布时间】:2012-03-23 02:41:38
【问题描述】:

在客户端-服务器环境中,当客户端发送请求“GET /index.php ...等”的数据包(带有源ip/目标ip/端口...等)时,
在服务器应用程序(守护程序)到达整个数据包(整个数据位),包括 mac、IP、端口、tcp 标志、有效负载?还是只是有效载荷?

因为我不明白脚本如何读取远程地址(例如 echo $_SERVER['REMOTE_ADDR']; )

【问题讨论】:

    标签: tcp client-server tcp-ip


    【解决方案1】:

    服务器机器获取整个数据包。它的内核和 TCP/IP 堆栈接收并处理它。应用服务器使用套接字与内核通信,这是比原始数据包更高层的接口;因此它有不同的看法。假设我们谈论的是 TCP,您会发现:

    • 来自物理层或数据链路层的信息(例如源和目标 MAC 地址)在套接字上不可用(除非您做的事情非常花哨且可能不可移植)。
    • IP 和 TCP 层的一些信息是可用的,因此应用程序可以使用特殊的系统调用(例如 getsockname()getpeername())检索它。这包括 IP 地址和端口。
    • 应用程序不关心来自 IP 和 TCP 层的大部分其余信息,并且它在套接字上不可用。例如,选项、窗口大小、校验和、片段偏移量。
    • 应用程序在套接字上发送和接收数据,就好像它是一个连续的字节流一样。它不知道也不关心数据流是如何分解成小数据包的,每个小数据包都包含一段数据。

    对于您强调的​​$_SERVER['REMOTE_ADDR']; 的具体情况,此信息来自上述getpeername() 系统调用。 PHP 会为您调用它并使信息可用。

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 2021-07-06
      • 2013-12-08
      • 2011-06-25
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多