TCP协议(上)

2023-10-25 11:26:28 浏览数 (1)

概述 RFCs-793, 1122, 1323, 2018, 2581

TCP特点

  • 点对点连接
    • 一个发送方,一个接收方
  • 可靠的,按序的字节流
    • TCP拥塞控制和流量控制机制
    • 设置窗口尺寸
  • 发送方/接收方缓存
  • 全双工(full-duplex)
    • 同一连接中能够传输双向数据流
  • 面向连接
    • 通信双方在发送数据之前必须建立连接
    • 连接状态只在连接两端中维护,在沿途节点中并不维护状态
    • TCP连接包括:两台主机上的缓存,连接状态量,socket等
  • 流量控制机制

TCP段结构

TCP的序列号和ACK
  • 序列号:
    • 序列号指的是segment中第一个字节的编号, 而不是segment的编号
    • 建立TCP连接时,双方随机选择序列号
  • ACKs:
    • 希望接收到的下一个字节的序列号
    • 累计确认:该序列号之前的所有字节均已被正 确接收到
  • Q: 接收方如何处理乱序到达的Segment ?
  • A: TCP规范中没有规定,由TCP的实现者做出 决策

TCP可靠数据传输

概述

  • TCP在IP层提供的不可靠服务基础上实现了可靠数据传输服务
  • 流水线机制
  • 累计确认
  • TCP使用单一重重传定时器
  • 触发重传的事件
    • 超时
    • 收到重复ACK
  • 渐进式
    • 暂不考虑重复ACK
    • 暂不考虑流量控制
    • 暂不控制拥塞控制

RTT和超时

question 1 : 如何设置定时器的超时时间?

  • 大于RTT
    • RTT是变化的
  • 过短
    • 不必要的重传
  • 过长
    • 对段丢失时间反应慢

question 2 : 如何估计RTT?

  • SampleRTT: 测量从段发出去到收到ACK的时间
    • 忽略重传
  • SampleRTT变化
    • 测量多个SampleRTT,求均值,形成RTT的估计值EstimatedRTT

answer 1 : 定时器超时时间的设置

  • EstimatedRTT "安全边界"
  • EstimatedRTT变化->较大的边界

SampleRTT与EstimatedRTT的差值

定时器超时时间的设置

  • TimeoutInterval = EstimatedRTT 4 * DevRTT

TCP发送方事件

  • 从应用层到数据
    • 创建Segment
    • 序列号是Segment第一个字节的编号
    • 开启计时器
    • 设置超时时间 : TimeInterval
  • 超时
    • 重传引起超时的Segment
    • 重启定时器
  • 收到ACK
    • 若确认此前未确认的Segment
      • 更新SendBase
      • 如果窗口中还有未确认的分组,重新启动定时器

TCP发送端程序

重传过程

ACK生成 : RFC 1122,RFC 2581

快速重传机制

  • TCP的实现过程,如果发生超时,超时时间间隔将重新设置,即将超时时间间隔加倍,导致其很大
    • 重发丢失的分组之前要等待很长时间
  • 通过重复ACK检测分组丢失
    • Sender会背靠背地发送多个分组
    • 如果某个分组丢失.可能会引发多个重复的ACK
  • 如果sender收到对同一数据的3个ACK,假定该数据之后的段已经丢失
    • 快速重传 : 在定时器超时之前即进行重传
  • 快速重传算法

TCP连接管理

  • TCP sender和receiver在传输数据之前需要建立连接
  • 初始化TCP变量
    • Seq.#
    • Buffer和流量控制信息
  • Client : 连接发起者
    • Socket clientSocket = new Socket("hostname","port number");
  • Server : 等待客户连接请求
    • Socket connectionSocket = welcomeSocket.accpet();

建立连接

  • 三次握手(Three way handshake)
    • step 1 : client host sends TCP SYN segment to server
      • specifies initial seq #
      • no data
    • step 2 : server host receive SYN, replies with SYNACK segment
      • server allocates buffers
      • specifies server initial seq.#
    • step 3 : client receives SYNACK,replies with ACK segment,whitch may contain data

关闭连接 (Closing a connection)

client closes socket : clientSocket.close();

  • 四次挥手
  • step 1 : client 向server发送 TCP FIN 控制 segment
  • step 2 : server 收到 FIN,回复ACK,关闭连接,发送FIN
  • step 3 : client 收到FIN 回复ACK
    • 进入"等待"-如果收到FIN,会重新发送ACK
  • step 4 : server收到ACK,连接关闭

TCP协议客户端与服务端连接生命周期

TCP拥塞控制

未完待续…

0 人点赞