您的当前位置:首页正文

TCP协议之三次握手

2024-11-23 来源:个人技术集锦

三次握手的目的

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
	建立连接时,本地端口的可用范围

TFO技术

net.ipv4.tcp_fastopen
	此参数是按比特位控制的。其中,第1个比特位为1时,表示作为客户端时支持 TFO;第2个比特位为1时,表示作为服务器时支持 TFO,所以当tcp_fastopen的值为3时(比特为 0x11)就表示完全支持TFO功能。

SYN攻击

处理方式:

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

参考文档
  1. https://mp.weixin.qq.com/s?__biz=MzUxODAzNDg4NQ==&mid=2247483989&idx=1&sn=7e2ed852770743d3955ef9d5561fcef3&scene=21#wechat_redirect
    2.https://time.geekbang.org/column/article/237612
    3.https://mp.weixin.qq.com/s/Jgo_P1oKRHffurkoek0oVw
显示全文