接收窗口大小
在TCP协议中,一方的接受窗口由另外一方指定。那么,我们如何通过SOCKET设置自己的窗口大小呢?答案是通过setsocketopt 系统调用,该函数用于SOCKET的一些参数,其中之一就是设置接收窗口大小,一个经典的用法如下:
int RecvBuf = 0x800;
setsockopt(ListenSocket, SOL_SOCKET, SO_RCVBUF, (const char*)&RecvBuf, sizeof(int));
修改接收窗口需要注意以下几点:
- SOCKET在初始化时系统会设置一个默认的接收窗口,一般很大;
- 一旦双方的三次握手协商完成之后,接收窗口的值只能扩大,不能缩小;
OOB数据(紧急数据)
在Windows下的Socket中,有关OOB数据的行为表现如下:
- 当send函数的
MSG_OOB 位置1时,该次发送的数据为OOB数据,但无论本次发送的数据量有多大。只有最后一位位紧急数据; - 当recv函数的
MSG_OOB 位置1时,如果缓冲区中存在紧急数据,则将这一BYTE的紧急数据优先读取,不论紧急数据之前有多少数据,同时将这一BYTE的数据丢出字节流;如果不存在紧急数据,表现行为根据阻塞或非阻塞来决定; - 当recv函数的
MSG_OOB 位置0时,无论缓冲区有没有紧急数据,都当作没有紧急数据来处理;
关闭Nagle算法
可在setsockopt 函数中设置TCP_NODENY 选项来关闭Nagle算法
TIME_WAIT状态
在Windows上,服务器(即Listen)的套接字,无论是不是优雅关闭,都不会进入TIME_WAIT状态。
SHUTDOWN和CLOSESOCKET
关于SHUTDOWN合CLOSESOCKET可以看MSDN博客
|