1.同步Sequence序列号,TCP协议的许多特性都是依赖序列号实现的,比如流量控制、消息丢失后的重发等等
2.交换TCP参数,如MSS、窗口比例因子、选择性确认、指定校验和算法
1.一开始,客户端和服务端都处于CLOSED状态。先是服务端主动监听某个端口,处于LISTEN状态。
2.客户端主动发起连接SYN,之后处于SYN-SENT状态。
3.服务端收到发起的连接,返回SYN,并且ACK客户端的SYN,之后处于SYN-RCVD状态。**将SYN和ACK一次性返回的,这也就是为什么握手是三次,而挥手是四次**
4.客户端收到服务端发送的SYN和ACK之后,发送ACK的ACK,之后处于ESTABLISHED状态,因为它一发一收成功了。
5.服务端收到ACK的ACK之后,处于ESTABLISHED状态,因为它也一发一收了。
TCP 的连接状态查看,在 Linux 可以通过 netstat -napt 命令查看
一、服务端
二、客户端
参数
net.ipv4.tcp_syn_retries
主动建立连接失败时,发SYN的重试次数,默认是6次,第1次重试发生在1秒钟后,接着会以翻倍的方式在第 2、4、8、16、32秒共做6次重试,最后一次重试会等待64秒,如果仍然没有返回 ACK,才会终止三次握手。所以,总耗时是1+2+4+8+16+32+64=127秒,超过2分钟,所以可以根据业务尽量减少重试次数
net.ipv4.ip_local_port_range
建立连接时,本地端口的可用范围
net.ipv4.tcp_fastopen
此参数是按比特位控制的。其中,第1个比特位为1时,表示作为客户端时支持 TFO;第2个比特位为1时,表示作为服务器时支持 TFO,所以当tcp_fastopen的值为3时(比特为 0x11)就表示完全支持TFO功能。
处理方式:
1.内核参数修改
net.core.netdev_max_backlog
在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_abort_on_overflow
net.ipv4.tcp_syncookies
net.ipv4.tcp_synack_retries
2.通过防火墙编写高级acl