TCP在建立连接的时候,SYN分节会相互通告窗口,此窗口就是TCP内核的缓冲区大小,通常要求其为MSS的偶数倍。
为了充分利用TCP连接,需要估计TCP连接的传输速度和RTT值,得到在网络上传输的字节流大小,通过SO_RCVBUF和SO_SNDBUF可以查看本地socket的发送和接受缓冲区大小。
SO_RCVLOWAT和SO_SNDLOWAT 表示本地TCP接受low water,如果接受的字节大于该值,内核将其标识为可读;如果发送缓冲区的可用空间大于SO_SNDLOWAT,内核将其标识为可写;一般该值缺省为2048字节。
具体可查看UNIX网络编程P165。
char sock_rcv_buf_size[MAXHOSTNAMELEN]; int len = sizeof(sock_rcv_buf_size); acceptor.get_option(SOL_SOCKET, SO_RCVBUF, sock_rcv_buf_size, &len); sock_rcv_buf_size[len] = 0; ACE_DEBUG((LM_DEBUG, ACE_TEXT ("(%P|%t) Receive buffer size %d %d \n"), *(int*)sock_rcv_buf_size, len));
|
这几行代码可以在ACE上查看缓冲区大小,搞不明白的是,ACE将get_option的第三个参数改成了char*,这样需要自己根据类型做转换。
在WinXP上,接收缓冲区8192字节,发送缓冲区64512字节。
TCP/UDP所返回的缓冲区大小是一致的。
阅读(7382) | 评论(0) | 转发(1) |