- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试在 GNU/Linux 系统上以编程方式配置我的 TCP 连接的 MSS,特别是 Ubuntu 12.04,内核 3.2.0-68-通用
根据 man 7 tcp
TCP_MAXSEG The maximum segment size for outgoing TCP packets. If this option is set before connection establishment, it also changes the MSS value announced to the other end in the initial packet.Values greater than the (eventual) interface MTU have no effect. TCP will also impose its minimum and maximum bounds over the value provided.
这让我觉得我可以在 连接 TCP 套接字之前配置值。我编写了一小段代码来创建套接字,并使用 setsockopt() 来配置 MSS。在我的测试中,我将 mss 设置为 1000B。
代码调用 setsockopt(),然后调用 getsockopt() 来仔细检查值是否已正确配置。两个系统调用都返回 0(无错误)。之后我连接到远程主机以通过 tcpdump 验证使用的 mss 是否正确。这是我看到的:
修改我的代码以在连接套接字后配置 MSS。
是否有正确的方法来解释这种行为?
一些注意事项:
如果你有兴趣,下面是我的代码:
int setSocketMss( int i_sd, int i_mss )
{
int res = 0;
int mss = i_mss;
socklen_t len = sizeof( mss );
res = ::setsockopt( i_sd, IPPROTO_TCP, TCP_MAXSEG, &mss, len );
if ( res < 0 )
{
qDebug() << "error: cannot configure mss for socket" << i_sd;
return -1;
}
res = ::getsockopt( i_sd, IPPROTO_TCP, TCP_MAXSEG, &mss, &len );
if ( mss != i_mss )
{
qDebug() << "MSS set to" << i_mss << "but read value is" << mss;
}
else
{
qDebug() << "MSS for socket" << i_sd << " has been set to" << mss;
}
return mss;
}
void configureAddrStruct( const QString & i_ipAddress,
quint16 i_port,
struct sockaddr_in & o_sockaddr )
{
o_sockaddr.sin_addr.s_addr = htonl( QHostAddress(i_ipAddress).toIPv4Address() );
o_sockaddr.sin_port = htons( i_port );
o_sockaddr.sin_family = PF_INET;
memset( o_sockaddr.sin_zero, 0, sizeof(o_sockaddr.sin_zero) );
}
int main(int argc, char *argv[])
{
int sd = ::socket( PF_INET, SOCK_STREAM, getprotobyname("tcp")->p_proto );
if ( -1 == sd )
{
qDebug() << "erro creating socket";
exit (1);
}
else
{
qDebug() << "created socket:" << sd;
}
setSocketMss( sd, 1000 );
struct sockaddr_in localAddress;
struct sockaddr_in remoteAddress;
configureAddrStruct( "192.168.23.7", 0, localAddress );
configureAddrStruct( "192.168.23.176", 9999, remoteAddress );
int res = ::bind( sd,
reinterpret_cast<const sockaddr *>( &localAddress ),
sizeof(localAddress) );
if ( -1 == res )
{
qDebug() << "error binding socket to local address";
exit(2);
}
//setSocketMss( sd, 1000 );
res = ::connect( sd,
reinterpret_cast<const sockaddr*>( &remoteAddress ),
sizeof(remoteAddress) );
if ( -1 == res )
{
qDebug() << "error connecting to remote host";
::perror( "connect()" );
exit(2);
}
//setSocketMss( sd, 1000 );
return 0;
}
最佳答案
你做错了。您应该在接收方发送套接字接收缓冲区大小。
关于c - 为什么 getsockopt() 没有返回 TCP_MAXSEG 的预期值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25996741/
我正在尝试在 GNU/Linux 系统上以编程方式配置我的 TCP 连接的 MSS,特别是 Ubuntu 12.04,内核 3.2.0-68-通用 根据 man 7 tcp TCP_MAXSEG Th
我正在研究 boost 1.55.0 asio 库。我正在尝试找出增加 TCP 套接字的 MSS(最大段大小)的方法。 我想这个选项应该通过 acceptor.set_option(...) 方法或类
问题更新:除了下面的问题,我们使用 Linux PLPMTUD 机制的客户端/服务器应用程序似乎获得了太大的路径 MTU。有没有人看到这个,即实际路径 MTU 是 1500,但是 getsockopt
我是一名优秀的程序员,十分优秀!