TCP连接管理

1. 建立连接

TCP 建立连接的过程需要在客户端和服务端之间交换 3 个 TCP 报文段,故而也称为 “三次握手”。

假设 A 运行 TCP 客户端程序,B 运行 TCP 服务端程序,则三次握手过程如下所示:

在这里插入图片描述

  • 开始时,两者各自创建一个 TCP 套接字,此时两者都处于 CLOSED 状态;
  • 然后,服务端 B 将套接字标记为被动的,进入 LISTEN 状态,监听客户端连接请求;
  • A 向 B 发送一个 SYN 报文段,其中的同步位 SYN=1,同时选择一个初始序号 seq=x;SYN 报文段不能携带数据,但要消耗一个序号,在发送完 SYN 报文段之后,进入 SYN_SENT 状态;
  • B 收到 A 的连接请求报文后进入 SYN_RCVD 状态,然后向 A 发送确认:确认报文段的 SYN=1、ACK=1,确认号为 ack=x+1,同时为自己选择一个初始序号 seq=y,此报文段也不能携带数据,但要消耗一个序号;
  • A 收到 B 的确认后,还要向 B 返回确认,然后进入 ESTABLISHED 状态:确认报文的 ACK=1,确认序号为 ack=y+1,而自己的序号为 seq=x+1,此报文段可以携带数据,如果不携带数据则不消耗序号(下一个报文段的序号仍为 seq=x+1);
  • B 收到 A 的确认后也进入 ESTABLISHED 状态。

为什么 A 最后还要发送一次确认? 主要是为了防止已失效的连接请求报文段突然又传送到了 B:如果 A 发出的第一个连接请求报文段因为网络延迟没有及时到达 B;此时 A 发出第二个连接请求报文段,且成功建立了连接,数据传输完毕后,释放了连接;一段时间后,第一个连接请求报文段终于到达了 B(B 以为是一个新的连接请求),如果 B 不需要 A 的确认就建立了连接,而 A 又不理会 B 的确认,则 B 就白白浪费了资源。

2. 释放连接

假设 A 主动关闭连接,则连接的释放过程如下:

在这里插入图片描述

  • A 关闭套接字,向 B 发送连接释放报文段:报文段的 FIN=1,序号 seq=u;然后进入 FIN-WAIT-1 状态,等待 B 的确认;FIN 报文段不能携带数据,但要消耗一个序号;
  • B 收到连接释放报文段后立即发出确认:确认报文段的 ACK=1,确认号为 ack=u+1,序号为 seq=v;然后进入 CLOSE-WAIT 状态(等待己方关闭连接);此时的 TCP 连接处于半关闭状态,即 A 已经没有数据要发送了,但如果 B 发送数据,A 仍要接收,也就是说 B 到 A 这个方向的连接仍未关闭;
  • A 收到 B 的确认后进入 FIN-WAIT-2 状态,等待 B 发送连接释放报文段;
  • B 发送完数据之后也关闭连接,向 A 发送连接释放报文段:报文段的 FIN=1,ACK=1,序号为 seq=w,确认号仍为 ack=u+1;然后进入 LAST-ACK 状态,等待 A 的确认(最后一个确认);
  • A 收到 B 的连接释放报文段后,向 B 发出确认:报文段的 ACK=1,序号为 seq=u+1,确认号为 ack=w+1;然后进入 TIME-WAIT 状态,此时连接仍未释放;
  • B 收到 A 的确认后释放连接,进入 CLOSED 状态;
  • A 在 TIME-WAIT 状态中等待 2MSL(Maximum Segment Lifetime)的时间之后才进入到 CLOSED 状态,即 B 先于 A 结束 TCP 连接。

为什么 A 需要在 TIME-WAIT 状态中等待 2MSL 的时间? 原因有如下两点:
(1)为了保证 A 发送的最后一个 ACK 报文段能够到达 B。如果此 ACK 报文段丢失,B 会因为没收到确认而超时重传 FIN+ACK 报文段,而 A 就能够在这 2MSL 时间内收到重传的 FIN+ACK 报文段,然后 A 重传一次确认,并重新启动 2MSL 计时器。
(2)A 在发送完最后一个 ACK 报文段后,再经过 2MSL 时间,就可以使本连接期间所产生的所有报文段都从网络中消失,这样就可保证新连接中不会出现旧连接的请求报文段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、进程之间的通信分为有连接和无连接两种方式。有连接方式需要先建立连接,然后进行数据传输,传输完成后再释放连接。无连接方式则不需要建立连接,直接进行数据传输。 二、UDP协议是一种无连接的传输协议,数据传输前不需要建立连接,也不保证数据传输的可靠性。UDP首部数据格式包括源端口、目的端口、长度和校验和等字段。 三、TCP协议是一种面向连接的传输协议,数据传输前需要先建立连接,并保证数据传输的可靠性。TCP首部数据格式包括源端口、目的端口、序号、确认号、数据偏移、标志位、窗口大小、校验和等字段。MSS是指TCP报文段中的最大数据段长度。 四、TCP可靠传输是通过滑动窗口实现的,滑动窗口是指接收端和发送端的缓存区大小。滑动窗口向前滑动的条件是接收端已经成功接收到一部分数据。滑动窗口大小和两个窗口(rwnd、cwnd)的关系是发送端的窗口大小不能超过接收端的窗口大小。RTO是指重传超时时间,是根据网络延迟和丢包率等因素计算得出的一个时间值。 五、TCP流量控制是通过接收端的rwnd窗口实现的,rwnd窗口大小表示接收端的缓存区大小。发送端的数据大小不能超过接收端的rwnd窗口大小。 六、TCP拥塞控制是为了避免网络拥塞而采取的一系列措施,包括满开始和拥塞避免两个阶段。在满开始阶段,发送端的cwnd窗口大小为1,每次传输一个数据包。在拥塞避免阶段,发送端逐渐增加cwnd窗口大小,以适应网络负载。 七、TCP连接管理采用三次握手过程。客户端向服务端发送一个SYN包,服务端回复一个SYN+ACK包,最后客户端回复一个ACK包,建立连接

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值