【总结】计算机网络基础
2020-12-05
计算机网络概述
因特网是一个世界范围的计算机网络,各个端系统之间通过通信链路(Communication link)和分组交换机(Packet switch)连通,传输速率(比特/秒,bit/s,bps)为衡量端到端之间连通性能指标。
协议定义了在两个或多个通信实体之间交换的报文格式和次序,以及报文发送和接受一条报文后其他事件采取的动作。
分组交换和电路交换
电路交换(circuit switching)是以电路连接为目的的交换方式,通信之前要在通信双方之间建立一条被双方独占的物理通道。
- 电路交换网络中的复用:频分复用(Frequency-Division Multiplexing,FDM)和时分复用(Time-Division Multiplexing,TDM);
- 静默期(silent period)指连接没有数据交换;
分组交换(packet switching)是以分组为单位进行传输和交换的,它是一种存储-转发交换方式,即将到达交换机的分组先送到存储器暂时存储和处理,等到相应的输出电路有空闲时再送出。
- 报文(message):端系统之间交换数据的单位;
- 分组(packet):源系统向目的端系统时,源系统将长报文划分为较小的数据块,分组通过通信链路和分组交换机(packet swich,路由器和链路层交换机)传送;
- 储存转发机制:交换机能够开始向输出链路传送第一个比特之前,必须接受到整个分组;
- 路由选择协议:每台路由器具有一个转发表(forwarding table),用于将目的地址映射成输出链路;
- 丢包(packet lost):交换机的输出缓存空间有限,当等待发送的数据占据全部缓存空间,新分组数据将会被丢弃;
- 延时:总时延 = 处理时延 + 排队时延+ 传输时延 + 传播时延
- 节点处理时延(nodal processing delay):检查分组首部、决定分组去向、检查比特级别的差错;
- 排队时延(queuing delay):分组在链路上传输速率,取决于流量;
- 传输时延(transmission delay):当所有分组均到达后才能开始向下一个端发送;
- 传播时延(propagation delay):在通信链路上出传输的时间;
电路交换和分组交换的区别在于:分组交换简单、高效、成本低,并且带宽共享,但不适合实时服务;电路交换使用专用电路,可以预测延时,但效率低。
分层的体系结构
- OSI七层协议:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
- TCP/IP四层协议:网络接口层、 网际层、运输层、 应用层。
- 因特网五层协议:物理层、数据链路层、网络层、运输层、应用层。
因特网五层协议每层的作用和协议:
- 物理层:通过媒介传输比特,确定机械及电气规范;协议:IEEE802.3。
- 数据链路层:将比特组装成帧和点到点的传递;协议:PPP,MAC。
- 网络层:负责数据包从源端系统到目的端系统的传递,以及网际互连;协议:IP,ICMP,ARP。
- 传输层:提供端到端的可靠或不可靠报文传递,以及错误检查和恢复;协议:TCP、UDP。
- 应用层:应直接向应用程序接口并提供常见的网络服务,包括创建、管理、终止会话(会话层),以及数据加密、解密和压缩(表示层);协议:HTTP、FTP、SMTP、WWW、DNS、NFS。
应用层
应用程序体系结构(application architecture)规定了如何在各种端系统上组织应用程序。当前主流体系有:
- 客户-服务器体系结构(client-service architecture):总有一个打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求,客户相互之间不直接通信。
- 对等体系结构(P2P architecture):对位于数据中心的专用服务有最小(或无)依赖,相反,应用程序在间断连接的主机之间使用之间通信,这些主机被称为对等方。
进程通过套接字(socket)的软件接口向网络发送报文和从网络接收报文,套接字也称为应用程序和网络之间的应用程序编程接口(Application Programming Interface, API)。
HTTP 超文本传输协议
超文本传输协议(HypeText Transfer Protocol,HTTP)是 Web 的应用层协议。网络应用的客户端、服务器端运行在不同的端系统上,通过交换 HTTP 报文进行会话,HTTP 规定了报文的结构和交换方式。HTTP 是一种无状态协议(Stateless Protocol),即服务器不保存客户状态,但它使用 TCP 作为运输协议,TCP 保证了数据的传输。
HTTP 有两种连接方式:非持续连接(Non-persistent Connection),每个请求/响应对是经过单独的TCP连接发送;持续连接(Persistent Connection),所有请求/响应对是经过相同的TCP连接发送。非持续连接需要对每个请求的对象建立一个新的TCP连接,增大了服务器的压力(HTTP 报文中 Connection 字段表示连接方式,close指不希望使用持续连接)。
HTTP 中的 GET 和 POST
- 从原理性看:
- 根据 HTTP 规范,GET 用于信息获取,而且应该是安全和幂等的;
- 根据 HTTP 规范,POST 请求表示可能修改服务器上资源的请求;
- GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包(header 和 body 分两个包);
- 从表面上看:
- 后退/刷新:GET 是无害的,但是 POST 数据会被重新提交;
- 书签:GET 可以被储存为书签,POST 不可以;
- 缓存:GET 可以被缓存,POST 不行;
- 历史:GET 方法的参数会被储存在历史中,POST 的不会;
- 对数据长度的限制:当发送数据时,GET 方法向 URL 添加数据,URL 的长度是受限制的,而 POST 方法将数据放在 HTTP 包内,所以没有限制;
- 对数据类型的限制:GET 只允许 ASCII 字符,POST 没有限制;
- 安全性:GET 参数为 URL 的一部分,所以相比 POST 安全性要差;
- 参数可见性:GET 参数可以在 URL 中看到,POST 不可以;
HTTP 和 HTTPS 区别:HTTP 协议运行在 TCP(80端口)之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 协议运行在 SSL/TLS 协议上,SSL/TLS 协议运行在 TCP(443端口) 上,所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。
session 和 cookie 机制:session 技术是服务端的解决方案,它通过服务器来保持状态的;cookie 技术是客户端的解决方案,它是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息,所以 cookie 存在于四处(HTTP响应报文中的一个 Cookie 首部;HTTP 请求报文中的一个 Cookie 首部;客户端系统保留的 Cookie,由浏览器管理;位于Web站点的一个后端数据库)。
DNS 域名系统
DNS 服务是一个实现查询主机名对应IP地址的黑盒服务,当应用程序希望查询一个主机名对应的IP地址时,会将主机名传递给运行在端系统上的 DNS 客户端,由DNS客户端向DNS服务器查询,最后返回IP地址给应用程序。DNS 解析过程有两种:
- 迭代式查询:请求主机向本地 DNS 服务器发送查询请求,本地 DNS 服务器如果没有对应的记录,则向根 DNS 服务器查询,获得对应顶级域 DNS 服务器的IP地址,然后向顶级域 DNS 服务器查询对应权威 DNS 服务器的 IP 地址。最后从权威 DNS 服务器处获取获取目标IP地址,返回给请求主机。
- 递归式查询:请求主机向本地 DNS 服务器发送查询请求,本地 DNS 服务器向对应根 DNS 服务器查询,根DNS服务器向顶级域名服务器查询,顶级域名服务器向权威服务器查询,最后再逐层返回给请求主机。
运输层
运输层协议为运行在不同主机上的应用程序之间提供了逻辑通信(Logic Communication)功能。由于网络层协议可能发生分组丢失、篡改和冗余,并且不能保证字段的机密性,所以运输层协议为应用程序提供可靠的数据传输服务,且通过加密保证应用程序不被入侵。
运输层的基本任务(可靠数据传输和拥塞控制为 TCP 提供):
- 主要任务:将两个端系统间IP的交付服务扩展为运行在端系统上两个进程之间的交付服务,即运输层的多路复用(Transport-layer Multiplexing)与多路分解(Transport-layer Demultiplexing)。
- 差错检查:差错检查字段保证数据的正确性。
- 可靠数据传输(Reliable Data Transfer):通过流量控制、序号、确认和定时器实现。
- 拥塞控制(Congestion Control):所有连接平等共享链路带宽。
多路复用和多路分解
多路复用指从不同套接字中收集数据块,并为每个数据块封装上运输层信息;多路分解指将运输层报文段中的数据交付到正确的套接字。
- 对于无连接的多路复用和多路分解:UDP 套接字由目的IP地址和目的端口号组成;
- 对于面向连接的多路复用和多路分解:TCP 套接字由源 IP 地址、源端口号、目的 IP 地址和目的端口号组成,不同的源 IP 地址和源端口号所对应的套接字不同(除非携带初始建立连接请求);
UDP 用户数据报协议
用户数据报协议(User Datagram Protocol,UDP)实现了运输层的多路复用和多路分解,以及少许的差错检测。DNS 运输层的协议为 UDP 协议。
- 优点:
- 关于何时、发送什么数据的应用层控制更为精细,而TCP具有拥塞控制机制;
- 无需建立连接,无建立连接造成的时延;
- 无连接状态,而TCP端系统中需要维护TCP连接状态;
- 分组首部开销小,TCP为20b,UDP为8b;
- 争议:
- UDP 无拥塞控制,无法预防互联网拥塞;
- 可靠传输需要通过应用程序中的机制来实现;
TCP 传输控制协议
传输控制协议(TCP,Transmission Control Protocol)是面向连接的(Connection-oriented),它的连接状态只维护在两个端系统中。TCP 连接是全双工服务(Full-duplex Service)和点对点(Point-to-Point)服务(全双工指同一时间内支持信号的双向传输)。
TCP 三次握手
- 客户端发送一个请求建立连接的报文给服务端。
- 服务端接收到请求报文,为连接分配缓存和变量,并返回一个确认报文。
- 客户端接收到 SYNACK 报文,为连接分配缓存和变量,并返回一个确认报文。
为什么要进行三次握手:主要目的防止server端一直等待,浪费资源。
TCP 四次挥手
- 主动关闭方发送一个 FIN,用来关闭主动方到被动关闭方的数据传送。
- 被动关闭方收到 FIN 包后,发送一个 ACK 给对方。
- 被动关闭方发送一个 FIN,用来关闭被动关闭方到主动关闭方的数据传送。
- 主动关闭方收到 FIN 后,发送一个 ACK 给被动关闭方。
为什么要四次挥手:由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
KeepAlive:当超过一段时间之后,TCP 自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。
TCP 重传机制:要保证所有的数据包都可以到达,就必需要有重传机制。而在 TCP 中接收端给发送端的 ACK 确认只会确认最后一个连续的包。例如发送端发送了1-5一共5份数据包,接收端收到了1和2,于是回复 ACK=2,然后又收到了4,但是3还未收到。
- 超时重传机制:死等3,当发送方发现收不到3的 ACK 超时后,会重传3。一旦接收方收到3后,会回复Ack=4,意味着3和4都收到了;而对于发送方,重发数据有两种选择:
- 仅重传timeout的包,这种方法节省带宽,但是慢,需要等待接收方的确认。
- 重传timeout后面所有的包,这种方法虽然较快,但是浪费带宽。
- 快速重传机制:发送端收到了三个 ACK=2 的确认后,知道3发送失败,会重新发送3。
- SACK 方法:在 TCP 头里加一个 SACK 的东西,ACK 还是Fast Retransmit 的 ACK,SACK 则是汇报收到的数据碎版。通过 SACK 选项可以使 TCP 发送方只发送丢失的数据而不用发送后续全部数据,提高了数据的传输效率。
SYN泛洪攻击(SYN Flood Attack):发送大量的SYN报文请求建立连接,而不完成第三次握手,导致服务器不断为半开连接分配资源直至资源耗尽。
TCP 拥塞控制
滑动窗口协议:滑动窗口协议是传输层进行流控的一种措施,它允许发送方在停止并等待确认前发送多个数据分组。发送窗口大小 swnd = min(rwnd, cwnd),其中 rwnd 为接收窗口大小,cwnd 为拥塞窗口。(例:连续ARQ协议)
拥塞控制:
- 慢启动状态(Slow-start):初始 cwnd 值较小,为一个最大报文段(MSS)大小。
- 每接收到一个确认报文,cwnd 增加一个的 MSS,即无拥塞状态下指数增长;
- 当 cwnd 大于等于 ssthresh 时,慢启动模式停止,进入拥塞避免模式;
- 出现丢包事件,采用快速重传机制;
- 检测到3个冗余ACK,采用快速恢复机制;
- 拥塞避免状态:每个 RTT 只将 cwnd 增加一个 MSS,线性增加。
- 出现丢包事件,采用快速重传机制;
- 检测到3个冗余ACK,采用快速恢复机制;
- 快速重传机制:ssthresh=cwnd/2,cwnd=1,进入慢启动状态。
- 快速恢复机制:ssthresh=cwnd/2,cwnd=ssthresh,进入拥塞避免状态。
网络层
IP 网际互连协议
网际互连协议(Internet Protocol,IP)规定了因特网的转发和编址。
- Ipv4:IP 长度32 bit,2的32次方个IP地址,一般按点分十进制记法(Dotted-Decimal Notation)。
- Ipv6:扩大地址的容量 32 bit 到 128 bit,并增加了任播地址(Anycast Address),交付给一组主机中的任意一个。
- 子网(Subnet):分开主机和路由器的每个接口,产生几个隔离的网络岛,每个隔离的网络岛就是一个子网。
- 子网掩码(Network Mask):标识子网IP地址有效位。
路由选择协议
路由器的路由转发平面(Router Forwarding Plane)负责转发数据;路由控制平面(Router Control Plane)负责路由选择。而路由选择协议(Routing Protocol)规定了如何计算路由控制平面中的路由表。
交换机和路由器的区别:交换机工作于数据链路层,用来隔离冲突域,连接的所有设备同属于一个广播域(子网),负责子网内部通信;路由器工作于网络层,用来隔离广播域(子网),连接的设备分属不同子网,工作范围是多个子网之间,负责网络与网络之间通信。
链路层
ARP 协议地址解析协议
ARP的作用是将IP地址解析为MAC地址,只为一个子网上的主机和路由器解析。
- 每台主机和路由器在内存中具有一个 ARP 表,包含 IP 地址到 MAC 地址的映射关系,以及一个寿命值,指示了从表中删除映射的时间。
- 无记录或记录过期时,通过 ARP 分组,包含源和目的IP地址,以及源端系统的 MAC 地址,查询目的 IP 地址的 MAC 地址;查询方式为通过广播地址,向子网中所有端进行询问,匹配者通过单播向源 IP 地址发送 ARP 响应。
ARP 协议与 DNS 协议的对比:DNS 协议将主机名解析为 IP 地址,作用于因特网中任何地方;而 ARP 协议是将 IP 地址解析为MAC地址,只为一个子网上的主机和路由器解析。
RARP 协议
RARP是逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站。
- 发送主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址。
- 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址。如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;如果不存在,RARP服务器对此不做任何的响应。
- 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。
参考文献
- 《计算机网络:自顶向下方法(原书第6版)》(豆瓣),原作名: Computer Networking:A Top-Down Approach,Sixth Edition,作者James F.Kurose,美国马萨诸塞大学阿默斯特分校;Keith W.Ross,纽约大学理工学院,译者陈鸣。
- 《计算机网络》阅读笔记 - Jerakrs