IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> [Remaster] 传输层 -> 正文阅读

[网络协议][Remaster] 传输层

功能

提供进程之间的通信,即端口到端口的通信。传输层将报文加上端口信息后传给链路层。
Description:端到端的透明数据传输,差错控制,流量控制
过程:

进程-端口-主机-路由-主机-端口-进程
其中,IP协议作用于主机之间,传输层协议(TCP/UDP)作用于端口之间.

端口


Socket=(IP:Port)

面向连接和不

TCP:面向连接 可靠性强 报文体积大
UDP:无:不保证送达 速度快

UDP

在IP的基础上添加了复用,分用和差错检测
复用:多个源端口都走IP
分用:一条IP分给多个目标端口
提供无连接不保证送达的服务,可靠检查需要在应用层处理
用于DNS等服务
UDP不分割报文,只是加上首部就传给网络层的IP

首部格式

UDP首部仅有8B
16位原端口-16位目的端口
16位UDP长度(包括首部的8B,单位为字节)-16位Checksum
数据部分


校验和的计算

  1. 内容的补全:在数据报之前添加一个仅用作校验和计算的伪首部.伪首部长12B
  2. 数据的补全:补全为8B的整数倍
  3. 计算:每4B16位为一组,求和之后求反

校验和其他细节

  • 校验和字段是可选的,不想用可以全0
  • 校验和计算结果为全0,则填入全1
  • 伪首部包含了IP报文的部分信息

TCP

  • 面向连接的可靠传输层协议
  • 点对点,一对一
  • 全双工
  • 可靠有序的交付服务
  • 面向字节流

TCP的报文段

  1. 源/目的端口
  2. 序号SEQ,长4B
  3. 确认号ACK,长4B
  4. 数据offset,长4b表示首部长度(单位:per 4B)
  5. reserve 6位
  6. FLAGS,6位
  7. 窗口,占2B,表示接收方的现有缓存空间.(e.g. seq=701,window=1000,则可以接受的序号区间在702~1701之间)
  8. 校验和,占2B.同样要加上12B的伪首部,参看UDP.
  9. 紧急指针,2B
  10. Options,包含MSS(MSS仅有数据字段长度)
  11. Padding,整个长度是4B的整数倍
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HCMszy9R-1631863207380)(index_files/0.6188094739845976.png)]

连接的建立:三次握手

  1. SYN=1,SEQ=x
  2. SYN=1,ACK=1,ACK=x+1,SEQ=y
  3. ACK=1,SEQ=x+1,ACK=y+1

连接的释放:四次挥手

连接双方都可以提出FIN

  1. FIN=1(要求FIN)
  2. ACK=1(服务器收到FIN)
    开始数据传送,经过几个传输周期
    这里仅有服务器->客户端的数据流向,ACK不变,并且客户端处连接已经关闭
  3. FIN=1,ACK=1(服务器完成数据传输,关闭服务端)
  4. ACK=1(客户端收到消息)
    收到服务器消息延迟2MSL,客户端关闭
    END

TCP的可靠传输机制

和GBN/SR不同,上述协议运行在链路层,保证了数据帧的有序可靠。

TCP的序号

TCP是针对字节流的,所以序号是数据部分字节的序号
和建立连接和释放连接时候不同,SYN和FIN报文没有数据的
e.g. 数据传输阶段,第一报文段SEQ=1,数据长度100,则返回的ACK=101,下一个报文SEQ=101

序号建立在字节流上而不是报文段

ACK

ACK为期待的下一个报文的字节序号.
TCP使用累积确认,只确认第一个丢失的字节.
e.g. 当SEQ=3的报文缺失,但收到了SEQ=5,ACK还是3.

重传机制
超时重传

如果发出报文段后规定时间RTT没有接收到ACK,则认为是报文丢失,重传一份

RTT由采样算法决定.

Multi-ACK

即发送/收到了多个相同的ACK.
为什么会发生?
该报文没有到达接收方而后续的报文到达并储存在接收方的buffer中.在响应后续的报文时就会传送缺失的那个ACK(见上).此时发送方就会收到两个相同的ACK,表示该报文丢失,所以重传.
这种重传无视计时器的限制,所以叫快速重传.

流量控制
  • 目的:保护接收方的缓存区不溢出
  • 原理:滑动窗口匹配:接收方根据发送方的发送窗口大小动态调整rwnd.
    rwnd是通过TCP报文的头部传输的.
拥塞控制

流量控制考虑的是两端的承受能力(缓冲区),拥塞控制考虑的是线路的承受能力.
keywords:慢开始,拥塞避免,快重传,快恢复,Reno
这一块已经比较清楚了,只放个图做参考.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NtelsWPe-1631863207384)(index_files/0.12337701345063509.png)]
注意门限值,收到3个重复的ACK时拥塞窗口/2

TCP传输实例

仅作参考.TCP入门与实例讲解 - 程序猿小卡 - 博客园 (cnblogs.com)
Prep.
主机A和主机B通过TCP建立连接,为方便区分,起始SEQ均为0(Relative Offset)
未特别指出,标志位均为0.

连接建立
  1. A:SYN=1,seq=0
  2. B:SYN=1,ACK=1,seq=0,ack=1
  3. A:ACK=1,seq=1,ack=1
数据传输
  1. B:seq=1,len=273,ack=2
  2. A:seq=2,len=1,ack=274已经收到前273字节
  3. B:seq=274,len=1400,ack=3发送长1400的报文
数据断开
  1. A:FIN=1,seq=84,ack=9379 此时A不再发送信息,处于半开状态
  2. B:ACK=1,seq=9379,ack=85
  3. B:FIN=1,ACK=1, B收到断开请求,传送剩余内容 这里没有
  4. A:ACK=1,seq=85,ack=9380 A收到B的传送完毕的信息,断开

题目中存在的一些问题

  • TCP 使用对报文确认的机制

TCP拥塞和流量控制解题TIPs

流量控制和接收窗口

接收方根据自己剩余的缓存,动态调整发送方发送窗口的大小。
这种机制通过接收方在ACK中的窗口字段设置rwnd实现.
rwnd=剩余的接收缓存,在发送完毕后会有变动.
具体的控制过程参考P221 Fig.5.10

拥塞控制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xs3EANZ1-1631863207388)(index_files/0.12337701345063509.png)]

  1. 慢开始(指数)-拥塞避免-加法增大
  2. 遇到拥塞,门限/2
  3. 用慢开始-打到1MSS重新指数
  4. 用快恢复-打到门限然后线性增加

TIPS

最终的发送窗口= M i n ( c w n d , r w n d ) Min(cwnd,rwnd) Min(cwnd,rwnd)
当提到收到三个ACK后,使用快恢复,否则默认慢开始.
以及,考虑一个这样的表述方式:P226,21

接下来*个RTT内

每个RTT代表一个传输轮次,该轮次下发送当前发送窗口个数的报文
即:

  1. 发送1个MSS
  2. 2个
  3. 4个
  4. 8个

当全部收到ACK后
此时cwnd再次*2,应该cwnd=16

门限不是 2 n 2^n 2n?

e.g. P226.22
后半段门限为6
则慢启动序列为
1 , 2 , 4 , 6 , 7 , 8 , . . . 1,2,4,6,7,8,... 1,2,4,6,7,8,...

MSS和报文段

接受窗口,发送窗口的大小变化以字节为单位.
即,如果MSS=2KB(P227,28)
cwnd序列为2,4,8,16,…

RTT和时间

RTT是一个时间段.
所以要注意题目提到的瞬间.比如,发送时或收到ACK时,etc
比如,1,2,4,8
8发送时是3RTT,收到ack是4RTT.
一定要注意,很多题目就在这里挖坑.

字节**为单位.
即,如果MSS=2KB(P227,28)
cwnd序列为2,4,8,16,…

RTT和时间

RTT是一个时间段.
所以要注意题目提到的瞬间.比如,发送时或收到ACK时,etc
比如,1,2,4,8
8发送时是3RTT,收到ack是4RTT.
一定要注意,很多题目就在这里挖坑.

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 10:36:22  更:2021-09-18 10:36:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 12:56:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计