赞
踩
目前正在备考24考研,现将24计算机王道的408学习整理的知识点进行汇总整理。
博主博客文章目录索引:博客目录索引(持续更新)
传输层只有主机才有的层次。
传输层的功能:
1、传输层提供进行和进程之间的逻辑通信。
2、复用与分用。
3、传输层对收到的报文进行差错检测。
两个协议为:TCP
、UDP
。前者可靠,后者不可靠。
TCP与UDP协议的对比:
①TCP
:面向连接的传输控制协议。
②UDP
:无连接的用户数据报协议UDP。
复用与分用:
复用
:应用层所有的应用进程都可以通过传输层再传输到网络层。分用
:传输层从网络层收到数据后交付指明的应用进程。端口:传输层的SAP,用来标识主机中的应用进程,一个应用进程运行都会有端口号。
端口号按照范围分:包含有服务端的端口号、客户端使用的端口号
其中一些常见的固定应用服务的使用端口如下:
在网络中采用发送方和接收方的套接字组合来识别端点。
套接字:唯一标识了网络中的一个主机和它上面的一个进程。
套接字Socket = (主机IP地址,端口号)
,其中主机IP地址能够去标识定位一个网络中的主机,而对于端口号则是用来表示主机上的某个进程。UDP功能:只在IP数据报服务之上提供了很少的功能,如复用分用和差错检测功能。
UDP的主要特点:
1、UDP是无连接的,减少开销和发送数据之前的时延。
2、UDP使用最大努力交付,即不保证可靠交付。
3、UDP是面向报文的,适合一次性传输少量数据的网络应用。
应用层给UDP多长的报文,UDP也会照常发送,即一次发一个完整报文,由于也是不可靠的交付,容易导致数据丢失,若是传输的数据量不大,这样即使发生丢失的的情况损失也比较小。
4、UDP无拥塞控制,适合很多实时应用。
5、UDP首部开销小,8B,TCP为20B。
首部字段总和固定是8B,其中包含源端口号
、目的端口号
、UDP长度
、UDP检验和
都是2B(16位)。
16位UDP长度
:指的是数据字段+首部字段,若是数据字段为7B,那么这个UDP长度就是15。
16位UDP检验和
伪首部只有在计算校验和的时候才出现,不向下传送也不向上递交。伪首部就是模仿的IP数据报的首部。
源IP地址
:4个字节。目的IP地址
:4个字节。0
:1个字节,全0也就是为首部的第三个字段固定全0。17
:1个字节,封装UDP报文的IP数据报首部协议字段是17。UDP长度
:2个字节,UDP长度 = UDP首部8B + 数据部分长度
(不包括伪首部)如何使用伪首部来校验UDP用户数据报有没有发生差错?
将它看成有许多16位的字串连接起来的,也就是很多个4个字节的组成部分,如下图中的右半部分,每16位作为一组并排写:
在发送端:
1、填上伪首部。
2、全0填充检验和字段。
3、全0填充数据部分(UDP数据报要看成许多4B的字串接起来)。
4、计算:将伪首部+首部+数据部分采用二进制反码求和。
5、将求和反码填入到首部的检验和字段。
6、去掉伪首部,发送。
在接收端:
1、填上伪首部。
2、伪首部+首部+数据部分采用二进制反码求和。
3、最终得到结果全为1则无差错,否则丢弃数据报 或 应用层 附上出差错的警告。
如下在求和中有区别的就是检验和部分,在接收端时这个检验和为发送端时候的一个检验和,不再是使用全0来计算:
**为什么最终和为1?**可以看到在发送端时最终的结果取得是反码放入到检验端,那么将计算得到的值+反码值,那就是全1,如下两行相加。
1、TCP是面向连接(虚连接)的传输层协议。
2、每一条TCP连接只能有两个端口,每一条TCP连接只能是点对点的。
3、TCP提供可靠交付的服务,无差错、无丢失、不重复、按序到达。【可靠有序,不丢不重】
4、TCP提供全双工通信。
发送缓存
:准备发送的数据 & 已发送但尚未收到确认的数据。(对于一些已经发送但是还没有收到确认的数据,不能够直接从缓存中删除,因为一旦出现超时的情况那么就需要进行重发)接收缓存
:按序到达但尚未被接受应用程序读取的数据 & 不按序到达的数据。(对于每按序到达的数据,只有将数据顺序排好了,接收方才能够逐一一个有一个的来从接收缓存当中取出数据交付给对应的进程)。5、TCP面向字节流
流
:流入到进程或从进程流出的字节序列。如下图文件包含多个字节,我们将10个字节放入到缓存中等待发送:
此时开始发送,可能会先取3个字节组成一个TCP的报文段,接着在这个报文段上加入TCP的首部形成一个完整报文段,再放到链路上进行一个传输,对于这个字节传输的个数根据具体情况不定:
所以说TCP协议是面向字节或者说字节流的。
TCP报文段首部整体描述:
下面是TCP首部的11个个字段详细描述:
①-②源端口、目的端口
:各自占用2B也就是16位。
③序号位
:占用4B,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号。
④确认号
:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N - 1为止的所有数据都已正确收到。
⑤数据偏移(首部长度)
:TCP报文段的数据起始处位置J距离TCP报文段的起始处有多远,以4B位单位,即1个数值是4B。
TCP报文段长度指的是如下图:
由于是以4B作为单位,对于数据偏移若是1111,那么就是16 x 4B = 64B,当前TCP首部就是64字节,固定20B,可选+填充就是44B。
⑥6个控制位:
紧急位URG
:URG = 1时,标明此报文段中有紧急数据,时高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。(如下,当在缓存中已经拆分多段待发送的报文,那么此时途中处于第4段的报文里由于包含URG=1,那么就表示该数据需要尽快传送,赋予其一个优先级,此时就可以移动到最前面,而不用等地啊排队轮到它。)
确认位ACK
:ACK = 1时确认号有效,在连接建立后所有的传送报文段都必须把ACK置为1。推送位PSH
:PSH = 1时,接收方尽快交付应用进程,不要再等到缓存填满后再向上交付。(指的是接收方进行的一个紧急处理,如下图中若是缓存区第二个段是PSH=1,那么此时就被赋予了一个报文段的优先级,会赶紧交付给应用层上面的进程。)
复位RST
:RST = 1时,表明TCP连接中出现了严重差错,必须释放连接,然后再重新建立传输链接。同步位YSN
:SYN = 1时,表明是一个连接请求/链接接受报文。(如下图中发送方发送给出了SYN = 1,那么接收端也会返回一个SYN = 1)。
终止位FIN
:FIN = 1时,表明此报文段发送方数据已发完,要求释放连接。对于推送位、复位考试不考,做一个简单了解。
⑦窗口字段
:指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。
⑧校验和
:检验首部+数据,检验时要加上12B伪首部,第四个字段(相对应协议字段)为6。
⑨紧急指针
:URG = 1时才有意义,指出本报文段中紧急数据的字节数。
10选项
:最大报文段长度MSS、窗口扩大、时间戳、选择确认…。
11填充字段
:若是选项字段不是4B的整数倍,那么此时就需要进行填充其为4B的整数倍。
TCP连接传输三个阶段:
TCP连接的建立采用客户/服务器方式,主动发起连接建立的应用进程叫做客户,被动等待连接建立的应用进程叫做服务器。
连接时三次握手:
ROUND1:客户端发送连接请求报文段,无应用层数据。
SYN = 1,seq = x(随机)
对于SYN只有两种情况下置为1,一个是连接请求,另一个是连接请求的确认。
ROUND2:服务端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据。
SYN=1,ACK=1,seq=y(随机),ack=x+1
ROUND3: 客户端收到服务端的确认,接下来应该返回一个确认的确认,告诉服务器我们已经建立连接了,接下来就可以给你发送数据,与前两个报文段不同的是,这个第三个报文段可以携带数据了,此时可以将正式要发送的数据放入到报文段。
SYN=0,ACK=1,seq=x+1,ack=y+1
对于第二步、第三步中,服务器和客户端都围着TCP连接的过程分配了缓存和变量,此时就会导致出现问题:洪泛攻击
。
原因:由于三次握手才产生的黑客攻击问题。
攻击描述:SYN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那么这个TCP连接就处于挂起状态,也就是所谓的半连接状态。服务器收不到再确认的话,就会重复发送给ACK给攻击者,此时就会更加浪费服务器的资源。
解决syn洪泛攻击的办法:设置的是syn cookie
。
关闭连接时四次挥手:
参与一条TCP连接的两个进程中的任何一个都能够终止该连接,连接结束后,主机中的"资源"(缓存与变量)将被释放。
ROUND1:客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。
FIN = 1,seq = u
ROUND2:服务器端回送一个确认报文段,客户到服务器这个方向的连接就是释放了。(此时处于半关闭状态)
ACK = 1,seq = v,ack = u+1
主机收到了这样的一个确认报文段时,不用予以回复,因为这个主机现在已经结束通话了,只需要等待这个服务器告诉它,它也结束,接着它们俩之间的连接就算是正式关闭。
注意:在这个过程中还会发送完剩余数据。
ROUND3:服务器端发送完数据,就发出连接释放报文段,主动关闭TCP连接。
FIN = 1,ACK = 1,seq = w,ack = u + 1
ROUND4:客户端回送一个确认报文段,再等到时间等待时间计时器设置的2MSL(最长报文段寿命),此时连接彻底关闭。
ACK=1,seq = u + 1,ack = w + 1
过程:与UDP校验一样,增加伪首部。
与UDP的一样,最终发送的报文段可能就是下面TCP缓存中的几个字节,那么序号就表示每个段的第一个字节在整个TCP缓存当中的位置:
下面我们可以看到当我们TCP缓存中的第一段报文在发送到服务端的时候,TCP缓存里并没有将这个第一段删除掉:
其原因就是要等待服务器端确认之后才进行删除,若是没有收到确认报文那么就可能会出现报文丢失的情况,所以对于发送端如何知道接收方已经正确、完整的接收到了这整个报文,就是靠我们这个确认机制,接收方收到了这个报文段之后,就会返回一个确认报文段。
可以看到当我们服务端返回确认报文时,其中的确认号字段为4,那么就表示4之前的数据已经都完成了接收,那么此时发送端就可以将TCP缓存当中的第一段删除:
那如果说有1、2、3段,此时中间的第二段迟迟不到(可能已经丢失),对于1、3段已经收到了,此时TCP默认会使用累计确认,此时确认号字段依旧是4,也就是服务端告知客户段我下面还是要收到第4字节开始的报文:
此时客户端就会发送第2段报文,也就是4、5、6,当第2段报告发送到服务端时,此时服务端已经接收到了第1、2、3段,那么下一次发送确认段中确认号字段为9。
对于顺序、乱序到达服务端的情况说明:
确认、重传机制不分家,TCP的发送方在规定的时间内(重传时间)没有收到确认那么就要重传已发送的报文段。【超时重传】
问题1:何时重传?
问题2:对于这个重传的时间如何进行计算?
RTTs(加权平均往返时间)
,也就是当我们发送第一个报文段的时候,这个RTTs指的就是取的第一个报文的RTT(从第一个报文的发送开始知道确认),接着在发送第二段RTT时,那么同样会有一个rtt,接着根据第1、2个rtt就能够算出一个RTTs就作为现在的重传时间。对于之后发送第N段RTT时,都会设置一个加权的平均往返时间,通过一个公式来计算。问题3:若是对于超时重传,若是一直没有到达这个超时时间,那么就会一直进行等待,有没有一种办法能够在超时事件发生之前就能够直到发送方有没有丢失这个报文段,然后尽快的重传呢?
方案:冗余ACK(冗余确认)
,与确认机制相关。
过程:每当比期望序号大的时序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。
对于下面的情况,可以考单由于在1段之后2没有收到,此时不断到来的是3、4、5此时服务器端也就都会接收,当接收完一个报文段时,实际会发送一个确认号,可以看到在1段之后,由于2段迟迟没有到来,确认报文段中确认号一直都是2,可以看到此时这种连续确认号为中间2段,那么就是一个冗余确认。当接收端收到了三个相同序号的报文段(是基于1的确认为序号2之后的连续三个),此时就会就会判断自己发送的这个2号报文段发生了丢失情况,此时就会进行重传(此时就实现了提前重传效果)
**为什么能够乱序到达呢?**TCP中接收端并不是收到一个确认机制发送一个报文段,它时可以进行连续的发送多个报文段的。
这种技术也可以成为:快速重传技术。
原因:在平时发送数据的时候,通常都会希望这个发送数据的速率可以更快一些,但是如果发送的速率过快,就会使得接收方可能来不及接收,此时就会导致非常严重的丢包现象,此时就需要有流量控制来控制发送方的一个发送速率。
流量控制:让发送方慢点,要放接收方来得及接收。
TCP利用滑动窗口机制
来实现流量控制。
滑动窗口过程:在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方确认报文段的窗口字段来将rwnd通知给发送方),发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。
对于发送方的窗口是可以动态变化的,这个取决于接收方所返回的一个报文段,可能是确认报文,也有可能是一个数据报文,如果窗口字段大,说明现在可以让发送方多发一些数据,若是窗口字段比较小,那么就是让发送方少发一点数据:
A向B发送数据,连接建立时,B告诉A:“我的rwnd = 400(字节)”,设每一个报文段100B,报文段序号初始值为1。
详细过程描述:
1、首先A向B进行请求连接建立,接着B返回一个确认报文段,其中设置了字段rwnd = 400(字节)。
2、主机A收到确认报文段,此时读取到rwnd = 400,此时就给自己的发送缓冲区窗口划分了400字节(由于报文段100B,那么就正好是4段)。
接着会根据窗口的大小连续的发出了4个报文段,每个报文段100字节,根据图可以看到前两个报文段主机B成功接收,对于第3段丢失:
3、此时主机B发送了一个确认报文段,其中指明我接下来要接收从201字节开始的一个报文段,此时并指明当前可以接收的窗口为300字节。
主机A的发送窗口是从接收端暂未收到的201字节开始,直到500字节:
4、此时发送端的发送窗口由于有300字节,由于此时201-300字节的报文段还没有收到确认报文,此时就会保持在发送窗口,接下来主机A发送数据,就可以发送这两个格子里面的数据会从301开始,第3段,第4段,此时就无法发出了,已经窗口最大只能够开大500字节。
5、此时对于窗口201-300字节的报文段就一直处于僵持的状态,一直在等待接收方发来的确认,等待对于201-300字节的报文段超时时间过去之后,就会进行一次重传
6、主机B能够成功接收到,此时主机B发送了一个响应报文,在响应报文中指明了现在主机B想要接收的报文段从501开始,发送窗口大小可以限制在100。
7、主机A开始发送501字节开始的一段报文段,由于窗口大小只有100字节,所以发送完该段就无法继续发送。
8、此时接收端主机B返回了一个确认报文段,其中表明说想要从601字节开始,发送窗口大小为0。
由于窗口设置为0,那么此时发送端就不能在发送数据了。
额外问题1:若是主机A一直在等待主机B发送一个非零窗口的通知,而主机B发送了一个新的报文段(允许窗口大小为400)在传输过程中丢失,此时若是没有措施的话,那么主机A、主机B就会一直相互等待,对于这种相互等待的情况,类似于死锁,那么如何解决呢?
解决方案:TCP为每一个连接设置有一个持续的计时器,只要TCP连接的一方收到对方的零窗口通知,就会启动这一个持续计时器。若是计时器到时间,那么主机A就会发送一个探测报文段,那么主机B会重传这一个通知报文。
什么叫做拥塞控制?
出现拥塞的条件:对资源需求的总和>可用资源
若是某段时间对于网络当中某一个资源的需求总和超过了这个资源,它可以提供的可用部分,那么网络的性能自然就会变换。此时就会有许多资源同时呈现一个供应不足的情况,从而导致以下的情况发生:
拥塞控制作用:防止过多的数据注入到网络当中。
拥塞控制与流量控制的区别:
拥塞控制
:假如说下图的上边为接收方,图下边式发送方,都需要给接收方发送数据,那么由于它们同时使用这个网络上的资源,同一个交换结点,那么这个路由器就会使得这个网络非常的繁忙,甚至会出现一个拥塞的情况,对于接收方而言并不知道这种拥塞情况具体是哪一个主机或者是哪几台主机发送速率过快造成的。
流量控制
:是一种点对点之间的通信量控制,是一个端到端的问题,如果和这个接收方它手来的这个数据来不及接收了,那么此时就会直到应该照这个发送方。
小结:流量控制这是点到点之间的一个问题,是这个发送方的速率过快导致接收方缓存不够;拥塞控制是一个全局性的问题,主要是因为这个网络发生了阻塞。
四种算法:慢开始、拥塞避免、快重传、快恢复。
上面的四种是每两个进行搭配使用在一种情形当中,一个是慢开始+拥塞避免
,另一个组合是快重传+快恢复
:
在学习上面算法之前先进行几个假定:
1、数据单方向传送,而另一个方向只传送确认报文段(并不是传输有效数据进行一个捎带确认)。
2、接收方总是有足够大的缓存空间,因而发送窗口大小取决于拥塞程度。
发送窗口 = Min(接受窗口rwnd,拥塞窗口cwnd)
纵坐标指的是拥塞窗口cwnd
,初始值为1,代表的是一个报文段,一个最大的报文段长度MSS(此时图中的4指的是4个MSS,8指的是8个MSS),随着传输轮次的增加,拥塞窗口会发生变化。
横坐标指的是传输轮次
,一个传输轮次就是一个单位,指的是发送一批报文段并收到他们的确认时间。
传输轮次的理解:
如下:主机A给主机B发送了一个报文段,此时主机B向主机A响应了一个报文段,此时就算作一个轮次
由于网络情况很好,此时会多发送几个报文段m2、m3,此时主机B收到两个报文段之后依次返回两个确认,对于这一种情况,到M3确认为止,这样的一段就是第二个传输轮次。
此时发送窗口再次进行调大,此时窗口为4,那么此时可以连续发送4个报文段,接着依次收到第4个报文段的时候此时就算作第三个传输轮次:
慢开始指的是一个指数规律增长,一个爆炸式增长的过程。
过程:首先对这个网络进行一个探查,看一下这个网络的拥塞情况,若是比较好,那么此时就增加我的拥塞窗口发送方,增加拥塞窗口,这个倍数是2倍,分为四个阶段。
①一开始是进行**【慢开始】,在第一个传输轮次是1个MSS,第二个传输轮次是2个MSS,第三个传输轮次是4个MSS,第四个传输轮次是16个MSS,此时可以看到已经到达了ssthresh的初始值16,其指的是一个慢开始门限**。
②此时就会由慢开始进入到**【拥塞避免】**,因为目前现在注入的报文段比较多,此时会担心之后很快会发生拥塞情况,此时就把速度稍微降一降。此时会在之前的拥塞窗口基础上,每次增加一个拥塞窗口,可以看到在5个轮次到12个轮次每次都是+1,此时一直到了24个MSS。
③由于到达了24MSS时,此时网络出现了拥塞,发生了丢包情况,此时会重新进入到**【慢开始状态】**,拥塞窗口重新回到了1,瞬间从24个报文段缩减为1个报文段,之后的过程就是继续开始执行慢开始,1、2、4、8,接着在第17个轮次时,注意此时的门限值变为了12。
④当进入到**【拥塞避免】**状态时,还是会进行线性增长,每次+1,之后的过程都是一样一旦出现网络拥塞,那么会设置新的门限值,并重新回到慢开始进行。
快重传出现的原因主要是解决对于等待超时时间过长而实现的一种机制,机制过程如下:
**快恢复是如何体现的呢?**可以看到下图中在12抡次时拥塞窗口为24时,由于收到了3个重复的确认后执行了【快重传】,紧接着就会进入到【快恢复状态】,此时并不用降低拥塞窗口为1MSS情况,此时就会降到新的一个门限值,此时在这个12的门限值阶段我们进行【拥塞避免】进行线性加法增大。
**什么是快恢复?**不用降到1,直接降到新的门限值(出现快重传的拥塞窗口/2),接着使用拥塞避免的算法。
对于图中的TCP-Tahoe版本已经废弃,该版本应该就是在出现快重传的时候,此时拥塞窗口直接变为了慢开始的初始阶段1,之后就执行相应的策略。
整理者:长路 时间:2023.8.7-8
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。