TCP报文中一些字段的含义
确认ACK:仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1
同步SYN:在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1
终止FIN:用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求
释放
TCP 三次握手
一次握手:客户端发送连接请求报文到服务端。报文首部中的同步SYN=1,同时选择一个初始序列号 seq=x ,发送后客户端进入SYN_SEND状态,等待服务端的确认。
二次握手:服务端发送确认报文到客户端。确认报文中包含:确认ACK=1,同步SYN=1,确认号ack=x+1(客户端初始序列号+1),同时也要为自己初始化一个序列号 seq=y。然后服务端进入SYN_RECV状态。
三次握手:客户端发送确认报文到服务端。确认报文:ACK=1,确认号ack=y+1(服务端的初始序列号+1),自己的序列号seq=x+1(服务端返回的确认号ack的值)。然后客户端和服务端都进入ESTABLISHED状态,完成 TCP三次握手。
为什么要三次握手?
三次握手的目的是建立可靠的通信信道,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是否正常。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
第二次握手:Client 确认了自己发送、接收正常,对方发送、接收正常;Server 确认了对方发送正常,自己接收正常(此时Server还需确认自己的发送和对方的接受是否正常)
第三次握手:Server 确认了自己发送、接收正常,对方发送、接收正常
三次握手过程中可以携带数据吗?
在 TCP 三次握手过程中,第三次握手是可以携带数据的(客户端发送完ACK 确认包之后进入 ESTABLISHED 状态)。
TCP 四次挥手
第一次挥手:客户端发送连接释放报文到服务端。终止FIN=1,序列号seq=u。然后客户端进入FIN-WAIT-1(终止等待1)状态。
第二次挥手:服务端发动确认报文到客户端 。确认ACK=1,确认号ack=u+1,序列号seq=v。发送确认报文后服务端进入CLOSE-WAIT(关闭等待)状态。客户端接收确认报文后进入FIN-WAIT-2(终止等待2)状态,此时客户端等待服务端发送连接释放报文(第三次挥手)
第三次挥手:服务端发送连接释放报文到客户端。确认ACK=1,终止FIN=1,确认号ack=u+1,序列号seq=w。然后服务端进入LAST-ACK(最后确认)状态,等待客户端的确认
第四次挥手:客户端发送确认报文服务端。确认ACK=1,确认号ack=w+1,序列号seq=u+1.然后客户端进入TIME-WAIT状态。服务端接收确认报文后进入 CLOSE 状态。
如果客户端等待2MSL后依然没有收到回复,就证明服务端已正常关闭,随后客户端关闭连接
为什么客户端最后还要等待2MSL才断开?
第一,客户端发送的最后一个ACK报文可能丢失。如果该报文丢失,服务器会认为自己第三次挥手时发送的报文没有被成功接收,于是服务器会重新发送报文。而客户端就能在这个2MSL时间段内收到这个重传的报文,然后给出回应报文,并且会重启2MSL计时器。
第二,确保当前连接的报文不会出现在下一次连接中。每个报文最多只有1 MSL寿命。最坏情况下,ACK经历了1 MSL才到达服务端,假如在ACK到达前一瞬间,服务端重传了FIN并发生了滞留,需要等待1 MSL才可让其失效。因此,在最坏情况下,需要2 MSL才可让双向的滞留报文失效。1 MSL+1 MSL= 2 MSL
为什么要四次挥手?
举个例子:A 和 B 打电话,通话即将结束时
第一次挥手:A 说“我说完了”(发送连接释放报文)
第二次挥手:B 回答“我知道了”(发送确认报文)。但是 B 可能还会有要说的话
第三次挥手:B 说“我说完了”(发送连接释放报文)。
第四次挥手:A 回答“我知道了”(发送确认报文)。B听到后离开通话(CLOSE 状态),A等待一会儿后也离开通话(CLOSE 状态)
什么是 SYN洪泛攻击?如何防范?
SYN洪泛攻击属于 DOS 攻击的一种,它利用 TCP 协议缺陷,通过发送大量的半连接请求,耗费 CPU 和内存资源。
原理:
在三次握手过程中,服务器发送 [SYN/ACK] 包之后、收到客户端的 [ACK] 包之前的 TCP 连接称为半连接状态(half-open connect),此时服务器处于 SYN_RECV(等待客户端响应)状态。如果未接收到客户端的 [ACK],则会不断重发请求直至成功。
SYN 攻击的攻击者在短时间内伪造大量不存在的 IP地址,向服务器不断地发送 [SYN] 包,服务器回复 [SYN/ACK] 包,进入半连接状态。由于源地址是不存在的,服务器会不断的重发直至超时。
由于这些伪造的 [SYN] 包将长时间占用未连接队列,导致目标系统运行缓慢、网络堵塞甚至系统瘫痪。
检测:当在服务器上看到大量的半连接状态时,特别是源 IP 地址是随机的,基本上可以断定这是一次SYN 攻击。
防范:
通过防火墙、路由器等过滤网关防护。
通过加固 TCP/IP 协议栈防范,如增加大半连接数上限,缩短超时时间。