栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

《图解TCPIP》随笔--第六章(三)--tcp协议

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《图解TCPIP》随笔--第六章(三)--tcp协议

目录
  • 前言
  • 一. 特点&目的
  • 二. 实现可靠性的手段
    • 1. 序列号(`Seq`) + 确认应答(`ACK`)
    • 2. 连接管理
    • 3. 以段为单位发数据
    • 4. 重发超时
    • 5. 窗口控制 -- 提速
    • 6. 窗口控制 + 重发控制
    • 7. 流控制
    • 8. 拥塞控制
  • 三. 提高网络利用率的规范
    • 1. Nagle 算法
    • 2. 延迟确认应答 - 较优处理机制
    • 3. 捎带应答
  • 四. 首部格式
    • 1. TCP数据包格式
    • 2. 控制位
    • 3. 校验和
  • 结束

前言

特别写在前面

本文仅用学习记录及分享,不做他用.

如有不妥,请告知

一. 特点&目的

充分的实现了数据传输时的各种控制功能

  • 可以在丢包时进行重发控制
  • 可调节次序乱掉的数据包进行顺序控制
  • 可以控制通信中流量,防止浪费
二. 实现可靠性的手段
  • 校验和
  • 序列号
  • 确认应答
  • 重发控制
  • 连接管理
  • 窗口控制
1. 序列号(Seq) + 确认应答(ACK)
  • 序列号 - Seq – (序号)
    • 字长32位
    • 指发送数据的位置
    • 每发送一次数据,累加一次该字节数据

注意

建立连接和断开连接 发送的 SYN 和 FIN 数据包

虽不携带数据,但也会使 该字节+1

  • 确认应答号 - ACK
    • 字段长32位
    • 指下一次应该收到的数据的序列号
    • 发送端收到的确认应答号,表示此序列号之前的所有数据已正常接收
( 开始握手第一包 ACK == 0 , Seq == 0 )–Client
( 开始握手第二包 ACK == 1 , Seq == 0 )–Serve
> 一旦 - 回应上一包数据 - 确认接收后
> 下一包数据的 Seq = 当前ACK
> 下一包数据的 ACK + 1

两种异常情况

  • 数据包丢失
    • 当数据包丢失后,一段时间后 发送端 未收 接收端 返回的 ACK ,发送方 认为数据没有到, 重发控制 触发
  • 确认应答丢失
    • 发送端 没有收到 接受端 ACK 可能 仅仅 ACK丢失,数据正常传输
    • 一段时间后 重发
    • 这时,需要 序列号(Seq) + 确认应答(ACK) 判断是否需要丢掉重复数据
2. 连接管理
  • 请求连接 - SYN
  • 断开连接 - FIN

TCP 通信

三次"握手" , 四次"挥手"

正常通信过程 至少 来回 7个数据包 才能完成

3. 以段为单位发数据

MSS - 最大消息长度

最理想的情况

MSS 正好等于 IP 中不会被分片处理的最大长度

在开始通信时,双端都会产生一个MSS,会选择一个较小的值投入使用

4. 重发超时

重发超时 – 重发数据之前的等待时间

在每次数据往返时都要进行往返时间 和 偏差 的计算

一般超时都以 0.5秒 为单位进行控制,所以重发超时都是 0.5s 的整数倍

最初的数据包还不知道往返时间,故其往返时间设置为 6s左右

如若 重发超时 后再次 发送 后,超时会以 2 , 4 倍 的 指函数 增长

重发一定次数后 通信终止

重发超时 会随着发送的数据量 动态调整

5. 窗口控制 – 提速

以一段数据为单位发送,每段数据应答

  • 时间长
  • 性能低

滑动窗口 + 缓存区

窗口大小 – 无需等待确认应答,但可以继续发送数据的 最大值 ( 图中窗口大小为四段 )

该机制的实现使用了大量 缓存区 ,对多端数据 同时 进行 确认应答

6. 窗口控制 + 重发控制

应答未返回时

  • 运用了窗口控制后 无需再次发送

报文丢失时

  • 发送主机如果 重复收到3次 同一个应答信号
  • 表示该部分数据丢失,重发

这种模式被称为 高速重发控制

7. 流控制

机制
接收端 发送窗口大小值给 发送端
发送端 根据 接收端 自身实际接收能力去 控制 发送的数据量

如上图
1. 主机B 从 3001号后的缓存区即满 -- 停止接收数据
2. 主机A 重发超时 了,也没有收到应答信号
3. 主机A 发送 窗口探测 ...  ... ...( 随时发一包 探测此时窗口大小 )
4. 直到 主机B 窗口更新 通知给 主机A , 通信再次开始
8. 拥塞控制

防止网络过度 拥堵 而崩溃

通信一开始 通过 慢启动算法 得出 慢启动阀值 ,对 发送端 进行控制

以免造成连续发包 – (爆发) 造成的网络拥堵

三. 提高网络利用率的规范 1. Nagle 算法

只有 同时 满足下列两个条件 ,才能进行 数据传输

  • 已发的数据都被接收
  • 可以发送最大段长度MSS的数据

虽然可以提高网络的利用率

但是会造成网络延时

在 窗口系统 或 机械控制等领域 使用 tcp 时,会 关闭该算法

2. 延迟确认应答 - 较优处理机制

能够提高网络利用率

降低计算机处理负荷

实现机制

  • 在没有收到 2xMSS 的数据为止 ,不做确认应答 - ACK
    - 一些操作系统会规定
    - 无论数据大小 , 两个包即刻应答
  • 其他情况下 , 最大延迟 0.5s 回复确认信号
    - 很多操作系统设置为 0.2s 左右
3. 捎带应答

前提开启 延迟确认应答 才能实现

减少收发数据量

四. 首部格式 1. TCP数据包格式

名词长度解释
源端口号 - Source Port16bit发送端端口
目标端口号 - Destination Port16bit接收端端口
序列号 - Seq ( 计算机随机数 )32bit发送数据的位置 , 没成功发送一次 累计+1
确认应答号 - ACK32bit下次应收到的数据的系列号
数据偏移 - Data Offset32bit表示数据部分应该从哪里算起
==5 ,表示从源端口号到 4x5=20 个字节后都为数据部分
保留 - Reserved32bit用于后期扩展 , 一般为0
控制位 - Control Flag8bit见下文控制位表格
窗口大小 - Windows Size16bit表示从 确认应答信号 开始的位置算起 ,能够接收的 数据大小 ( 8bit )
==0 表示可以发送窗口探测
能够接收的 数据大小 必须 1Byte
校验和 - Checksum-见后文
紧急指针 - Urgent Pointer16bit控制位 - URG == 1 有效
紧急数据 - 从 数据首位 到 紧急指针 为止
同时也用作数据流分段标志
选项 - Optionsmax == 40byte用于提高传输性能
长度和数据偏移有关
2. 控制位

第几位名称用途
No.8CWRCWR + ECE 用于 IP的 ECN 字段
==1 通知 对方 拥塞窗口 已缩小
No.9ECEIP的 ECN == 1 时
ECE == 1 告知对方网络拥堵
No.10URG==1 包中有 紧急处理 的数据
No.11ACK==1 确认应答字段有效
No.12PSH==1 数据立刻上传应用层
==0 缓存
No.13RST==1 出现异常,强制断开
No.14SYN==1 希望建立连接
并在 序列号字段 进行 序列号 初始值设定
No.15FIN==1 希望断开连接,之后不会再发送数据
3. 校验和

为了提供 可靠的 TCP 首部 和 数据

TCP首部校验和计算三部分:TCP首部 + TCP数据 + TCP伪首部

TCP伪首部

参考

(1条消息) IP首部校验和计算及1的补码_cradmin的专栏-CSDN博客

(1条消息) tcp/udp校验和以及伪首部介绍_nice_wen的博客-CSDN博客_tcp 伪首部

TCP头校验和计算算法详解 - RodYang - 博客园 (cnblogs.com)

结束

~ ~ ~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/572452.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号