| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 计算机网络模型(三):运输层 -> 正文阅读 |
|
[网络协议]计算机网络模型(三):运输层 |
计算机网络模型(二):应用层 简介运输层其实很简单,就两个协议需要我们特别关心,一个是TCP协议,几乎所有的应用层协议都是基于TCP协议的;另一个就是UDP协议,也很重要。一般二者用在不同的场合。 想一下,两台网络主机要想通信,应该怎么办? 运输层提供了解决方法:
TCPTCP协议就好比火车,乘客就是要传递的信息。火车从上海到北京,路线固定,你不会中途走错路。但是呢,至于火车应该怎么走,那就是很复杂的问题了。 TCP报文格式
TCP三次握手见文章:洪水攻击与防治方法 三次握手之后,就要传递数据了。 但是,我们之前提到,TCP连接是虚拟的,所以一定会有信息干扰的情况,在这种情况下,我们怎么处理信息从而达到可靠交付呢? TCP可靠交付啥叫理想可靠交付?一般我们认为满足两点要求:
于是,我们就出现了为了TCP协议而定制的配套协议,帮助实现TCP可靠传输。 停止等待协议/自动重传请求(ARQ)
还有一种情况吧,就是A向B发送了数据,B收到了但是回应的消息丢失了,这时候触发超时重传机制,后面都是正常的,直到某一时刻,又收到了之前丢失的确认消息,这时候我们会采取丢弃消息的方式,迟到或者确认丢失了的消息都不要了,毕竟之前已经弥补了消息的传递。 要是想提高利用率怎么办?就引出了新的消息协议:连续ARQ协议。 连续ARQ协议发送方不管接收方有没有收到信息,都会不断向接收方传递消息,直到发现接收方传来了与预期不符的消息。我们先看看什么是连续ARQ:
那我们是不是也可以对分组进行再分组?可以的。 对分组进行分组后的确认被称为累计确认。对连续到达的最后一个分组进行确认,我们就可以认为收到了之前全部的数据。 这么做的缺点是什么呢?假设我收到了1245分组的消息,但是根据协议,我会回复2的ACK,但是45已经传出去了,作废,重新传345。这叫Go-Back-N,一旦出现网络不佳的情况,这样的协议也会非常耗时。 滑动窗口之前几个小章节说了TCP可靠交付的第一点,就是主机A发送什么数据,主机B就应该接收什么数据。那么第二点,在许可范围内尽可能多的传输数据,这个靠什么实现呢? 本章节的滑动窗口是重点,也是基础。 如果你了解计算机图形学,就会对滑动窗口有所了解。现假设我们的滑动窗口是以字节为单位的,并且滑动窗口的大小为5: 滑动窗口 = MIN { 接收窗口值,拥塞窗口值 },什么是拥塞窗口值,以后说。 我们还有一点需要说明,那就是万一出错了,滑动窗口怎么处理这些错误?这就需要我们重新看一下这个滑动窗口,简化一下:
如果主机A收到的确认帧中标识发送窗口的大小需要变小,那么发送窗口前沿不会移动,后沿会根据收到的确认帧前移,直到匹配需求大小。 超时重传时间太麻烦了,希望以后有精力在更新。 拥塞控制我们之前提到发送窗口的确定是和网络拥塞程度有关系的,那么网络拥塞程度怎么判断? 慢开始与拥塞避免在最开始的时候,我们把拥塞窗口大小设置为1,然后每经过1个传输轮次,也就是一个消息往返时间,拥塞窗口加倍。 假设拥塞窗口(cwnd)最初为1,那么经过5轮传输,理论上cwnd=16。 但是,假设网络中允许的最大流量为1025,那么经过多次传输轮次后,cwnd会到达1024,再次加倍就是2048,明显大于1025,于是消息阻塞了,这时候我们还需要定义一个数据,就是慢开始门限ssthresh。 我们现在把数据缩小,假设ssthresh=16,那么当cwnd=16的时候,就会改用拥塞避免算法。拥塞避免算法是,cwnd不再加倍,而是加一。 假设我们把ssthresh设置成一个非典型值,就是不是2的指数,设为24 直到38的时候,发现传送超时了,那么ssthresh就会更新为38 的一半,即19。此时cwnd重新设置为1,开始慢开始算法进行消息传送。 快重传和快恢复快恢复指的是当发送方发送了一套报文,现在假设报文号是1,2,3,4,5,6,7,8。 假设报文3未收到,那么接收方会重复确认收到报文2,重复三次,这样发送方会认为报文3未发出,重复发送报文3。
TCP四次挥手与三次握手对应,TCP释放连接的时候也需要四次挥手作为结尾。
MSL最长报文寿命(Maximum Segment Lifetime):RFC793建议为2分钟,但是工程上认为2分钟太长了,也就是说可能经过4分钟才能从time-wait等待状态真正关闭。因此工程上会缩短该时间。 ==真正的关闭是在A撤销了程序控制块TCB的时候。==也就是Time-wait后,A会撤销程序控制块。 那为什么要等待两个MSL时间呢? 保证最后的ACK报文能够到达B。该报文可能会丢失,导致B无法收到FIN+ACK报文段的确认,此时B会超时重传该信息。超时重传后的时间在2MSL之内。如果不设置该时间,B可能无法对该信息进行确认,从而无法正常关闭连接。 保活计时器服务端不会维持一个一直没有数据往来的客户端,加入保活计时器来计时。 假设2小时没有数据往来,服务器就会每75分钟构造一个探测报文,如果连续10次叹词报文无响应,主动断开连接。 UDPUDP与TCP不同,TCP是虚拟链路,而UDP是没有链路的,那UDP是怎么向指定主机传送信息的呢? UDP报文格式UDP报文不像TCP那样复杂。
因为伪首部并不是真正的UDP报文,而是临时添加上去,仅仅是为了计算校验和用的部分。该部分临时添加,因此不会向下传递,也不会向上递交。也就是说,UDP报文的伪首部只在发送到接收的区间添加,而解析过程不考虑伪首部,会直接放弃该字段。至于如何检验校验和,我们一会单独说。 现在说说其他的部分:
UDP特征
UDP数据检验发送方:
接收方: 运输层的东西就大致是这个样子了,下一篇文章更新网络层。 |
|
网络协议 最新文章 |
使用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/25 18:29:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |