TCP三次握手四次挥手
三次握手就是TCP建立连接过程,四次挥手就是TCP释放连接过程
三次握手
简单的说建立连接过程分三部 1.Client端发送连接请求报文,2.Server段接受连接后回复ACK报文,3.Client端接收到ACK报文后也向Server段发生ACK报文,这样TCP连接就建立了
- SYN是首部同步位(SYN=1的报文段不能携带数据)但要消耗掉一个序号,所以第三次握手时,不再有SYN=1这个信号
- ACK=1代表是应答(ACK)报文
- seq 代表发送报文的序号,每发一个报文他要增加1,比如客户初始报文是x,他发的下一个报文就是x+1
- ack 代表应答的是哪一条报文,比如服务器应答的是发送方seq=x的报文,所以ack=x+1
关于三次握手有一个经典的疑问,为什么要三次握手?二次握手它不香吗?
答:主要为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。如A发出连接请求,但因连接请求报文丢失而未收到确认,于是A再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,A工发出了两个连接请求报文段,其中第一个丢失,第二个到达了B,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达B,此时B误认为A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接,不采用三次握手,只要B发出确认,就建立新的连接了,此时A不理睬B的确认且不发送数据,则B一致等待A发送数据,浪费资源。
有关SYN攻击
二次握手后服务器就分配资源了,客户端要三次握手后分配资源,这就导致如果许多虚假ip向Server不断地发送SYN包,些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃。
防范SYN攻击措施:降低主机的等待时间使主机尽快的释放半连接的占用,短时间受到某IP的重复SYN则丢弃后续请求
四次挥手
简单的说释放连接过程分四步:1.客户端发起中断请求(FIN)2.服务器端答应了(ACK)3.服务器端发起中断请求报文(FIN)4.客户端答应了(ACK)
- FIN 终止请求的意思
注意以下三点
1.终止请求可以客户端先发起,也可以服务器端先发起
2.如图B处于close-wait状态还可以发消息的
3.如图A的time-wait状态需要等待2msl是因为:2MSL是最大报文段生存时间,虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文