《计算机网络自顶向下方法》前三章笔记
第一章:计算机网络和因特网
端系统通过 通信链路 和 分组交换机 连接到一起
分组 当一台端系统向另外一台端系统发送数据时,发送端系统将数据分段,并为每段加上首部字节,形成的信息包称为分组
分组交换机 用于转发接收的分组的设备(路由器和链路层交换机)
链路层交换机用于接入网中,路由器用于网络核心中
可以将因特网类比于货物运输:分组类似于卡车,通信链路类似于高速公路和公路,分组交换机类似于交叉口 ,而端系统类似于建筑物
ISP(因特网服务提供商):每个ISP自身就是由多台分组交换机和多段通信链路组成的网络
TCP/IP协议:
- TCP(Transmission Control Protocol)传输控制协议
- IP(Internet Protocol)网络协议
端系统
端系统也被称为主机,可以容纳应用程序
如Web浏览器程序、Web服务器程序、电子邮件客户程序或者电子邮件服务器程序
端系统还可以进一步的分为两类:客户端和服务端
接入网
接入网是指端系统连接到边缘路由器(端系统到任何其他远程端系统路径上的第一台路由器)的网络
存储转发传输和转发时延
存储转发传输机制:交换机在传输整个分组的第一个比特之前,必须接收到整个分组
交换机要接收完整个分组后,才能转发这个分组
排队延时和分组丢失
排队延时
到达的分组需要传输到某条链路,但是链路用于传输其他分组,那么该到达的分组必须在输出缓存中等待,产生的时延取决于网络的阻塞程度
分组丢失
缓存空间有限,缓存空间已满,若还有分组到来,到来的分组将被丢弃或者排队的分组之一被丢弃
转发表和路由选择协议
每个端系统都有IP地址,当源主机向目的端系统发送一个分组时,源在该分组首部包含了目的地地IP地址。
路由器会检查这个IP地址,通过查找转发表(目的地址和输出链路之间的一种映射关系),选择该分组的输出链路
电路交换和分组交换
电路交换:在连接期间在网络链路上预留了带宽,发送方能够以恒定速率向接受方发送数据
电路交换的明显缺点是对于网络资源的利用率不高
例如:打电话的一个人停止讲话,空闲的网络资源(在沿该连接路由的链路中的频段或时隙)不能被其他进行中的连接所使
分组交换相较于电路交换
- 有更好的带宽共享
- 比电路更加简单、更有效、实现成本更低
分组交换中的时延
节点总时延=节点处理时延+排队时延+传输时延+传播时延
-
节点处理时延(us或者更低)
路由器检查分组首部,决定分组导向何处的时间
检查比特级差错的时间等
-
排队时延(ms到us级)
分组在缓存中排队等待传输的时间
-
传输时延(ms到us级)
传输时延=L/R
L:bit表示该分组的长度
R :链路传输速率,单位为 bps=b/s
-
传播时延(ms量级)
传播时延=d/s
distance:两个路由器之间距离
speed:链路传播速率
传输时延和传播时延的区别
-
传输时延:路由器将分组推出所需要的时间
- 与分组长度、链路传输速率有关
- 与两个路由器之间距离、链路传播速率无关
-
传播时延:是将一个bit从一个路由器传输到另一个路由器所需要的时间
- 与分组长度、链路传输速率无关
- 与两个路由器之间距离、链路传播速率有关
排队时延
流量强度:La/R
a:分组到达队列的速率(pkt/s)
L:每个分组都是由L个比特位组成(bit)
La:每个比特位到达队列的速率
R:传输速率(bit/s=bps)
若流量强度>1,表示到达速率超过传输能力,排队将无限延伸
端到端时延
源和目的主机之间有N-1台路由器,并且忽略排队时延
端到端时延=N(处理时延+传输时延+传播时延)
端到端吞吐量
吞吐量:接收文件的速率
在实际网络中,吞吐量取决于
m
i
n
R
1
,
R
2
,
R
3
.
.
.
R
N
min{R_1,R_2,R_3...R_N}
minR1,R2,R3...RN,最小吞吐量的链路称为瓶颈链路
通常网络核心中链路的传输速率很高,因特网中对吞吐量的限制因素通常是接入网
如果许多其他的数据流也通过这条链路流动,一条具有高传输速率的链路仍然可能成为文件传输的瓶颈链路
5层因特网协议栈
-
应用层
HTTP协议、SMTP协议、FTP(两个端系统之间的文件传送)协议、域名系统(DNS)
报文 位于应用层的信息分组称为报文
-
运输层
-
TCP
1:提供面向连接的服务
2:提供可靠传输
3:流量控制(发送方和接收方速率匹配)
4:拥塞控制机制(网络拥塞时,源抑制其传输速率)
-
UDP
1:提供无连接服务
2:提供不可靠传输
3:无流量控制
4:无拥塞控制
将运输层的分组称为报文段
-
-
网络层
- 网络层包括网际协议IP,IP仅有一个,所有网络层的因特网组件需要运行IP
- 网络层也包括决定路由的路由选择协议
网络层数据分组称为数据报
-
链路层
- 链路层包括以太网、WIFI、电缆接入网的DOCSIS协议
- 数据报从源到目的可能经过几个不同的链路:上一段数据报可能被链路层以太网和下一段链路上的WIFI处理
链路层数据分组称为帧
-
物理层
物理层的任务就是将链路层中的帧中的一个一个bit从一个节点移动到下一个节点
与实际传输媒体有关
七层OSI模型
应用层、表示层、会话层、运输层、网络层、数据链路层、物理层
表示层:让通信的应用程序能够解释交换数据的含义(数据压缩、数据加密、数据描述)
会话层:提供数据交换定界和同步功能
封装
在上图中,链路层交换机有链路层和物理层,只能实现链路层包含的协议(以太网、WIFI等)
而路由器拥有三层网络协议,包含网络层、链路层和物理层,能够实现(IP、路由选择协议和以太网、WIFI协议)
分组:首部字段+有效载荷字段
例如:从运输层传输到网络层的报文,网络层增加了源和目的端系统地址这样的网络层首部信息
计算机网络和因特网的历史
分组交换发展:1961-1972
20世纪60年代:电话网广泛应用,电路交换技术比较成熟
第一个分组交换计算机网络:ARPA-net
TCP、IP、UDP在20世纪70年代末在概念上就已经完成
20世纪90年代Web应用程序出现,互联网开始爆炸式的广泛传播
第二章:应用层
应用层包含两种体系结构:服务器-客户端结构和P2P结构
不同主机进程之间通信通过套接字来实现
识别其他主机上的进程:IP+端口号
TCP/UDP
TCP
- 面向连接的服务
- 可靠数据传输
- 拥塞控制(当出现网络拥塞时,抑制源或者目的的发送速率)
- 流量控制(控制接收方和发送端发送速率一致)
UDP
-
提供差错检验功能(但无法修改差错)
-
无连接服务
-
不可靠数据传输
-
无拥塞控制
-
无流量控制
-
应用层协议HTTP
HTTP
HTTP协议是一个无状态协议(不保存客户的任何信息)
非持续性连接和持续性连接
非持续性连接:在相同客户端和服务器之间,每个请求/响应是经过一个单独的TCP连接发送,每个TCP连接只传输一个请求报文和响应报文
持续性连接:在相同客户端和服务器之间,所有请求/响应是经过相同TCP连接;如果一个连接经过一定时间间隔仍然未被使用,HTTP服务器就会关闭连接
GET和POST方法的区别
- Get参数通过URL传递,而Post通过表单提交信息
- Get只能发送ASCII码,Post能发送更多的数据类型
- Post用于修改和提交数据,Get一般用于搜索排序和筛选之类的操作
- Post相较于Get方法更安全
Web缓存
条件GET方法
在Web代理服务器中,可以使用条件GET方法来请求初始服务器中资源,保证代理服务器中的资源是最新的
SMTP
电子邮件的三个组成部分:用户代理、邮件服务器和简单邮件传输协议
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dw7y6t3u-1650637256061)(Markdown图片包/image-20220419180823453.png)]
- 客户 SMTP (运行在发送邮件服务器主 机上)在 25 号端口建立一个到服务器 MTP (运行在接收邮件服务器主机上)的 TCP 连接
- 如果服务器没有开机,客户会在稍后继续尝试连接
- 建立连接成功后,SMTP 的客户和服务器在传输信息进行握手
- 提供的可靠数据传输(TCP协议)传送邮件
- SMTP协议是一个推操作
工作流程:
DNS(Domain Name System)
IP地址和主机名之间的目录服务,主要作用是将用户提供的主机名解析为IP地址
DNS运行在UDP上,使用53号端口
工作详情:
分布式的DNS服务器
根服务器、顶级域DNS服务器、权威DNS服务器
DNS记录和报文
所有DNS都存储了资源记录,资源记录是一个包含了下列字段的4元组
( N a m e , V a l u e , T y p e , T T L ) (Name,Value,Type,TTL) (Name,Value,Type,TTL)
Name和Value取决于Type
-
Type=A:(relayl.bar.foo. com, 145. 37. 93. 126, A) 就是一条类型A记录
-
Type=NS:(foo com, dns. foo. com, NS) 就是一条类型为 NS 的记录
-
Type=CNAME:(foo. com, relay1.bar. foo. com, CNAME) ,
Name:别名 Value:规范主机名
-
Type=MX:(foo.com, mail.bar.foo. com , MX)
Name:别名 Value:邮件服务器规范主机名
P2P
参与一个特定文件分发的所有对等方集合称为一个洪流
追踪器 记录用户是否在洪流中,当一个对等方加入洪流中时,会向追踪器注册自己,并周期性通知追踪器其在洪流中
在任何给定的时间,每个对等方都将具有来自文件的块的子集
如何请求:比如一个名为Alice的对等方申请最稀缺的块(在其他邻居中最少的块),那么最少的块就能更更加迅速的重新分发
如何发送:Alice向以最高速率向她提供数据的邻居发送数据
视频流
视频存在在HTTP服务器作为一个普通文件,每个特定的文件都有一个URL
用户需要看视频时,客户与服务器之间建立一个TCP连接并发送GET请求
服务器以尽可能快的速率在HTTP响应报文中发送视频文件
字节被收集在客户端的应用缓存中,如果缓存中的字节数超过限制,程序就开始播放视频
流式视频应用程序周期性的从客户端缓存中抓取帧,同时缓存视频后面部分的帧
DASH
针对不同比特率版本,服务器提供一个URL和比特率,动态选取视频播放质量
CDN
视频缓存服务器
第三章:运输层
网络层IP网际协议
IP服务模型是尽力而为交付服务,在通信的之间交付报文段,但是不做任何保证
不能保证报文段的交付,不能保证报文段按序交付,不能保证报文段数据的完整性
端口号
端口号是一个16比特的数,0~1023范围端口号为周知端口号(HTTP协议端口、SMTP协议端口之类的)
运输层的多路复用和多路分解
多路分解:将运输层报文段中数据交付给正确的套接字,每台端系统有多个套接字接口
多路复用:从源主机中收集数据块,并为每个数据块封装上首部信息,生成报文段,将报文段传递到网络层
UDP面向无连接的多路分解和多路复用
主机上的每个套接字能够分配一个端口号,当报文到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字
然后报文段中的数据通过套接字进入所连接的进程
通过二元组:源端口号、目的端口号
假设在主机A的一个进程的UDP端口为19157,主机B的一个进程的UDP端口号为46284
1:主机A的运输层先创建一个运输层报文段,包含:应用程序数据,源端口号、目的端口号和其他值
2:A运输层将得到的报文段传递给网络层,网络层将报文段封装到IP数据报中(增加主机B的IP地址)
3:网络层尽力的将报文段交付给主机
4:主机B检查网络层交付的报文段,检查报文段中的目的端口号46284,并将这个报文段交付给 端口46284所识别的套接字
源端口号的作用是:当主机B要发送报文段给主机A时,可以提取源端口号作为目的端口号
TCP面向连接的多路分解和多路复用
通过四元组:源IP地址、源端口号、目的IP地址、目的端口号
UDP
UDP适合的类型
即时传输:TCP为确保数据可靠传输,会出现连接创建时延,对于实时性的数据传输并不适用,UDP即发即传
无连接的(不可靠传输):在发送报文之前,发送发和接收方的运输层实体之间是没有握手的
无连接状态:UDP无需要维护连接状态,也不需要跟踪连接的参数
分组首部开销小:UDP相比于TCP有更小的首部开销
UDP报文段结构
每个字段有2两个字节,一个字段16位,首部总共有4个字节
目的端口号<1024:从客户端传到服务器
源端口号<1024:从服务器传到客户端
源端口为占用两个字节,0632:0000 0110 0011 0010=2+16+32+512+1024=1536+50=1586,源端口号
目的端口号占用两个字节,00 0D:00000000 00001101=13,服务器端口号
UDP长度占用两个字节,00 1C:00000000 0001 1100=16+8+4=28
数据部分长度:28-8=20字节
长度字段表示:首部+报文的字节总数
提供差错检验功能(但无法修改差错)
检验和+其他字节16bit和为1111111111111111,如果比特之一是0,就出现差错
检验和字段是:所有两个字节16bit和的反码(如果溢出,末尾加一,进行回卷)
可靠信道传输
可靠传输主要是依靠:差错检验(检验和)、丢包处理、接收方反馈(肯定确认ACK、否定确认NCK)、定时器机制、重传机制
流水线可靠数据传输
GBN
包3、4、5接收后仍然被丢弃,因为分组2丢失,回退4步后重新发送分组2、3、4、5
SR
单独重传,分组2丢失后,3、4、5接收到后不丢弃,收到分组2后一并确认
TCP
- 可靠数据传输:能保证报文段正确地、按序的将数据发送给接收进程
- 拥塞控制:力求每一个通过拥塞网络链路的连接平等的共享网路链路带宽
发送缓存和接收缓存
TCP报文段
TCP首部字节通常是20字节
TCP连接
SYN:同步序号,表示建立连接;TCP规定SYN=1时不能携带,但是要消耗一个序号
seq:序列号,表示将从这个字节起始开始传送数据,包括这个字节
ack:确认序号,表示响应
三次握手
1:确认客户端发送能力
- 客户端TCP向服务器TCP发送一个特殊的TCP报文段,不包含应用层数据,设置SYN标志位为1,随机消耗一个序列号
- 客户端随机选取一个初始序号(client_isn),将其放入到序号字段中
2:确认服务器的接收和发送能力
- 服务器从数据报中提取TCP SYN报文段,为TCP连接分配TCP缓存和变量
- 服务器发送允许连接的报文段,SYN设置为1;服务器收到报文并确认收到,设置ACK=client_isn+1
- 服务器选取自己的初始序号放入到序号字段(server_isn)
3:确认客户端的接收能力,客户端可以发送数据
- 在收到服务器的报文段后,客户给连接分配缓存和变量
- 对服务器允许连接的报文进行确认,设置ACK=server_isn+1,序号字段=client_isn+1,SYN=0
TCP三次握手能改成两次握手吗?为什么?
-
由TCP性质决定,TCP是可靠传输,需要接收方接收到的数据是完整、有序、无差错的;
- 这是由TCP中的序号和确认号确定的:如果只是两个握手,客户端就不知道服务器的传送数据的起始序号server_seq,客户端在接收数据过程中容易出现丢包现象
- 要确认双方的发送和接收能力:两次握手只检验了客户端的发送和服务器的接收和发送能力,但没有检验客户端的接收能力
-
有可能会资源浪费情况
假设客户端发送连接请求,但因为这个连接请求报文段延时过长,而没有收到确认;
此时客户端又发送一次连接请求,这次连接被服务器收到确认后,就开始传输数据,传输完毕后,连接关闭;
滞留的第一次请求连接的报文段随后达到服务器,服务器确认后,等待客户端发送数据,但此时客户端以传输完毕,造成资源浪费
四次挥手
TCP拥塞控制
-
端到端拥塞控制:在这种拥塞控制方法中,由发送数据的端系统自己来判断是否拥塞,然后调整传输速率。
-
网络辅助的拥塞控制:由网络中的路由器来告诉发送方,网络的拥塞情况。一般有两种方式:
(1)路由器直接向发送端发送报文,告知网络拥塞情况;
(2)路由器更改数据段中的某个标志,来提示网络中的拥塞情况,然后数据将这个标志携带到目的主机,再由目的主机根据这个标志,向发送端发送报文,告知拥塞情况(被包含在确认报文中);
TCP面临的三个问题
1:如何限制数据发送速率
拥塞窗口cwnd,当网络拥塞时,TCP将减小cwnd;网络畅通时,增大cwnd,来控制数据发送速率
2:如何检测网络中是否拥有拥塞
- 若发送一条数据段后,成功接收到了接收方的确认报文,则可以认为网络没有拥塞;
- 若发送出一条数据段后,在规定时间内没有收到确认报文(丢失或时延太大),则可以认为网络出现了拥塞;
- 若连续收到接收方对同一条报文的三次冗余确认,则可以推测那条报文丢失,即发生了拥塞;
3:采用什么算法来调整速率
采用慢启动和拥塞避免算法
MSS:最大报文段长度
cwnd:拥塞窗口(发送但还没有确认的报文序号在这个区间)
RTT:往返时间,发送方发送一个报文,到接受到报文确认所经历的事件
ssthresh:慢启动阈值,慢启动阶段,若cwnd大小到达这个值,将转换到拥塞避免模式
慢启动
初始 cwnd=1MSS,报文段被确认后;以cwnd=2MSS发送报文段,报文段确认后,以cwnd=4MSS发送报文段…
慢启动结束条件:cwnd>ssthresh,结束慢启动模式,进入拥塞避免模式
拥塞避免
每个RTT对cwnd值增加一个MSS
每个ACK到达增加MSS/cwnd字节:比如MSS是1460字节,并且cwnd是14600字节,则在一个RTT发送10个报文段,每个到达的ACK增加1/10MSS,10个报文段确认后,拥塞窗口将增加一个MSS
拥塞避免结束条件:
1:出现超时器超时的丢包现象:设置ssthresh=cwnd/2,重置cwnd=1MSS,进入慢启动模式
2:检测到3个冗余ACK:ssthresh=cwnd/2;cwnd=ssthresh+3MSS,进入拥塞避免模式
TCP流量控制
提供一个速度匹配服务,即发送方的发送速率和接收方的应用程序读取速率相匹配
TCP通过维护一个接收窗口rwnd来进行流量控制,用来指示接收方还有多少可用的缓存空间
对于接收主机B:
-
rwnd:接收方还有多少可用的缓存空间
-
RcvBuffer:接收缓存大小
-
LastByteRead:主机B上的应用程序从缓存读出的数据流的最后一个字节编号
-
LastByteRcvd:从网络中到达的并且放入主机B接收缓存中数据流的最后一个字节编号
L a s t B y t e R c v d − L a s t B y t e R e a d < = R c v B u f f e r LastByteRcvd-LastByteRead<=RcvBuffer LastByteRcvd−LastByteRead<=RcvBuffer
r w n d = R e v B u f f e r − [ L a s t B y t e R c v d − L a s t B y t e R e a d ] rwnd=Rev Buffer - [ LastByteRcvd - LastByteRead ] rwnd=RevBuffer−[LastByteRcvd−LastByteRead]
对于发送主机A:
- LastByteSent:发送的最后一个字节编号
- LastByteAcked:确认到的最后一个字节编号
L a s t B y t e S e n t − L a s t B y t e A c k e d LastByteSent - LastByteAcked LastByteSent−LastByteAcked :主机发送到连接中但未被确认的数据量
L a s t B y t e S e n t − L a s t B y t e A c k e d < r w n d = R e v B u f f e r − [ L a s t B y t e R c v d − L a s t B y t e R e a d ] LastByteSent - LastByteAcked<rwnd=Rev Buffer - [ LastByteRcvd - LastByteRead] LastByteSent−LastByteAcked<rwnd=RevBuffer−[LastByteRcvd−LastByteRead]
当主机B的接收窗口为0时,主机A继续发送只有一个字节数据的报文段,这些报文段将会被接收方确认最终缓存将开始清空,并且确认报文里将包含一个非0 的rwnd值
这是因为主机B缓存满后,无任何数据告知主机A