接下去我们来说说复用和分用的概念
同一个运输层协议
传送数据(当然需要加上适当的首部)然后我们来看看两个应用进程之间是如何通信的
网络层为主机之间的通信提供服务
传输层在网络层的基础上,为应用进程之间的通信提供服务
还有一个小知识点需要记忆
→敲黑板!!!重点来了←
1. TCP【传输控制协议】
2. UDP【用户数据包协议】
下面是有关TCP和UDP的应用层协议,以及各自的端口。可以适当了解一下
在端口这一块,我们再来说说复用和分用的概念
向下
向上
接下去我们来考虑几个问题
对于上述的这些问题,我们应该怎么去解决呢?没错,就是利用【端口】
门
,有了这个门,应用层中的应用进程就必须通过这个门才能将数据经过运输层发送到互联网;而且别的主机上的应用进程要寻找本主机中的某个某个应用进程,也必须通过这个门(本段提供对于端口这一概念的理解)但是对于端口我们要做这么一个区分
【硬件端口】:协议栈层间的抽象的协议端口,不同硬件设备进行交互的接口
【软件端口】:应用层的各种协议进程与运输实体进行层间交互的地点
源端口
和目的端口
这两个重要字段16位端口号
来标志一个端口OK就这些,不往下说了,不然太多了,记重点就行
合适大小
的报文。
因为IP数据报的首部字段是固定的
】,也会降低IP层的效率恒定的速率
发送数据,但不允许数据有太大的时延,UDP刚好合适对于UDP的首部格式,你只需要记住一点,它的首部字段有8个字节,由四个字段组成,每个字段的长度都是2字节
学好三、四这两个模块可为后面TCP实现可靠传输打下牢固基础
[可靠有序,不丢不重]
面向字节流这一块可能比较抽象,稍微介绍一下
窗口值
和当前网络拥塞程度
来决定一个报文段应包含多少个字节,形成 TCP 报文段
【这一块在下面会进行再次介绍】TCP把连接作为基本的对象
TCP用主机的IP地址加上主机上的端口号作为TCP连接的【端点】。这样的端点就叫作套接字(socket)或插口。套接字用(IP地址:端口号)
来表示
例:套接字 socket = (192.168.1.20 : 7777)
注:
通过网络层的学习我们可以知道对于IP网络的传输是不可靠的
【停止等待协议】能够在不可靠传输的网络上实现可靠通信。对于“停止等待”而言就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组,也就是我们常说的【阻塞队列】
出现差错有两种情况,对于这两种情况【B 都不会发送任何信息】
解决方案:超时重传
超时计时器
A 在设定的超时重传时间内将不会收到确认
,因此 A 在超时计时器到期后重传 M1A 也会收到重复的确认
。对重复的确认的处理:收下后就丢弃,但什么也不做下面是它们的原理图
通常A总是可以收到对所有发出的分组的确认,如果A不断重传分组但是收不到确认,就说明通信线路太差,不能进行通信
[自动重传请求ARQ]
往返时间RTT
·为了提高传输效率,则不使用低效率的停止等待协议,而是采用【流水线传输】这个协议很重要,【滑动窗口】是后面TCP进行传输原理的重要基石,是TCP协议的精髓所在
然后介绍一下这个协议的基本要点
[连续发送出去]
,而不需要等待对方的确认来谈一谈这种【累计确认】
接下去我们来说说TCP报文段的首部格式,只有掌握了这些你才能掌握TCP的工作原理⏰
【TCP 首部的最小长度是 20 字节,后面的4N个字节是根据需要而增加的选项】<—— 这点要牢记
第一个字节的序号
若确认号 = N,则表明:到序号N - 1为止的所有数据都已正确收到
以下的这6个字段,在后面有关TCP的三次握手和四次挥手中会频繁使用到
URG = 1
时,表明紧急指针字段有效,告诉系统此报文段中有紧急数据,应尽快传送 (相当于高优先级的数据)ACK = 1
时,确认号字段才有效。当 ACK = 0
时,确认号无效
将PSH置为1
,并立即创建一个报文段发送出去。当接收方收到这个报文段后,就可以尽快地交付接受应用进程,而不再等到整个缓存填满了之后再向上交付RST = 1
时,表明 TCP 连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
SYN = 1,ACK = 0
时,表明这是一个连接请求报文段SYN = 1,ACK = 1
时,表明这是一个连接接受报文段FIN = 1
表明此报文段的发送端的数据已发送完毕,并要求释放运输连接虽然是比较多,但是却非常重要,为后面的学习打下坚实的基础
窗口值作为接收方让发送方设置其发送窗口的依据
URG = 1
时才有意义,它指出了本报文段中紧急数据的字节数,因而可以知道紧急数据的末尾在报文段中的位置
最后的填充字段仅仅是为了使整个TCP首部长度是4字节的整数倍
首先了解一些滑动窗口的概念
凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用
一定不能超过
B的接受窗口的数值
[左边]
[右边]
[表示没有收到新的确认]
[表示收到了新的确认]
[没有收到新的确认]
[收到了新的确认]
P1 = 后沿,P2 = 当前,P3 = 前沿
P1之前的数据 ===》已发送并已收到确认的部分
P3 之后的数据 ===》不允许发送的部分
P3 - P1 ===》A 的发送窗口(又称为通知窗口)
P2 – P1 ===》已发送但尚未收到确认的字节数
P3 – P2 ===》允许发送但尚未发送的字节数(又称为可用窗口)
有关窗口滑动的原理方面可以可以看看这个视频,讲解得还不错
大厂面试必备:TCP滑动窗口是干什么的?TCP的可靠性体现在哪里?
然后再来谈谈有关发送缓存与发送窗口
发送缓存用来暂时存放
接下来说说需要强调的三点Ⅲ
[因为有一定的时间滞后]
累积确认
的功能,以减小传输开销。强调两点:
最后强调一点,TCP的通信是全双工通信。通信中每一方都在发送和接收报文段,因此每一方都有自己的发送窗口和接收窗口。在谈到窗口的时候,一定要弄清是哪一方的窗口
TCP 超时重传时间设置
对上,TCP便采用了一种【自适应算法】,它记录一个报文段发出的时间,以及收到相应确认的时间
这两个时间之差就是报文段的往返时间 RTT
其他考试不会涉及,有兴趣可以看看
问题:若收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据,那么能否设法只传送缺少的数据而不重传已经正确到达接收方的数据?
(累积确认)
对于滑动窗口,在上面也提到过了,在流量控制这一块,就要利用到这个滑动窗口的机制去实现两个主机之间的通信
[流量控制的目的]:让发送方的发送速率不要太快,要让接收方来得及接收
然后来说一下很重要的例子,要注意理解,与后面的三次握手紧密度非常之大
DATA = 100
,数据报文段序号的初始值设置为1,即seq = 1
A主机继续向B主机发送了从[201]开始的数据
,但在途中丢失了。此时主机B发现主机A没有再发送数据过来了,因此向它发送过去一个确认报文段只有当ACK = 1 时ack才有效
确认字段的值
400->300
超时计时器
超时计时器
时间到了,但是主机B还是没有发来相关的响应,于是重新发送了一次从201开始的这100个数据报文段,这也就是我们在上面讲到过的【超时重传】从上面就可以看出主机B实现了三次流量控制,第一次将主机A的发送窗口大小从400->300
,第二次从300->100
,第三次就是从100->0
,通过【rwnd】这个接收窗口的控制,就使得主机A的发送窗口呈现出一个动态变化的趋势,也就是我们前面在讲到窗口值是在动态变化的
也就是当主机B重新发出一个新的窗口值为止
。B主机会在它的接收缓存中腾出一些地方,把缓存当中的数据[主机A发送过来的600B]
上交给了应用层后,它的接收缓存中就又可以有一些存储空间了rwnd = 400
的报文段,告诉它你现在可以将自己的发送窗口设置为400,并且开始发送数据了。但是这个报文段呢若是在传输的过程中丢失了(〃>目<),主机A就收不到,此时主机B一直在等待主机A发送新的数据过来,主机A呢也等待主机B发送一个报文段过来告诉自己可以发数据了,于是它们就开始了一段漫长的等待.<{=....那要怎么去解决这个局面呢?
持续计时器
】,当连接的一方收到对方的零窗口通知后,就会启动这个计时器。也就是当前的主机A,接下去呢它会发送一个【探测报文段】,这个报文段中会有1B的数据,发送过去之后若是接收方给出的窗口值依旧是0,那么主机A就会重新设置持续计时器。流量控制
就可以看出TCP真的是非常的严谨,很好得控制了每一次数据的传输o((>ω< ))o首先来看看什么叫做【拥塞】
【拥塞】:在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏 ∑对资源的需求 > 可用资源
很多人就认为解决网络拥塞的问题只需要增加一些资源即可
丢弃一些路由器分组
时,这一分组的源点就会重传这一分组,但是这又会间接导致更多的分组流入网络和被网络中的路由器丢弃在上一模块,我们讲到了流量控制,现在又说到了拥塞控制,那你可能会想它们之间会不会存在着什么关系呢?一起来看看
防止过多的数据注入到网络
,使得网络中的路由器或链路不至于过载,而且它是一个全局性
的过程,会接收到不同主机、路由器所发送过来的数据,那么这个中心的交换节点就会同时被使用,从而到导致繁忙进而造成拥塞,可是呢接收方在这么繁忙的情况下又很难去知道、去查询是哪个主机出了问题抑制发送端发送数据的速率
,以使接收端来得及接收。它是一个点对点通信量的控制,是个端到端
的问题可能在看了上面的叙述后依旧有点模糊,没关系,我通过一个生活中的小场景来叙述一下
流量控制
拥塞控制
对于同样的请求,都是将水龙头拧得小一些,但是目的却不一样。对照它们的原理之后,若是读者能明白,那也就懂了它们之间的区别
了解了拥塞控制的一半原理,接下去我们来聊聊TCP面对这样的拥塞状况是如何应付的
为了集中讨论拥塞控制,假定:
发送窗口的大小由网络的拥塞程度
来决定rwnd
接收窗口,是由接收方
维护的。表示接收方示意发送方自己可以接受的数据大小,以此来控制发送方发送数据的大小,cwnd
拥塞窗口,它呢是由发送方
维护的。它的大小取决于网络的拥塞程度,并且是动态变化着的。因为上面我们假定接收方的接收窗口足够大,因为发送方只需要考虑拥塞窗口的大小即可【发送方控制拥塞窗口的原则】:
增大一些
,将更多的数据发送出去,以此来提高网络利用率减小一点
,减少注入到网络的分组数,以便缓解网络出现的拥塞发送方如何知道网络出现了堵塞?
来总结一下这两个窗口
【接受窗口 rwnd】:由接收方维护,会根据接收缓存设置的值,并告知给发送方,反映接收方容量
【拥塞窗口 cwnd】:由发送方维护,会根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量
接下去我们来介绍一下拥塞控制中的算法,首先是
慢开始和拥塞避免算法
这两种,它们是配合使用的
【慢开始算法原理】:由小到大逐渐将数据字节注入到网络中,即逐渐增加拥塞窗口的数值
最大报文段SMSS
,因为慢开始规定,每收到一个新的报文段后,可以把拥塞窗口增加最多一个SMSS的值。然后通过下面这个例子来介绍一下慢开始算法TCP流量控制
中也有说到过,这么一趟来回就叫做一个轮次,也可以叫做往返时延RTT
第二轮的RTT
第三轮的RTT
试探
到本网络的拥塞状况良好,就会不断地增加自己的拥塞窗口,尽快地将数据发送出去。这种慢开始的策略可以使得网络拥塞的概率减小↓从上可以知道拥塞窗口在慢开始算法下会不断地增大,但是若是太大也不好,也会造成过多的数据涌入导致网络拥塞,因此便有了[慢开始门限ssthresh]
这么一个状态变量,它的用法如下
拥塞避免
算法慢开始算法
,也可使用拥塞避免
算法【拥塞避免算法原理】:让拥塞窗口cwnd按线性规律缓慢增长,每个轮次RTT只加1
这一块可以听一听王道这个小姐姐讲的,还是蛮不错的
5.3.5 TCP拥塞控制
然后再来简单介绍一下
快重传和快恢复
这两个算法
【快重传算法原理】:让发送方尽早知道发生了个别报文段丢失的情况,若发送发一连收到三个重复确认,便会立即重传接收方需要的报文段
冗余ack
【快恢复算法原理】:当发送端收到连续三个重复的确认时,不执行慢开始算法,而是执行快恢复算法算法
慢开始算法
而言,会使拥塞窗口降到1后再使用拥塞避免算法慢慢升回到调整后的慢开始门限值快恢复算法
而言,不会使拥塞窗口降到最小值1,而是降到门限值ssthresh / 2
的位置,然后再次执行拥塞避免算法,使拥塞窗口缓慢地线性增大以下是【TCP拥塞控制】的整个流程图,可以再对照回顾一下
上一节我们在讨论TCP拥塞控制时并没有和【网络层】采取的策略联系起来,其实它们之间有着密切的联系
本小节考试不会涉及,可以有兴趣可以了解一下
FIFO 先进先出
,因此当队列满了的时候,后面再到达的所有分组就都会被丢弃,这种就叫做[尾部丢弃策略]
慢开始状态
,这在TCP的术语中就叫做【全局同步】(global synchronization)主动丢弃
,这样便可以使得网络拥塞程度减轻甚至不会出现网络拥塞问题铺垫了这么多,有关TCP最最最重要的内容到了,你必须有很扎实的基础才能理解这些
有网上找了许多关于TCP三次握手和四次挥手的视频和文章,筛选了一些,可供复习参考
这个蛋老师讲得很生动
TCP三次握手和四次挥手
楠哥则是解说得很详细
【深度讲解+面试回答】tcp/ip协议三次握手、四次挥手,通俗易懂,亲自解答
这篇是文章——> 博文参考
如果觉得难理解也没关系,了解一下即可,可以的话记住三次握手和四次挥手中客户端与服务端之间发送的报文字段
TCP【传输控制协议】
UDP【用户数据包协议】
门
,有了这个门,应用层中的应用进程就必须通过这个门才能将数据经过运输层发送到互联网;而且别的主机上的应用进程要寻找本主机中的某个某个应用进程,也必须通过这个门以太网的MTU为1500B
。假设IP层采用默认首部,即20字节。那么应划分为8200/(1500-20),为6片。前5片是1480字节。第6片是800字节。片偏移字段分别是:0,185[1480 / 8]
,370[2960/ 8]
,555[4440/ 8]
,740[5920/ 8]
,925[7400/ 8]
主机A向主机B连续发送了两个TCP报文段,其序号分别是70和100。试问:
(1)第一个报文段携带了多少字节的数据?
(2)主机B收到第一个报文段后发回的确认中的确认号应当是多少?
(3)如果B收到第二个报文段后发回的确认中的确认号是180,试问A发送的第二个报文段中的数据有多少字节?
(4)如果A发送的第一个报文段丢失了,但第二个报文段到达了B。B在第二个报文段到达后向A发送确认。试问这个确认号应为多少?
使得不同分片的报文到达终点的时间不一样
,此时就会有数据报片无法及时到达终点,而早早到达终点的数据报片已经超时,所以会被丢弃,那此时就会导致这个【分组丢失】的现象以上便是对于《计算机网路》中运输层这部分知识点的期末汇总,期盼正在阅读的你可以取得一个好成绩❤️