握手的目标
同步Sequence序列号:初始序列号 ISN(Initial Sequence Number)
交换TCP通讯参数:如MSS、窗口比例因子、选择性确认、指定校验和算法
三次握手
三次握手(1):SYN报文
三次握手(2):SYN/ACK报文
三次握手(3):ACK报文
特例情况
两端同事发送SYN:双方使用固定源端口且同时建连接,会使用到TCB
TCP 中的性能优化和安全问题
服务器三次握手流程示例
优化:
1、超时时间与缓冲队列
1.1 应用层connect超时时间调整
1.2 操作系统内核调整
1)服务器端SYN_RCV状态:
net.ipv4.tcpmaxsyn_backing:SYNRCVD状态连接的最大个数
net.ipv4.synackretries:被动建立连接时,发SYN/ACK的重试次数
2)客户端SYN_SENT状态:
net.ipv4.synackretries=6 主动建立连接时,发SYN的重试次数
net.ipv4.ip_local_port_range = 32768 60999 建立连接时的本地端口可用范围
3)ACCEPT队列设置
2、Fast Open降低时延
第二次连接时跳过三次握手,使用上次连接时保存在cookie中的连接信息,同时发送数据,如GET请求信息;
Linux上打开TCP Fast Open:
SYN攻击
攻击者短时间伪造不同IP地址的SYN报文,快速占满backlog队列,使服务器不能为正常用户服务
解决方法1:Linux内核配置
解决方法2:tcp_syncookies
TCP_DEFER_ACCEPT功能
收到三次握手最后一步的ACK分组后,内核将报文放在accept队列中,不激活应用程序,待服务器再收到后续实际的报文请求后,再激活对应的应用程序(如Nginx),以应用程序响应效率更高。