TCP 的三次握手,四次挥手和重要的细节—干货满满,建议细读( 五 )

所以为了让初始序列号更难预测 , 现代系统常常使用半随机的方法选择初始序列号 , 详细的方法就不在这里展开了 。

第二次握手

当服务器接收到客户端的连接请求后 , 就会向客户端发送 ACK 表示自己收到了连接请求 , 而且 , 服务器还得把自己的初始序列号告诉客户端 , 这其实是两个步骤 , 但是发送一个数据包就可以完成 , 用的就是前面说的捎带技术 。 图里的 ACK = client_isn + 1 是指确认号字段的值 , 要注意和 ACK 标志位区分开 。

ACK 字段其实也有不少需要注意的点 , 不过这个跟滑动窗口一块讲比较直观 , 这里就先不提了 。

这里重点强调一下 , 当一个 SYN 报文段到达的时候 , 服务器会检查处于 SYN_RCVD 状态的连接数目是否超过了 tcp_max_syn_backlog 这个参数 , 如果超过了 , 服务器就会拒绝连接 。 当然 , 这个也会被黑客所利用 , 「SYN Flood」就是个很好的例子 。 因为服务器在回复 SYN-ACK 后 , 会等待客户端的 ACK , 如果一定时间内没有收到 , 认为是丢包了 , 就重发 SYN-ACK , 重复几次后才会断开这个连接 , linux 可能要一分钟才会断开 , 所以攻击者如果制造一大批 SYN 请求而不回复 , 服务器的 SYN 队列很快就被耗尽 , 这一段时间里 , 正常的连接也会得不到响应 。

推荐阅读