| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 计算机网络之传输层 -> 正文阅读 |
|
[网络协议]计算机网络之传输层 |
?一、传输层基本介绍#1. 基本职能#传输层位于计算机网络体系五层结构中的第四层,它的职能是:为运行在不同主机上的进程提供直接的通信服务。 和网络层提供服务的范围差异如下图所示: 即网络层提供了主机到主机间的通信(如果是IP协议的话还是不可靠的通信),而传输层提供的是主机中的进程与进程之间的通信(TCP协议提供可靠传输,UDP协议提供不可靠传输)。 更加直观的示意图如下所示: 2. 运输层端口号、复用分用的概念#端口号#为了使运行不同操作系统的计算机的应用进程之间能够进行网络通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识。 这里用于标识不同应用进程的东西就是端口号:
端口号分类:
发送方的复用和接收方的分用#TCP/IP体系结构应用层常用协议所使用的运输层熟知端口号: 二、UDP与TCP对比#UDP和TCP是计算机网络层的两个重要协议,如下图所示: 1. 是否连接#UDP协议是无连接的,TCP协议是面向连接的,如下所示: 2. 单播、多播和广播#
3. 面向报文和面向字节流#之所以TCP需要面向字节流,是因为TCP需要实现可靠传输、流量控制和拥塞控制,面向字节流是实现上述技术的基础。 4. 可靠性#5. 两种协议的格式#
因为TCP需要实现的功能较为复杂,因此TCP报文段的首部要比UDP数据包的首部大得多。 6. 小结#三、TCP的流量控制#一般情况下,我们都是希望信息可以尽快传输,但如果是TCP连接一对一进行传输时,如果不进行流量控制,就会出现一方传输速度过快,导致另一方的接收信息的缓存满了,如果再继续发送信息只会导致这部分信息的丢失,然后需要进行信息重传等操作,进而不仅信息传输比原来要慢很多,还占用了很多额外的网络资源。 TCP协议采用了滑动窗口的机制来进行流量控制。 1. 流量控制的相关术语#发送窗口和接收窗口 逻辑上,发送端有一个控制发送数据量的窗口,称为发送窗口,当发送端将发送窗口中的所有数据都发送出去后,还没有收到接收端的应答之前,都不能进行下一步的操作,例如移动窗口,发送新数据等等。 而接收窗口相当于接收端当前可以接受数据量的大小。 发送窗口的大小由接收端(接收窗口大小)来决定,这是保证流量控制,保证数据不溢出的关键。 2. 流量控制的流程#
当前接收方发送的rwnd为0,即接受窗口的大小为0,所以发送窗口也被调控为0,因而发送方无法继续发送数据。 考虑当接收方又出现了一定的接收空间,然后将当前的rwnd发送到发送方,但此时这个报文段丢失了,那么发送端无法接收到rwnd的变化信息,因而又无法发送数据,此时就会造成双方都在等待对方相应的状况,即死锁,如下图所示: 其实这种情况下,即发送方接收到
例题: 3. 小结#四、TCP的拥塞控制#1. 简单介绍#2. 拥塞控制算法#包括四个子算法:
3. 相关概念#为了实现拥塞控制,发送方除了需要维护swnd(发送窗口)之外,还需要额外维护一个新的变量cwnd(拥塞窗口),它的值取决于拥塞程度,而且动态变化。 此时, cwnd的变化规律:
最后,为了cwnd的增大变化更加合理,在特定的情况下采用特定的算法进行增大,发送端还需要维护一个慢开始门限变量ssthresh状态变量: 4. 拥塞控制的流程#为了能够更简单地说明问题,假定如下条件: 4.1 慢开始#连接成功后,假设发送端的拥塞窗口值被设置为1,此外还需要设置慢开始门限的初始值,这里以16为例。 慢开始算法:每次收到一个ACK,cwnd += 1。 具体案例如下所示: 因此在理想情况下运行慢开始算法时是每接收到一轮回复时 拥塞窗口的大小随传输轮次的增大的变化如下图所示: 4.2 拥塞避免#当cwnd达到ssthresh(慢开始门限)时,就会转而运行拥塞避免算法,即:每收到一个新的ACK,将CWND += MSS / CWND 在理想条件下,若每个ACK都没有延迟,则在每个RTT之后,cwnd的变化相当于 当出现某报文段发生超时重传时,判断网络发生了拥塞,此时进行如下操作: 即步骤为:
按照以上步骤执行直到信息发送完全为止。 因而总的流程如下图所示:
慢开始和拥塞避免算法是1988年提出的TCP拥塞控制算法(TCP Tahoe版本)。 1990年又增加了两个新的拥塞控制算法(改进TCP的性能),这就是快重传和快恢复(TCP Reno版本)。 原因:有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞。这将导致发送方超时重传,并误认为网络发生了拥塞,进而发送方把拥塞窗口cwnd又设置为最小值1,并错误地启动慢开始算法,因而降低了传输效率。 4.3 快重传#执行快重传算法的过程如下: 即使用这个算法可以减少发送端对网络拥塞的误判,使发送端更早地对丢失报文段进行重传,进而提高传输效率。 4.4 快恢复#4.5 四种算法的综合使用#下图的传输过程包括了四种算法的使用: TCP Reno版本的拥塞控制如下: 5. 例题#五、TCP超时重传时间RTO的计算#1. 问题引入#
可见,RTO太小或太大都不合适,太小时会使网络符合增大,太大时会降低传输速率。 因此,一般我们会取一个比往返时间RTT稍大的值作为RTO的值,如下图所示: 2. RTO计算公式#要计算RTO,首先我们需要先计算加权平均往返时间RTTS,计算公式为: 即新的RTTS由新的RTT样本和旧的RTTS同时决定,里面α的取值确定了两者的重要性,根据标准一般取值为1/8,即旧的RTTS权重较大: 而RTO的大小要略大于RTTS,其完整的计算公式如下: RTTS的计算过程已经提到过了,即: 而RTTD的计算如下: 按道理我们已经可以计算每一传输轮次的RTTS了,但是实际上还是会出现问题,这里主要是RTT样本在发生重传时很可能出现偏差,如下图所示: 因此我们需要解决这种网络不可靠情况下的RTT测量问题,这里主要是使用Karn算法: 在计算RTTS的过程中,只要报文段进行了重传,就不采用该报文传输得到的RTT样本。(样本重传不采用) 但这样也会出现特殊情况无法更新RTO:报文段的时延突然增大了很多,并且之后很长一段时间都会保持这种时延。因此在原来得出的重传时间内,不会收到确认报文段。于是就重传报文段。但根据Karn算法,不考虑重传的报文段的往返时间样本。这样,超时重传时间就无法更新。这会导致报文段反复被重传。 因此我们使用修正后的Karn算法:报文段每重传一次,就把超时重传时间RTO增大一些。典型的做法是将新RTO的值取为旧RTO值的2倍。( 以下是一个计算的例子: 总的计算方法如下图所示: 六、TCP滑动窗口和可靠传输#1. 基于滑动窗口的发送过程#TCP基于以字节为单位的滑动窗口来实现可靠传输。 滑动窗口示意图如下所示: 实现上维护3个指针来描述发送窗口的状态: 具体的报文段发送过程如下所示: 2. 注意点#发送窗口大小#对不按序到达数据的处理#确认机制#通信方式#3. 例题#例1: 例2: 七、TCP连接的建立#TCP是面向连接的协议,它基于运输连接来传送TCP报文段。因此TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。 1. 连接建立需要解决的问题#2. 连接的建立过程#首先TCP服务器自身先建立相应的传输控制块,内容如下,并进入监听状态,等待TCP客户进程的连接请求: 然后TCP客户端发送TCP连接请求 当TCP服务器接收到该请求后,会发送一个TCP连接请求的确认, 最后TCP客户端接收到服务器的确认后还需再发送一个报文段进行应答,至TCP服务器接收到该报文后,连接正式建立:
3. 例题#八、TCP连接的释放#TCP通过“四报文挥手”释放连接。客户端和服务器都可以发起释放连接请求。 这里假设TCP客户端主动发起释放连接请求: 其中 然后TCP服务器发送一个释放连接的确认报文,并通知应用进程,至此TCP客户到服务器的单向传输就关闭了: 此时TCP连接处于半关闭状态,即客户到服务器的连接断开,但服务器到客户的连接仍继续,服务器还可以继续向客户端发送数据: 当服务器要发送的数据也发送结束后,则服务器端也会发送一个释放服务器到客户端方向连接的请求,和客户端发送的释放请求的过程基本一致: 而客户端接收到释放请求时发送释放确认,并在等待2MSL后关闭连接,而服务器接收到该确认后直接关闭连接: 最后的这个等待时间是为了防止发生这种情况: 此外当连接过程中客户端出现故障时有这样的处理方案: 九、TCP报文的首部格式#1. 字节流和TCP报文段的关系#2. 格式与各部分的功能#整体格式如下图所示:
几个标志位:
URG和紧急指针: 紧急标志位URG:取值为1时紧急指针字段有效;取值为0时紧急指针字段无效。 选项部分:
以上就是TCP报文首部各字段的详细含义。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/26 3:35:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |