乐趣区

关于tcp-ip:TCP三次握手调优

TCP(Transmission Control Protocol)传输控制协议是一种面向连贯的、牢靠的、基于字节流的传输层协定。从 TCP 的定义中能够看出,TCP 是面向连贯的牢靠的通信形式,连贯单方都须要确定各自的连贯通道都是 OK 的。三次握手的目标就是为了确定各自的通道是 OK 的,同时告诉对方本人的起始 SEQ。当客户端调用 connect 函数时便发送了 SYN 报文同时告诉对方本人的起始 SEQ,从而发动第一次握手,客户端进入 SYN_SENT 状态;服务端收到 SYN 报文后,返回 SYN+ACK 报文到客户端同时告诉对方本人的起始 SEQ,从而发动了第二次握手,服务端进入 SYN_RCV 状态;客户端收到服务端的 SYN+ACK 后,回复 ACK 报文,从而发动第三次握手,客户端进入 ESTABLISHED 状态;服务端收到 ACK 报文后服务端进入 ESTABLISHED 状态。自此三次握手就实现了,其流程图如下:

TCP 的三次握手

过程如下:

客户端调优

1、当客户端发动第一次握手的时候,如果迟迟收不到对方的应答,那么客户端会重试,重试的次数由 /proc/sys/net/ipv4/tcp_syn_retries 管制,默认值是 5,重试距离是 1,2,4,8,16,32,总共须要破费 63s。能够依据客户端与服务端的网络情况以及服务端的负载,适当升高重试次数调小,如 2 次,从而出现异常的时候,客户端能够尽快感知到异样。

服务端调优

1、当服务端发动第二次握手的时候,如果迟迟收不到对方的应答,那么服务端也会重试,重试的次数由 /proc/sys/net/ipv4/tcp_synack_retries 管制,默认值是 5,重试距离是 1,2,4,8,16,32,总共须要破费 63s。同样的,如果客户端与服务器的网络情况挺好的,能够把重试次数调小。
2、当服务端发动第二次握手后,会把连贯放入到半连贯队列,队列的大小由 /proc/sys/net/ipv4/tcp_max_syn_backlog 管制,默认大小是 2048。当这个队列满时,服务器将无奈建设连贯。那么咱们怎么晓得这个队列是否有溢出呢?能够通过如下的命令看到

netstat -s | grep 'SYNs to LISTEN'
75571 SYNs to LISTEN sockets ignored

这个是个累计值,如果发现这个值一直的变大,能够把这个队列调大。同时还能够设置 /proc/sys/net/ipv4/tcp_syncookies=1,关上 tcp_syncookies 性能。tcp_syncookies 能够取如下的值:
A. tcp_syncookies= 0 时,敞开 syncookies 性能,当半连贯队列满时,服务端将无奈建设连贯;
B. tcp_syncookies= 1 时,当半连贯队列满时,服务端将启用 syncookies 性能;
C. tcp_syncookies= 2 时,服务端将始终启用 syncookies 性能。
tcp_syncookies 的次要工作流程如下:
服务端接管到 SYN 报文并返回 TSYN+ACK 报文时,不插入半连贯队列,而是依据这个 SYN 报文计算出一个 cookie 值。这个 cookie 作为将要返回的 SYN ACK 报文的初始序列号。当客户端返回一个 ACK 报文时,依据报文头信息计算 cookie,与返回的确认序列号 (初始序列号 +1) 进行比照,如果雷同,则是一个失常连贯,而后将连贯放入 accept 队列。
如果通过 netstat -lap 发现 SYN_RCV 状态的连接不断的增长,那么就须要通过抓包工具剖析是不是产生了 syn 泛洪攻打,如果产生了泛洪攻打,须要通过防火墙阻止这种连贯。
所谓的 SYN 泛洪攻打利用的是 TCP 的三次握手机制,攻打端利用伪造的 IP 地址向被攻打端发出请求,而被攻打端收回的响应报文将永远发送不到目的地,那么被攻打端在期待敞开这个连贯的过程中耗费了资源,如果有大量的这种连贯,主机资源将被耗尽,从而达到攻打的目标。
3、当服务端收到第三次握手的 ACK 应答报文后,服务端会把连贯放入 accept 队列,accept 队列由 listen()函数传入的参数(参数的值能够通过 ss -lnt 命令的输入“Send-Q”列查看)与 /proc/sys/net/core/somaxconn 独特管制,取 2 者的小值。能够通过如下的命令查看是否由溢出:

netstat -s | grep overflow
75571 times the listen queue of a socket overflowed

如果这个值一直的变大,阐明应用程序没有及时的调用 accept 函数接管连贯,能够先调高上文进步的 2 个参数。
accept 队列满后是否抛弃连贯,是由参数 /proc/sys/net/ipv4/tcp_abort_on_overflow 管制,默认是 0。如果设置为 1 并且溢出,则发送 RST 报文敞开连贯。个别倡议设置为 0,因为抛弃后,客户端如果发送了数据 +ACK,因为等不到应答,那么就会反复发送数据 +ACK,当服务端接管到 ACK 后,如果 accept 队列不满了,那么连贯就建设了。可见 tcp_abort_on_overflow=0,能够进步 TCP 连贯建设胜利的概率。只有 accept 队列长期溢出的时候,才设置 tcp_abort_on_overflow=1。
4、另外还能够关上 TFO 性能,进步 TCP 连贯建设的效率,TFO 详见文档:
https://tools.ietf.org/html/r…
https://www.cnblogs.com/passz…

退出移动版