HTTP:详解三次握手和四次挥手

2020-03-12  本文已影响0人  春暖花已开
一、TCP报文格式
TCP报文格式图:
图一.png
1. SYN(synchronous建立联机)

2. ACK(acknowledgement 确认)

3. PSH(push传送)

4. RST(reset重置)

5. URG(urgent紧急)

6. FIN(finish结束)

注:不要将确认号Ack(Acknowledge number) 和 标志位中的 ACK(acknowledgement)混淆

二、三次握手
三次握手.png

SYN攻击:

在三次握手过程中, Server发送SYN_ACK之后, 收到Client的ACK之前的TCP连接称为 半连接(half-open connect), 此时Server处于SYN_RECV状态,Server转入ESTABLISHED状态。 SYN攻击就是Client在短时间内伪造不存在的IP地址, 并向Server不断的发送SYN包, Server回复确认包, 并等待Client确认, 由于源地址不存在的, 因此Server需要不断重发直至超时, 这些伪造的SYN包将产时间占用未连接队列, 导致正常的SYN请求因为队列满而被丢弃, 从而引起网络堵塞甚至系统瘫痪。 SYN攻击时一种典型的DDOS攻击, 检测SYN攻击的方式非常简单, 即当Server上有大量半连接状态切源IP地址是随机的, 则可以断定遭到SYN攻击了, 使用如下命令可以让之现行:

netstat -nap | grep SYN_RECV
三、四次挥手

所谓四次挥手就是终止TCP连接, 就是要断开一个TCP连接时, 需要客户端和服务器总共进行四次交互。在socket编程中, 这个执行过程由客户端或者服务器任意一方执行close来触发, 下面是断开流程图:

四次挥手.png

由于TCP连接时全双工的, 因此, 每个方向都必须要单独进行关闭, 这一原则是当一方完成数据发送任务后, 发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了, 即不会再收到数据了, 但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。 首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

四、状态

SYN_SENT状态:

当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。 (发送端)

SYN_RCVD状态: 这个状态与SYN_SENT相呼应这个状态表示接受到了SYN报文。

ESTABLISHED: 表示连接已经建立了。

CLOSE_WAIT状态: 发起TCP连接关闭的一方称为client,被动关闭的一方称为server。 被动关闭的server收到FIN后, 但未发出ACK的TCP状态,是CLOSE_WAIT。 出现这种状况一般都是由于server端代码的问题, 如果你的服务器上出现大量CLOSE_WAIT, 应该要考虑检查代码。

TIME_WAIT状态:表示收到了对方的FIN报文, 并发送出ACK报文, 就等2MSL后即可回到CLOSED可用状态。

LAST_ACK:表示被关闭的一方在发送FIN报文后, 最后等待对方的ACK报文。 当收到ACK报文后, 也即可以进入到CLOSED状态了。

CLOSED:表示连接中断。


参考
真的懂了:TCP协议中的三次握手和四次挥手

上一篇下一篇

猜你喜欢

热点阅读