TCP协议(上)

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

TCP特点

  • 点对点连接
    • 一个发送方,一个接收方
  • 可靠的,按序的字节流
    • TCP拥塞控制和流量控制机制
    • 设置窗口尺寸
  • 发送方/接收方缓存

image.png

  • 全双工(full-duplex)
    • 同一连接中能够传输双向数据流
  • 面向连接
    • 通信双方在发送数据之前必须建立连接
    • 连接状态只在连接两端中维护,在沿途节点中并不维护状态
    • TCP连接包括:两台主机上的缓存,连接状态量,socket等
  • 流量控制机制

TCP段结构

image.png

TCP的序列号和ACK

image.png

  • 序列号:
    • 序列号指的是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

image.png

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

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

SampleRTT与EstimatedRTT的差值

image.png

定时器超时时间的设置

  • TimeoutInterval = EstimatedRTT + 4 * DevRTT

TCP发送方事件

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

TCP发送端程序

image.png

重传过程

image.png
image.png

ACK生成 : RFC 1122,RFC 2581

image.png

快速重传机制

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

image.png

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

image.png

关闭连接 (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,连接关闭

image.png

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

image.png
image.png

TCP拥塞控制

未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝士君(Java 版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
>