【计算机网络】第八章:传输层(Part2.UDP/TCP协议)

UDP协议

在这里插入图片描述
UDP协议相对于TCP协议是无需在发送数据之前建立连接的。节省了建立与释放连接的开销,发送之前耽误的时间也比较少。UDP协议下数据发送不管链路是否拥堵,接收端是否开机等一系列可能出现问题的情况,只是写上目标地址就发出去。丢包了也不会重新传输,会尝试几次之后报错。
UDP协议能够保留报文边界(应用层的完整信息)。
在这里插入图片描述
UDP在实时应用中很重要,比如说语音聊天,不管网络是否堵塞,都会按照规定速率发送,而不会降低速率来维持信息完整性。这样语音通话中网络状况即便不好,接收方听得卡顿,但是有效的部分仍然可以辨识清除,否则收到的声音将会极大变质无法分辨。

拒绝服务攻击DOS:使用网络中多台计算机向目标发UDP数据包,即便有防火墙阻挡丢掉这些无用数据吧,其目的根本在于占用带宽让正常服务请求无法到达。UDP数据包的特性就很好地表现了出来(多对一)。
在这里插入图片描述
UDP首部:只有8个字节。4个字段,每个字段2字节。
在这里插入图片描述
UDP首部加数据部分就是UDP报文。

校验和计算方法:伪首部+首部+数据部分
伪首部:0是填充组成12字节的,没有实际意义。17是UDP的协议号,表示是UDP协议,然后是UDP长度。IP地址是继承网络层首部的部分。
在这里插入图片描述
每两个字节写成一组,每四个字节写成一行。然后将所有字节依次排序并计算。计算出的结果用来替代原有竖式中全0的那一行,然后再次计算,如果结果是全1,则认为UDP数据包在传输过程中没有错误。
在这里插入图片描述

TCP协议

在这里插入图片描述
三次握手:第一次客户端向服务器发起TCP连接请求,这个请求里带有一些参数,包括缓存最大字节数、支持不支持选择性确认、客户端最大支持字节数等。第二次是服务器向客户端进行的确认,第三次是客户端对服务器的确认消息进行的确认。
这一个连接就可以进行双向通讯,不需要两条连接来提供两方向通信。

可靠传输:为数据包/数据段分段排序标号,然后将数据通过网络层传输。网络不可靠,可能会丢包、数据包不按顺序到达等,如果丢包会重传,不按顺序到达在接收端也会重组顺序来保证数据完整性。

丢包重传:有差错检验机制,接收端检验出差错后,会丢掉该数据包并要求发送端重传;发送端发出数据包后,会等待接收端的确认信息,如果等待时间内没有等到接收端的确认信息,则会重传该数据包。

面向字节流
在这里插入图片描述
上层应用程序发送/接收都是以字节流的形式,不参与传输层的工作。
发送端会按顺序把文件以字节流形态发送到TCP缓存中,然后发送端与接收端建立连接。通过连接确认客户端的接收能力,动态调整将要发送的数据包容量(大小),在网络不佳时,单位时间内传输的数据量少。
接收端上层应用程序会读取缓存中已经按顺序排好且无缺失部分的字节流,且不管一个数据包装了多少字节、如何封装、顺序如何等,只管读取字节流。应用层不关心传输层的任务,就好比我们网购不关心包裹怎么来的,只在意有没有到,有没有质量问题。
传输过程中,增加TCP首部并依靠网络传输,丢包会重传。接收端也有差错校验功能,保证上层应用程序读取的数据是正确的。

TCP报文格式

在这里插入图片描述
在这里插入图片描述
和之前的网络层首部一样,掌握这个图,就是掌握了TCP协议的功能部分。
端口号:不管源端口还是目标端口,都是2个字节(16位二进制),可以表达最多65536个数,取值范围是0~65535
在这里插入图片描述
序号:数据传输过程中,分段处理时,用于标记这一段数据的第一个字节是源字节流中的第多少个的序号。功能就是用于表示字节流顺序,保证接收端能按顺序将字节流组装起来。序号占4个字节,取值范围是0~232-1,传输过程中当序号增加到极限值后(数据包数量已经发送了极限值的n倍),会从开始重新排序。
确认号:当接收端收到某一确认数据包,其TCP首部的确认号表明该确认号之前的数据段都已经接收完毕,请求发送接下来以确认号为序号的数据段。一个TCP首部里也有序号也有确认号。A对B的确认号是确认A已经传输成功了多少字节,B对A是成功接收了多少字节。
在这里插入图片描述
TCP首部因为有选项部分,长度不固定,因此需要数据偏移来明确告知TCP报文从那一部分开始是数据部分。
在这里插入图片描述
数据偏移:因为只有4位二进制的内容,也就说只有最多15个值。数据偏移的单位是4字节,因此至多60字节,也就说TCP首部最多60字节,选项部分至多40字节。
在这里插入图片描述
数据包中,Header Length是20字节,也就意味着首部只有20字节,换言之填充字节数为0,也就说从21字节开始就是数据部分了。
在这里插入图片描述
上图选项占12字节的,Header长度为32字节(20+12),其中20是固定,12是选项部分。由此可以确定TCP首部的数据偏移的作用。
在这里插入图片描述
保留字段:目前没用。一般把这6位二进制设置成0。
标记位:总共6种,占6位。
在这里插入图片描述
抓包工具来分析
在这里插入图片描述
Urgent:紧急指针。该位为1,表明该数据紧急需求,要优先传输,不再按照原来的排队顺序传输。
Acknowledgment:确认标记位。值为1时确认位才有效,如果为0,则确认位的数据不起作用。
Push:推送标记位。值为1时,表明该数据传输到接收端后,希望上层应用程序立刻执行该数据段,而不是再等待顺序读取缓存数据。一般来说这样的数据段里包含的命令,可以立刻执行造成一定的响应。
Reset:复位标记位。值为1时表明该TCP连接出现了严重的差错,必须释放连接重新建立连接。
Syn:同步标记位。三次握手的前两次握手该标记位为1,第三次握手和之后传输数据的数据包,标记位为0。
Fin:结束标记位。为1表示计算机通讯即将结束,要释放传输连接。

窗口:2个字节。当接收端确认收到几个数据包之后,发送确认数据包时,标记了确认号的同时,也有一项窗口值,该值表明接收端缓存还能容纳多少字节的数据。有了这一项,发送端就可以根据缓存可容纳数据的量来控制发送速度。假如缓存剩余空间大,则可以单位时间内发送多个数据包;假如缓存空间只能至多容纳1个数据包,则单位时间内只能发一个数据包然后就等待接收端的确认数据包。

校验和:负责差错校验,计算方法前面已经说明了。

紧急指针:只有urgen位值为1时,该字段有效。紧急指针用来指明有效数据部分前x位的数据是紧急数据,剩下的数据是普通数据。值为20则说明数据部分前20字节是紧急数据。
在这里插入图片描述
带有ack的是确认数据包。可以看到窗口值一直在减小,说明缓存数据越来越少。Ack值越来越大。

可靠传输

停止等待协议

在这里插入图片描述
停止等待协议:发送端发送数据包后,会一直等待接收端回复确认数据包,如果丢包则重传,只有发送端确认后才会发送下一个数据包,以此来达到可靠传输的目的。
超时重传:发送端等待超过往返时间的时间段后,会主动再发一次数据包。

在这里插入图片描述
确认丢失:如果接收端接收到数据包且返回了确认数据包,单确认数据包在返回过程中丢包,此时发送端超时重传,接收端收到两次同样的数据包,此时接收端会用第二次收到的数据包覆盖第一次的数据包(第一次的数据包直接丢掉)。

确认迟到:因为网络的不可靠性,可能会因为网络拥堵而导致数据包迟到,如果第一次返回的确认数据包因网络原因迟于超时重传的确认数据包时,发送端可以识别这个确认已迟到,不会进行任何操作。

总而言之,停止等待协议的核心就是发一个数据包等待一个确认。发送端发送效率低。停止等待协议又称为ARO(自动重传请求)。

连续ARQ和滑动窗口协议

在这里插入图片描述
改进的停止等待协议。相当于给连续字节流分组成多个数据段,一次发一次组,然后等待一个确认再发下一组,提高整体效率。只不过组不上随机划分是,是由滑动窗口限定的。我们现在的计算机就是使用这种协议来上网,窗口是传输层首部的窗口。
下面我们看数据包来直观感受
在这里插入图片描述
可以看到,确认数据包之间有一系列连续的数据包,而确认数据包的窗口值在不断缩小。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果在传输过程中丢包,则丢弃的数据包会在等待一个往返时间之后进行超时重传。如图,如果7丢包,则接收端会返回一个包含6的确认数据包,请求发送端发7之后的数据包,由于7是丢包的数据包,因此他会在超时后自动重传,而在重传之前的这段时间,发送端仍然会根据窗口发送接下来一组数据段,并不会因为7丢包而立刻发7,而是发981011四个包,重传期间可能会有7超时重传而插入传输队列。

存在的问题:当一个窗口内包含四个数据段5678而7丢包时,实际上接收端收到了568,然而返回的确认信息是确认56收到,并没有告诉发送端8收到了,也就会导致发送端重新发送7和8,然而8已经收到,重发一遍是消耗资源的无意义行为。

选择性确认SACK

为了解决连续ARQ的问题,而使用的方法。在建立TCP联机时,两端就协商好是否支持选择性协商。使TCP只重发丢失的数据包,而不用发送后续所有的分组,并提供相应机制使接收方能告诉发送方哪些数据丢失,哪些数据已经提前收到。
在这里插入图片描述
SACK用来指明是选择性确认,长度表明该选项的长度。左边界和右边界分别表明已经收到的字节快的起始字节和结束字节。右边界是最后一个字节+1.
在这里插入图片描述
选择性确认的边界,最多可以框选4个数据段。每个边界占4字节,两个边界确定一个数据段8个字节,填充部分最大可用40字节,1字节用来标识选择性确认,1字节用来标识选择性确认的长度,因此可用最大为38字节,8的最小公倍数是4。

超时重传时间调整

在这里插入图片描述
超时重传的具体时间是不确定的,比如局域网的往返时间可能是1ms,而跨国通讯可能往返时间200ms,他们对应的超时重传时间也不同。超时重传时间是一个往返时间再多一点,那么我们要先明确往返时间怎么计算。
在这里插入图片描述
时间戳:发送端发送数据包时附加上当前精确到毫秒的系统时间,接收端返回的确认数据包也会包含这一时间戳。比较时间戳与收到确认数据包的时刻,就能计算时间差值,然后将这个差值作为往返时间RTT。
重传队列TCP控制块:TCP窗口中保存着发送但未确认的数据,第一次发送时记录时间点,当第一次收到该数据的确认时,比较两个时刻的时间差值,就是RTT。

在实际传输过程中,RTT不是一成不变的,因此需要动态调整超时重传的时间。
在这里插入图片描述

计算公式如图。
在这里插入图片描述
往返时间如图。
iRTT是建立连接时计算得出的初始的往返时间。
在这里插入图片描述
这里再确认一下,Ack表示的是已经收到了多少字节-1的字节数数据(下一个要发送的字节),这里3335也就说收到了3334个数据,要求再发以3335为开头的数据。果不其然下一个数据包就发送了3335开头的数据段。

流量控制

发送端的发送速率会根据一系列情况进行调整,比如接收端缓存已满、网络拥堵等,都会自动减缓发送速率。而流量控制的手段就是通过改变窗口大小。

当接收端缓存空间不多,在返回确认数据包时,这个确认数据包有两个功能。
1.确认收到前面Ack-1个字节,请求发以第Ack字节为开头的数据段
2.由于缓存内容不足,接收数据能力下降,减小窗口。
发送端收到后,发送接下来的数据包时,由于窗口变小,所以发送的数据内容就少了,发送后需要等待下一次确认。从而减少了发送速率。(发送数据变少,等待时间变长)。当接收端读取数据后,缓存空间充足,则下一次发送确认数据包时,仍会做出上述两个功能的确认。窗口变大,则发送端发送的数据量变大。

极端情况下,接收端缓存已满,确认窗口调整为0,此时发送端停止发送数据。然后再缓存释放的差不多后再次发送一个确认数据包,这两个确认数据包连续,差距只有窗口值不同,ACK值是相同的。如果第二个确认数据包丢失,也不会出现发送端无限等待的情况,发送端会周期性发送一个试探性数据包来观察接收端缓存状况,如果空闲则会开始发送,防止出现关键性确认数据包丢包导致白等。
在这里插入图片描述
rwnd表示的是windows接收窗口。

拥塞控制

网络中所有的计算机来共同实现的拥塞控制。方便理解,我们可以类比成堵车。堵车的根本原因是道路上的车太多,堵车的原因并不是一辆车的问题,而是所有在这条道路上的车辆的问题。只要你不上道路,你就一定不会堵车,也就说,堵车和你的上线虽然关系不大,但是确实有关系。
在这里插入图片描述
如图,左边称为A网络,右边称为B网络。每个网络有两个网段。R1和R2的流量会汇总到R3,通过R3-R4的唯一链路来传输流量。干道链路的承载负荷有上限,当总流量超过额定带宽时,理想情况下路由器会扔掉多余的流量,但是线路仍然畅通不堵。
真实的情况,看这个曲线图。随着流量的增加,链路吞吐量也会增加,但是增加幅度越来越小,有一个极限值,当达到极值后反而吞吐率会下降。吞吐率下降时就进入了拥塞装态,而极值之前是轻度拥塞状态,但是吞吐量仍会增加。所有网络中的计算机协调控制,尽量避免让链路负载达到极值,应该控制在轻度拥塞范围内。

慢开始算法&拥塞避免算法

慢开始是指一开始发送数据包比较慢,但是速率增加是2n指数增长。一开始会发1个数据包,收到确认后,下一次发2个,确认后,下一次发4个……发8/16个。直到没有收到确认,认为当前数据包发送量已经是网络状况的极限情况,说明有拥塞情况。此时,会使用一种新的算法——拥塞避免算法。

慢开始:
在这里插入图片描述
MSS:单位数据包的字节数 cwnd:拥塞控制窗口,用于进行慢开始
在这里插入图片描述
rwnd=3000,发送窗口是3000,但是基于慢开始,一开始不会发3000字节的数据,而是发送以MMS单位(此处为100)也就说100字节为单位的一个数据包过去。然后指数增加发送量,随着发送量的增加,等待确认时间也会相应增加。

真实情况,一般MSS是1460字节,加上网络层和传输层首部,最小分别是20字节,合计1500字节,是数据链路层的MTU。
在这里插入图片描述
纵坐标单位是字节。第一次开始发送数据包时,有一个慢开始门限值,当慢开始单位时间传输数据量达到门限值后,改为线性增加数据包(每次多发一个数据包)。直到发现数据包丢包时,认为此时网络可能已经拥堵,将门限值变更为当前传输字节数的一半,然后重新开始新一轮的慢开始+拥塞避免算法。
当网络状况不良时,门限值会下降的很快,门限值又决定了单位时间内注入网络中的数据分组量,从而减少注入网络的分组数。同时,执行拥塞避免算法后,拥塞窗口会缓慢增大,以防止过早出现网络拥塞。

快重传和快恢复

在这里插入图片描述
当接收端收到序号为124的数据包后,就可以确认数据包3丢包了。因为数据包按顺序发送的。此时接收方对发送方进行三次连续的确认数据包2,就告诉了发送端是数据包3丢包了,此时发送端不等待超时重传立刻重发。这样就可以加快接收端窗口的后移,让数据包更快的连续化,以方便接收端应用程序读取缓存。

而丢包往往意味着网络状况不好,此时配合快重传。
在这里插入图片描述
目前正在使用的方法。在慢开始-拥塞控制后,执行快重传。

发送端窗口的变化:一般来说,接收端会在建立TCP连接时给发送端限定最大传输报文字节数和最大窗口。而这个值一般是1460和64230,这是流量控制。而对于拥塞控制,发送端不会一开始就发送64230的字节,而是发送1460的字节,此时的窗口也是1460字节。基于慢开始,1460*2n-1(n是发送次数)就是此时窗口的大小。如果网络状况极佳,最大则限定在64230字节。

TCP连接

TCP连接是客户端向服务器发起的,服务器是被动的。客户端发给服务器的第一个数据包叫做TCP连接请求,这个数据包里附带一些参数,包含是否支持选择性确认、MSS、接收窗口等。服务器收到后返回一个TCP连接确认,包含了服务器的接收窗口、MSS、是否支持选择性确认等信息的数据包。此后,客户端会再发一个确认的确认,才能建立TCP连接,此连接允许双向通信。

三次握手的必要性:如果一次请求和确认就建立连接,则会出现以下情况。当客户端发送了一个请求,请求的线路拥堵,导致迟到,在第一个数据包到达服务器之前,客户端便重发了请求且选择了一条通畅的线路到达了服务器,服务器给出确认建立了连接。然后迟到的数据包到达,服务器再次返回数据包建立连接,此时对于客户端而言,因为是同一个请求发了两遍,在重发时已经默认第一条请求失效,则不会承认第二次确认,但是客户端却认为建立了连接。从而浪费资源并且出现传输错误。
在这里插入图片描述
连接请求的数据包信息如上。试着自己分析一下图中的标记位。注意ACK和ack不一样。ACK代表标记,ack代表确认号。当SYN=1,ACK=0时,说明这个数据包是TCP连接请求数据包;如果当SYN=1,ACK=1,则是确认数据包。
A给B发数据包时,请求数据包没有数据部分,只有TCP首部,ack是代表着收到了前面的字节,收到了前面第0个字节,所以ack=0。而对于确认数据包,这里之所以ACK是1,是因为第一个请求数据包是第0个数据包,则下一个数据包就是第1个数据包,此时需要确认位有效,所以ACK=1,ack=1。 而确认的确认数据包,A收到了B的第0个数据,所以ack=1,ACK=1,SYN=0。
在这里插入图片描述
至于seq是随机值,第一次握手的随机值与第二次不同,第三次是第一次握手随机值+1.

SYN攻击和Land攻击

SYN攻击:发送端发送数据时截获该数据包,然后篡改发送端的源IP地址并发给服务器,服务器会返回给错误的IP地址确认数据包,而收到确认数据包计算机会忽略该请求,然而该确认数据包仍然会存在一段时间才会知道确认无效并释放。如果这种篡改请求数据包数量庞大,则服务器会返回大量无效确认数据包,则会消耗大量系统资源且无意义。

Land攻击:攻击者伪造一个与接收端完全相同的IP地址作为源地址发送TCP连接请求,接收端收到后,会给出确认数据包,然而确认数据包的源和目标IP地址都是自己的,端口也是来源与目标一致。这种情况下,对接收端的影响非常巨大,接收端可能会系统崩溃,因为自己给自己建立连接请求的数据包去向是不合法的。

TCP连接释放

释放连接需要四次握手。
在这里插入图片描述
这些状态,可以通过cmd的netstat -n来查看。其中TIME-WAIT之所以不立刻进入CLOSED状态是为了防止最后一个数据包丢包后,服务器再次发送确认数据包时,客户端不接受的情况,MSL是最大报文时间(2min*2=4min)。
在这里插入图片描述
比较一下这些连接状态,然后试着分析一下。

猜你喜欢

转载自blog.csdn.net/Chahot/article/details/107245582