TCP如何实现可靠的数据传输服务

总观TCP

TCP为成对的应用提供通信服务。它允许一台主机上的某一个应用与另一台主机上的某一个应用进行通信,允许同一台主机上的多个应用同时进行可靠稳定,不受干扰的数据通信。TCP使用协议端口号来区分不同的应用。TCP的特点有

  1. 点对点,即在一个发送方和对应的接收方之间建立逻辑连接
  2. 基于连接的,即需要首先建立连接(三次握手),连接建立后进行数据传输,最后断开连接(四次挥手)
  3. 全双工数据,即数据流在同一个通信中是双向的
  4. 可靠的连接,即使用Go-Back-N和Selective Repeat的方法(有checksum,重新传输,累积的或有选择的ACK还有计时器来判断有没有超时)
  5. 有管道的(有滑动窗口的传输方法)
  6. 有流量控制的,即发送方和接收方都具有缓存机制

TCP首部格式

在这里插入图片描述

可靠的数据传输服务

TCP保障接收方一定能收到数据,发送方一定会最终被通知,但是TCP的可靠的数据传输服务是建立在IP的不可靠的服务上的,所以这里就需要借助重新传输来实现。

自适应重传

RTT(round-trip time)会根据实际网络的情况不断被重新估计,计时器会不断根据RTT来计时,从而适应不同的TCP通信。

发送方的情况

1. 接收方发回的ACK丢失
  • 发送方在超时后未收到ACK,重新传输
  • 接收方收到重复数据后直接丢弃,再重新发送ACK
    在这里插入图片描述
2. 超时
  • 发送方在超时后重新传输
  • 发送方收到接收方发来但迟到的ACK,于是进行更新
  • 接收方收到重复的数据,直接丢弃并发送最新的ACK
    在这里插入图片描述
3. 累积的ACK

就算之前接收方回传的旧的ACK丢了也不要紧,发送方会直接更新最新的ACK。
在这里插入图片描述

接收方的情况

收到按顺序到达的segment

  1. 如果所有的segment(包括现在的segment)都已经发回ACK了,那么会延迟500ms发送该ACK以等待下一个segment,如果超过500ms仍然没有下一个segment,才会发送该ACK
    在这里插入图片描述

  2. 如果除现在的segment外的其他segments都已经发回ACK了,那么会马上发回当前收到的segment所对应的ACK
    在这里插入图片描述

收到不按顺序到达的ACK

马上发回之前已经重复发过的ACK,索要中间空缺的segment。直到收到了中间空缺的segment,就会直接发回最后一个(橙色)segment对应的ACK
在这里插入图片描述

TCP快重传

由于通过超时重传总是要花相对较多的时间,所以TCP快重传问世。因为接收方收到不按顺序的segment会连续发送相同的ACK,所以TCP快重传通过3个重复的ACK来判定segment是否延时未到或者是丢失。只要收到3个重复的ACK,发送方就不会等到超时再重传,而是会直接发送ACK对应的segment
在这里插入图片描述

TCP流量控制

接收方可以通过ACK中的窗口字段控制发送方的窗口大小,从而使得segments不会在接收方的缓存(窗口)中溢出。每一个ACK都明确了接收方缓存中的剩余空间。
在这里插入图片描述
下面是一个例子:
假设Maximum Segment Size(MSS)是1000,接收方窗口大小是2500。接收方发回的ACK中包含了接收方窗口剩余空间的值。当该值为0时,发送方就不会发送segment

在这里插入图片描述

TCP的连接管理

建立连接:三次握手

假设客户端想要与服务器建立连接

  1. 客户端发送SYN segment到服务器,这里会随机选择一个初始序列号(ISN)并赋值给Seq(假设为x),SYNbit=1
  2. 服务器收到SYN segment后,随机选择一个初始序列号(ISN)并赋值给Seq(假设为y),SYNbit=1,ACKnum=x+1,ACKbit=1
  3. 客户端收到ACK/SYN后,发送连接确认报文段,ACKnum=x+1,ACKbit=1
    在这里插入图片描述

终止连接:四次挥手

假设客户端打算终止连接

  1. 客户端发送连接释放报文,FIN=1,随机选择一个初始序列号(ISN)并赋值给Seq(假设为x),然后进入FIN_WAIT_1,只能收数据不能发数据
  2. 服务器收到连接释放报文,发送ACK,ACKbit=1,ACKnum=x+1,然后进入CLOSE_WAIT,还可以继续发数据
  3. 客户端收到ACK,进入FIN_WAIT_2
  4. 服务器发送连接释放报文,FIN=1,随机选择一个初始序列号(ISN)并赋值给Seq(假设为y),然后进入LAST_ACK,在这里也不能再发数据了
  5. 客户端收到连接释放报文,发送ACK,ACKbit=1,ACKnum=y+1,然后进入TIMED_WAIT,在等待2*MSL(Max Segment Lifetime)后进入CLOSED状态
  6. 服务器收到ACK后直接进入CLOSED状态

在这里插入图片描述

TCP拥塞控制

拥塞控制和流量控制很相似,但流量控制是为了使得接收方来得及接收,segment不会溢出,而拥塞控制是为了降低整个网络的拥塞程度。拥塞控制使用Congestion Window(cwnd)来控制传输的segment,真实的窗口大小=min(rwnd,cwnd)(rwnd是Receiver Window)
TCP发送方可以通过超时和接收到3个重复的ACKs来判断是否出现网络拥塞,3个重复的ACKs可以运用TCP快重传解决。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值