前言
TCP和UDP的区别
- TCP提供
面向连接的、可靠的数据流
传输- UDP提供
非面向连接的、不可靠的数据报
传输- TCP数据
安全可靠
,UDP数据传输快
TCP的三次握手
主机A向B发送连接请求
主机B对收到的主机A的报文段进行确认
主机A再次对主机B的确认进行确认
三次握手状态图(第二次ack应为x+1)
TCP的三次握手过程?为什么会采用三次握手,若采用二次握手可以吗?
采用三次握手是为了防止失效的连接请求报文段突然又传送到主机
,因而产生错误
考虑这样一种特殊情况,主机A第一次发送的连接请求
并没有丢失,而是因为网络节点导致延迟达到主机B
。主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,此时主机A根本不会理会
,主机B就一直在等待主机A发送数据,导致主机B的资源浪费
如果采用三次握手
,由于客户端不会向服务端发出确认,服务端由于没有收到确认信息
,就知道客户端没有要求建立连接,不建立该连接
SYN flood攻击
假设一个用户向服务器发送了SYN报文后突然死机或掉线
,那么第三次握手无法完成,这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度称为SYN Timeout。如 果大量模拟这种情况,服务器端为了维护一个非常大的半连接列表而消耗非常多的资源
SYN flood只能攻击TCP服务
,由于UDP不需要连接,故不受影响。
TCP的四次挥手
由于接收到FIN时意味将没有数据再发来
,但是还是可以继续发送数据
,所以断开连接时必须是四次握手
四次挥手状态图
为什么A在TIME—WAIT状态必须等待2MSL时间呢?
为了保证A发送的最后一个ACK报文段能够到达B
若该ACK报文段很有可能丢失,如果A在TIME—WAIT状态不等待一段时间就直接释放连接到CLOSED状态
,那么就无法收到B重传的FIN+ACK报文段
,也不会再发送一次确认ACK报文段
,那么B就无法正常进入CLOSED状态
防止已失效的请求连接出现在本连接中
在连接处于2MSL等待时,任何迟到的报文段将被丢弃
,这样可以使下一个新的连接中不会出现这种旧的连接之前延迟的报文段。