企业网站建设的开发方式,省心的专业建设网站公司,网站开发 运维 招投标,三明城乡建设网站TCP 三次握手的性能提升
三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上#xff0c;所以要正确使用三次握手的中参数#xff0c;需要先用netstat命令查看是哪个握手阶段出了问题#xff0c;主动发起连接的客户端优化相对简单些#xff0c;而服务端需要监听端口所以要正确使用三次握手的中参数需要先用netstat命令查看是哪个握手阶段出了问题主动发起连接的客户端优化相对简单些而服务端需要监听端口属于被动连接方其间保持许多的中间状态优化方法相对复杂一些。
客户端优化
调整SYN报文重传次数
三次握手建立连接的首要目的是「同步序列号」。只有同步序列号才有可靠传输SYN 的全称就叫 Synchronize Sequence Numbers同步序列号。
客户端作为主动发起连接方首先发送SYN包于是客户端连接会处于SYN_SENT状态,客户端没有收到服务端传过来的ACKSYN就会重传SYN重发的次数由 tcp_syn_retries 参数控制默认是 5 次每次超时时间是上一次的2倍。可以根据网络的稳定性和目标服务器的繁忙程度修改 SYN 的重传次数调整客户端的三次握手时间上限。
服务端优化
调整SYN 半连接队列长度
要想增大半连接队列不能只单纯增大 tcp_max_syn_backlog 的值还需一同增大 somaxconn 和 backlog也就是增大 accept 队列。否则只单纯增大 tcp_max_syn_backlog 是无效的。
如果 SYN 半连接队列已满只能丢弃连接吗
开启 syncookies 功能就可以在不使用 SYN 半连接队列的情况下成功建立连接。
调整 SYNACK 报文重传次数
客户端收到服务端的ACKSYN后恢复ACK给服务器同时客户端连接状态由SYN-SENT变为ESTABLELISHED表示连接建立成功服务端需要接收到客户端的ACK才会变成ESTABLELISHED如果没收到客户端的ACK就会重传ACKSYN同时一直处于 SYN_RCV 状态。
当网络繁忙、不稳定时报文丢失就会变严重此时应该调大重发次数。反之则可以调小重发次数。修改重发次数的方法是调整 tcp_synack_retries 参数。
调整accept队列长度
服务器收到ACK后建立连接成功此时内核会把连接从半连接队列中移除然后创建新的完全连接并将其添加到accept队列等待进程调用accept函数时把连接取出来。
如果进程不能及时地调用 accept 函数就会造成 accept 队列也称全连接队列溢出最终导致建立好的 TCP 连接被丢弃。
如何查看accept连接队列已满
netstat -s 可以隔几秒钟执行下如果这个数字一直在增加的话说明 accept 连接队列偶尔满了。
如何绕过三次握手
TCP Fast Open 功能需要客户端和服务端同时支持才有效果使得 HTTP 请求减少了 1 个 RTT 的时间
TCP三次握手优化总结 TCP 四次挥手的性能提升
主动方优化关闭连接的方式通常有两种分别是 RST 报文关闭和 FIN 报文关闭。
close函数和shutdown函数有什么区别
调用了 close 函数意味着完全断开连接完全断开不仅指无法传输数据而且也不能发送数据。 此时调用了 close 函数的一方的连接叫做「孤儿连接」如果你用 netstat -p 命令会发现连接对应的进程名为空。
使用 close 函数关闭连接是不优雅的。于是就出现了一种优雅关闭连接的 shutdown 函数它可以控制只关闭一个方向的连接
主动方的优化
调整FIN报文重传次数
第一次挥手 调整tcp_orphan_retries参数降低
调整FIN WAIT2状态的时间
主动方收到ACK后进入FIN—WAIT2状态表示主动方的发送通道已经关闭接下来将等待对方发送FIN报文关闭对方的发送通道。
如果此时连接使用shutdown函数关闭的连接可以一直处于FIN—WAIT2状态因为还可以继续发送或接收数据。但是对于close函数关闭的孤儿连接由于无法再发送和接收数据所以这个状态不可持续太久而 tcp_fin_timeout 控制了这个状态下连接的持续时长默认值是 60 秒
调整孤儿连接的上限个数
当进程调用了close函数关闭连接此时连接就会是孤儿连接因为无法再发送和接收数据有个tcp_max_orphans孤儿连接数量参数大于他就不再走tcp四次挥手直接RST复位报文关闭。
Time wait的作用
①防止历史连接的数据被后面相同四元组的连接错误接收2MSL这个时间足以让两个方向上的历史数据包都被丢弃使得原来连接的数据包在网路中都自然消失再出现数据一定都是新建立连接所产生的。
②保证被动关闭连接的一方能被正确关闭 等待足够长的时间使得ACK能让被动关闭方接收从而帮助其正确关闭。
调整time wait 状态的上限个数 tcp_max_tw_buckets 参数当 TIME_WAIT 的连接数量超过该参数时新关闭的连接就不再经历 TIME_WAIT 而直接关闭并发增多可以适当增大这个数量也不是越大越好资源有限。
复用time_wait状态的连接
tcp_tw_reuse 和 tcp_timestamps 设置为1只作用在 connect 函数也就是客户端将TIME_WAIT状态的端口复用作为客户端的新连接只适用于客户端。
被动方的优化
close_wait状态的数量
被动方收到FIN就开始进入close_wait状态等待进程调用close函数关闭连接。因此出现大量CLOSE_WAIT状态的连接。
减少FIN报文重传次数
TCP 数据传输的性能提升 扩大窗口大小
TCP提供一种可以让发送方数据根据接收方的实际接收能力控制发送的数据量-滑动窗口
内核接收到报文必须使用缓冲区存放他们这样剩余缓冲区空间变小接收窗口也变小
进程调用read函数报文被读入内存空间内核缓存被清空主机可以接收更多的报文窗口大。
接收方把报文大小放到TCP报文头部的窗口字段中
默认的滑动窗口最大值只有 64 KB不满足当今的高速网络的要求要想提升发送速度必须提升滑动窗口的上限在 Linux 下是通过设置 tcp_window_scaling 为 1 做到的此时最大值可高达 1GB。
调整发送缓冲区范围
发送缓冲区是自行调节的当发送方发送的数据被确认后并且没有新的数据要发送就会把发送缓冲区的内存释放掉。
调整接收缓冲区范围
接收缓冲区可以根据系统空闲内存的大小来调节接收窗口
发送缓冲区的调节功能是自动开启的而接收缓冲区则需要配置 tcp_moderate_rcvbuf 为 1 来开启调节功能
接收缓冲区动态调节
我们应该把缓冲区的上限设置为带宽时延积。发送缓冲区的调节功能是自动打开的而接收缓冲区需要把 tcp_moderate_rcvbuf 设置为 1 来开启。其中调节的依据是 TCP 内存范围 tcp_mem。
调整内存范围
通过 tcp_mem 配置完成一般情况下这些值是在系统启动时根据系统内存数量计算得到的