《计算机网络--自顶向下方法》学习笔记(一)

Chapter 1

本书配套资源地址.

湖科大计网笔记: https://nullcode.fun/172.html。(简略版)

湖科大计网笔记:https://blog.csdn.net/Nimrod__/article/details/113127311。(详细版)

自顶向下方法笔记: https://blog.csdn.net/qq_39326472/article/details/88089747。

强推小林的图解系列。

主机,或端系统通过因特网相连;端系统由通信链路和分组交换机组成。

2种著名的分组交换机:路由器和链路层交换机。

TCP/IP协议是因特网的主要协议。分别是传输控制协议和网际协议。

套接字接口与端系统相连,规定了2个端口间的交付数据的方式。

  • 什么是协议?
  • 定义2个或多个通信实体间交换报文的格式和顺序,以及报文发送/接收采取的动作。
    掌握计网就是理解网络协议的构成,原理和工作方式。

网络边缘:应用程序,端系统。

端系统连接到边缘路由器的网络,就是接入网。家庭,学校,企业有不同的接入方式。

网络核心:由端系统的分组交换机和链路构成的网络。

端系统间发送报文经过分组交换,将长报文划分为小的数据块(分组)。每个分组通过通信链路和分组交换机由源到目的地。

分组交换机:

存储转发传输机制,当路由器接收完源传过来的完整分组时,才开始向目的地传输。每经过1个路由器,就要多一个L/R时延。交换机可连接多条链路,对于每条链路它具有1个输出缓存。如果到达的分组需要的链路忙,则它在输出缓存中等待。输出缓存填满,将出现丢包。

  • 路由器如何转发分组?
  • 每台路由器有1个转发表,将目的地址或其一部分映射为输出链路,路由器检查分组首部的IP地址,搜索转发表。路由选择协议用于自动设置这些转发表。

通过网络链路和交换机移动数据的2种方式:电路交换和分组交换。传统电话属于电路交换。

发展趋势:分组交换。

网络协议分层,所有协议统称为协议栈,一个协议层通过硬件,软件或两者结合实现。

共有五层:物理层,链路层,网络层,运输层,应用层。

每层中的分组称呼,应用层:报文,运输层:报文段,网络层:数据报,链路层:帧,物理层:比特。

数据封装,上层分组附上首部信息后封装成下层分组。

Chapter 2

网络应用程序体系结构:cs体系结构,客户-服务器,和P2P体系结构。

进程通信,两个端系统上的进程(不是程序)通过计算机网络交换报文实现通信。

套接字接口是主机内应用层与传输层间的接口,具体来说是应用程序进程与运输层协议间的接口,它是可编程接口。

2个重要的传输层协议:
TCP面向连接,可靠数据传输。一个TCP连接是全双工的,双方都可以发送报文。拥塞控制机制。
UDP提供最小服务,无连接,不可靠。

常见应用层协议:

HTTP,超文本传输协议。它是web的核心。它使用TCP协议。无状态协议,不存储用户的状态信息。
连接分类,持续和非持续连接。

HTTP属于持续连接。但也可以设为非持续。

HTTP总响应时间,2个RTT+传HTML文件时间。(RTT,往返时间)tcp的三次握手,客户发,服务器回,客户确认。然后服务器传文件。看下图:

image-20211009211335978

HTTP使用cookie来跟踪用户,标识一个用户。

web缓存器,也叫代理服务器。作用类似cache在CPU和内存间的作用。

SMTP协议,用来发邮件。发送不经过中间服务器。http是拉协议,smtp是推协议。

POP3协议用来访问邮件。

DNS协议,提供域名解析服务。通常被http等其他应用层协议使用。DNS缓存,在一段时间后会丢弃缓存信息,因为映射不是永久的。
主机名和IP地址都能识别主机。DNS,主机名解析为IP地址。它有一个分布式、层次数据库用于查询。运行在UDP之上。

Chapter 3

运输层协议为不同主机上的应用进程提供了逻辑通信。而网络层提供了主机间的逻辑通信。

IP协议为主机间提供通信,不可靠服务。

将主机交付扩展到进程间交付,称为运输层的多路复用和多路分解。
多路分解,将运输层报文段中数据交到正确的套接字。
多路复用,从源主机不同套接字从收集数据块,为每个数据块封装上首部信息后生成报文段,交给网络层。

tcp拥塞控制机制力求每个通过拥塞网络链路的连接平等共享网络链路带宽;而udp流量不可调节。
udp套接字由目的IP和目的端口组成的二元组唯一标识。tcp由四元组唯一标识。
udp检验和提供差错检测功能,但它不能纠错。

可靠数据传输:
自动重传请求协议。接收方反馈ACK或NCK,以此知道哪些要重传。
流水线差错恢复方法,回退N步和选择重传。
回退N步,滑动窗口协议。接收方丢弃所有失序分组。
选择重传,发送方仅重传它怀疑接收方出错的分组。接收方将确认一个正确接收的分组不管顺序。失序分组将缓存到所有丢失分组都收到。

tcp通过三次握手建立连接,客户发,服务器回,前两次不包含数据。最后客户回应,可以包含数据。
发送数据通过套接字之后,tcp将其放入该连接的发送缓存中,接下来tcp时不时从缓存中取数据传给网络层。从缓存中取出并放入报文段的数据数量受限于最大报文段长度MSS。MSS指报文段中应用层数据的最大长度,不包括首部。

tcp在连接的两端都有各自的发送,接收缓存。

tcp报文段首部中两个重要字段是序号字段和确认号字段。它们是tcp可靠传输的关键部分。
序号是该报文段首字节在字节流中的编号。见下图:

image-20211009211734369

tcp提供累积确认:

image-20211009212157361

TCP的一些机制:

估计往返时间:在你任意时刻,仅为一个已发送但目前尚未被确认的报文段估计SampleRTT。

超时间隔加倍:每次超时后,会将间隔时间加倍。

快速重传:一旦收到3个冗余ACK,就执行快速重传。

流量控制:TCP提供流量控制服务以消除发送方使得接收方缓存溢出的可能性。它是一个速度匹配服务,匹配发送速率和读取速率。

注意:不要把拥塞控制和流量控制混为一谈。发送方因为IP网络而被遏制。

如何实现流量控制?

TCP让发送方维护一个接收窗口,给发送方指示接收方还有多少可用的缓存空间。由于TCP是全双工通信,两边都有接收窗口。

image-20211010211003358

发送方会轮流跟踪两个变量LastByteSentLastByteAcked,它们需要满足不等式:LastByteSent - LastByteAcked <= rwnd,确保发送到连接中但未被确认的数据量小于空闲空间。以此确保不会缓存溢出。

UDP不提供流量控制,报文段由于缓存溢出可能丢失。

TCP连接:三次握手

  1. 第一步:客户端TCP发送报文段,不包含应用层数据,会在报文段的首部的SYN比特标志位置1,客户随机选择一个初始序号client_isn
  2. 第二步:服务器从收到的IP数据报中提取TCP SYN报文段,为该TCP连接分配TCP缓存和变量。发送允许连接的报文段,SYN比特置1,也不包含应用层数据,首部确认号设为client_isn+1,服务器选择自己的初始序号作为报文首部序号。发回的报文段被称为SYNACK报文段。
  3. 第三步:客户给连接分配缓存和变量,首部确认号设为client_isn+1,表示对允许连接的确认。SYN比特置0,因为连接已经建立。

image-20211010211027158

终止连接:四次挥手

TCP连接的任意一方进程都能终止连接,连接结束后,缓存和变量资源将释放。

假设客户发起关闭连接命令。

客户发送报文,FIN比特置1,服务器发送一个ACK确认报文段。

服务器发送终止报文,FIN比特置1,客户发送一个ACK确认报文段。

最后连接占用的资源释放。

image-20211010211039912

拥塞控制产生:

丢包一般因为网络拥塞导致路由器缓存溢出发生。分组重传是网络拥塞的前兆,但不能解决网络拥塞。为了处理网络拥塞,需要遏制发送方。

拥塞控制与流量控制的对比:

  1. 拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;全局性过程。
  2. 流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接;端到端过程。

拥塞控制方法:

总体来说,我们可以更具网络层是否为传输层拥塞控制提供了显式帮助来区分拥塞控制方法:端到端拥塞控制和网络辅助拥塞控制

1.TCP必须通过端到端的方法解决拥塞控制,因为IP层不会像端系统提供有关网络拥塞的反馈信息。TCP报文段的丢失(超时或者收到3次冗余确认而得知)被认为是网络拥塞的一个迹象,TCP将相应地减小窗口长度。

2.在网络辅助的拥塞控制方法里,网络层会向发送方提供关于网络中拥塞状态的显式反馈消息。比如使用一个比特位来指示网络是否拥塞;拥塞信息从网络反馈到发送方一般有两种方式,其中直接反馈信息可以由网络路由器发送给发送方,这种方式的通知通常采用一种拥塞分组的形式;第二种形式的通知是路由器标记或者更新从发送方到接收方的分组中的某个字段来指示拥塞的产生,然后由接收方向发送方通知该网络发生了拥塞。

TCP拥塞控制原理:

TCP必须使用端到端的拥塞控制而不是网络辅助的拥塞控制,因为IP并不会向端系统提供显式的网络拥塞反馈。

TCP所采用的方法是让每一个发送方根据其所感知的网络拥塞程度来限制其能向连接发送流量的速率;如果TCP判断网络通畅,那么它会提高发送速率,如果TCP判断网络拥塞,那么它会限制发送速率;需要解决三个问题:TCP如何限制发送速率?TCP如何感知网络拥塞程度?TCP该以何种算法改变其发送速率?

问题1:

TCP连接的每一端都由一个接收缓存、发送缓存和几个变量组成。

TCP拥塞控制机制会跟踪一个额外的变量,拥塞窗口(表示为cwnd)

发送方中未被确认的数据量满足:

LastByteSent - LastByteAcked <= min{rwnd,cwmd}

我们假设rwnd足够大,发送方可以在RTT时间范围内连续发送cwnd个字节的数据,所以发送速率即为cwnd/RTT;发送方通过调整窗口大小来对发送数据的速率加以控制。

问题2:

我们将TCP发送方的丢包事件定义为:要么超时,要么收到接收方的3个冗余ACK;如果网路拥塞,那么网络中的路由器就会发生缓存溢出,进而导致数据报被丢弃,然后就会引起发送方的丢包事件;此时,TCP发送方就可以认为TCP连接出现了拥塞。

另外,TCP将接收方发送的ACK视为网络通畅的标志,如果ACK到达的速率较高,那么TCP的拥塞窗口就会以较高的速率扩大,如果ACK到达的速率较慢,那么TCP拥塞窗口的增加速度也会较慢;因为TCP使用ACK对拥塞窗口做出调节,所以也别称为自计时的。

怎样控制速率既不导致拥塞又能充分利用带宽?

一个丢失的报文段意味着拥塞,因此当丢失报文段时应当降低TCP发送方的速率;

一个确认报文段指示该网络正在向接收方交付发送方的报文段,因此,当收到对先前报文段的确认时,可以增加发送方的速率;

带宽检测;TCP调节器传输速率的策略是增加其速率以响应到达的ACK,除非出现丢包,此时才减少发送速率。

接下来就是广受赞誉的TCP拥塞控制算法,该算法包含三个主要部分:慢启动、拥塞避免、快速恢复。(注:本书提到三个,其他书是四个)慢启动和拥塞控制是TCP的强制部分;两者的差异在于对收到的ACK做出反应时增加cwnd长度的方式;快速恢复是推荐部分,对于TCP发送方并非是必须的。

1.慢启动

TCP连接在开始的时候,其cwnd常设置为一个MSS,然后在慢启动状态每收到一个ACK,cwnd就增加一个MSS;这样的话,在慢启动阶段,发送速率是指数增加的(1,2,4,8…)

何时结束这种指数增长?有三种情况:发送了超时、发生了冗余ACK以及cwnd达到ssthresh。

ssthresh是慢启动阈值的速记;在慢启动阶段,如果发生了超时事件,那么ssthresh就被设置为当前cwnd的一半,然后将cwnd置为1个MSS;当cwnd逐步增加到ssthresh时,再翻倍增加cwnd就有一点鲁莽了,所以此时TCP结束慢启动,进入拥塞避免模式。在拥塞避免模式里,TCP将更谨慎地增加cwnd;如果收到冗余ACK,那么TCP会做一次快速重传,然后进入快速恢复阶段。

2.拥塞避免

一旦进入拥塞避免状态,cwnd的值大约是上次遇到拥塞时的一半,所以TCP在每个RTT中,只将cwnd增加一个1个MSS大小;也就是说在拥塞避免阶段,cwnd是线性增加的;

当出现超时时,TCP将cwnd设置为1个MSS,然后将ssthresh更新为cwnd的一半;当收到3个冗余ACK时,这种丢包比超时丢包不那么剧烈,TCP将cwnd减半,然后将ssthresh置为cwnd值的一半,并且进入快速恢复状态。

3.快速恢复(非必要)

在快速恢复阶段,对于引起TCP进入该状态的缺失报文段,每收到一个ACK,cwnd增加一个MSS;最终,当对丢失报文段的一个ACK到达时,TCP降低cwnd后进入拥塞避免状态;如果出现超时事件,快速恢复在执行如同慢启动和拥塞避免中相同动作后,进入慢启动状态。

坚持原创技术分享,您的支持将鼓励我继续创作!