仓库源文站点原文


title: "计算机网络简要" categories: Tech updated: 2021-06-08 comments: true

mathjax: false

参考

只记录了大体框架.

<!-- more -->

概述

互联网的组成

从工作方式看, 可以分为边缘部分, 即连接在互联网上的主机, 是用户直接使用的部分, 主机称为端系统 (end system); 以及核心部分, 由大量网络和连接这些网络的路由器组成, 为边缘部分提供服务.

进行通信的是进程 (process). 端系统间的通信方式有 Client/Service, P2P (peer to peer).

路由器 (router) 是一种专用计算机, 是实现分组交换 (packet switching) 的关键构件, 任务是转发收到的分组.

分组交换采用存储转发技术. 要发送的整块数据称为一个报文 (message), 先把它分为更小的等长数据段, 每个数据段前加上首部 (header) 后就构成了一个分组 (packet), 也叫 "包". 首部包含了目的地址和源地址等控制信息. 路由器收到分组时, 先暂时存储一下, 检查首部, 查找转发表, 按照首部中的目的地址, 找到合适的接口转发到下一个路由器直至主机.

分组交换的好处

协议

TCP/IP 是四层结构, 学习时以五层结构来讲. 协议只针对同层之间的通信, 是 "水平的". 服务是 "垂直的", 由下层向上层通过接口提供.

首部可以看成 "信封", 传输时一层层套信封, 最后一层层解开信封. 路由器只有底下三层, 没有运输层.

网络层

网络层向上只提供简单灵活的, 无连接的, 尽最大努力交付的数据报 (datagram) 服务. 数据报, IP 数据报, 分组是同义词. 在发送分组时不需要先建立连接, 每个分组独立发送 (不编号). 网络层不提供服务质量的承诺. 分组可能出错, 丢失, 重复, 失序, 也不保证交付时限. 这使得路由器简单, 价格低廉. 可靠性由运输层负责, 就是端系统自己保证, 而不是靠网络保证.

网际协议 IP

Internet Protocol.

虚拟互连网络

将网络连接起来的中间设备.

互连之后的网络看成虚拟互连网络 (internet), 称为 IP 网. 即逻辑互连, 利用 IP 使得物理上各异的网络在网络层上看起来好像是一个统一的网络. 如果在覆盖全球的 IP 网的上层使用 TCP, 那么就是现在的互联网.

IP 地址

IP 地址是给互联网上每一台主机或路由器的每一个接口分配一个在全世界范围内是唯一的 32 位的标识符. IP 地址的结构方便寻址. 为了提高可读性, 就有点分十进制标记法.

硬件地址又称为物理地址或 MAC (media access control) 地址, 是指局域网上的每一台计算机中固化在适配器的 ROM 中的地址. 物理地址是数据链路层和物理层使用的地址, 而 IP 地址是网络层及以上各层使用的地址, 是一种逻辑地址.

尽管互连在一起的网络硬件地址体系各不相同, 但 IP 层抽象的互联网却屏蔽了下层这些很复杂的细节. 只要我们在网络层上讨论问题, 就能使用统一的, 抽象的 IP 地址研究主机和主机或路由器之间的通信.

编址方法的三个历史阶段.

无分类域间路由选择 CIDR (classless inter-domain routing). 消除了传统的分类地址以及划分子网的概念, 因而能更加有效地分配 IPv4 的地址空间. 把 32 位的 IP 地址划分为前后两个部分, 前面部分是 "网络前缀", 指名网络, 后面部分用来指名主机. 还使用 "斜线记法" (slash notation), 或者叫 CIDR 记法, 即在 IP 地址后面加上斜线 /, 然后写上网络前缀所占的位数.

为了更方便地进行路由选择, CIDR 使用 32 位的地址掩码 (address mask). 由一串 1 和一串 0 组成, 1 的个数就是网络前缀的长度. 虽然 CIDR 不适用子网了, 但由于目前还有一些网络使用子网划分和子网掩码, 地址掩码也可继续称为子网掩码. 例如 /20 地址块的掩码就是连续 20 个 1 再接 12 个 0.

网际控制报文协议 ICMP (Internet Control Message Protocol). ICMP 报文作为 IP 层数据报的数据, 有两种, ICMP 差错报告报文和 ICMP 询问报文.

IPv6 每个地址占位 128 位, 点分十进制记法也不够方便了, 改用冒号十六进制记法.

网络地址转换 NAT

Network Address Translation. 专用 (private).

为了更加有效地利用 NAT 路由器上的全球 IP 地址, 现在常用的转换表把运输层的端口号也利用上. 这样就可以使多个拥有本地地址的主机共用一个 NAT 路由器上的全球 IP 地址.

硬件茶谈. (2020, Aug 21). 【硬件科普】IP 地址是什么东西? IPv6 和IPv4 有什么区别? 公网 IP 和私有 IP 又是什么?. bilibili.

运输层

概述

运输层提供通信服务. IP 虽然能将分组送到目的主机, 但是这个分组还停留在网络层而没有交付应用进程.

逻辑通信: 数据实际按照虚线传送, 但是底下的细节在运输层看不到, 就好像两个运输层之间直接传送一样. 网络层为主机之间提供逻辑通信, 而运输层为应用进程之间提供逻辑通信.

运输层还要对报文进行差错检测. 网络层只检验首部, 不检查数据部分. 传送的数据单位是 TCP 报文段 (segment) 或 UDP 用户数据报.

单个计算机中的进程使用进程标识符 (一个不大的整数) 标志, 但这不适用与互联网. 解决方法是在运输层使用协议端口号 (protocol port number), 简称端口. 虽然通信的终点是应用进程, 但只要把报文交到目的主机的目的端口, 剩下的工作就由 TCP 或 UDP 来完成.

TCP/IP 的运输层用一个 16 位端口号标志一个端口. 端口号只具有本地意义, 标志本计算机应用层中的各个进程和运输层交互时的层间接口. 由此, 两个计算机中的进程需要通信, 不仅要知道对方的 IP 地址 (为了找到对方的计算机), 也需要知道对方的端口号 (为了找到对方计算机中的应用进程).

用户数据报协议 UDP

User Datagram Protocol. 只在 IP 的数据报服务上增加了很少的一点功能.

首部由 4 个字段组成, 每个字段 2 个字节. 源端口, 目的端口, 用户数据报的长度, 检验和.

如果接收方 UDP 发现报文中的目的端口号不正确, 就丢弃该报文, 并由 ICMP 发送 "端口不可达" 差错报文给发送方.

传输控制协议 TCP

Transmission Control Protocol.

可靠传输

出现差错时, 让发送方重传出现差错的数据; 同时在接收方来不及处理收到的数据时, 及时告知发送方适当降低发送数据的速度.

停止等待协议

只讨论原理, 因此把传送的数据单位都称为分组, 不考虑是在哪个层次上传送的. "停止等待" 就是每发完一个分组就停止发送, 等待对方的确认, 在收到确认后再发送下一个分组.

发送方记为 A, 接收方记为 B.

出现差错就丢弃,其他什么也不做 (不通知 A). A 发送完一个分组后, 暂时保留副本以备重传, 直到收到确认再清除副本.

如果 B 收到了分组, 但是发送的确认丢失了. A 在设定的超时重传时间到后重传了分组, B 收到了重复的分组. 此时, B 要丢弃重复的分组, 并向 A 发送确认.

这种可靠传输协议称为自动重传请求 ARQ (automatic repeat request), 即重传的请求是自动进行的.

连续 ARQ 协议

上面的协议显然信道利用率太低.

位于图中发送窗口内的 5 个分组都可连续发送出去, 而不需要等待对方的确认. 发送方每收到一个确认, 就把发送窗口向前滑动一个分组的位置.

接收方一般采用累积确认的方式. 即不必对收到的分组逐个发送确认, 而是收到几个分组后, 对按序到达的最后一个分组发送确认.

TCP 报文段的首部

一个 TCP 报文段分为首部和数据两部分. 前 20 字节固定, 后面 4n 个字节按需增加.

TCP 可靠传输

不妨假定数据传输只在一个方向进行, A 发送, B 确认. 滑动窗口以字节为单位. 假定 A 收到了 B 发来的确认报文段, 确认号为 31 (表明序号直到 30 的数据都收到了).

TCP 流量控制和拥塞控制略.

TCP 运输连接管理

运输连接有三个阶段: 连接建立, 数据传送, 连接释放.

连接建立过程解决三个问题

主动发起连接的应用进程叫客户 (client), 被动等待连接建立的进程叫服务器 (server).

TCP 连接建立

TCP 连接建立的过程叫握手, 需要交换三个 TCP 报文段. 三报文段握手 (three way handshake) 实际是一次握手过程中交换了三个报文段, 而不是进行了三次握手 (handshake 是单数).

最初两端的 TCP 进程都处于 CLOSED (关闭) 状态. 主机下面的方框表示 TCP 进程所处的状态.

一开始 , B 的 TCP 服务器进程先创建传输控制块 TCB, 进入 LISTEN (收听) 状态, 等待客户的连接请求.

A 的 TCP 客户进程也是先创建传输控制块 TCB, 然后发出连接请求报文段, 首部同步位 SYN = 1, 初始序号 seq = x. SYN 报文段不能携带数据, 但要消耗掉一个序号. 进入 SYN-SENT (同步已发送) 状态.

B 收到连接请求报文段, 如同意连接, 则向 A 发送确认. 确认报文段 SYN = 1, ACK = 1, 确认号是 ack = x+1, 同时也为自己选择一个初始序号 seq = y. 这个报文段也不能携带数据, 但要消耗掉一个序号. 进入 SYN-RCVD (同步收到) 状态.

A 收到 B 的确认后, 还要向 B 给出确认, 报文段 ACK = 1, 确认号 ack = y + 1, 自己的序号 seq = x + 1. ACK 报文段可以携带数据, 但如果不携带数据则不消耗序号 (即下一个数据报文段依然 seq = x+1). 此时 TCP 连接已经建立, 进入 ESTABLISHED 状态.

B 收到 A 的确认后, 也进入 ESTABLISHED 状态.

为什么 A 最后还要发送一次确认? 主要是为了防止已失效的连接请求报文突然又传到了 B (比如之前长时间滞留在半路上), 因而产生错误. 如果 B 收到了已失效的连接请求报文, 直接建立了连接, 那么就会一直干等, 白白浪费了资源

TCP 连接释放

四报文握手.

现在 A 和 B 都处于 ESTABLISHED 状态. A 先发出连接释放报文段, 首部 FIN = 1, 序号 seq = u, 为前面传送过的数据的最后一个字节的序号 +1. A 进入 FIN-WAIT-1 状态. 即使 FIN 报文段不携带数据, 也消耗一个序号.

B 收到连接释放报文段后发出确认, 确认号 ack = u + 1, 自己的序号是 v, 为 B 已经传送过的数据的最后一个字节的序号 +1. B 进入 CLOSE-WAIT 状态. TCP 服务器进程此时通知应用进程, 因而 A 到 B 的连接就释放了, 这时 TCP 连接处于半关闭状态, 即 A 已经没有数据要发送了, 若 B 发送, A 仍要接受.

A 收到确认后, 进入 FIN-WAIT-2 状态.

B 发出连接释放报文段, FIN = 1, ack = u + 1, seq = w (B 可能又发送了一些数据). 进入 LAST-ACK (最后确认) 状态.

A 收到连接释放报文段后, 发出确认, ACK = 1, ack = w + 1, seq = u + 1. 进入 TIME-WAIT (时间等待) 状态. 经过时间等待计时器设置的时间后, A 进入 CLOSED 状态.

为什么还要等一段时间?

应用层

域名系统 DNS

Domain Name System. 方便把机器名字转换为 IP 地址.

为什么分组要使用 IP 地址而不使用域名? 因为 IP 地址长度固定, 而域名长度不固定, 机器处理起来比较困难.

域名到 IP 地址的解析 (resolve) 是由分布在互联网上的许多域名服务器程序共同完成的. 当某一个进程需要解析主机名时, 调用解析程序, 称为 DNS 的一个客户, 把待解析的域名放在 DNS 的请求报文中, 以 UDP 用户数据报方式发给本地域名服务器 (用 UDP 目的是减少开销). 本地域名服务器查找域名后, 把对应的 IP 地址放在回答报文中返回. 若本地域名服务器不能回答, 则向其他域名服务器发出查询请求.

任何一个连接在互联网上的主机或路由器, 都有一个唯一的层次结构的名字, 即域名. "域" 是名字空间中一个可被管理的划分. 例如

mail.cctv.com

最后面的 com 是顶级域名, 然后 cctv 是二级域名, mail 是三级域名. 域名不区分大小写. 通用顶级域名: com (公司企业), net (网络服务机构), org (非营利性组织), edu (美国专用的教育机构, 比如中国的则是 edu.cn), gov (美国的政府部门) 等.

硬件茶谈. (2020, Sep 30). 【硬件科普】能上 QQ 但是打不开网页? 详解 DNS 服务, DNS 解析, DNS 劫持和污染. bilibili.

万维网 WWW

World Wide Web. 万维网是一个分布式的超媒体 (hypermedia) 系统, 是超文本 (hypertext) 系统的扩充. 所谓超文本是指包含指向其他文档的链接的文本. 超媒体则可以包含其他表示形式的信息, 如图像, 声音, 视频等.

万维网以客户服务器方式工作. 需要解决几个问题

URL

URL 是与互联网相连的机器上的任何可访问对象的一个指针. 由四部分组成:

<协议>://<主机>:<端口>/<路径>

常用协议 http, https. HTTP 默认端口号是 80, 通常可以省略. 若再省略路径, URL 就指向某个主页 (home page).

HTTP

HTTP 定义了浏览器 (即万维网客户进程) 如何向万维网服务器请求万维网文档, 以及服务器怎样把文档传送给浏览器.

何明科. (2016, Feb 15). 为什么 2015 年底各大网站都纷纷用起了 HTTPS?. 知乎.

代理服务器 (proxy server)

是一种网络实体, 又称为万维网高速缓存.

在服务器上存放用户的信息

虽然前面提到 HTTP 是无状态的, 但是实际一些网站希望能够识别用户, 这时可以使用 Cookie 来跟踪用户. 这里 Cookie 表示在 HTTP 服务器和客户之间传递的状态信息.

当用户 A 浏览某个使用 Cookie 的网站时, 该网站的服务器就位 A 产生一个唯一的标识码, 并以此作为索引在服务器的后端数据库中产生一个项目. 接着在 A 的 HTTP 响应报文中添加一个叫做 Set-cookie 的首部行. 例如

Set-cookie: 31d4d96e407aad42

当 A 收到这个相应时, 浏览器就在它管理的特定 Cookie 文件中添加一行, 包括服务器的主机名和 Set-cookie 后面的识别码. 当 A 继续浏览这个网站时, 每发送一个 HTTP 请求报文, 其浏览器就会从其 Cookie 文件中取出这个网站的识别码, 并放到 HTTP 请求报文的 Cookie 首部行中.

Cookie: 31d4d96e407aad42

HTML

XML (extensible markup language) 是可扩展标记语言, 设计宗旨是传输数据, 而 HTML 则是显示数据. XML 标记由文档的作者定义, 而 HTML 标记是预定义的.

CSS (cascading style sheets) 是层叠样式表, 是一种样式表语言, 用于为 HTML 文档定义布局, 格式化结构化的内容.

上面讨论的都是静态文档. 就是在创作完毕后放在服务器中, 被浏览的过程中, 内容不会改变. 动态文档是动态创建的 (脚本). 脚本指的是一个程序, 它被另一个 (解释) 程序而不是计算机的处理机来解释或执行. 专门的脚本语言有 JavaScript 等, 也可用常见编程语言如 C/C++ 来写脚本.

动态文档一旦建立, 其所包含的信息内容也就固定下来而无法即使刷新屏幕. 有两种技术可用于浏览器屏幕显示的连续更新. 一个是服务器推送, 把所有工作交给服务器, 这显然不好. 另一种是活动文档 (active document), 把所有工作转移给浏览器端, 服务器返回一段活动文档程序副本使该副本在浏览器端运行 (如 Java 等).

搜索引擎

关键词通配符* or "精确匹配 可带空格避免拆分" 
-不包含 +包含 
site:网址 
filetype:pdf 
inurl:gov.cn allinurl:movie video 
intitle:stanford allintitle:xx

其中 allinurl 表示后面两个关键词同时出现在 url 中.

define:字典查词

搜狗可以搜索微信.