TCP 链接管理

概述

  TCP是面向链接的协议。运输链接是用来传输报文的。运输链接的创建和释放在每一次通讯中是必不可少的内容。所以运输链接分为三个阶段:创建链接、传输数据和释放连接。运输管理就是保证每一步都能正常运行。缓存

在TCP 链接的创建过程主要解决三个问题:服务器

  1. 要使每一方都可以知道对方的存在
  2. 要容许双方协商一些参数(如窗口最大值、是否使用窗口扩大选项和时间戳等)
  3. 可以对运输实体资源(如缓存大小、链接表中的项目等)进行分配。

1、TCP 链接的创建

在这里插入图片描述

TCP 的链接创建,咱们经常称为三次握手。网络

A:您好,我是A。计算机网络

B:您好,我是B指针

A:您好B。cdn

链接过程

假设A 为客户端(上图左),B 为服务端(右)blog

  1. 一开始A、B 均为关闭状态。B先开启服务器,创建传输控制块TCB。准备接受链接请求,而后处于LISTEN 状态。等待用户链接请求并做出响应。

TCB:(Transmission Control Block,存储了每个链接中的一些重要信息,如:TCP 链接表,指向发送和接受缓存的指针,指向重传队列的指针,当前发送和接受序号等等)队列

  1. A 也是先建立链接控制模块TCB 。而后A 向B 发送请求报文段,这时首部中的同部位SYN = 1,同时选择一个初始序号 seq = x。TCP 规定,SYN 报文段不能携带数据,但要消耗掉一个序号。而后客户端进入SYN-SEND (同步已发送)状态。
  2. B 接受到A 的链接请求后,若是赞成链接须要给S 发送确认。确认报文段ACK 置为1,确认号ack = x+1,同时选择一个本身的初始序号seq = y。请注意这个报文段也不能传输数据,但也要消耗一个序号。这是B 进入SYN-RCVD (同步收到)状态。
  3. A 收到B 的确认后,须要发送一个确认给B。确认报文段ACK 置为1,确认号ack = y + 1,而本身的序号seq = x + 1,。TCP 规定,ACk 报文段能够添加数据。但若是没有添加数据则不消耗序号。这时,TCP 链接已经创建,A 进入ESTABLISHED (已经创建链接)状态。
  4. B 收到 A 的确认也进入ESTABLISHED (已经创建链接)状态。

为何TCP 是三次握手?

假设A B 只用两次握手就创建链接。图片

当A 第一次发送给B 链接请求时,若是迟迟得不到回应,A会再次发送链接请求。那么如今网络中有两次请求,通常状况下第一次请求挂掉了,那么B 收到第二次请求,而后回应A,链接创建,没毛病。可是第一次请求可能只是滞后了,假设AB断开链接后,B 又收到了第一次请求,又会尝试创建链接,可是A 会以为本身没有尝试创建链接,从而拒绝B。由于是两次握手,B 会觉得本身已经创建链接了,等待A 发送数据,白白浪费资源。资源

三次握手就不会出现这个问题,B 在发送确认后,得不到A 的确认,就会知道这是个过期的请求,知道A 没有要求创建链接。

2、TCP 链接释放

在这里插入图片描述
好了,说完了链接,接下来讲一说“拜拜”,好说好散。这常被称为四次挥手。

A:B 啊,我不想玩了。

B:哦,你不想玩了啊,我知道了。

这个时候,还只是 A 不想玩了,也即 A 不会再发送数据,可是 B 能不能在 ACK 的时候,直接关闭呢?固然不能够了,,颇有可能 A 是发完了最后的数据就准备不玩了,可是 B 还没作完本身的事情,仍是能够发送数据的,因此称为半关闭的状态。

这个时候 A 等待 B 也主动关闭。

B:A 啊,好吧,我也不玩了,拜拜。

A:好的,拜拜。

释放连接的过程

首先AB 都处于ESTABLISHED 状态

  1. A 先发送链接释放报文段,并中止发送数据,主动关闭TCP 链接。A 把连接释放报文段首部的停止控制位FIN 置为1 ,其序号为seq = u(等于前一个传输数据的序号+1)。这是A 进入 FIN-WAIT-1(终止等待链接1)状态,等待B 的确认。TCP规定,FIN 报文段即便不携带数据,也会消耗一个序号。
  2. B 收到A 的链接释放报文段后发出确认。确认号ack = u + 1,而报文段本身的序号seq = v(等于前一个传输数据的序号+1)。而后B 进入CLOSED-WAIT(关闭等待)状态,这是A->B方向的链接就已经断开了,TCP 链接处于半关闭状态.
  3. A 收到B 的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B 发送释放报文段。
  4. 若B 发送完数据后,向A 发送TCP 释放报文段。FIN 置为1 ,先假设序号seq = w (B可能又发送了一些数据),B 还必须重复上次已经发送的确认号ack = u + 1。这是B 进入LAST-ACK(最后确认)状态,等待A 的确认
  5. A 在收到链接释放报文段后发送确认。在确认报文段中把ACK 置为1 ,确认号ack = w + 1,而本身的序号seq = u + 1(TCP 规定,前面发送过的FIN 报文段要消耗一个序号)。而后进入到TIME-WAIT(时间等待)状态
  6. 如今TCP 链接尚未断掉。必须通过时间等待计时器(TIME-WAIT time)设置的2MSL时间事后,A 才进入到CLOSED 状态。

MSL(Maximum Segment Lifetimr)最长报文生存时间,RFC793 建议为2 分钟。

  1. B 收到A 的ACK 后进入CLOSED 状态

为何A 在TIME-WAIT 必须等待2MSL时间?

  1. 为了保证A 发送的最后一个ACK 报文段可以到达B。
  2. 防止已失效的链接请求报文段出如今本连接中。A 在发送完最后一个ACK 后,在通过2MSL 的等待时间能够保证本连接持续时间内发送的报文在网络中消失。这样就不会出现旧链接请求出如今新链接请求里面的状况

TCP 保活计时器

除了时间等待器外,TCP 还设有一个保活计时器(keepalive timer)。

当客户与服务器创建了链接,而客户出现故障没法响应客户端时,服务器就会发一个探测报文,75秒发一个,若连续发10 个客户端都没响应,则服务器端自动关闭链接。保活计时器默认为2 个小时,每收到一次请求刷新。

TCP 状态机

在这里插入图片描述

参考资料

  • 极客时间:《趣谈网络协议》
  • 《计算机网络》
相关文章
相关标签/搜索