TCP可靠传输基础概念

in #cnlast month

概述

  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

Coin Marketplace

STEEM 0.28
TRX 0.13
JST 0.033
BTC 62916.93
ETH 3028.97
USDT 1.00
SBD 3.67