前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TCP协议(上)

TCP协议(上)

作者头像
cheese
发布2023-10-25 11:26:28
1510
发布2023-10-25 11:26:28
举报
文章被收录于专栏:Java PorterJava Porter

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

TCP特点

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

TCP段结构

image.png
image.png
TCP的序列号和ACK
image.png
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
image.png

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

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

SampleRTT与EstimatedRTT的差值

image.png
image.png

定时器超时时间的设置

  • TimeoutInterval = EstimatedRTT + 4 * DevRTT

TCP发送方事件

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

TCP发送端程序

image.png
image.png

重传过程

image.png
image.png
image.png
image.png

ACK生成 : RFC 1122,RFC 2581

image.png
image.png

快速重传机制

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

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

image.png
image.png
image.png
image.png

TCP拥塞控制

未完待续…

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述 RFCs-793, 1122, 1323, 2018, 2581
    • TCP特点
      • TCP段结构
        • TCP的序列号和ACK
    • TCP可靠数据传输
      • 概述
        • RTT和超时
          • TCP发送方事件
            • TCP发送端程序
              • 重传过程
                • ACK生成 : RFC 1122,RFC 2581
                  • 快速重传机制
                  • TCP连接管理
                    • 建立连接
                      • 关闭连接 (Closing a connection)
                        • TCP协议客户端与服务端连接生命周期
                        • TCP拥塞控制
                        相关产品与服务
                        数据传输服务
                        腾讯云数据传输服务(Data Transfer Service,DTS)可帮助用户在业务不停服的前提下轻松完成数据库迁移上云,利用实时同步通道轻松构建高可用的数据库多活架构,通过数据订阅来满足商业数据挖掘、业务异步解耦等场景需求。同时,DTS 还提供私有化独立输出版本 DTS-DBbridge,支持异构数据库和同构数据库之间迁移和同步,可以帮助企业实现完整数据库迁移(如 Oracle)。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档