TCP可靠传输基础概念

in cn •  8 months ago 

概述

  1. 点对点: 一个发送方,一个接收方
  2. 可靠的,按顺序的字节流: 没有报文边界
  3. 管道化(流水线):TCP拥塞控制和流量控制设置窗口大小,分组发送和接收。
  4. 发送和接收缓存
    image.png
  5. 全双工:在同一连接中数据双向流动,按照MSS(最大报文段)进行数据报传递。
  6. 面向连接: 数据交换之前通过握手(交换控制报文)初始化发送,接收方的状态变量。
  7. 有流量控制: 发送方不会淹没接收方。

报文段结构

image.png

  • 序号,确认号
    序号是报文段首字节在字节流的编号
    确认号是期望从另一方收到的下一个字节的序号(累计确认)
    Q: 接收方如何处理乱序的?
    A: 报文段并没有规定。可以缓存或者丢弃。

image.png
并且标记tcp报文段的对应的标记位。

TCP可靠传输

TCP在IP不可靠服务的基础上,建立了rdt:

  1. 管道化的报文段(GBN or SR)
  2. 累计确认(像GBN)
  3. 单个重传定时器(像GBN)
  4. 是否可以接受乱序,没有规范。

通过以下事件触发重传:

  1. 超时(只重发最早未确认的段,类SR)
  2. 重复的确认(快速重传,都到3个相同的ack,未达到超时时间,触发重传)

image.png


TCP发送方事件

  • 从应用层接收数据
  1. 用nextseq创建报文段
  2. 序号nextseq为报文段首字节的字节流编号
  3. 如果还没有运行,启动定时器(定时器与最早未确认的报文段关联,过期间隔TimeoutInterval)
  • 超时
  1. 重传后沿最老的报文段
  2. 重新启动定时器
  • 收到确认
  1. 如果是对尚未确认的报文段确认(更新已被确认的报文序号,还有未被确认的报文段,重新启动定时器)

image.png


TCP流量控制

流量控制:接收方控制发送方,不让发送方发送的数据太多,太快;以至于让接收方的缓存区溢出

 TCP 往里写数据  =>  数据缓冲区(网卡缓冲)  <=  app应用从当中读取数据
  • 接收方在其向发送方的tcp段头部的rwnd字段同步其空闲buffer发小(捎带技术)
  1. RcvBuffer大小通过socket选项设置,默认大小为4096字节
  2. 很多操作系统自动调整RcvBuffer
  • 发送方限制未确认字节的个数 <= 接收方发送过来的rwnd值
  • 保证接收方不会被淹没

image.png


TCP连接管理

在正式交换数据之前,发送方和接收方握手建立通信关系。(同意建立连接,连接参数,控制变量同步)

TCP三次握手

image.png

TCP四次挥手

image.png

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!