持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
核心描述
- 什么是 TCP 协议
- 为什么要有三次握手:为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
- 三次握手相关的缩写:
- SYN (Synchronize Sequence Numbers):同步序列编号-同步标签,该标志位仅在三次握手建立 TCP 连接时有效。
- ACK (Acknowledgement Number):确认编号-确认标志,TCP 协议规定,只有 ACK=1 时有效,也规定连接建立后所有发送的报文的 ACK 必须为1
- seq (Sequence number):顺序号码,后续传输过程中由 ISN 累加 1 而来
- ISN (Initial Sequence Number):初始顺序号码,动态生成(随机数+时钟)防止被破解出来,也防止重复重复
- 三次握手的过程:
- 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据.
知识拓展
- 其他与 TCP 相关的场景的缩写:
- FIN (Finish):结束标志,用来释放一个连接。当 FIN=1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放。
- 什么是 SYN 攻击(SYN Flood):SYN 攻击指的是,攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认。由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪。
- 检测:当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。在 Linux/Unix 上可以使用系统自带的 netstats 命令来检测 SYN 攻击。
- 防御:
- 缩短超时(SYN Timeout)时间
- 增加最大半连接数
- 过滤网关防护
- SYN cookies技术
参考资料
- 在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP:cloud.tencent.com/developer/a…
- TCP、UDP 的区别,三次握手、四次挥手:ainyi.com/55
浏览知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。