TCP流量控制与连接管理

一、TCP流量控制

在前面的文章中我们讲过,一条TCP连接每一侧主机都为该连接设置了接收缓存。
如果应用程序读取数据时相对较慢,而发送方发送的太快太多,这时就可能会导致该连接的接收缓存溢出。这时TCP要为它的程序提供速度匹配服务和流量控制服务。
(1)速度匹配服务:发送速率和接收应用程序的提取速率匹配。
(2)流量控制:发送方不能发送的太多太快,让接收缓存区溢出。
那么TCP流量控制是如何工作的呢?
在这里插入图片描述
如上图所示,左边为接收窗口,右边为接收缓存,我们假设TCP接收方丢弃失序的报文段。
(1)流量控制使用接收窗口:接收缓存区的剩余空间。
(2)接收方在报文段中宣告接收窗口的剩余空间。主机B通过把当前的接收窗口也就是剩余空间的值放入发给主机A的报文段接收窗口字段中,通知主机A它在该连接的缓存中患有多少空间可用。
(3)发送方限制没有确认的数据不超过接收窗口也就是剩余空间,这是为了保证接收缓存区不溢出。

二、TCP连接管理

1、连接建立

在之前我们说过TCP在交换数据报文段之前在发送方和接收方之间建立连接。连接过程分为三步:
(1)客户端的TCP首先向服务器端的TCP发送一条特殊的报文段成为SYN报文段。该报文段首部的SYN被置为1。选择一个初始序号client_isn放入到序号段中。该报文段没有应用层数据。
(2)服务器接收SYN报文段,为该连接分配缓冲区和变量。并回复SYNACK即允许连接报文段。这个允许连接报文段也不包含应用层数据。回复的报文段中SYN置为1,确认号字段置为客户端发过来的client_isn+1,序号字段是服务器服务器自己选择的初始序号server_isn。通俗的说就是:我收到了你发起建立连接的分组,这个分组初始序号是client_isn,我同一建立连接,我自己的初始序号是server_isn。
(3)客户端收到了服务器端发送过来的允许连接的报文段。这时客户端给该连接分配缓存和变量,同时向服务器发送新的报文段。这个报文段是对服务器发过来的允许连接进行了确认。因为连接已经建立,此报文段的SYN置为0。
上面三步也就是我们常说的”三次握手“。

2、连接终止

有连接就会有终止连接。参与一条TCP连接的两个进程中的任何一个都能终止该连接。主要分为4步。
在这里插入图片描述

(1)客户发送TCP FIN控制报文段到服务器。此报文段首部中的FIN置为1。
(2)服务器接收FIN报文段后,回复ACK即确认报文段。并发送FIN报文段到客户端。
(3)客户端接收FIN报文段,回复ACK确认报文段。
(4)服务器接收ACK,连接关闭。

3、客户端与服务器端的状态转换

在连接建立和终止过程中客户端和服务器端会出现一系列的TCP状态。
(1)客户端状态转换
在这里插入图片描述
如图所示,客户端一开始处于关闭(CLOSED)状态。客户的应用程序发起一个新的TCP连接,这引起客户中的TCP向服务器中的TCP发送一个SYN报文段,发送过后,TCP客户端进入SYN_SENT状态,它等待来自服务器的TCP对客户端所发的报文段进行确认。收到服务器发过来的允许连接报文段后进入已建立(ESTABLISHED)状态。当要终止连接时客户发送TCP FIN控制报文段到服务器,这时进入FIN_WAIT_1状态,等待来自服务器端的ACK即确认报文段。当收到服务器端的确认报文段时进入FIN_WAIT_2状态。这时客户端等待服务器的另一个FIN被置为1即FIN报文段。当收到FIN报文段后,客户端对服务器的报文段进行确认并进入TIME_WAIT状态。若ACK丢失,TIME_WAIT状态使客户端重传最后的确认报文。经过等待后连接就正式关闭,客户端所有资源将被释放。
(2)服务器端状态转换
在这里插入图片描述
服务器端处于关闭状态,当服务器程序创建一个监听套接字时,服务器转变为监听(LISTEN)状态,正在监听客户发送其SYN报文段的端口。当收到客户端发送的SYN报文段时,回复SYNACK允许连接报文段,这时状态为SYN_RCVD,当收到客户端发送的连接确认报文段时状态转变为已建立(ESTABLISHED)状态,当要关闭连接时收到客户端发来的FIN报文段,服务器回复ACK报文段后进入CLOSE_WAIT状态,之后服务器端又发送一个FIN报文段,发送完后进入LAST_ACK状态,当服务器端收到客户端发送的ACK报文段后连接关闭。

三、TCP有限状态机

TCP协议的操作可以使用一个具有11种状态的有限状态机来表示,如下图所示:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值