TCP(Transmission Control Protocol)是面向连接的可靠的通讯协议。TCP需要经过三次握手建立连接,并在断开时通过四次挥手释放连接。TCP通过应答确认、超时重传(RTO)、往返时延(RTT)、数据排序、流量控制、全双工通讯的机制和特性,保证连接的可靠性。
可靠传输
超时重传:RTO,Retransmission TimeOut。TCP对收到的每一帧数据都需要给予应答,如果发送端超过一定时间没有收到来自对端的应答,则重传该帧数据。超时的时长根据网络情况动态调整,网络较好时,超时时间较短。这里是根据数据包往返时延(RTT,round-trip time,数据包从发送端发送出去到接收到这个包的回复时长)进行调整。通过算法和公式平滑RTT值后,最终确定重传超时值。
数据排序:IP层进行数据传输时,是不能保证数据包按照发送的顺序达到目的机器。当IP将把它们传送到TCP层后,TCP将包排序并进行错误检查。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
流量控制:TCP采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。当接收方处理能力强时,窗口增大,表示可以接收更多的数据,否则窗口减少。由此来平衡发送和处理数据的速度。
全双工:即通信的双方可以同时发送和接收数据。(半双工:发送和接收不能同时进行。单工:只能一端往一端发送)。TCP是全双工的通讯方式。
三次握手
三次握手就是,TCP建立连接时,需要在客户端和服务端之前总共发送三个包来确认连接。
第一次握手:客户端设置SYN标志位为1,产生一个随机seq=J,将这两个值发送给服务端。Client进入SYN_SENT状态,等待Server端确认。
第二次握手:服务端收到并解析数据包,得到SYN=1,知道此客户端在请建立连接。服务端设置SYN和ACK标志都为1,将客户端提供的随机值+1,即ack=J+1,产生一个随机值seq=K。服务端将包含以上信息的包发送给客户端端。服务端进入SYN_RCVD状态,并等待客户端再次确认。
第三次握手:客户端收到服务端回复数据包,检查ACK是否为1,以及ack的值是否为J+1。检查通过,将服务端的随机值+1,即ack=K+1,同时设置ACK为1。将包含这些信息的数据包再次发送给服务端端。客户端进入ESTABLISHED状态。服务端收到数据后,检查ack是否为K+1,以及ACK是否为1。检查通过,进入ESTABLISHED状态。至此完成三次握手,连接建立,客户端和服务端可以进行数据传输。
需要三次握手的原因
TCP是一种全双工的通讯,即客户端和服务端都可以同时进行收发数据。第一次握手确认了客户端发数据正常;第二次握手确认客户端收数据正常和服务端发数据正常;第三次确认了服务端收数据正常。因此,“三次”是通讯双方能够确认彼此都能够正常收发数据所需要的最小次数。
四次挥手
四次挥手,就是断开连接时,需要客户端和服务端总共发送4个包以确认断开连接。
第一次挥手,客户端请求关闭(此时客户端称为“执行主动关闭”),将FIN标志置为1,生成随机序列号seq = U。将数据包发送给服务端。客户端进入FIN-WAIT-1状态(等待关闭状态)。
第二次挥手,服务端接收到消息,解析出FIN=1,得知客户端请求断开连接(服务端此时称为“执行被动关闭”)。设置ACK标志为1,回复序列号+1,即ack_seq=U+1,生成随机序列号seq=V。将这些信息发送给客户端。此时服务端进入CLOSE_WAIT状态(半关闭状态)。
客户端收到服务端消息,进入FIN-WAIT-2(终止关闭2)状态。此时表示客户端没有消息要发送给服务端。而服务端可能还有数据要发给客户端。
第三次挥手,当服务端确定也没有数据要发送给客户端后。将发送请求终止报文。设置FIN标志为1,并生成随机序列号seq=W。请求关闭连接。此时服务端进入LAST_ACK(等待确认)状态。
第四次挥手,客户端收到服务端请求关闭请求。设置ACK标志为1,恢复服务端序列号+1,即ack_seq=W+1。发送给服务端。此时客户端进入TIME_WAIT状态。等待一段时间后客户端关闭连接,进入CLOSE状态。
服务端收到客户端回复确认消息,进行关闭连接,进入CLOSE状态。
TIME_WAIT状态
主动关闭端进入TIME-WAIT状态,此时TCP连接还没有释放,需要等待2*MSL的时间(MSL是最长报文寿命,表示一个报文能够在网络中存活的最长时间。这个值一般设置在30s到1min之间)才进行关闭连接动作。
TIME-WAIT状态存在的意义是保证可靠的终止TCP连接和迟到的TCP报文有足够的时间被识别和丢弃。
在第四次挥手的时候,客户端收到服务器连接释放的请求,需要再发出确认的报文。如果最后这个报文丢失,服务端没有收到就会再次发出释放的请求,客户端收到后要再次应答。如果,客户端是直接关闭连接,这种情况下,将无法再收到服务端再次请求释放的报文和进行应答。因此,客户端需要等待给服务端足够的接收到报文的时间,这样才能可靠的终止连接。
另外,一个TCP端口一次只能被一个应用打开。当一个应用占用一个TCP端口时,其他的应用将无法占用该端口。如果在第四次挥手后,客户端直接释放了端口,则其他应用可以进行使用。此时如果网络上还有数据要发送给第一个应用程序,那么数据将会被后来的应用程序错误的接收。因此,需要TIME_WAIT的时间,让迟来的TCP报文有足够的时间被丢弃。从而避免由于端口复用而导致数据被错误的传递。
SYN洪泛攻击
SYN洪泛攻击是面向TCP连接的主要网络攻击手段。攻击者伪造IP地址向服务器发起握手请求,当服务器进行响应(发送第二次握手请求)时,会处于等待客户端响应的状态。由于IP地址是伪造的,因此永远不能得到第二次握手的响应。攻击者大量发起请求,让服务器大量的资源用于等待握手连接,导致服务器资源耗尽无法处理正常的连接请求。
应对SYN洪泛攻击主要有如下的方案:
无效连接监视释放:不停监视所有的连接,当达到一定阈值时拆除这些连接,从而释放系统资源。缺点是,这种方法对于所有的连接一视同仁,不管是正常的还是攻击的。
延缓TCB分配方法:一般的做完第一次握手之后,服务器就需要为该请求分配一个TCB(连接控制资源),通常这个资源需要200多个字节。延迟TCB的分配,当正常连接建立起来后再分配TCB则可以有效地减轻服务器资源的消耗。
使用防火墙(推荐):防火墙在确认了连接的有效性后,才向内部的服务器(Listener)发起SYN请求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)