所谓的三次握手,就是指客户端和服务器端建立 TCP 连接。访问过程中会发送三个包来确认,并建立连接。
第一步:客户端会发送请求包,包内包含 SYN 信号,SYN 标记位置为1(还可以是其他的位置),并且随机产生一个随机值 seq(用来后面的检验),将这些发送给服务端。
第二步:服务端收到 SYN 信号后,会发送一个确认信息给客户端,包内包含 SYN 的标志位 SYN=1 ,以及确认标志位 ACK=1 ,检验位 ack=J+1(客户端发送的随机数+1),本机生成的随机数
seq=K。
第三步:客户端在收到服务端的确认信息后,开始发送建立连接的信息,包内包含,确认标志位ACK=1,检验位 ack=K+1 。
经过以上这三步,服务端与客户端就建立了连接。
(同时由于服务器端只要收到 SYN 信号,就会处理并发送建立连接的信息,所以有些人会不停的发送 SYN 请求信息,但是不接收服务器端发送来的确定建立信息,也就是说只执行三次握手的第一步,那么服务器端就会一直接受接受,然后导致服务器资源耗尽。这就是 SYN 攻击。解决办法我在网上找了,大致有两种:1、硬件防护。2、软件防护。
硬件防护不用说,就是买硬件防火墙。
软件防护方法有多种:
1、做 SYN 网关,当用户发送 SYN 请求时,由网关代理转发至后端服务器,这样后端服务器能与网关之间完成一整套TCP连接,SYN 攻击被阻挡在 SYN 网关那里。
2、做 SYN 连接超时设置,再短时间内如果一个连接没有完成,则不会继续等待,会自动断开。
3、做 SYN 中继,当用户发送 SYN 请求时,中继器会等待知道收到客户端发送的 ACK 检验后再讲请求发送到后端服务器上,否则丢弃。)
建立连接后,自然就需要断开连接。
TCP/IP 四次挥手
第一步:客户端主动发出断开请求 FIN M 给服务器。
第二步:服务器端在收到客户端发送的 FIN M 后,返回确认信息 ack M+1 。
第三步:服务器端发送完确认信息后会再次发送 FIN N ,用来关闭向客户端发送的数据。
第四步:客户端在收到服务器端发送来的确认信息后,会返回一个标志信息 ACK=1(这个 1 就是之前建立连接的标志信息),然后返回确认信息 ack=K+1。
至此,TCP连接彻底断开。
(注:文中图片来自http://blog.csdn.net/mxgsgtc/article/details/12718905 )
以上只是我个人的语言组织理解,如果有错误的地方,还望能指正出来,良辰在此谢过
本文出自 “菜鸟的Linux历程” 博客,请务必保留此出处http://jackdady.blog.51cto.com/8965949/1704004
原文地址:http://jackdady.blog.51cto.com/8965949/1704004