tcp协议的三次握手四次挥手虽然在我的实际工作中并不常用,但是面试的时候似乎经常被问到,最近好好学习了一把,总结一下。
TCP协议是传输控制协议,位于tcp/ip协议模型的传输层,提供可靠的连接服务。
三次握手:
1.TCP协议的三次握手,总体可以分为三个步骤:请求-应答-再次确认。
握手过程如图所示:
- 客户端发送连接请求的报文
- 服务端接受连接后,回复ACK报文,并为这次连接分配资源
- 客户端接收到ACK报文后也向服务端发送ACK报文,并分配资源,这样tcp连接就建立了。
为了防止失效的连接请求突然又传到了服务器,服务器发送确认包(SYN-ACK)之后,一直等待客户端发送数据,并且重发确认,直至超时,导致服务器资源浪费。
3.SYN攻击
原理:在短时间内伪造出大量不存在的IP地址,向服务器不断发送SYN包,请求连接服务器。服务器在回复确认包(SYN-ACK)之后到收到客户端的ACK之前的TCP连接称为半连接,由于源IP地址不存在服务器无法收到客户端的ACK确认,服务器要不断的重发确认包,直至超时。 这些伪造的SYN包,将长时间占用未连接队列导致正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
检测:SYN攻击是典型的DDOS攻击,当在服务器上看到大量的半连接状态时,尤其是源IP地址都是随机的,基本上可以断定这是一次SYN攻击。Linux下可以使用如下命令检测SYN攻击:netstat -n -p TCP当查看到很多连接状态为SYN_RECV,或者使用命令:netstat -n -p TCP | grep SYN_RECV | grep :22 | wc -l查看某个端口下的未连接数。
防范:SYN网关(代替客户先发送ACK确认包),SYN代理(代替服务器先发送SYN-ACK确认包,看是否有客户端的ACK确认包),SynAttackProtect机制,SYN cookies技术,增加最大半连接数,缩短超时时间。
四次挥手:
1.言简意赅通俗易懂的说法:
A:我没数据要发给你了。
B:好的,我知道了,我还有点数据要给你。
......
B:我也没有数据要发给你了,我准备好要关闭数据连接了。
A:好的,你先关吧。(等2MSL没有回复,说明B端已经正常关闭)那我也关了。
2.上图显示四次挥手:
这是从百度图库偷来的图,因为第一次挥手的请求可能是服务端发出的也可能是客户端发出的,所以这图我是不认同他说的客户端和服务端的说法的,只说AB.
- 主机A向主机B发送一个FIN报文段,还有一个序号为seq的数据包,主机A进入FIN_WAIT_1状态。表示A没有数据要发送给主机B了。
- 主机B向A回一个ACK报文段,请求的数据包序号为seq+1,主机A进入到FIN_WAIT_2状态。表示B知道了A 的关闭请求,但是有可能B还有数据要传送给A,这时候B还可以向A发送数据。
- 主机B向主机A发送一个FIN报文段,请求关闭连接。表示B也没有数据要发送给A了,请求关闭连接。
- 主机A向主机B发送发送ACK报文段,然后主机A进入TIME_WAIT状态,主机B收到A这个ACK报文段之后就关闭连接了;而A在TIME_WAIT状态等待2MSL之后没有收到回复,说明B已经正常关闭了,主机A也可以关闭连接了。