【事先声明】
这是对于中科大的计算机网络的网课的学习笔记,感谢郑烇老师的无偿分享 书籍是《计算机网络(自顶向下方法 第6版)》
需要的可以私信我,无偿分享,课程简介下也有
课程链接
为运行在不同主机上的应用进程提供逻辑通信
逻辑上,应用层的进程可以直接与另一主机上的进程进行通信,通过套接字即可
传输层协议有TCP或者UDP协议两种选择
网络层提供的是端到端(主机到主机)之间的服务,传输层在网络层的基础上,提供更加细分的服务,从进程到进程之间的服务。
网络层:主机之间的逻辑通信
传输层:进程之间的逻辑通信
以TCP为例,应用层建立TCP套接字
应用层调用传输层的服务需要提供的信息有,数据报文与socket套接字—两个参数
分组到达目标端后,依次进行报头解包,向上提供有效载荷部分,网络层还需要提供源IP与目标IP,在传输层中,根据这些数据,再解包出来的源RORT与目标PORT,根据这四个数据可以确定对应的套接字,然后根据套接字可以确定目标进程。
套接字结构
逻辑概念图
在目标端中
在网络传输的过程中,只要四元组 ( 源 I P ,源 P O R T ,目标 I P ,目标 P O R T ) (源IP,源PORT,目标IP,目标PORT) (源IP,源PORT,目标IP,目标PORT)中的任何一个不一样,访问的主机的进程都会是不一样的
UDP在IP上并没有增加一些服务的性能,报文可能丢失、乱序
常用于 流媒体、DNS、SNMP,一次传输搞定或者对速率要求高、丢失不敏感的类型。
校验和:一种校验手段,用于判断在传输的过程中,数据是否出错
传输校验码,在接收端会重新根据内容计算一遍,来与校验和对比,判断是否出错,但是校验不一定是绝对正确的,存在某些错误但是通过了校验。
报文段的头部很小,有效载荷占比大,所以传输速率高。
在TCP协议中,器可以建立一条可靠数据传输信道,然后,在进行有序的分组的传输。
不过,传输层实现的有效数据传输协议的下层协议是不可靠的,要在一个底层不可靠的协议上实现可靠的传输协议。
由于底层信道的不可靠性,导致rdt协议会比较复杂。
底层信道完全可靠,不需要上层采取什么措施来保证数据可靠
假定底层信道的分组发送是按照顺序被接收的,不过在发送的过程中,会存在一些比特错位的情况(物理部件中)
发送端发送分组后,接收端接收需要对分组进行校验,校验成功,发送给接收端一个(ack)的信号,表示确认收到。
如果校验失败,接受方发送一个(nak)的信号,要求发送方再重传一次。
发送方发送一个分组后,再缓冲区中还需要留这个分组一个备份,等接受方发送一个ack的信号后,再跟新缓冲区,发送下一个分组。如果收到一个nak的信号,则从缓冲区中将备份重传一遍,等待信号。
需要三种协议来处理比特差错的情况
不过有一个问题,没有考虑到接收方反馈信号受损的情况(发送方没有收到ack或者nak)。
在分组之间引入一个字段代表序号
如果两个信息的序号一样,说明是处于重传的情况。序号改变了,说明这传递的是一个新的分组。
如果发送方发送了分组,序号0,接收方发送一个ack,但是ack受损,本来发送方是希望接收到ack或者nak,但是出现了其它的情况,发送方就会重新把序号0的分组发送给接收方,接收方收到,判断处前后两个分组的序号一样,就会再次发送ACK,同时一直等待,直到接收到前后两个序号不一样的分组,接收方就直到上一个状态结束了,继续去等待收到下一个序号不一样的分组。
接收方,在收到分组时(序号为0),如果校验通过,发回一个ack,然后等待发送方发一个序号1的分组,如果任然接受到的序号为0,说明发送方接收到的数据有误,则 会继续等待,同时发送一个ack给发送方,希望发送方可以同步上来
如果对于接收方的确认信息,ack或nak,如果不发送nak,通过序号与ack的结合也可以达到nak的效果。
对ack进行编号。
接收端收到的分组校验失败时,需要发送端重新发送一份,接收端会发送nak;发送端需要重新发送分组的情况有,nak出问题了或者分组发送校验失败,两个情况都需要重新发送一份分组
所以,当分组为0时,发送端接收到ack0时,说明双方正常,可以进行下一次分组发送,同时序号变为1;发送端接收到ack1时,说明需要重新发送一份序号0的分组。
接收方,当校验失败时,发送一个ack1,需要发送方重发,等待正常的序号0分组;当接收到一个序号0分组时,发送一个ack0,表示可以进行下一步(等待序号1的分组)。当收到一个序号0分组时,说明发送方正在重传,发回一个ack0,等待发送方发送序号1的的分组(进入下一步)。
此时状态0,等1,可以进入下一步
此时状态1,等0,可以进入下一步
当发送方发送一个分组,然后等待ack,但是分组丢失了,而接收方又没有收到分组,在等待分组,双方都在等待对方的信号,这样会造成死锁,无法向下进行。
引入了超时重传机制,等待超过一定时间就会重传一次分组。
对于发送方等待超时的情况下,发送方不知道是分组丢失,还是ack丢失,直接发送方重传一份。
如果是ack丢失,发送方重新发送一份,对于接收方而言,不过是重新接受一份,继续等待。
当定时设置的合适时,效率是正常的,如果定时设置的不合理,则会导致其性能严重下降。
当rdt3.0在信道较大(带宽大)的情况下,会出现吞吐量很低的情况,传输延时(距离长)较大,会造成利用率非常低,因为RTT时间长。大部分时间都花在传输上。因为,rdt3.0模式下,信道中只能有一个分组进行传输,严重浪费了带宽资源,引入流水线技术。
一个信道种传输多个分组,当一个分组发送刚出去后,立马发送下一个分组…
所以,发送端要准备一个缓冲区,将发送出去的分组暂存在缓冲区,如果发送失败了,还能重发
一次可以发送分组的数量
由于要求链路的利用率不能超过100%,且链路的容量是指带宽大小,带宽是有限的,所以对于缓冲区能存放的分组的大小是有限的。
一次最多可以接收存储多少分组
接收窗口才是决定到底一次性接收多少分组
当接收窗口为1时,按照顺序向后滑动,接受完0号分组,再去接收1好分组
当窗口在2号位置上等待接收,如果三号分组来了,是不会接收的,抛弃掉,只有接受完2号分组才回去接收下一个。
同时,接收端发送一个ack1,表明1号分组已经接收,同时根据rdt的理论,这是在向发送端说,在等待2号分组的接收。
如果接收窗口在2号分组的位置上,且来了3、4、5…其它分组的,接收窗口都不会接收,会将他们抛弃掉,同时向发送端发送一个已接收的最高分组的ack,根据rdt的理论,这个表明接收端正在等待下一个序号的分组,还没接收到。
依次流水线发送发送窗口中的分组,只有最低序号的分组得到确认窗口才能向前移动
如果发送方一直收到的是已经发送的最高序号的ack,那么说明接收方一直没接收到,需要重传,则会将窗口中的所有分组都进程重传
定时器只有一个,在发送方,发送了分组后,就会开启定时器,定时器结束前没有接收到ack,就会将窗口内的分组全部重新发送一遍。
其接收窗口的大小为1,这样要去顺序接收,如果当前序号的分组没有被接收,后面序号的分组如果到来是会被抛弃,因为要保证分组的有序性
只要在接受窗口的范围内,是可以乱序接收的,接收到分组后,然后向发送端发送一个ack+对应接收的分组序号
。
如果窗口的第一个位置的分组丢失了,而后面的分组都被接收了,会有超时重传,重新发送发送窗口中的分组。
当最低序的分组被接受后,就可以让窗口向后滑动了,滑动到没被接收的位置。
都是要在
rdt3.0
协议下进行的流水线改造
发送窗口中的分组要依次进行发送,为避免分组丢失,会为窗口中的每一个分组都准备一个定时器,发送后开始计时。当接收到对应的ack后,窗口就会向后滑动。
如果定时器到了,就会将发送窗口中的未确认的分组重发一次。
在接收窗口的内部,是可以乱序接收的,然后将其存在缓存区的对应位置上,当最低序号的分组都被接收了,接收窗口才能向后移动。
接收窗口中的每一个分组被接收后,都会发送一个独有的信号,告诉发送方,该分组已经接收,可以停止计时。
低序号的分组接收,接收窗口向后滑动
高序号的分组到来,窗口内的乱序接收,因为要保证rdt,所以必须保证分组有序,不滑动
收到那个分组,就发送那个分组的确认信号。
SR会为每一个分组都准备一个定时器,而GBN则是顺序接收,只会为发送窗口中的第一个准备定时器,如果超时,会将发送窗口中的分组都发送出去。
提供点到点之间的通信,一台主机对一台主机,无法做到一对多的广播模式
TCP连接只在端系统中运行,在网络核心中的网络元素(路由器与交换机)并不会维持其连接状态,对于网络元素,其看到的只是数据报,并不会专门提供一条线路维持其连接。
TCP连接提供的是全双工服务,当两台主机上的进程建立了TCP连接后,两个进程之间可以互相传递数据,而不是单向的数据传递。
指应用层数据最大字节数
MSS是由从源主机到目标主机的路径上,所有链路上所能够发送的最大链路层帧(最大传输单元),以太网与PPP链路层协议都是1500个字节的MTU
TCP报文段,包括40分字节的报头,加上1460个字节的应用层数据段。
最大对于应用层的数据只能封装成这么大,如果太大,就要对数据进行切分,然后再封装。
TCP为每块客户数据块配上一个TCP首部,形成多个TCP报文段,这些报文段被传递给网络层,通过一连串的路由器与交换机的链路层与物理层,最后到达服务端的TCP连接接收,然后放入TCP接收缓存中(这个缓存应该是在OS提供的一块缓存区)。
TCP连接的每一端都有各自的发送缓存与接收缓存。
这个是对于应用层的数据段,被分割成一块块的MSS,然后封装,这个是对于各块MSS在原数据段中的对于第一个字节的偏移量
任何一个TCP的实体,既是接收方也发送方。
在主机A与主机B建立了TCP连接,当主机A发送一串数据给主机B,主机B也会给主机A一个反馈报文段,当主机B收到主机A发送的0-533序号的所有字节,主机B会等待主机A发送534及其之后的报文段字节,主机B就会发送一个确认号为533的报文段,向主机A表明,533及其之前的报文段都已经被接受了,等待后面的报文段。
对于乱序到达的报文段,可以选择缓存(SR),也可以选择抛弃(BGN)。
用于流量控制,愿意接收的字节数量
超时设置要大于RTT时间
如果超时设置较小,则会造成主机B还没反馈,就又发送报文段,会发送很多的重复报文段
如果超时设置较大,会造成需要重传时,造成很大的延时。
长时间的主机访问的RTT虽然是符合正态分布的,但是无论怎样设置都会造成较大的问题。
但是短时间的主机访问RTT的时间是非常集中的,所以超时设置应该是一个动态的自适应参数
在一个局域网中,RTT非常小,但是对于两个进程之间的TCP通信,这个RTT会不太确定,影响很多。
所以需要时不时的去测量RTT,来动态的调整超时。
当前采样值对于整体值的影响会随着时间(采样次数)的增加而呈指数规律越来越小。
TCP是一种流水线的数据传输协议,而流水线的协议由两种:GBN与SR
TCP的数据传递是两种的混合体
当过早超时时,发送方会发送最老的那个报文段,然后接收方就会发送最新的预期确认号,这样就可以让发送方关掉定时器,发送预期的报文段。
接收方发送的确认是累计确认,是最新的期望接收的报文段
如果发送方收到了3个冗余的ACK(收到了3个确认号一样的ACK),说明发送方发送的那个报文段丢失了,因为是流水线持续发送报文段。
这样不用等到定时器触发,直接重发一份。
接收方发送的报文段的序号是要大于接收到的ack,这样可以检测出接收方的报文段缓冲区存在间隔
接收方控制发送方的发送速率,不让发送方发的太快、太多,而导致接收方的缓冲区溢出。
通过TCP报文中的接收窗口这个字段,接受方发送给发送方,可以让发送方知道接收方的接收缓冲区中还有多少空间
TCP连接是可以双向通信的,进程A发数据给进程B,进程B也要发数据给进程A。进程B收到进程A的数据,需要将ACK发送给进程A,但是这个ACK可以和进程B发给进程A的数据在一个报文段中一起发回去,TCP报文段也提供了这个格式。
在正式交换数据之前,接收方与发送方需要三次握手,建立连接关系
第二次握手后,双方就可以开始随机初始化自己的初始序号
在第三次握手后,再开始分配资源,如果再前两次握手,会存在大量的办理按揭同时会消耗大量的系统资源,一种攻击手段。
两个半连接的互相拆除。
客户端确认关闭连接后,双方为了TCP连接准备的资源就会被释放。
通过携带技术,服务端的FIN报文段可以携带对客户端回应的ACK
与流量控制不同,拥塞控制是出现在网络中,针对分组的丢失率与延迟的处理
对于网络核心中的元素,路由器与交换机
对于路由器的带宽,给两个发送方提供服务,作为一个共享带宽,一个发送方最大享用R/2的带宽
随着发送方的发送速率越来越大了,则在缓冲区的排队的分组也越来越多。当一个发送方占用的带宽达到R/2时,说明共享链路的流量强度以及达到上限。
分组发送中的延时也会越来越大,并且指数级增长。
都知道路由器的缓冲区一旦溢出对于新到来的分组就会被丢失
这样会触发发送方超时重传的机制,会重新发送分组。
一种理想情况,当缓冲区每空出来一个位置,就会有一个重传的分组到达去占据这个位置
另一种情况,当分组在缓冲区中排队延时超过一定时间,会引发重传机制,会再次发送一份分组,或许时间一长(多次路由器中的排队延时),会多次重传,就会造成很多不必要的分组重传,会加剧网络的拥塞程度,同时会造成吞吐率下降,即有效的传输会严重下降。
多个发送方说明网络的拥塞会急剧上升,多台路由器会出现多个拥塞的节点
当一个发送方需要经过多台路由器才能到达接收方,如果前几个录用其出现拥塞,然后发送方会发送大量的重传分组,然后某个分组到达一个新的路由器时,那个路由器因为缓冲区溢出,而抛弃那个分组,这样会造成大量的传输能力的浪费,会造成链路的带宽的浪费,会加剧网络的拥塞程度。
网络层不会为传输层提供信息,端系统必须通过对网络层数据状态的观察来推断,网络中是否出现拥塞
TCP连接通过对报文段的丢失或者收到3次冗余的报文段来判断网络是否出现拥塞,一种推理方法。
当推断网络出现拥塞时,会响应的减少发送速率,当网络情况良好的时候,会提高发送速率。
网络中的组件(路由器)会向发送方的传输层提供网络的拥塞状况,可以很简单的使用一个比特位来表明链路中的拥塞状态,让发送方调整自己的发送速率,以抑制网络拥塞的恶化
拥塞信息的传递有两种
该网络的交换数据单元叫信元
信元只有53个字节,远小于分组的大小,所以其在链路上的传输速率要比分组快,虽然比线路交换慢。
在ATM网络中,网络不发送拥塞的情况,会提高传输速率尽可能利用可用带宽,在网络拥塞的情况,会限制传输速率。
信元分为数据信元与资源管理信元,大部分是数据信元,中间残差了少量的资源管理信元
在资源管理信元,中由两个比特位,一个表示轻微拥塞,一个表示重度拥塞,在经过交换机时,交换机会根据情况来设置资源管理信元的标志位。
发送方将一组信元发送给接收方,经过一连串的交换机,到达接收方后,接收方不做处理,资源管理信元被接收方原路返回给发送方,告诉发送方网络的拥塞情况。
资源管理信元中,还存在一个字段ER,在资源管理信元经过一个个交换机后,可以知道所有交换机可以位会话提供最小的带宽是多少,可以让发送方调整发送速率,改善网络拥塞情况
如果是网络辅助的拥塞控制,虽然可以提高网络的拥塞控制能力,但是会增加网络的负载,增加路由器的负担,代价比较大。
网络路由器不提供信息,而是靠端自己获得的信息来判断网络是否发送拥塞
超时定时器的时间到了,但是那个段的确认却没收到
虽然,一旦超时就认为拥塞是存在问题的,但是总体的大方向控制是没有错误的
网络还能进行一定程度的传输,说明网络存在一定轻微的拥塞
为此一个变量,CongWin:在对方未确认的情况下,可以往网络中发送多少字节
发送速率 r a t e = C o n g W i n R T T rate=\dfrac{CongWin}{RTT} rate=RTTCongWin,表明单位时间内可以往网络中注入多少字节
会将CongWin的发送速率调整为1个MSS,进入到一个慢启动(SS)的阶段,然后倍增到CongWin/2(每个RTT),进入到拥塞避免(CA)阶段
CongWin降为CongWin/2,进入CA阶段
发送方收到正常的ACK,CongWin会逐步增加
发送方控制发送但为确认的量,同时也不能超过接收窗口,需要满足流量控制
SendWin=min{CongWin,RcvWin}
刚开始,CongWin等于一个MSS,然后从下一次开始,每次发送是之前一次的两倍,相当于指数级增加。
当出现超时的情况时,将阈值设置为CongWin/2,然后CongWin变成1MSS开始倍增,当倍增到阈值时,就停止倍增,然后以每次增加一个MSS的速率增加,探测更加准确的阈值。
一旦出现超时或者冗余ACK,就会将阈值设置为原先的一半,CongWin变成1个MSS,重新倍增。
维持一个变量:Threshold,表示CongWin成倍增加的阈值。出现丢失时,就设置为CongWin/2
两个TCP会话,都需要通过一个瓶颈链路,链路带宽为R,两个会话的RTT相等
因为拥塞控制的阈值每次回变为CongWIn的一半,最后回收敛为两个会话各自占用一半的带宽