TCP提供的使面向连接的服务,其通信过程分为三个阶段:建立连接、传输数据、释放连接。并且在整个通信过程中,都会对连接进行维护,以保证可靠通信。
1.建立连接
为了建立一个可靠的TCP连接,连接建立过程中要解决以下三个问题:
(1)使每一方能够确知对方的存在。
(2)允许双方协商一些参数(如最大报文段长度、最大窗口大小、服务质量等)。
(3)能够对传输实体资源(如缓存区大小、连接表的项目等)进行分配。
TCP的通信和建立连接都是采用客户/服务器方式。主动发起连接建立的应用进程被称为客户(client)。被动等待连接建立的应用进程被称为服务器(server)。TCP建立连接采用三次握手的方式,如图4-26所示。
图4-26 TCP三次握手建立连接的过程
假设主机A的一个进程发起建立与主机B一个进程的连接,建立连接的过程为:
第一次握手。主机A的TCP向主机B发出连接请求报文段,其首部中的同步比特SYN应置为1,并选择序号x,表明传送数据时的第一个数据字节的序号是x。
第二次握手。主机B的TCP收到连接请求报文段后,如果同意,则发送确认。B在确认报文段中应将SYN置为1,其确认号应为x+1,同时也为自己选择序号y。
第三次握手。主机A收到此报文段后,向主机B给出确认,其确认号应为y+1。主机A的TCP通知上层应用进程,连接已经建立。主机B的TCP收到主机A的确认后,也通知其上层应用进程,连接已经建立。
握手过程中传送的报文里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。
2.释放连接
如果说建立连接的过程是握手,那么断开连接的过程可以说是挥手。TCP释放连接是通过四次挥手来实现的,如图4-27所示。
假设主动释放连接方为主机A的进程,被动释放方为主机B的进程。释放连接的过程:(www.xing528.com)
第一次挥手。主机A发送一个FIN报文,FIN=1,发送序号为x,用来关闭主机A到主机B的数据传送,也就是主机A告诉主机B:我已经不会再给你发数据了(当然,在FIN报文之前发送出去的数据,如果没有收到对应的ACK确认报文,主机A依然会重发这些数据)。但此时,主机A还可以接收数据。
第二次挥手。主机B收到FIN报文后,发送一个ACK给对方,确认序号为收到序号x+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手。主机B发送一个FIN,用来关闭主机B到主机A的数据传送,也就是告诉主机A,我的数据也发送完了,不会再给你发数据了。
第四次挥手。主机A收到FIN后,发送一个ACK给主机B,确认序号为收到序号+1,至此,完成四次挥手。
图4-27 TCP四次挥手释放连接的过程
3.数据传输
(1)确认和超时重传。
超时重传机制用来保证TCP传输的可靠性。每次发送数据包时,发送的数据包都有seq号,接收端收到数据后,会回复ACK进行确认,表示某一seq号数据已经收到。发送方在发送了某个seq包后,设置一个计时器,如果当计时器超时,还没有收到对应的ACK回复,就会认为报文丢失,会重传这个数据包。
(2)快速重传。
接收数据一方发现有数据包丢掉了,就会发送ACK报文告诉发送端重传丢失的报文。如果发送端连续收到标号相同的ACK包,则会触发客户端的快速重传。
比较超时重传和快速重传,可以发现超时重传是发送端在傻等超时,然后触发重传;而快速重传则是接收端主动告诉发送端数据没收到,然后触发发送端重传。
(3)流量控制。
TCP采用滑动窗口机制实现流量控制。TCP首部有一个字段“窗口”,接收端窗口又称为通告窗口(rwnd),是接收端告诉发送端自己还有多少缓冲区可以接收数据。发送端可以根据这个接收端的处理能力来发送数据,而不会导致接收端无法处理。滑动窗口也是提高TCP传输效率的一种机制。
(4)拥塞控制。
流量控制只关注发送端和接收端自身的状况,而没有考虑整个网络的通信情况。拥塞控制则是基于整个网络来考虑的。如果某一时刻网络上的延时突然增加,TCP做出的应对只有重传数据,但是重传会导致网络的负担更重,会导致更大的延迟以及更多的丢包。如果一个网络内有成千上万的TCP连接如此操作,会形成“网络风暴”,从而拖垮整个网络。为此,TCP引入了拥塞控制策略。拥塞控制策略算法主要包括:慢启动,拥塞避免,拥塞发生,快速恢复。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。