![0e82afda535cd723208e5edf509e2090.png](https://i-blog.csdnimg.cn/blog_migrate/2f9594a07db758021082fd6e12ed93c0.jpeg)
握手的目标
同步Sequence序列号:初始序列号 ISN(Initial Sequence Number)
交换TCP通讯参数:如MSS、窗口比例因子、选择性确认、指定校验和算法
三次握手
![1e1e24d3b733ad3628413be292575748.png](https://i-blog.csdnimg.cn/blog_migrate/66a568d5a8adadd923395c7622534e92.jpeg)
三次握手(1):SYN报文
![6f1affcbd5d21a043dd4c9518913b9a5.png](https://i-blog.csdnimg.cn/blog_migrate/9cf345960c00ba0f7ed87524a0e2433c.jpeg)
三次握手(2):SYN/ACK报文
![4fe237d06bd917cc138edee1552da414.png](https://i-blog.csdnimg.cn/blog_migrate/54b76d1ffcfb2ca1928774425a14e2ed.jpeg)
三次握手(3):ACK报文
![3da18d5553bb07a4bc3a56490d2cced9.png](https://i-blog.csdnimg.cn/blog_migrate/fe4d94e5c9b10109778ec51179eed3b6.jpeg)
特例情况
两端同事发送SYN:双方使用固定源端口且同时建连接,会使用到TCB
![fe3b6a22c2a70e7c8bf398de20d24793.png](https://i-blog.csdnimg.cn/blog_migrate/b024614faf0f45308bdeae9055f509b5.jpeg)
TCP 中的性能优化和安全问题
服务器三次握手流程示例
![45816d91d981c950d600718dd09a5d8d.png](https://i-blog.csdnimg.cn/blog_migrate/67fcbbb9eed9c37f3cf91aa624a2873b.jpeg)
优化:
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降低时延
![c2233afdd9312120adf4afb310dba505.png](https://i-blog.csdnimg.cn/blog_migrate/5b1023b75773f2a9712e3a158e29dc58.jpeg)
第二次连接时跳过三次握手,使用上次连接时保存在cookie中的连接信息,同时发送数据,如GET请求信息;
Linux上打开TCP Fast Open:
![ec81a208afc7fba62a9303c68d124828.png](https://i-blog.csdnimg.cn/blog_migrate/05b94581083adbdb25ae433adc9007b2.jpeg)
SYN攻击
攻击者短时间伪造不同IP地址的SYN报文,快速占满backlog队列,使服务器不能为正常用户服务
解决方法1:Linux内核配置
![4b19c9e54df7307ff4d364f84fb1b42d.png](https://i-blog.csdnimg.cn/blog_migrate/cd481aa86ff08f0cd5e403777e13a6a1.jpeg)
解决方法2:tcp_syncookies
![1ad349bead627aad6a085aa8fcc8569a.png](https://i-blog.csdnimg.cn/blog_migrate/f5c44a219cdd589293570c94bc047c3e.jpeg)
TCP_DEFER_ACCEPT功能
收到三次握手最后一步的ACK分组后,内核将报文放在accept队列中,不激活应用程序,待服务器再收到后续实际的报文请求后,再激活对应的应用程序(如Nginx),以应用程序响应效率更高。
![aec6c94c991b1f4c6829ad15296379f5.png](https://i-blog.csdnimg.cn/blog_migrate/e31248d807c0c5c3a1647e3725ea31d1.jpeg)