Tcp怎么保证可靠性
####(1)、序列号、确认应答、超时重传
数据达到接收方,接受方会发送一个确认应答序列,确认应答序列说明发送方下一次需要接受的序列号。如果接收方迟迟为收到确认应答,那么可能是发送方数据丢失或者确认应答序列丢失,在经过一段时间差后,发送方会进行此数据段的重传。这个时间差一般是2*RTT(报文往返时间)+ 一个时间差。
####(2)、窗口控制与高速重发控制(重复确认应答)
TCP会利用窗口控制来提高传输速度,意思是在一个串窗口大小内,不用一定等到确认应答才能发送下一段数据。窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。
传送门:博客-TCP华东窗口控制流量大小
(3)、拥塞控制
如果吧窗口定义的很大,发送端连续发送大量的数据,可能会造成网络的拥堵,甚至造成网络的瘫痪。所以TCP为了防止这种情况进行拥塞控制。
- 慢启动:定义拥塞窗口,一开始将该窗口大小设为1,之后每次收到确认应答(经过一个RTT),将拥塞窗口大小*2。
- 拥塞避免:设置慢启动阈值,一般开始设置为65536。拥塞避免是当拥塞窗口大小达到这个阈值,拥塞窗口的值不在指数上升,而是加法增加。将报文段的超市重传看作拥塞,则一旦发生拥塞,先将阈值设为当前窗口大小的一般,并且将窗口大小设为1,再次进入慢启动过程。
- 快速重传:在遇到3此重复应答时,代表收到3个报文段,但是之前的1个段丢失了便对它进行立即重传。然后先将阈值设为当前窗口大小的一般,然后将拥塞窗口大小设为慢启动阈值+3的大小。
这样:在TCP通信是,网络吞吐量呈现逐渐的上升,并且随着拥堵来减低吞吐量,再进入慢慢上升的过程,网络不会轻易发生瘫痪。
TCP建立连接和断开连接的过程
三次握手
- Clinet将标志位SYN置为1,随机产生一个值seq=x,并将该数据报发送值Server,Clinent进入SYN_SENT状态,等待Server确认。
- Server收到数据包后,后标志位SYN=1知道Client请求建立连接,Server将SYN和ACK都置为1,ACK=x+1,随机产生一个seq=y,并将该数据包发送给Client确认请求连接,Server进入SYN_REVD状态。
- Client收到确认后,检查ACK是否为x+1,SYN是否为1,如果确认,ACK=y+1,并将该数据包发送到Server,Server检查ACK是否是y+1,SYN是否为1。如果正确,则成建里连接。Client和Server都进入ESTABLISHED状态,完成三次握手,随后Client和Server之间就可以传输数据了。
为了实现可靠数据传输,TCP协议的通讯双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方收到的。三次握手的过程即使通信双方相互告知序列号的起始值,并确认对方已经收到了词序列号起始值的必经步骤。<\b>
如果知识两次握手,至多只能知道起始序列号收到并被确认,另一方选择的序列号则得不到确认。
四次挥手
由于TCP链接是全双工的,因此,每个方向都必须单独进行关闭,这一原则是当乙方完成数据发送任务后,发送一个FIN来终止这一方向上的连接,收到一个FIN只是意味着这一方向上没有数据流动了,既不会在收到数据,但是这个TCP连接上任然能够发送数据,知道这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
- 数据传输结束后,客户端的应用发出连接释放把文段,并停止发送数据,客户端进入FIN_WAIT_1状态,此时客户端依然可以接受服务器发送来的数据。
- 服务器接收到FIN后,发送一个ACK给客户端,确认序列号+1,服务器进入CLOSE_WAIT状态。客户端收到后进入FIN_WAIT_2状态。
- 当服务器没有数据要发送时,服务器发送一个FIN报文,此时服务器进入LAST_ACK状态,等待客户端的确认。
- 客户端收到服务器的FIN报文后,给服务器发送一个ACK报文,确认序列号收到的序列号+1。此时客户端进入TIME_WAIT状态,等待2MSL(MSL:报文段最大生存时间),然后关闭连接。