1.0 三次握手
即TCP连接,client 和server 通过发三次包建立连接的过程。 Snip20190531_6.png<1>客户端把标志位SYN置为1,产生一个随机数seq = J,发送数据包给服务器,客户端进入SYN_SENDER状态。
<2>服务器收到客户端的数据包,通过SYN = 1,知道对方想建立连接,把ACK置为1,ack = J+1,SYN置为1,产生随机数seq = K,将数据包回给client,服务器进入SYN_RECEIVER状态。
<3>客户端收到包后,首先检查ack 是否是J+1,ACK= 1,正确的话,就把ACK置为1,ack = K+1, 回给服务端,服务器判断,ack是否是K+1,ACK = 1, 正确的话,就成功建立连接。进入连接建立状态。Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
SYN攻击:
在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
#netstat -nap | grep SYN_RECV
2.四次挥手
tcp是一个全双工的连接,需要server和client经过发送四次数据包才能断开连接。
Snip20190531_7.png<1>client发送一个FIN 给server,告诉server自己不会发送数据了,关闭client到server的数据传输,但是还可以接收数据。
<2>server收到后,会发送一个ACK的应答,是FIN 序号+1。
<3>server发送一个FIN的序号给client,告诉它自己要关闭了。
<4>client收到后,回一个ACK的应答,server收到后,检查无误,这个就正式断开连接。
为什么建立连接时三次握手,而断开连接需要四次挥手?
因为建立连接时ACK 和SYN 是在一个数据包里发送,而FIN 和ACK 是分开发送的。
为什么是三次握手不是两次?
client向服务器发送SYN后,server向client回复一个ack 假设由于网络原因,第一次的client发包延迟,过了很久才到达服务器,但是其实已经失效了,服务器收到后,回复一下,如果此时不进行第三次握手,那么服务器会一直等待服务器的数据,这样会造成极大的资源浪费。
名词解释
SYN :(同步序列编号):seq和ack存在tcp报文的首部,seq是序号,ack是确认号,都占用四个字节(32位),范围(0 ~ 2^32-1),tcp报文是字节流,tcp报文中的每个字节都按照顺序编号,报文中的序号指的是报文数据中的第一个字节的序号。ack是期望收到对方下个报文段的第一个数据字节的序号。
参照> https://blog.csdn.net/qq_34386891/article/details/80515912
https://baijiahao.baidu.com/s?id=1614404084382122793&wfr=spider&for=pc
网友评论