一、概述
TCP连接中有许多操作系统提供的调节参数,在不同的使用场景中修改对应的参数,可以TCP性能。
可以将性能提高分为下面三个部分:
- TCP三次握手的性能提升。
- TCP数据传输的性能提升。
- TCP四次挥手的性能提升。
二、TCP三次握手的性能提升。
调整SYN报文的重传次数。
//控制SYN重传次数,默认是5次
tcp_syn_retries;
一般第一次握手的SYN发出后没有回复,发起连接方会再次发送SYN,这样重复五次。
总耗时是 1+2+4+8+16+32=63 秒,大约 1 分钟左右。
当在网络情况比较好的情况下(内网通信),适当减少重传次数,今早将问题暴露给应用层。
调整SYN半连接队列的长度。
想要增大半连接队列,不能单独的增大tcp_max_syn_backlog,还要同时增大somaxconn和backlog(也就是增大accept队列)。
同时可以开启syncookies。
调整accept全连接队列的长度。
accept 队列的长度取决于 somaxconn 和 backlog 之间的最小值,也就是 min(somaxconn, backlog),其中:
- somaxconn 是 Linux 内核的参数,默认值是 128,可以通过 net.core.somaxconn 来设置其值;
- backlog 是 listen(int sockfd, int backlog) 函数中的 backlog 大小;
调整SYN+ACK的重传次数。
//控制SYN_ACK重传次数,默认是5次
tcp_synack_retries
绕过三次握手。
TCP Fast Open,需要客户端和服务端同时开启才可以。除了第一次连接后续连接服务端可以再验证cookie后直接发送数据,从而减少一次握手时间。
三、四次挥手性能提升
关闭连接的方式有两种。
- 异常退出,发送RST。
- 正常退出,发送FIN。
close()函数和shutdown()函数的区别?
- close():在多线程中会对socket套接字的引用计数,当引用为0时会进行彻底释放,对于读端有新到的数据返回异常,写端将缓冲区数据发送给对端,并发送FIN报文,接下来如果有写操作也会异常。
- shutdown():可以选择性只关闭读端**SHUT_RD(0)或者写端SHUT_WD(1)或者读写SHUT_RDWR(2)**都关闭。
四、数据传输的优化
以上内用和图片参考小林coding
就是这事,散会!