tcp的三次握手与四次挥手
本篇文章主要讲解的是tcp的三次握手和四次挥手的信号传输过程
tcp的含义:1、TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据前,通信双方 必须在彼此间建立一条连接,所谓的连接其实就是客服端和服务端保存的一份关于对方的信息,如ip地址、端口号等。
2、TCP可以看成是一种字节流,它会处理IP层或以下层的丢包、重复以及错误问题。
3、在建立连接的过程中,双方需要交换一些连接参数,这些参数可以放在TCP头部。一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。
4、一个TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手来建立一个链接,通过四次挥手来关闭一个链接。
5、当一个链接被建立或者被终止时,交换的报文段只包含TCP头部而没有数据。
过程
第一次:客户端向服务端发送连接请求报文段,标识为syn(建立连接),产生一个序列号seq=x,表明传送数据时的第一个数据字节序号为 x
第二次:服务端的TCP 收到连接请求报文段后,如果同意,则发挥连接同意报文
服务端在连接同意报文中使用俩个标识SYN和ACK,其随机序列号为seq=y,确认序列号为ack=x+1
第三次:客户端收到服务端的报文,发送确认报文ACK,随机序列号为seq=x+1,ack=y+1
服务端和客户端收到确认报文,通知上层应用进程:TCP连接已建立
总结
首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。
2、三次握手过程详解:
四次挥手
TCP是基于全双工通信的,所以双方都可以主动释放连接。
四次挥手的意义就在于,当 A 发送完最后一条数据之后,但可能B还有未发送给A 的数据。
所以A在发送完收据后可以请求释放连接,此时B给与A响应,告诉A我知道你想断开连接,此时A还可以继续接收B发送的信息。
在B处理完工作后,也请求释放连接。A同意后,就断开连接。
这样可以保证数据正常可靠的交互。
过程
FIN : 标志位,请求关闭连接
第一次:数据传输结束后,通信双方都可以释放连接
假设A已经向B传输完数据,A就可以发生释放连接报文段,并停止发送数据,主动关闭TCP连接
A 连接释放报文首部 FIN,其序列号 seq = u,等待 B 的确认。
第二次:B收到后,发送确认报文,意思是我收到了确认号 ack = u+1,而这个报文段自己的序号为seq = v 从A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。B 若发送数据,A仍需要接收
第三次:当B发送完数据后,就可以释放连接。
B 发出的连接释放报文 的 FIN,序号为w,ack仍为u+1
第四次: A 收到连接释放报文后,必须发出确认。确认好 ack = w +1,序号seq = u+1。
至此,双方断开连接
总结
起初A和B处于ESTABLISHED状态——A发出连接释放报文段并处于FIN-WAIT-1状态——B发出确认报文段且进入CLOSE-WAIT状态——A收到确认后,进入FIN-WAIT-2状态,等待B的连接释放报文段——B没有要向A发出的数据,B发出连接释放报文段且进入LAST-ACK状态——A发出确认报文段且进入TIME-WAIT状态——B收到确认报文段后进入CLOSED状态——A经过等待计时器时间2MSL后,进入CLOSED状态。
问题
1、为什么不能用两次握手进行连接?
答:主要为了防止已失效的连接请求报文段突然又传送到了服务器,因而产生错误。如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端工发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务器,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务器,此时服务器误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务器发出确认,就建立新的连接了,此时客户端不理睬服务器的确认且不发送数据,则服务器一致等待客户端发送数据,浪费资源。
2、为什么A在TIME-WAIT状态必须等待2MSL的时间?
MSL最长报文段寿命Maximum Segment Lifetime,MSL=2
答:两个理由:1)保证A发送的最后一个ACK报文段能够到达B。2)防止“已失效的连接请求报文段”出现在本连接中。
1)这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B超时重传FIN+ACK报文段,而A能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则B无法正常进入到CLOSED状态。
2)A在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
3、为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
4、如果已经建立了连接,但是客户端突然出现故障了怎么办?
答:TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
5、Server端易受到SYN攻击?
答:服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击,SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。
防范SYN攻击措施:降低主机的等待时间使主机尽快的释放半连接的占用,短时间受到某IP的重复SYN则丢弃后续请求。