tcp相关的一些选项解析
man tcp 查看详细信息
1.SO_ERROR
当一个套接字发生错误时,那么协议模块内部so_error会被设置成为Exx错误码
IO复用通知可读可写,可以使用getsockopt来获取这个错误
2.SO_KEEPALIVE
2小时后才发送keep-alive探询消息,以75秒的时间间隔发送9个探询消息
经过2小时11分15秒才发现连接已经中断
在应用层,实现自己的心跳机制
3.SO_LINGER
close的默认动作是发送完成缓冲区内数据,并且发送FIN分节之后立即返回。
返回之后如果数据或者是FIN分节没有确认的话, 那么tcp实现会自动进行重传,但是如果重传失败的话,我们也是没有办法知道的。
TIME_WAIT状态 持续2MSL
struct linger {
int l_onoff; /* Nonzero to linger on close. */
int l_linger; /* Time to linger. */
};
l_onoff=0,那么就是按照默认情况处理。
l_onoff=1, l_linger==0,close会立刻丢弃缓冲区内部数据并发送RST分节断开连接立即返回,而不是走正常的断开连接过程,这样就不会有TIME_WAIT状态。
l_onoff=1, l_linger!=0的话,close会等待l_linger(单位s)的时间或者是等待到最后数据和FIN的ACK返回为止。如果close 设置称为非阻塞的话,会立刻返回。如果等待到了最后的数据和FIN的ACK的话,close返回值为0, 否则返回-1,errno=EWOULDBLOCK.
不推荐使用
4.SO_REUSERADDR
复用端口,server快速重启,client使用同一端口连接多个server
使用该端口的socket都必须设置为SO_REUSERADDR(包括新的申请该地址的socket),并且之前端口没有处于listening状态,则该端口可以给新申请者使用。
net.ipv4.tcp_tw_reuse参数只有在执行connect操作时才会生效,而server如果bind一个地址,即使系统设置为tcp_tw_reuse为1,而SO_REUSERADDR没有设置,端口依然无法绑定成功
tcp_max_tw_buckets参数是系统中TIME_WAIT套接字的最大数量
tcp_timestamps参数用来设置是否启用时间戳选项,tcp_tw_recycle参数用来启用快速回收TIME_WAIT套接字。tcp_timestamps参数会影响到tcp_tw_recycle参数的效果。如果没有时间戳选项的话,tcp_tw_recycle参数无效
5.SO_RCVBUF/SO_SNDBUF
会影响窗口大小
tcp头部中,窗口的大小用16位表示,最大为64K.在选项字段中设置窗口扩大因子,可以使窗口大于64K
TCP的窗口规模选项是在建立连接时候使用SYN分节相互交换得到的,客户端必须在connect之前设置,服务端必须在listen之前设置
设置net.ipv4.tcp_window_scaling来使用更大的缓冲区
2 * Bandwidth * Delay
tcp_rmem 和 tcp_wmem 选项
6.close shutdown
close同时将文件描述符引用技术减一
shutdown不对文件描述符操作
shutdown 可以进行半关闭
SHUT_RD SHUT_WR SHUT_RDWR
FIN_TIME_2状态
tcp_fin_timeout 停留在半关闭(FIN_TIME_2)的最大时间
7.TCP_NODELAY TCP_QUICKACK TCP_CORK
禁止Nagel算法,默认会使用Nagle算法,数据并不会立即发送,而是等到一定大小的时候才一起发送,这样可以减少分组
对广域网网络环境合适,能够有效地利用网络,对局域网内交互式应用程序,局域网传输质量非常好,快速和实时性才是最主要的。
Delay ACK算法,接收到数据之后并不回复ACK,而是假设我可能也要发送数据,发送这个数据时候捎带ACK回去. 如果在某段时间内没有数据(绝大部分实现采用的延迟是200ms),那我才响应ACK.
对局域网内交互式应用程序并不适合
TCP_CORK是对Nagle算法的一个扩展,不能和TCP_NODELAY一起使用。
Nagle算法会等待数据到达一定程度之后然后发送,但是过程我们不能控制。 使用TCP_CORK可以控制这个过程。
首先设置TCP_CORK,向tcp kernel buffer里面write数据,这时并不直接发送,等到clear TCP_CORK选项之后才会发送。
man 7 tcp里面也提到在实现的时候,如果内部存在数据但是200ms没有发送的话,那么就会自动发送
nginx在传输文件的时候会使用这个选项
8.SO_RCVTIMEO/SO_SNDTIMEO
可以设置针对这个套接字的读写超时,影响的函数包括:
read/write
readv/writev
recv/send
recvfrom/sendto
recvmsg/sendmsg
9.tcp使用的定时器
重传定时器
坚持定时器
保活定时器
本文来源 我爱IT技术网 http://www.52ij.com/jishu/12488.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
