服务器接收到客户端的 SYN 报文以后,也要生成一个特殊的报文段来允许客户端的接入,这个报文是设置一个自己的初始序号,SYN 设置为 1,ACK 设置为 SYN 报文序号加一。这个报文段称之为 SYNACK 报文。并且根据 SYN 报文的参数来分配本地变量,但是也是由于这么早的分配变量就有一种 SYN 洪泛攻击。注意一下,上面的这两个报文段都没有数据部分。
在客户端收到 SYNACK 报文段时候需要对客户端分配变量,然后对服务器的允许进行确认。这时候 SYN 位要置位 0 ,并且可以携带数据,也就是这时候是已经开始了数据传输的。
那么问题来了,为什么需要序号呢?为什么又是三次握手而不是两次?以及什么是 SYN 洪泛攻击?
序号存在的目的是为了能否区分多个 TCP 连接,毕竟是一个服务器,多个客户端,不然各个 TCP 连接就会变得非常混乱。
其实我们单方向来看其实就是两次握手,之所以是三次握手是因为 TCP 是双工的,中间那次的 SYNACK 其实试一次合并。
SYN 洪泛攻击就是让客户端乱遭一些 IP 然后和服务器简历 TCP 连接,由于服务器收不到 ACK 但是他分配了变量,导致一直在消耗服务器资源。这个解决方法就是采用 SYNCookie 这个 Cookie 其实就是服务器在发送 SYNACK 的头部的 seq 序号的值,那么客户端必须返回一个比 Cookie 大一的 ACK 回来才是正确的,否则不分配变量,也就是变量延时分配。
2.释放链接四次挥手首先客户端发起终止会话的请求,FIN=1
服务器接收到后相应客户端 ACK=1
服务器发送完毕终止会话 FIN=1
客户端回应 ACK=1
这里需要说明一下的是最后的那个长长的 TIME_WAIT 状态一般是为了客户端能够发出 ACK 一般他的值是 1分钟 或者2分钟
4.总结好了,今天真的写了不少,主要就是把 TCP 的可靠传输以及连接管理讲清楚了,以及里面的一下细节问题,真的很花时间。然后其他没有涉及到的就是关于 TCP 的头并没有详细的去分析,这个东西其实也不是很难,但是现在篇幅真的已经很大就先这样,头里面的都是固定的不需要太多的理解。