《计算机网络自顶向下》读书笔记
第一章 计算机网络和因特网
- 描述因特网的两种方式:
- 构成因特网的基本硬件和软件
端系统(主机):其中可以运行应用程序
通信链路:由各种不同的物理介质(同轴电缆,铜线,光纤,无线电频谱)组成的各种类型的通信链路,它们的传输速率也因此不同
分组交换机:主要是路由器和链路层交换机;
应用程序
- 为端系统上的分布式应用提供服务的基础设施
运行在端系统中的很多应用程序需要在不同端系统之间收发数据,为这种需要提供服务的基础设施即因特网
-
URL:计算机网络中任何一个文件都对应唯一的URL(统一资源定位符)
-
协议:在两个/多个通信实体之间交换的报文格式和次序,以及发送/接受一条报文或其它事件所采取的动作
-
接入网:
- 家庭接入方式:DSL,传统电话线拨号上网,电缆因特网接入,光纤,卫星链路
DSL:
电缆因特网接入:共享广播媒体
光纤:主动/被动光纤网络
-
企业接入方式:以太网和WIFI
-
广域无线接入:3G,LTE
- 网络核心:
-
在网络链路和交换机传送数据的方法:分组交换和电路交换
①分组交换:无需预先分配,谁来谁用,按需分配,由需要传的分组就传,只是可能会排队
分组;通信链路和分组交换机
存储转发传输机制
交换机必须完整接受完一个分组,才会开始输出该分组;而不是边接受边发送
便于实时的选择最优路由
排队时延和丢包
交换机有一个输出buffer,还未满时,若新来的分组想要输出的链路正忙,就会进入buffer排队,若满了,该分组就会被丢弃或buffer内已经排队的一个分组就会被丢弃
转发表和路由选择协议
②电路交换:预先分配传输链路的使用,所以无需排队,但已分配但未被使用的链路被浪费
FDM;TDM
- 分组交换网中的时延,丢包,吞吐量
- 时延
一个分组在两个结点之间传递的过程中的四种时延:
1. 处理延迟
2. 排队延迟 (新来的分组发现队列已满,则发生丢包)
3. 传输延迟
4. 传播延迟
- 吞吐量
一条通信链路上的传输速率取决于瓶颈链路的传输速率;
瓶颈链路往往在接入网,但实际上往往有很多干扰流量流过同一条通信链路,因此也可能在高速的核心链路中也成为瓶颈;
- 协议分层:ISO定义了OSI模型:7层;TCP/IP模型:5层,虽然主要使用的是5层,但有些场合下还是会用到其它两层来提供一些服务(表示层:数据压缩/加密/描述;会话层:数据交换定界和同步)
每层使用下层接口提供的功能,并为上层提供服务,若仅修改某层的实现,但不会影响其他层;
即站在巨人的肩膀上,并加上自己的一些动作来为上层提供服务
应用层:process间的通信; 传送:报文; 协议:HTTP, SMTP, FTP, DNS
表示层:
会话层:
运输层:end间的通信; 传送:报文段; 协议:TCP, UDP
网络层:host间的通信; 传送:数据段; 协议: IP, 路由选择协议
链路层:node间的通信; 传送:帧 协议:PPP
物理层:bits 传送:bit
- 带宽-时延积:R * d(prop);指一条链路可以存放比特的最大数量(即这条链路上充满比特)
- 比特宽度:在一段距离为len的链路上充满比特,len / 比特数;即使实际并不能充满,也按充满算
- 分组传输的优缺点:
优点:防止单个分组太大导致路由器的buffer不够导致丢包; 分开便于差错检查和出错时只需重传一部分无需重传整个分组
缺点:为了标识每部分,需添加额外首部
第二章 应用层
2.1 应用层协议原理
- 网络应用程序只需运行在端系统上,而无需运行在路由器或链路层交换机上(因为这些仅在网络层及以下起作用);
- 2种网络应用程序体系结构:
1. client-server体系结构:
server:服务器常开,且具有固定,周知的IP地址,往往大量服务器主机构成数据中心来处理client的海量请求;
client:客户间不直接通信,而是通过服务器;可能具有动态IP;客户机可以随时向服务器的IP地址发送分组来与其联系,即客户机一般不会常开;
2. P2P体系结构:
任意端系统(对等方)之间可以自己联系,无需通过服务器,即每个既能是客户也能是服务器;自扩展性;
- 应用程序由通信进程对组成,每对中的两进程互相发送报文;
- 客户进程通过socket将报文从应用层进程传到传输层(可能还要先经过SSL将报文加密,再传给传输层),在传输层中通过TCP/UDP协议传送到目的主机的传输层,再通过与应用层间的socket传给服务器进程(若加密了,此处就要对应在SSL中解密再传给服务器进程)
注:SSL在TCP的基础上保证了安全性; SSL位于应用层中,若需要使用该服务,则需在客户端和服务端代码中都包含SSL代码,则客户发出明文报文,通过SSL的socket传给SSL进行加密,加密后的报文再通过与传输层之间的socket进入传输层,经由TCP协议将报文传给接收进程中的TCP socket,经过SSL进行解密后,最后经SSL socket将原始明文传给接收进程;
- 用IP地址标识目的主机,用目的进程的socket端口号标识接收主机上具体的那个接收进程
- 运输层协议:1. 可靠数据传输 2. 带宽(吞吐量) 3 . 定时 4.安全性
TCP:
面向连接:先进行握手,建立了连接之后才发送数据
可靠数据传输 + 安全性(需使用SSL加密);
流控制:若发送方的速度不得超过接收方的速度,否则就会淹没一部分数据
拥塞控制机制:抑制发送进程的发送速率,避免发送速度率超过网络链路的瓶颈速率导致数据在网络中被丢失(即流控制和拥塞控制都是为了限制发送方的速率)
不提供带宽,定时,安全的保证:限制每个TCP连接使每个连接都公平的共享网络带宽
UDP:
不面向连接
不可靠数据传输,但成本低
带宽:可以以任意速率向网络层下发数据,但由于中间链路带宽不足或拥塞,实际端到端的吞吐量往往达不到
定时:不保证
注:带宽和定时:TCP/UDP都不保证,但有很多设计可以尽可能满足要求,但不保证一定满足
不同应用程序对于这几种服务的要求都不同,便于我们为应用程序设计针对性的解决方案
- 应用层协议:定义了运行在不同端系统上的应用程序如何相互传递报文
交换的报文类型:
各种报文有哪些字段
这个字段都代表什么意思
发送进程何时发送报文?怎么发?接收进程怎么收?
- 应用层协议 != 网络应用,只是其中一部分
web应用中:除了使用的HTTP应用层协议,还包含很多其他组成
电子邮件应用:除了使用SMTP应用层协议,还包含很多其他组成
2.2 Web和HTTP
-
Web页面:往往由一个HTML基本文件 + 若干对象(文件)组成,HTML基本文件通过URL地址去引用页面中的其它对象;
-
URL地址:存放对象的主机名 + 该对象的路径名; 注:一个对象对应一个URL地址
-
Web浏览器,Web服务器:Web应用程序基于client-server体系结构
-
HTTP是一个无状态协议:HTTP的服务器不保存关于客户的任何信息
例如Web服务器常开,具有固定的IP地址,处理数百万不同的浏览器的请求;
-
3次握手:
客户向服务器发送一个小TCP报文段; 服务器回一个小TCP报文段; 客户收到响应(代表客户知道了对方能收到我的消息)后,再向服务器回复一个确认(服务器收到后就知道,客户也能收到我的消息) 注:这样客户和服务器双方都确定对方能收到自己发的消息,因此建立了一个可靠的TCP连接
-
2种TCP连接:
非持续连接:客户向服务器发起n次请求,需要建立n次TCP连接,每次只处理一个请求,服务器每处理一次请求都关闭TCP连接;
持续连接:只需建立一次TCP连接,该客户和服务器之间的后续请求都使用同一个TCP连接; HTTP的默认模式是使用带流水线的持续连接
注:每处理一次请求,总的响应时间 = 2 * RTT + 传输文件所需的时间;
- HTTP报文格式:
- HTTP请求报文
请求行 方法 sp URL sp 版本 crlf
首部行 首部字段名:sp 值 crlf
首部行 首部字段名:sp 值 crlf
首部行 首部字段名:sp 值 crlf
首部行 首部字段名:sp 值 crlf
空行 crlf
实体体 可填可不填(根据请求行的方法不同)
- HTTP响应报文
状态行 版本 sp 状态码 sp 相应状态信息 crlf
首部行 首部字段名:sp 值 crlf
首部行 首部字段名:sp 值 crlf
首部行 首部字段名:sp 值 crlf
首部行 首部字段名:sp 值 crlf
空行 crlf
实体体 响应报文要发送的对象(即请求报文想要获取的那个对象)
- cookie :尽管HTTP是无状态的,但使用cookie技术可以追踪用户,并存储很多用户访问信息;为用户提供针对性的服务;
- Web缓存器(代理服务器):在一个机构的客户与原始服务器之间添加一个Web缓存器,有自己的磁盘存储空间,内部保存最近请求过的对象的副本;机构网络到Web缓存器使用高速链路;
功能:替原始Web服务器分担一部分压力,如果Web缓存其中保存有客户所需对象就直接返回了,若没有才替客户去问原始服务器请求到所需对象并传回客户;若全部请求都经过介入链路从原始服务器获取对象,则接入链路很容易拥塞,增加缓存器可以减少接入链路的压力;
原因:1.机构网络与缓存器之间使用高速链路,若所需对象命中,则大大减少响应时间
2.大大减少该机构网络与因特网之间的接入链路的通信量,因此机构无需急于为接入网络增加带宽
- 条件GET方法:使用Web缓存器可能导致缓存器上存储的对象已经是旧版本的了,而服务器上可能已经修改了该对象
1. 每当Web缓存器备份服务器回复的响应报文中的对象时,同时存储了该对象的最后修改时间:在响应报文中的last-Modified:首部行
2. Web缓存器收到客户HTTP请求报文时,即使自己已存储该对象,也要向服务器发送发送一个条件GET请求报文确认一下我存的这个对象副本后来有没有被改过,该请求报文中包含if-Modified-Since: 首部行,首部行的值就是原来记录的那个最后修改时间;
3.服务器收到请求报文后,对比自身的数据库中该对象的last-Modified:若没改过就回复一个空的实体体的响应报文,若改过就在实体体中包含新对象;
2.3 文件传输协议:FTP
- 特点:
1.运行在TCP连接上;
2.使用两个并行的TCP连接来传输文件:控制连接(专门一条连接传输控制信息,因此FTP协议是带外传送,HTTP协议是带内传送)和数据连接;
3.在整个会话期间,控制连接只有一条,而每传送一个文件就断开数据连接,若需再传新文件就重新建立一条数据连接(数据连接是非持续的);
4.FTP是有状态的,在整个会话期间都跟踪用户状态(缺点:大大限制了FTP可同时支持的会话总数);
注:控制连接用于在客户端和服务器端传输控制信息,如客户的主机名,用户标识和口令,及改变远程目录的命令和存、取文件的命令;数据连接用于传输一个文件;
2.4 因特网中的电子邮件
- 邮件结构有三部分组成:用户代理;邮件服务器;SMTP协议
用户代理:运行在用户pc上的一个用户代理程序,允许用户阅读,恢复,转发,保存,攥写报文;
邮件服务器:维护的报文队列用于发送发送方的用户代理发来的报文
维护着的若干用户的邮箱(用于保存用户收到的报文);
SMTP协议:使用TCP持续连接传送可靠数据
- SMTP协议:
特点:
1. 用于从发送方的邮件服务器到接收方的邮件服务器
2. SMTP传送的邮件报文要求必须按7bite ASCII编码(若不满足,则需重新编码/解码)
3. 收发邮件服务器采用直连,不使用任何中间邮件服务器,因此邮件不会被存储在中间某个邮件服务器上 (若接受邮件服务器故障,则发送邮件服务器每隔一段时间重复发送)
4. 采用TCP持续连接发送报文
- SMTP与HTTP异同:
同:
1. 都用于一台主机向另一台主机传文件
2. 都使用TCP的持续连接
异:
1. HTTP是拉协议,TCP连接由文件发送方发起;SMTP是推协议,TCP连接由文件接收方发起;
2. SMTP要求所有报文都是用7bite ASCII编码;HTTP无要求
3. HTTP每个响应报文中只发送一个对象;SMTP把所有对象放在同一个报文中
- 邮件发送过程:
发送方在PC运行的用户代理程序写完邮件,用户代理使用SMTP将邮件发给发送方所属的邮件服务器,进入报文队列等候发送;
发送方的邮件服务器通过SMTP将邮件发送给接收方的邮件服务器(若发送失败,会定时尝试重发);
接收方的邮件服务器收到邮件后,将其保存在接收方对应的邮箱中;
接收方的用户代理自己的邮件服务器中获取邮件报文采用邮件访问协议(POP3, IMAP, HTTP),之所以不能用SMTP,因为SMTP是一种推协议;注:若邮件访问协议使用HTTP,则发送方的用户代理到自己的邮件服务器这一段也使用HTTP,但两个邮件服务器之间始终采用SMTP;
DNS
- 标识主机的方式:主机名(可能多个IP地址对应一个主机名且主机名的格式不固定,不方便查找);IP地址(每台主机唯一且格式固定)
- DNS:①是一个由分层的DNS服务器实现的分布式数据库 ②使一台主机能够查询分布式数据库的应用层协议 ③运行在UDP协议上;
- DNS协议的功能:
1. 为其它应用层协议HTTP, FTP, SMTP提供帮助,将主机名解析为IP地址
2. 应用程序可以调用DNS来获取主机别名对应的规范主机别名及主机IP地址
3. 电子应用程序可以调用DNS,获取邮件服务器别名对应的规范主机名及IP地址
4. 对服务器实现负载分配(若干服务器的IP地址对应同一个规范主机名,且轮流回复响应报文,分担压力)
- DNS工作过程:
用户主机上的某些应用程序接受主机名;
应用程序调用DNS客户端,名把要查的主机名给它,DNS客户端通过UDP数据报从53端口向网络发送查询报文;
DNS客户端收到对应的IP地址,并传回给应用程序使用;
- DNS服务器结构:根服务器 -> *域(TLD)服务器 -> 权威服务器
权威服务器下面,往往每个ISP都有一台本地DNS服务器用于管理当地的主机
查询方式:递归查询 + 迭代查询
- DNS缓存
本地DNS服务器存储了最近它所收到的任何信息,包括主机名/IP地址对,以后当又收到查询此主机名的请求时,可以直接返回;
缓存会保留一段时间后被删除
- DNS记录和报文
TCP和UDP
-
地址标识:一个进程向另一个进程发送分组,需要用IP地址+目的进程的socket端口号标识接收进程
-
socket:相当于进程的门,每一个socket有一个端口号
第三章 运输层
3.1,3.2,3.3 传输层提供的服务,多路复用/分解,UDP
- 不同层运行的位置:
internet edge:应用层和传输层 inernet core:网络层及以下
应用层:用户态 运输层和网络层:OS内核态 链路层和物理层:网络接口上
- 运输层和网络层之间的关系:
网络层(IP协议):提供不同主机之间的逻辑通信
传输层(TCP/UDP协议):在网络层提供的服务基础上,将不同主机间的逻辑通信扩展为不同主机的具体进程之间的逻辑通信
- UDP和TCP的提供的服务:
UDP:进程间的数据交付;差错检查;
TCP:进程间的数据交付;差错检查;可靠数据传输(通过流量控制,序号,确认,定时器实现);拥塞控制;
注:
进程间的数据交付服务是通过多路复用/分解实现的(UDP是源端口号+目的端口号;TCP是源端口号+源IP+目的端口号+目的IP,以上这些字段实现的)其中端口号为16位,低10位已被周知端口号使用了
差错检查是通过报文段首部的检验和来检查报文段是否出错;
- 多路复用/分解:在发送方实现应用数据的多路复用,在接收方实现应用数据的多路分解;
1. UDP(一个UDP套接字是一个二元组:目的IP和目的端口号):
多路分解:主机A的某进程x1发给主机B的某进程y1一个报文段,主机B使用该报文段的目的IP地址和目的端口号这个二元组来将此报文段中应用数据传入对应的套接字;(疑惑的地方:P109说将源IP/端口号和目的/IP/端口号都附在了报文上,可UDP首部只有源/目的端口号,那二者的IP地址附在了哪里?难道是IP首部?)
多路复用:运输层从不同的套接字x1,x1,...中取出数据块,各自封装上首部信息,并将其传到网络层;
注:UDP的源地址的作用:主机B从A发给它的报文段中提取首部字段的源端口号(以及源IP,可能是在IP首部中),以此作为主机B发给A报文段的目的地址
2. TCP(一个TCP套接字是一个四元组:源IP地址/端口号,目的IP地址/端口号):
多路分解:TCP是面向连接的,客户向服务器发起第一次握手的SYN报文段通过目的IP/端口号定位到接收进程的welcome socket,当接受进程收到SYN报文段,会再创建一个四元组的connect socket(用于将后续来自客户进程的报文段定向分解到指定的connect socket)
注:
服务器进程有两个套接字:welcome socket和connection socket
源IP地址/端口号用于第二次握手时服务器向客户发送SYN ACK报文段;且TCP连接建立之后,相当于TCP连接两端的客户套接字和连接套接字之间有条管道,双方发送的数据会定向的沿这条管道发给对方;
- UDP的优点:
1. UDP没有三次握手的连接时延,拥塞控制机制,发送数据更快(从应用进程收到报文,可以很快的将其打包为报文段,紧接着发给网络层)
2. 对于实时应用和一些可以容忍部分数据丢失的应用,发的快更重要
3. UDP无需维护连接状态,TCP还需维护接受和发送缓存,流量控制参数变量(rwnd),拥塞控制参数变量(cwnd, ssthresh),序号,确认号等参数
4. 每个UDP报文段的首部为8字节,TCP为20字节
- UDP报文段:
源端口号 目的端口号
长度 检验和
应用数据
注:
源/目的端口号:用于目的主机实现多路分解
长度:报文段首部+应用数据的字节数
检验和:计算整个UDP报文段和IP首部的一些字段,从源到目的移动途中是否有bite出错,提供差错检测功能(之所以UDP要提供差错检测功能,是因为无法确保端到端之间的链路和路由器都提供差错检测,那么只能在两头的主机上确保提供这种功能)
应用数据:应用进程所要传输的报文
3.4 可靠数据传输原理
- TCP的下层网络层提供的服务是不可靠的,而要提供给上层应用层的服务必须是可靠的;
- 构造传输层的可靠数据传输协议:
rdt 1.0:基于完全可靠的底层信道
发送方的传输层将从应用层收到的data直接发给下层,接收方一定能收到无误的data;
接收方无需提供反馈信息给接收方;
发送方可以不用限制发送速率;
rdt 2.0(是一种停等协议):基于具有比特差错的底层信道,但不会丢失分组
发送方的传输层将从应用层收到的data添加上检验和字段再发给下层,接收方依据校验和进行差错检测;
接受方依据差错检测的结果,对发送方反馈ACK或NAK分组;
发送方根据收到ACK或NAK,来决定是否重传;
缺点:接收方使用ACK或NAK来通知发送方刚刚发送的报文是否出错,但ACK或NAK分组本身在从接收方到发送方的途中也可能出错或丢失(因此若发送方收到不确定的ACK或NAK时,无脑重传,但接收方并不知道发送方有没有正确接收到ACK或NAK,所以接收方不知道它现在接收到的分组是一条新的还是旧的一条重传);
rdt 2.1:对2.0的优化
发送方在分组中添加一个序号字段,以此来告知接收方收到的是新的还是旧的一条重传(若是旧的重传,接收方也能辨别出来,但这样会在接收方造成冗余);
对于停等协议,都是确保一个分组搞定才会去发下一条分组,因此序号只需1位(两种情况表示新还是旧即可)
rdt 2.2
跟2.1的区别:接收方不使用NAK分组,只使用ACK分组
当接收方检测到1号分组出错时,2.1协议情况下,接收方会回复一个1号NAK通知发送方1号出错,进而发送方重传;但2.2协议情况下,接收方会恢复一个0号ACK,这样发送方自己本来期望收到一个1号的确认分组(即使出错也应该是1号NAK,若正确应该是1号ACK),但却收到一个0号分组,这样也能通知发送方刚刚发送的1号分组出问题了,进而重传,也能起到同样的效果;
2.2:分组丢失或分组/ACK过度延时:使用检验和,序号,ACK分组,重传解决
rdt 3.0(比特交替协议):不止分组可能出现bite错误,还可能出现分组丢失
在2.2可以解决分组丢失后的处理的基础上,增添倒计数定时器来检测丢包;
选择一个合适的时间作为定时器,每当发送方发送一个分组就开启定时器,若规定时间内没收到ACK(无论是发送方发的分组或是接收方回复的ACK发生丢失,或是没有丢失但是由于延时导致ACK规定时间内还没回到发送方),发送方都重传分组,但后果是可能会在接收方形成冗余分组(但使用序号字段可以处理冗余)
注:之所以称为比特交替协议,是因为3.0协议仍是一种停等协议,即发送方只发送一个分组,当确保这个分组被接收方正确接收后,才会发下一条分组;因此用一位序号比特位便可区分,序号在0,1交替(若发送王发送了0号分组,则期望收到0号ACK,但当收到1号ACK或定时器超时仍未收到期望的0号ACK,都会选择重传;若收到期望的0号ACK,下次当上层产生调用事件rdt_send(data)时,发送方便将分组编为1号分组发送)
缺点:3.0仍是停等协议,信道利用率很低
流水线可靠数据传输协议:对于传输中可能出现的丢包,bite损坏,时延过大的情况,使用回退N步(GBN协议或滑动窗口协议)和 选择重传来解决
1. 滑动窗口(GBN):缺点:当窗口长度和带宽时延很大时,很容易因为单个分组出问题导致重传大量分组,进而导致链路中被大量冗余分组充满
对于上层rdt_send()的调用:发送方的发送窗口不满N个时才能发送,否则会拒绝上层的调用请求或者发送方使用同步机制通知上层仅当窗口不满时再发起调用
累积确认:(发送方和接收方都采用累计确认)保证接收方传给上层的分组是按正确顺序的,接收*收到n号分组并将其上传给上层,则代表n号及n-1等等以前的分组都按序上传了;否则,若接收方期望收到n,但收到一个n+1,或收到一个校验错误的n号分组,都会导致接收方丢弃收到的这条分组并回复n-1号ACK通知发送方n号分组出问题了,然后一直等待n号分组的到来(若之后发送方收到了n-1号ACK,或这条n-1号ACK丢失了(n-1号ACK丢失会导致发送方所期望的n号ACK超时,若n-1号ACK没丢则会通知到发送方n出问题),最终结果都会导致发送方重传n号分组和n号分组后面的所有已经发出去的分组)
超时:当第一个发出但未被确认的分组的定时器超时,选择将该分组和后面所有的已发出的分组全部重传
2. 选择重传(SR)
//待补充,没懂
3.5 TCP的可靠数据传输
- “TCP连接”的连接状态只在一对端系统中维护,而中间的路由器和链路层交换机看不到这条连接
- TCP连接:一台主机的缓存,变量,与进程连接的socket 和 另一台主机的缓存,变量,与进程链接的socket
//TCP连接的特点和混淆点:
全双工:TCP连接的一对进程可以同时向对方发送报文;
点对点:一条TCP连接只能是二人世界,而不能是“多播”;
MSS(最大报文段长度):虽然名字叫报文段长度,但实际指的只是报文段长度中的应用层数据的那部分;MSS + TCP首部 + IP首部 = 链路层发送的最长帧(MTU),通常TCP/IP首部共40字节,以太网和链路层协议的MTU未1500字节,因此MSS通常未1460字节;
TCP的发送方和接收方分别有一块缓存(TCP发送缓存,TCP接收缓存):发送进程将数据传入套接字,数据被保存在TCP发送缓存,当需要的时候,从中取出一部分数据并封装成报文段发往网络层;接收方同理,从网路层收到的报文段中的数据被保存在TCP接收缓存,应用程序从此缓存中读取数据;
TCP连接的组成部分都在端系统上,而两台主机中间的路由器,链路层交换机和中继器不会为TCP连接分配任何缓存和变量;
- TCP报文段:
源端口号 目的端口号
序号
确认号
首部长度 保留 URG ACK PSH RST SYN PIN 接收窗口
因特网校验和 紧急数据指针
选项
应用数据
源/目的端口号:用于多路复用/分解
序号:发送方发往接收方的应用数据的首个字节编号(序号面向的是字节流,TCP会隐式的对字节流中的每一个字节编号)
确认号:接收方用于通知发送方某段报文段已经收到了,并和序号一起为TCP连接提供可靠数据传输
首部长度:整个TCP首部的长度,通常为20字节(一般没有选项字段)
URG,PSH和紧急数据指针:用于标志紧急数据的相关参数
ACK:置1代表该报文段是对于一个被成功接受报文段的确认
SYN:置1用于前两次握手,代表这是一个请求连接的报文段
PIN:置1用于第一次和第三次挥手,代表这是一个请求断开连接的报文段
RST:未知
接收窗口:用于流量控制。发送方维护的一个rwnd变量(从接收方发回的报文段首部的接收窗口字段获得),用以说明接收方的接收缓存还能接受的字节数量
因特网校验和:对TCP整个报文段按16bite大小的字进行计算并填入
- TCP连接的3次握手,4次挥手:
3次握手:
① 客户向服务器发送SYN报文段,不携带应用数据,请求建立TCP连接;
② 服务器为这条半开的TCP连接分配缓存和变量,并回复SYN ACK报文段(也不携带应用数据),表示同意建立;
③ 客户收到SYN ACK并回复ACK(只要发出去ACK,客户就进入了established状态),而服务器收到ACK后才会进入established状态(个人猜测是因为第一次握手如果成功就代表客户到服务器这个方向是可以通的,因此客户只要发出去这条ACK,它就相信能被服务器正确接收到);
4次挥手:
注:TCP连接的双方都可以当第一个发起断开连接的人
① 客户向服务器发送FIN报文段,进入FIN_WAIN_1状态;
② 服务器收到FIN报文段,并回复ACK,服务器进入CLOSE_WAIT状态;
③ 客户收到ACK进入FINT_WAIT_2状态,并发送FIN报文段,进入TIME_WAIT状态(定时等待一段时间后进入closed状态);
④ 服务器收到FIN报文段,并回复ACK,服务器进入closed状态
- 三次握手可能出现的问题:
若客户向服务器的一个并不存在的端口发SYN报文段,则服务器会回复一个重置报文段,用于通知客户我没有这个套接字;
而对于UDP,若服务器收到的报文段中的目的端口号自己并未开启,则服务器回复一个ICMP数据报;
3.6 拥塞控制原理
- 拥塞原因和代价:
1. 当分组的到达速率接近链路容量时,虽吞吐量会达到顶峰,但分组会有巨大的排队时延;
2. 发送方必须重传来补偿那些因在中间链路缓存溢出导致丢失的分组,这样会降低发送方的有效速率(其中一部分速率用于发送重传分组了)
3. 发送方在遇到大时延时,导致发送的分组尽管没有丢失但是由于ACK超时因此发送方重传,这些不必要的重传占据了链路带宽(而这些带宽本可以用于发送其它有效的分组的)
4. 当一个分组经过多跳才能到到接收方时,若某分组经历过几跳后由于缓存溢出导致分组丢失,那么这个分组的前面几跳都白费了(前面几跳本可以传输其它分组的)注:当一个路由器转发分组时,最好优先考虑转发已经经过一定数量的上游路由器的分组(因为它们费了更大劲才到这里,最好不要把它们丢失掉);在众多TCP连接轻载时,随着发送速率提高,接收速率也提高。但若众多TCP重载,会导致拥塞崩溃;
- 拥塞控制方法:
1. 端到端拥塞控制:TCP使用的是端到端的拥塞控制,因为IP层并不会向端系统提供任何网络拥塞的反馈,因此端系统只能自己根据观察到的一些现象判断网络的拥塞程度(如超时,超过三次冗余ACK会被认为网络拥塞,因此会减小窗口长度N);
2. 网络辅助的拥塞控制:网络层的构件(路由器)会显式的将网络中的拥塞信息反馈给发送方,发送方据此判断是否需要调整发送速率,反馈方式有两种:
① 直接反馈:如果网络拥塞了,路由器直接向发送方回复一个阻塞分组,通知发送方网络堵了;这种方法比较快;
② 间接反馈:如果网络拥塞了,路由器会对流经它的分组的某个字段作标记,这样接收方收到被标记的分组就会回复发送方一个分组通知其网络堵了;这种方法至少需要一个RTT时间
3.7 TCP拥塞控制
- TCP使用的是端到端的拥塞控制(即只能靠发送方自己这边能看到的信息来调整发送方自己的发送速率):
1. 发送方检测路径中出现拥塞:超时或收到3个某报文段的冗余ACK
2. 发送方通过调整拥塞窗口cwnd来调整发送方速率
3. 当检测到拥塞时,使用TCP拥塞控制算法计算出cwnd的合适值(在不丢包的前提下尽可能大的发送速率):慢启动;拥塞避免;快速恢复
- TCP是自计时的:TCP每收到ACK报文,是好事,要增大拥塞窗口长度;
对于TCP连接来说,丢包是坏事,需要降低cwnd;
收到未确认报文段的ACK是好事,需增加cwnd;
TCP发送方需要尽可能尝试增大cwnd,如果出现拥塞就降一点,过一会再尝试增大,以此保证对于带宽的最大利用率;
核心:对于TCP来说,网络中不会提供任何有关拥塞状态的信息,发送方只能靠自己观察到的情况来调整cwnd,发送方可以看到的现象有超时(说明丢包或者路径时延大),收到某报文段的3条冗余ACK(说明该报文段后面发送的报文段已经丢失),收到未确认报文的ACK(是好事)等;
- TCP拥塞控制算法(P184):对于发送方来说,慢启动和拥塞避免是必须的,快速恢复是可选的;
- 慢启动
cwnd起步慢,但以指数增长:发送方第一次只发1个MSS报文段,之后每收到一个ACK,就将拥塞窗口增加一个MSS报文段,这样也就是每隔RTT,发送的MSS报文段的个数都翻倍;
停止翻倍的三种情况:① 发送方检测到超时,则将ssthresh = cwnd / 2, 并将cwnd = 1,从头开始慢启动 ② 当发送方的cwnd == ssthresh时,不敢再翻倍,因此结束慢启动进入拥塞避免开始更谨慎的增加cwnd ③ 当发送方检测到某个报文段的3个冗余ACK,TCP发送方会ssthresh = cwnd / 2, cwnd = cwnd / 2 + 3 * MSS, 并启动快速重传(即在该报文段的定时器过期之前就重传丢失的报文段,即在该报文段后面发送出去的那些报文段)并进入快速恢复;
注:对于云服务中使用TCP的慢启动,即使是很小的查询,也会导致开时延很大。可利用TCP分岔技术大幅缩小传输时延和接入网的丢包引起的重传时延,优化用户感受;
- 拥塞避免
进入拥塞避免状态时,每RTT只增加1个MSS(这个RTT期间的cwnd / MSS个报文段,每收到一个报文段的ACK就cwnd += MSS * (MSS / cwnd))
线性增长的途中,停止拥塞避免的情况:① 发送方检测到超时,则将ssthresh = cwnd / 2, cwnd = 1,从头开始慢启动 ② 发送方检测到3个冗余ACK,则ssthresh = cwnd / 2, cwnd = cwnd / 2 + 3 * MSS, 快速重传丢失的报文段,并进入快速恢复
- 快速恢复
进入快速重传状态后,对于那些丢失了的报文段,每收到一条这些丢失报文段的冗余ACK, cwnd都增加MSS。目的是较快的增加cwnd,尽快收到那些丢失报文段的ACK
结束快速恢复的情况:① 发送方检测到超时,则将ssthresh = cwnd / 2, cwnd = 1,从头开始慢启动 ② 若发送方快速重传那些丢失分组之后,收到了一个这些丢失分组的ACK,则cwnd = ssthresh,并进入拥塞避免
- TCP连接的公平性(UDP不具备公平性):
若多条TCP连接中间有一段共享的瓶颈链路,则在这段共享链路中每条TCP连接是平分带宽的,即便初始状态大家所占的带宽不同,但最终也会趋于平均;
前提:这些TCP连接的RTT,发送速率都相同,且这些链路中只有TCP流量没有UDP流量干扰(因为网络拥塞时,TCP连接会降低发送速率而UDP不会,则UDP源很可能会压制并抢占TCP流量),且对于一对主机来说只有一条TCP连接与之关联。
但实际情况,这些前提条件往往不满足,具有较小RTT的TCP连接会更容易在链路空闲时更快的抢到可用带宽,导致大家分配不均;
TCP连接的公平性的缺点:① 导致TCP流量容易被UDP流量抢占带宽,导致传送速率低; ② 有些基于TCP的应用使用并行连接,去占用一条链路的大部分带宽(我的连接数目越多,由于公平性,在一条链路中所占比例就越大),由此说明,多考虑别人有时并不是什么好事
第四章 网络层
4.1, 4.2 网络层提供的服务
- 网路层的功能:实现主机与主机间的通信
1. 转发(一个路由器上进行的):一个分组从一个输入链路接口转移到一个输出链路接口的路由器所采取的动作;
2. 路由选择(整个网络范围内):网络层通过路由选择算法,决定分组从发方到收方经过的路径;
3. 连接建立:为发送主机和接收主机彼此传递数据之前,先通过主机间的握手建立起所需的状态信息;
- 网络层的服务模型
因特网:尽力而为服务
ATM:恒定比特率CBR服务模型和可用比特率服务模型
- 网络层提供的服务
1. 主机到主机间的连接服务:虚电路网络实现
2. 主机到主机间的无连接服务:数据报网络实现
注:任何计算机网络体系结构中,网络层只能提供主机间的连接/无连接服务之一,而不能同时提供连接/无连接服务;
- 网络层的连接/无连接服务和运输层的差异:
1. 运输层为进程间提供服务,网络层为主机间提供服务
2. 运输层的面向连接服务仅在端系统中实现,而网络层的面向连接服务在端系统和路由器中实现;
- 虚电路(AC)网络
在一条虚电路(AC)中,由一系列路由器和链路组成;
转发表:记录分组的AC号查询转发表的:一个分组每经过一个路由器,路由器根据收到的分组的输入链路和AC号在转发表中查询,确定输出链路和要转换的AC号;
在AC网络中,该网络的每个路由器必须为进行中的连接维护 连接状态信息 (即使没有AC号转换),只要通过该路由器建立了新连接或拆除了一条连接,都会更新该路由器的转发表;
虚电路由3个阶段:虚电路建立->数据传送->虚电路拆除;
网络层中的虚电路连接与运输层中的TCP连接的区别:TCP连接仅仅只有两个端系统参与并各自独立决定连接参数,而虚电路连接沿着两个端系统之间路径上的每个路由器都会参与,且每台路由器都知道经过它的所有虚电路(两个端系统知道吗?书上没明确提)
- 数据报网络
无需建立任何虚电路,路由器不维护任何虚电路的状态信息。而是通过路由选择算法更新每个路由器中的转发表;
转发表:基于分组的目的地址查询转发表的:32bite的地址对应输出链路,路由器将收到的分组的目的地址的前缀与转发表的表项匹配(当出现多个匹配时,选择最长的前缀进行匹配),进而找到链路出口转发分组;
4.3,4.4 转发功能
- 路由器的结构
1. 路由转发平面(硬件实现)
输入端口:① 线路端接(物理层) ② 数据链路处理(协议,拆封)(链路层)③ 查找,转发,排队转发表由路由选择处理器计算和更新,但会保存一份副本到线路卡,用于实现本地查找的功能,避免了集中式处理的瓶颈
输入端口缓存:发生排队时,可能出现线路前部阻塞;
交换结构:内存;总线;纵横式;
输出端口:① 排队(缓存管理)② 数据链路处理(协议,封装)(链路层) ③ 线路端接(物理层)
输出端口所需的缓存:① 少量的TCP流时:B = 平均往返时延RTT * 链路容量C ② 大量的TCP流时: B = 平均往返时延RTT * 链路容量C / 根号N
输出端口排队:需要在输出端口上使用分组调度程序从排队的分组中选出一个发送(分组调度程序提供了服务质量保证)
输出端口缓存:通过主动队列管理(AQM算法,例如随机早期检测RED算法),在输出端口缓存满之前提前丢弃分组,并通知发送方拥塞;
2. 路由控制平面(软件实现)
路由选择处理器:通过路由选择算法计算并更新转发表,并将转发表备份在输入端口的第③部分
- 因特网的网络层的组件:1. IP协议 2. ICMP协议 3. 路由选择协议
- IPv4
IPv4的数据报格式(仅记录注意点):
标识,标志,片偏移:用于IP分片(IPv6不允许分片)
上层协议:用于粘合运输层和网络层(6代表要交给TCP,17代表要交给UDP)
首部校验和:只校验IP首部,按16bite大小的字进行计算并填入。 注:运输层和网络层都执行差错检测:① IPv4校验IP首部,运输层校验整个报文段 ② TCP/UDP与IP可能不属于同一个协议栈(TCP也能运行在ATM协议上,而IP携带的数据可能是TCP/UDP(要交给运输层),也有可能是ICMP)
注:由于往往不包含选项字段,因此通常一个(包含TCP报文段的)无分片的数据报 = 20字节的IP首部 + 20字节的TCP首部 + 应用层报文
- IP数据报分片
分片原因:在发送方到接收方之间的每段链路可能使用不同的链路层协议,导致每段链路的MTU不同,若一个路由器的入链路MTU大,出链路MTU小,则一个大的数据报必须分成几个小的片才能发出去;
分片位置:可能是路径中的任何一个路由器;
重组位置:目的端系统
实现:
标号:发送方主机在生成数据报时,为每个数据报填入了标号100,若在中间某路由器需要对其分片,则每个片的标号都是100,代表它们是一起的;
标志:除了最后一个片的标志为0,用于表明作为最后一片,前面的片都是1
偏移字段:用于表示该数据报片的有效载荷部分在原数据报中的有效载荷的偏移量(字节数 / 8)
注:分片易受攻击,因此IPv6废弃了路由器的分片功能
- IPv4编址
每个接口对应一个IP地址;
233.1.1.0/24 :子网,表示该组织内的所有主机和路由器的IP地址的公共前缀都是233.1.1.
DHCP协议(动态主机配置协议):DHCP可以通过主机主动申请的方式,为其分配一个IP地址,将主机接入网络
1. 一个ISP从ICANN机构获取一个地址块,并分配给自己的若干组织
2. 组织通过一台DHCP服务器,为本组织内的主机和路由器接口逐个分配IP地址
① 新入主机广播发送DHCP发现报文
② DHCP服务器收到并广播回复DHCP提供报文,为其分配IP地址
③ 新入主机收到并广播回复DHCP请求报文,确认自己得到的IP地址
④ DHCP服务器回复ACK进行响应
- NAT(网络地址转化)
在一个家庭网络内部,主机之间互相通信使用的是自己真正的IP和端口号,而当这个组织内的主机需要与外界网络通信时,NAT使能
路由器通过内部维护的NAT转换表将该组织的主机地址进行转换,即NAT使能路由器对外界屏蔽了家庭网络内部的细节。
NAT使能路由器:
① 内部运行一个DHCP服务器,为位于NAT-DHCP路由器控制的家庭网络地址空间的计算机提供地址;
② 这个NAT使能路由器从ISP的DHCP服务器得到它自己的地址,作为这个家庭网络与外界联系的明信片(即该家庭网络内的主机与外
界网络通信时,在该路由器处通过NAT转换表将主机本身的IP和端口号转换为明信片的地IP和端口号,并再NAT转换表中添加一个映
射表项,而外界网络对主机作出的响应在NAT路由器处会通过这条表项转换为主机的真正IP和端口号)
注:明信片的端口号由NAT路由器任意选择一个未在当前NAT转换表使用过的端口号即可
NAT的问题:P234, P235
- ICMP报文:
功能:用于路由器和主机之间沟通网络层的信息,例如差错报告,ping的请求和回答,源抑制等报文
ICMP是包含在IP的有效载荷中的,即IP数据报的上层协议可能是TCP/UDP/ICMP
4.5,4.6,4.7 路由选择功能
- 路由选择:从源路由器到目的路由器的一条好的路径(即由路由器连接起来的一段段的链路)
源路由器(源主机的默认路由器或第一跳路由器):源主机出来直接相连的第一个路由器
目的路由器(目的主机的默认路由器):经过这个路由器将直接进入目的主机
最短路径
最低费用路径
- 路由选择算法:
- 全局式?分散式?
全局式路由算法:在某个节点处输入整个网络的状态(连通性和链路费用),再进行计算。如LS算法
① 首先通过每个结点都运行链路状态广播算法,使所有节点同样都具有整个网络的视图;
② 每个结点都运行LS算法,计算出最低费用路径集合:以D算法举例
分散式路由算法:每个结点仅直到直连链路的相关信息,而没有整个网络的完整信息,每个结点通过迭代的方式,慢慢计算出到网
络中其他节点的费用(或距离)。如DV算法,以P算法举例
- 静态?动态?
静态路由选择算法
动态路由选择算法
- 负载敏感?迟钝?
- AS(自治系统)
前面的D算法/P算法都是默认一个网络中的所有路由器都运行同样的路由选择算法,且拥有彼此的信息,这不利于安全.
将整个大网络分成若干AS系统,每个AS内部自己选择合适的路由选择协议(内部每个路由器都运行相同的路由选择算法),并通过若干
台网关路由器与外部转发分组;
第五章 链路层
5.1 链路层提供的服务
- 术语
结点:主机,路由器,链路层交换机,Wifi接入点
链路:WiFi链路,以太网链路等
链路层帧:在不同的链路中运行的帧
- 链路层与网络层的联系:
每个结点的网络层负责根据某种路由选择协议判断分组要走的链路;
而在每一段链路中运行的某种链路层协议负责将帧运输到下一个结点处;
- 链路层能够提供的服务(不同种类的链路层协议有差异):
1. 成帧:将来自网络层的数据报封装成帧,再进入链路传送
2. 链路接入:规定帧在链路上何时传输?若发生冲突时,如何c++协调?(MAC协议用于多路访问问题下,协调多结点的帧传输)
3. 可靠交付:在差错发生的链路上纠正差错(常用于高差错率的链路,如无线链路),但低差错率的链路为了减小开销
往往不提供此服务(如各种有线链路),而将可靠交付的任务交给运输层
4. 差错检测和纠正:运输层和网络层通过校验和来进行差错检测; 而链路层利用硬件实现差错检测和差错纠正(通过发送控制器
在帧的首部设置差错检测和纠正比特,接收控制器进行差错检测和纠正);
注:链路层的实现(硬+软):
① 路由器的线路卡中;
② 主机的网络适配器((硬件)其中的控制器提供各种链路层服务)和CPU上的软件共同实现的;
5.2 差错检测和纠正
- 越复杂的纠错技术,更多的差错检测和纠正比特位,可以尽可能的降低发现不了错误的概率,但开销越大;
奇偶校验(以及二维奇偶校验);
检验和;
循环冗余检测(CRC):
注:运输层和网络层使用校验和,但链路层使用CRC的原因:运输层实现在主机的操作系统中用软件实现的,而链路层在网络适配器
中用专门的硬件实现,可以支持更复杂的操作,因此使用CRC可以提高检错性能;
5.3 多路访问链路以及协议
- 链路类型:
点对点链路:单个发送方和单个接收方中间的信道;如PPP, HDLC
广播链路:多个发送方和多个接收方之间的信道,只要一个发送,接收方都将收到同样的副本;如以太网和无线局域网
- 多路访问协议
1. 信道划分协议:TDM, FDM, CDMA
2. 随机接入协议:ALOHA,CSMA(例如以太网协议)
3. 轮流协议:轮询协议,令牌传递协议
5.4 MAC
- MAC地址:
1. 为何同时需要应用层的主机名,网络层的IP地址和链路层的MAC地址:保持各层独立(P309)
2. 一个适配器(即网络接口)对应一个6字节的MAC地址
3. MAC地址具有扁平结构:无论适配器移动到何处MAC地址都不会改变;
IP地址具有层次结构:即子网部分 + 主机部分,当移动到其它子网内时,IP地址会改变;
4. 适配器将数据报封装为帧时,需填入目的MAC地址,只有目的地收到该帧才会处理,其它适配器收到会丢弃;若需广播,
则目的MAC地址为FF-FF-FF-FF-FF-FF
- ARP协议:用于同一个子网内,查询到一个IP地址对应的MAC地址
每个主机和路由器的接口都包含一个IP地址+一个MAC地址+一个适配器+一个ARP模块;
每个主机和路由器的内存中都维护一个ARP表:IP地址和MAC地址的映射,以及TTL值。
当发送主机只知道目的IP地址,则需要通过ARP获得目的MAC地址,发送方的网络层向链路层的适配器提供数据报,并且提供
目的MAC地址,适配器才能将数据报封装成一个链路层帧发进局域网。
1. 若主机的ARP表中包含目的结点的表项,就可以直接索引到该项;
2. 若主机的ARP表不含目的节点的表项,ARP模块就构造一个ARP请求分组(包含源IP/MAC地址,目的IP/MAC地址),发送主机的
适配器将ARP请求分组封装为链路层帧发入子网中,填入的目的MAC地址为6字节的FF广播地址,则发送主机所在的子网内每个主机
和路由器的适配器都会收到此帧,并把帧中的ARP请求分组取出向上传给各自的ARP模块,各自对比自己的IP地址和ARP请求分组中
的目的IP地址。与其匹配的那个给查询主机回复一个ARP相应分组,里面携带了自己的MAC地址,这样查询主机收到后就能更新自己的
ARP表,得到了目的MAC地址后,发送方就能向其发送分组;
注:
1. DNS解析为因特网中任何地方的主机将主机名解析为IP地址
2. ARP解析只为同一个子网内的主机或路由器将IP地址解析为MAC地址,若跨越了不同的子网,则以两个子网的网关路由器作为中继,
先通过ARP将分组传到网关路由器的输入链路,网关路由器通过查询转发表,将其转发到输出链路的接口,在输出链路接口所在的子网
再继续通过ARP,去找目的主机;
- 以太网
- 以太网帧结构
前同步码:用于源和目的适配器进行同步
目的MAC地址:
源MAC地址:
类型:用于说明将数据上传给何种上层协议(如ARP协议,IP协议或其他网络层协议)
数据:46~1500字节,MTU=1500,最小为46(若不够需要填充)。以IP数据报为例:可通过IP首部的首部长度和数据报长度字段
来去除填充部分
CRC:链路层的循环冗余校验
注:以太网技术向网络层提供无连接服务:类似于IP和UDP的无连接服务
同样以太网像网络层提供不可靠服务:没有ACK或NAK机制,若接收方的适配器未通过CRC,则丢弃,发送方并不知道这一点。
上一篇: 关于STM32外部中断配置