【问题标题】:PHP Socket Types and TCP Window SizePHP 套接字类型和 TCP 窗口大小
【发布时间】:2011-05-19 03:07:23
【问题描述】:

所以这实际上是一个两部分的问题,第一部分导致第二部分。

我正在开发一个 PHP 服务器项目,但我对创建套接字的所有不同方式感到有些困惑。我已经设法使用一种新方法创建了三个套接字。有谁知道这三种方法的根本区别吗?

方法 1 使用 'socket_create'

$Socket1 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
socket_bind($Socket1, $LocalIP, $LocalPort)
socket_connect($Socket1, $DestIP, $DestPort)
//Method 1 Read
socket_read($Socket1)
//Method 1 Write
socket_write($Socket1, $WriteMsg, strlen($WriteMsg))

使用'fsockopen'的方法2

$Socket2 = fsockopen($Server, $Port)
//Method 2 Read
fgets($Socket2)
//Method 2 Write
fputs($Socket2, $PutMsg, strlen($PutMsg))

使用'stream_socket_client'的方法3

$Socket3 = stream_socket_client('tcp://'.$DestIP.':'.$DestPort)
//Method 3 Read
stream_socket_recvfrom($Socket3, $RecSize)
//Method 3 Write
stream_socket_sendto($Socket3, $SendMsg)

虽然我不了解其中的区别,但我一直在探索所有三个选项,以寻找一种控制 TCP 窗口大小的方法。我试图通过我的 LAN 将数据包推送到客户端,该数据有效负载为 1460 字节,在查看数据包捕获后,我的数据包的 TCP 数据部分总是缩短为 1448 字节。有什么想法吗?

提前致谢!

【问题讨论】:

    标签: php sockets tcp mss


    【解决方案1】:

    您应该可以使用socket_set_option 命令来执行此操作(其中选项记录在socket_get_option 命令中):

    $Socket1 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
    // send window
    socket_set_option($Socket1, SOL_SOCKET, SO_SNDBUF, 1460);
    

    请务必在socket_create 之后立即调用它。如果需要修改接收窗口:

    socket_set_option($Socket1, SOL_SOCKET, SO_RCVBUF, 1460);
    

    【讨论】:

    • 谢谢!我不知道那个有趣的选择。又过了几个深夜,我发现 TCP 最大段大小 (MSS) 值指定了本地系统可以接受(重组)的单个 IP 数据报中的最大 TCP 数据量。 SO_SNDBUF 选项确实定义了最大发送缓冲区大小,但是当由较低级别的 TCP 协议发送时,它仍然可以分成多个数据包。事实证明,以太网 MSS 值为 1460 (1500 - 40 = 1460)。有一个 TCP Timestamp 选项被发送到我的 TCP 套接字,它抢走了我正在寻找的 12 个字节。
    【解决方案2】:

    您无法控制一次接收的实际数据量。 TCP 是一种流协议。它向应用程序提供了一个字节流 API。你只需要准备好反复阅读,直到你得到你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-17
      • 2015-04-16
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多