传输层

2022-03-21  本文已影响0人  freemanIT

传输层(Transport)

tcp,udp比较

UDP (数据格式检验和)

UDP是无连接的, 减少了建立和释放连接的开销

UDP 尽最大能力交付, 不保证可靠交付, 因此不需要维护一些复杂的参数, 首部只有8 个字节. TCP 的首部至少20 个字节

udp格式

UDP 长度(Length), 16 位, 首部长度+数据长度

检验和(Checksum)

检验和的计算内容: 伪首部+首部+数据

伪首部格式

端口(Port)

默认端口

UDP 首部中端口占用2 个字节, 范围是0~65535

客户端的源端口是临时开启的随机端口

防火墙可以设置开启或关闭某些随机端口, 提高安全性

常用命令如下

TCP

要点:

tcp首部

TCP 数据偏移, 保留

数据偏移

保留

保留位

UDP 首部中哟16 位的字段记录整个UDP 报文段的长度(首部 + 数据)

但是, TCP 首部中仅仅有个4 位的字段记录了TCP 报文段的首部长度, 并没有字段记录TCP 报文段的数据长度

TCP 检验和(CheckSum)

跟UDP 一样, TCP检验和的计算内容: 伪首部 + 首部 + 数据

伪首部: 占12 字节, 尽在计算检验和时起作用, 并不会传递给网络层

tcp伪首部检验和

TCP 标志位

URG(Urgent)

ACK(Acknowledgement)

PSH(Push)

RST(Reset)

SYN(Synchronization)

FIN(Finish)

TCP 序号, 确认号, 窗口

序号(Sequence Number)

确认号(Acknowledgement Number)

窗口(Window)

TCP 可靠传输

可靠传输是为了保证包的完整性, 当有丢包, 收到三次重复确认等情况, 就会重新发包

TCP 可靠传输 - 停止等待ARQ协议

ARQ(Automatic Repeat-reQuest), 自动重传请求

arq协议 ARQ协议1

重传次数

若有包, 重传多次还是事变, 会一直重传到成功为止吗?

取决于系统设置, 比如重传5 次还是失败, 就会方发送reset报文(RST)断开TCP 连接

重传次数

TCP 可靠传输 - 连续ARQ协议+滑动窗口协议

连续窗口协议

如果接收窗口最多能接收4 个包, 但发送只发了2 个包, 接收方如何确认后面还有无2个包?

数据分割

现在假设每一个组数据是100 字节, 代表一个数据段的数据, 每一个组给一个编号

数据传输过程分析

TCP 可靠传输 - SACK(选择性确定)

在TCP 通信过程中, 如果发送序列中间某个数据包丢失. 如1, 2, 3, 4, 5, 丢失3

TCP 会通过重传最后确认的分组手续的分组. 最后确认为2, 重传3, 4, 5

这样原先已经正确传输的分组也可能重复发送, 降低了TCP 性能

为改善上述情况, 发展处SACK(Selective acknowledgement) 选择性确认技术

sack格式

SACK 信息会凡在TCP 首部的选项部分

sack演示

一对边界信息需要占用8 字节, 由于TCP 首部的选项部分最多40 字节, 所以

为什么在传输层将数据分割, 而不是在网络层分割传递给数据链路层?

TCP 流量控制

流量控制是点对点, 端对端, 两台设备之间的

如果接收方缓存区满了, 发送方还是疯狂发送数据

流量控制:

原理:

rwind(receive window), 接收窗口

流量控制

TCP 流量控制 - 特殊情况

特殊情况:

解决:

TCP 拥塞控制

拥塞控制

拥塞控制

拥塞控制是一个全局的过程

TCP 拥塞控制方法

概念:

TCP 拥塞控制 - 慢开始

cwnd的初始值比较小, 随着数据包被接收方确认(收到一个ACK), cwnd 就成倍增长(指数级)

拥塞控制慢开始 cwnd慢开始

TCP 拥塞控制 - 拥塞避免

拥塞避免

ssthresh(slow start threshold), 慢开始阈值, cwnd达到阈值后, 开始拥塞避免

拥塞避免(加法增大), 拥塞窗口cwind 缓慢增大, 以防止网络过早出现拥塞

乘法减小, 只要出现网络拥塞, 把ssthresh 减为拥塞峰值一半, 同时执行慢开始, 当网络出现频繁拥塞时, ssthresh 值下降很快

TCP 拥塞控制 - 快重传, 快恢复

快重传

快恢复:

当发送方连续收到三个重复确认, 说明网络出现拥塞

与慢开始不同之处是现在不执行慢开始算法, 即cwnd 现在不回复到初始值

快重传快恢复

发送窗口的最大值swnd = min(cwnd, rwnd)

当rwnd < cwnd时, 是接收方的接收能力限制发送窗口的最大值

当cwnd < rwnd时, 网络拥塞控制发送窗口的最大值

TCP 序号, 确认号

序号 序号细节 序号细节1 序号细节2 序号过程 相对值 连接传输过程

TCP 建立连接 - 3 次握手

3次握手

TCP 建立连接 - 前2 次握手的特点

SYN 都为1,

数据部分长度都是0

TCP 头部长度一般为32 字节

双方交换确认一些信息

为什么是3 次握手不是2 次?

目的: 防止server 端一直等待, 浪费资源

如果建立连接只需要2 次握手, 可能出现以下情况

第三次握手失败的处理

三次握手失败

TCP 释放连接 - 4 次挥手

释放连接

FIN-WAIT-1, 表示主动关闭连接

CLOSED-WAIT, 表示在等待关闭

FIN-WAIT-2, 只要对方发送ACK 确认后, 主动方就会进入FIN-WAIT-2 状态, 然后等待对方发送FIN 报文

CLOSING, 罕见状态

LAST-ACK, 被动关闭一方在发送FIN 报文后, 最后等待对方的ACK 报文

TIME-WAIT, 表示收到对方的FIN 报文, 并发送出了ACK 报文, 就等待2MSL 后进入CLOSED状态

CLOSED, 关闭状态

由于有些状态的时间比较短暂, 所以很难用netstat 命令看到, 比如SYN-RCVD, FIN-WAIT-1

TCP 释放连接 - 细节

  1. client 发送ACK 后, 需要有个TIME-WAIT 阶段, 等待一段时间, 再关闭连接

    一般是等待2 倍MSL(Maximum Segment Lifetime), 最大分段生存期

    MSL 是TCP 报文在Internet 上的最大生存时间

    每个具体的TCP 实现都必须选择一个确定的MSL, RFC 112 建议2 分钟. 可以防止本次连接中产生的数据包误传到下一次连接中, 因为本次连接中的数据包会在2MSL 时间内消失了

  2. 如果client 发送ACK 后马上释放了, 然后因为网络的原因, server 没有收到client 的ACK, server就会重发FIN, 这时可能出现的情况是

    1. client 没有任何响应, 服务器那边一直等待, 甚至多次重发FIN, 浪费资源
    2. client 有新的应用程序刚好分配同一个端口号, 新的应用程序收到FIN 后马上开始执行断开连接的操作, 原本是要和server 建立连接的

为什么进行4 次挥手?

TCP 是全双工通信

第一次挥手, 主机1 发出FIN 报文时

第二次挥手, 主机2 返回ACK 报文

第三次挥手, 主机2 也发送FIN 报文

第四次挥手, 主机1返回ACK报文

上一篇下一篇

猜你喜欢

热点阅读