计算机网络

本文最后更新于:2023年3月30日 晚上

第一章-计算机网络和因特网

因特网构成

  • 手机、电脑、电视等接入互联网的“物品”称为主机(host)端系统(end system)
  • 链接上述终端的是通信链路(communication link)分组交换机(packet switch)
  • 链路有**传输速率(transmission rate)**,单位是比特每秒(bps);
  • 端向端发送的数据,分段后加上首部字节,这些信息包称为分组(packet)
  • 两条链路间,转发分组的称为分组交换机,最著名的如路由器(router)链路层交换机(link-layer switch);
  • 端到端之间,一个分组经历的所有链路和分组交换机称为路径(route 或 path)
  • 端系统通过因特网服务提供商(Internet Service Provider, ISP)接入因特网;
  • 以上因特网部件都要运行一系列协议(protocol)TCP(Transmission Control Protocol,传输控制协议)IP(Internet Protocol,网际协议)是两个最重要的协议;
  • IP协议定义了在路由器与端系统之间发送和接收的分组格式;
  • 设计多个端交互数据的程序,称为分布式应用程序(distributed application)

What is Protocol ?

协议(protocol)定义了两个或多个通信实体间交换的报文的格式和顺序,以及发送/接收报文时采取的动作。

接入网

这是指将端系统物理连接到其边缘路由器(edge router)的网络。
边缘路由器是端系统到任何其他远程端系统的路径上的第一台路由器。
住户通常从提供本地电话接入的本地电话公司处获得数字用户线(Digital SubscriberDSL)因特网接入。因此,当使用DSL时,用户的本地电话公司也是它的ISP。

卫星无线电信道

通常使用两类卫星:同步卫星(geostationary)近地轨道卫星(Low-Earth Orbiting, LEO)

存储转发传输

存储转发传输指交换机开始向输出链路传输该分组第一个bit前,必须先完整收到整个分组。

电路交换

网络链路和交换机移动数据有两种基本方法:电路交换(circuit switching)分组交换(packet switching)
链路中的电路是通过频分复用 (Frequency- Division Multiplexing, FDM )时分复用
(Time-Division Multiplexing, TDM)
来实现的。

时延

这些时延最为重要的是节点处理时延(nodal processing delay) 排队时延(queuing delay)传输时延
(transmission delay)传播时延(propagation delay)
,这些时延总体累加起来是**节点总时延(tolal nodal delay)**。

令Q表示分组到达队列的平均速率(a的单位是分组/秒,即pkt/s)o前面讲过尺是传输速率,即从队列中推出比特的速率(以bps即b/s为单位)。为了简单起见,也假定所有分组都是由厶比特组成的。则比特到达队列的平均速率是La bps。最后,假定该队列非常大,因此它基本能容纳无限数量的比特。比率La/R被称为流量强度(traffic intensity),它在估计排队时延的范围方面经常起着重要的作用。如果La/R>l,则比特到达队列的平均速率超过从该队列传输岀去的速率。在这种不幸的情况下,该队列趋向于无限增加,并且排队时延将趋向无穷大!因此,流量工程中的一条金科玉律是:设计系统时流量强度不能大于1

协议分层

下层为上一层提供服务(service),各层的所有协议称为协议栈(protocol stack)。
因特网的协议栈由5个层次组成:物理层、链路层、网络层、运输层和应用层

  • 应用层信息分组:报文(message);
  • 运输层:报文段(segment);
  • 网络层:数据报(datagram);
  • 链路层:帧(frame);
  • 物理层;

OSI模型
应用层、表示层、会话层、运输层、网络层、数据链路层、物理层。

封装

封装(encapsulation)。一个应用层报文传送给运输层,首部会附带上附加信息,这些一起构成了运输层报文段。再加上另外的首部信息,给到网络层,生成了网络层数据包。接下来生成链路层帧。
一个分组具有两种类型的字段:首部字段和**有效载荷字段(payload field) **



第二章

DNS

DNS:Domain Name System 域名系统。

DNS 是:

  • 一个由分层的 DNS 服务器实现的分布式数据库;
  • 一个使得主机能够查询分布式数据库的应用层协议。

DNS 服务器通常是运行在 BIND (Berkeley Internet Nmae Domain)软件的 UNIX 机器。DNS 协议 运行在 UDP 上使用 53 端口。

DNS 将用户提供的主机名(www.kawa.com 类似的)解析为 IP 地址。

DNS 可以将主机别名进行解析,方便使用

DNS 的记录和报文

共同实现 DNS 分布式数据库的所有 DNS 服务器存储了 **资源记录(Resource Record)**,RR 提供主机名到 IP 地址的映射。
RR 包含以下字段的四元组:

1
(Name, Value, Type, TTL)

TTL 是记录的生存时间,它决定了资源记录应当从缓存中删除的时间。
Name 和 Value 的值取决于 Type:

  • 若 Type = A ,则 Name 是主机名, Value 是该主机名对应的 IP 地址。
  • 若 Type = NS,则 Name 是个域(如 foo.com),而 value 是个知道如何获得该域
    中主机IP地址的权威DNS服务器的主机名,例如(foo.com, dns.foo.com, NS)
  • 若 Type = CNAME,则 Value 是别名为 Name 的主机对应的规范主机名。例如(foo.com, relay1.bar. foo. com, CNAME)就是一条 CNAME 类型的记录。
  • 若 Type = MX,则Value 是个别名为 Name 的邮件服务器的规范主机名。举例来说,(foo.com, mail. bar. foo. com, MX)就是一条MX记录。

DNS报文

  • 前12字节是首部区域

P2P 文件分发

最稀缺优先(rarest first),针对自身没有的块,优先在其邻居中决定最稀缺的块(副本数最少的块),并请求之。

视频流和内容分发网

经 HTTP 的动态适应流 (Dynamic Adaptive Streaming over HTTP, DASH)
在 DASH 中,视频编码为几个不同的版本,每个版本由不同的比特率,对应不同质量水平。

内容分发网(Content Distribution Network,CDN)
CDN管理分布在多个地理位置上的服务器,在它的服务器中存储视频(和其他类型的Web内容,包括文档、图片和音频)的副本,并且所有试图将每个用户请求定向到一个将提供最好的用户体验的CDN位置。
CDN 可以是专用 CDN ,也可以是第三方 CDN。
CDN 部署核心是集群选择策略(cluster selection strategy),即动态地将用户定向到 CDN 中某个服务器集群或数据中心。
一种策略是地理上最为接近(geographically closest)的集群。


系统性学习

基本概念

信道

就是传送信息的通道

信道的类型

物理信道 & 逻辑信道

信道的带宽

带宽指的是:某个信道在单位时间内最大能传输多少bit的信息。
在计算机领域中,带宽指数字带宽,单位是“比特率”或“字节率”。

带宽的单位

大写字母 B表示“字节”,小写字母 b 表示“比特”。
【10进制】中,K 表示 1000 , M 表示 1000 x 1000;
【2进制】中,K 表示 1024, 表示 1024 x 1024;

国际上的约定:若是二进制,在 K 后面加一个 i ;
如:
1Kbps 表示“1000比特每秒”;
1KiBps 表示“1024字节每秒”;

信道工作模式: 单工、半双工、全双工

单工

方向单一,如电台 -> 收音机 可以,但收音机 -> 电台 是不行的。

半双工

方向双向,但同一时刻只能有一个方向进行传输数据。
类似火车轨道,双向都能走,但是不能同时两个方向都来车(撞车了)。

全双工

【同时相向】传播可行。
如:光纤。

从“分层”到“参考模型”

分层

对于网络通讯,不太可能用一种通讯协议完成所有的信息传递任务,故需要多种协议。
采用【分层】的设计思路,让多个层次的协议在一起协同工作,技术上称作“协议栈”(protocol stack)。

协议栈的原理

对于多层次的协议栈,每个层次都有各自的“端点”。
处于【同一层次】的两个端点,使用该层次的协议进行通讯。(一个层次的协议,可能有一个有可能有多个)
除最顶层外,每个层次的端点向其【直接】上层提供“服务”;除最底层外,上层的端点调用【直接】下层提供的“服务”。(服务,技术行话为“API”,即接口)

OSI 参考模型的7层

层次 中文名 英文名
7 应用层 Application Layer
6 表示层 Presentation Layer
5 会话层 Session Layer
4 传输层 Transport Layer
3 网络层 Network Layer
2 数据链路层 Data Link Layer
1 物理层 Physical Layer

物理层

为什么需要物理层(必要性)

物理层是物质层次上的数据传输,例如光纤中的光信号,无线电通讯等等,其依赖于物理媒介进行通讯。

物理层的主要职责是:屏蔽其他细节,除物理层之外的其他地方,无需考虑物理上的数据传输。

信噪比(Signal-to-noise ratio)

噪声(Noise):对于“物理信道”,传输过程中收到的环境干扰,产生的无用数据,称之为噪声。

而“信道传输的有用信息”与“无用的干扰噪声”之比,称之为信噪比。

信噪比的单位是【分贝】(decibel)。“deci”表示十进制,“bel”是为了纪念贝尔。

多路复用(Multiplexing)

对信道的复用,能提升信道传输信息的效率。

频分多路复用(Frequency-Division Multiplexing,FDM)

将频率拆分,不同的线路占用不同频段,互不干扰。

缺点:

  • 需要足够宽的频段(频段是稀缺资源);
  • 不同线路流量变化,某频段的线路若空闲,则其频段被浪费。

时分多路复用(Time-Divition Multiplexing,TDM)

这种思路只用一个很窄的频段。为了在同一个频道发送多个信道,采用【分时机制】,把时间切割成很小的时间片,每个线路占用一个时间片。周而往复。

这个思路有点像十字路口的红绿灯——每隔一段时间,其中一条路可以通行。

缺点:线路过多,则等待时间长。

码分多路复用(Code-Divition Multiplexing,CDM)

同一端点使用不同的编码策略,使发出的数据包互不干扰。

物理层的协议实现

物理层的设备

调制解调器(modem)

用于翻译“数字信号 & 模拟信号”。

在发送信息时,modem 把电脑要发送的“字节流”(数字信号)翻译成“模拟信号”,然后通过物理介质发送出去;当它从物理介质收到“模拟信号”,再翻译成“数字信号”,传回给电脑。

中继器(repeater)

信号在传输过程中,能量会随着距离衰减,”中继器“则负责【信号增益】,使信号传达更远距离。

集线器(hub)

可以把“集线器”视作更牛逼的“中继器”——“中继器”只有两个口(只能连接两个通讯端点),而“集线器”有多个口(同时连接多个通讯端点)。

n in 1

链路层

链路层的必要性

对信息打包

链路层将物理层收到的流(一堆比特)打包,方便上层协议处理。链路层的数据称之为帧。

差错控制

链路层负责检查物理层的传输是否出错。

流量控制

防止发送方发送数据的速度大于接收方处理数据的速度。

信道复用

某些物理介质可能是【半双工】,所有这些物理层的限制,都使得“多路复用”变得复杂。为了解决这些问题,链路层需要提供了某种相应的机制(协议),术语叫做“介质访问控制”(洋文是“Media Access Control”,简称 MAC)。

差错控制

为了检查传输的信息是否出错,设计了许多相应的数学算法。

检错算法:对传输数据计算出一个【校验值】,接收方收到数据会重新计算校验和,若算出来不对,则丢弃数据令其重发。

MAC 协议

“MAC 协议”用来确保对下层物理介质的使用,不会出现冲突。

假设有一条【单轨】铁路连接 A/B 两地。有很多火车想从 A 开到 B,同时还有很多火车想从 B 开到 A。
首先,要确保不发生撞车(如果已经有车在 A 开往 B 的途中,那么 B 就不能再发车);其次,即使是同一个方向的车,出发时间也要错开一个时间间隔。
所有这些协调工作,都是靠“MAC 协议”来搞定。

MAC 地址

为了完成上述任务,光有“MAC 协议”还不够,还需要为每一个端点引入【惟一的】标识。这个标识就称作“MAC 地址”。

通俗地说,每个网卡都内置了一个“MAC 地址”。这个地址是网卡在出厂的时候就已经设置好的,并且用某种机制确保该地址【全球唯一】。

MAC 地址包含6个字节(48个比特),分为两半。第一部分称作【OUI】,OUI 的24个比特中,其中2个比特有特殊含义,其它22个比特,用来作为网卡厂商的唯一编号。这个编号由国际组织 IEEE 统一分配。

MAC 地址第二部分的24比特,由网卡厂商自己决定如何分配。每个厂商只要确保自己生产的网卡,后面这24比特是唯一的,就行啦。

MAC地址构成如下图:

“虚拟网卡”是由【虚拟化软件】创建滴。IEEE 也给每个虚拟化软件的厂商(含开源社区)分配了唯一的 OUI。因此,虚拟化软件在创建“虚拟网卡”时,会使用自己的 OUI 生成前面24个比特;后面的24比特,会采用某种算法使之尽可能【随机化】。由于“2的24次方”很大(224 = 16777216),碰巧一样的概率很低。
  (注:如果手工修改 MAC 地址,故意把两块网卡的 MAC 地址搞成一样,那确实就做不到唯一性了。并且会导致链路层的通讯出问题)

链路层相关的【网络设备】

网络交换机(network switch)

此处引用某网络牛人的叙述,真的很幽默风趣且有道理。。

1
2
3
4
5
6
(注:一般提到“网络交换机”,如果不加定语,指的就是“2层交换机”;此外还有更高层的交换机,在后续章节介绍)
  为啥要有交换机捏?俺拿“以太网的发展史”来说事儿。
  以太网刚诞生的时候,称之为“经典以太网”,电脑是通过【集线器】相连。“集线器”前面提到过,工作在【1层】(物理层),并不理解链路层的协议。因此,集线器的原理是【广播】模式——它从某个网线接口收到的数据,会复制 N 份,发送到其它【每个】网线接口。假设有4台电脑(AB、C、D)都连在集线器上,A 发数据给 B,其实 C & D 也都收到 A 发出的数据。显然,这种工作模式很傻逼(低效)。由于“经典以太网”的工作模式才“10兆”,所以集线器虽然低效,还能忍受。
  后来要发展“百兆以太网”,再用这种傻逼的广播模式,就不能忍啦。于是“经典以太网”就发展为“交换式以太网”。用【交换机】代替“集线器”。
  交换机是工作在2层(链路层)的设备,能够理解链路层协议。当交换机从某个网线接口收到一份数据(链路层的“帧”),它可以识别出“链路帧”里面包含的目标地址(接收方的 MAC 地址),然后只把这份数据转发给“目标 MAC 地址相关的网线接口”。
  由于交换机能识别2层协议,它不光比集线器的性能高,而且功能也强得多。比如(稍微高级点的)交换机可以实现“MAC 地址过滤、VLAN、QoS”等多种额外功能。

简单来说,网络交换机负责将需要传输给对应 MAC 地址的包,定向单独地,传输给指定目标。

网桥/桥接器(network bridge)

“交换机”通常用来连接【同一种】网络的设备。有时候,需要让两台不同网络类型的电脑相连,就会用到【网桥】。

例如,宿主机与虚拟机之间进行互ping,需要设置桥接模式。

现在,假设你的物理电脑(Host OS)只安装了【无线网卡】(WiFi),而虚拟化软件给 Guest OS 配置的通常是【以太网卡】。显然,这是两种【不同】的网络。为啥 Guest OS 的以太网卡设置为“bridge 模式”之后,外部 WiFi 网络可以看到它捏?
奥妙在于——虚拟化软件在内部悄悄地帮你实现了一个“网桥”。这个网桥把“Host OS 的 WiFi 网卡”与“Guest OS 的以太网卡”关联起来。WiFi 网卡收到了链路层数据之后,如果接收方的 MAC 地址对应的是 Guest OS,网桥会把这份数据丢给 Guest OS 的网卡。
这种网卡模式之所以称作“bridge 模式”,原因就在于此。

链路层相关软件

嗅探抓包工具(Sniffer)

这些攻击能捕获流经你网卡的所有的【链路层】数据包。

关于 ARP 协议

地址解析协议(Address Resolution Protocol),其基本功能为透过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。它是IPv4中网络层必不可少的协议,不过在IPv6中已不再适用,并被邻居发现协议(NDP)所替代。

假设主机A和B在同一个网段,主机A要向主机B发送信息,主机A首先查看自己的ARP表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全为0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。

总结,若 A 中无目的主机的 MAC 地址,则广播一个 ARP 请求报文,去让 B 收到该报文,并返回它自己的 MAC 地址给 A 以接收数据。

网络层

网络层的必要性

路由机制(routing)

由于 OSI 模型中,链路层本身【不】提供路由功能,即不是”直接“相连的主机之间,无法进行通信。

而对于复杂网络,很多端点间可能没有【直接链接】。为了在这些端点间建立链接,需要某种机制,让其他端点帮忙转发数据,这就是”路由机制”的引入。

IP地址

链路层提供了全球唯一的地址编码方式(MAC 地址),但 MAC 地址存在一些问题:

  • MAC 地址是固定的;
  • MAC 地址基于【厂商】,无法体现【网络】的拓扑结构。对“路由机制”不友好。

所以引入更抽象的地址,也就是“网络层地址”。即 IP 地址。

如果把 MAC 地址看作每个人的身份证号,在学校、公司内用身份证号来确定一个人,可以,但不方便(数据库系统课上也有相关概念,主键设计这些)。于是给每个人一个学号、员工id,由年级、院系等成分构成,对当前层次(单位)更加友好。

类似道理,每个网卡都有自己固定的 MAC 地址,当这个网卡接入到不同的网络,每次都可以再分配不同的“网络地址”。通过“网络地址”可以看出这个网卡属于哪个网络(对路由比较方便)。

网际互连

引入网络层的另一个目的是:屏蔽不同类型的网络之间的差异,实现”Network of networks“的建立。

一般来说,要想联通【异种】网络,就要求每个网络中都有一台主机充当【网关】(gateway)。【网关】起到“中介/翻译”的作用——帮不同的网络翻译协议,使得不同的网络可以互相联通。

假设【没有】统一的网络层,网关的工作就很难做。就好比说:如果全球没有某种通用的自然语言,就需要培养非常多不同类型的翻译人才(假设有30种主要语言,任意两种互译,就需要几百种不同的翻译人才)。

反之,如果有了某种统一的网络层标准,问题就好办多了(还是假设有30种主要语言,只要选定某种作为通用语,然后培养29种翻译人才,就可以实现任意两种语言互译)。

如今的互联网时代,【IP 协议】就是那个充当统一标准的网络层协议。

总结下网络层的作用

  • 实现路由,不直连端点间的通信;
  • 将主机用其所处的不同的网络划分,给其分配 IP 地址;
  • 统一协议,实现网际互连。

关于路由

当主机 A 向主机 B 发送网络层的数据时,大致会经历如下步骤:

1.
A 主机的协议栈先判断“A B 两个地址”是否在同一个子网(“子网掩码”就是用来干这事儿滴)。
如果是同一个子网,直接发给对方;如果不是同一个子网,发给本子网的【默认网关】。
(此处所说的“网关”指“3层网关/网络层网关”)
2.
对于“默认网关”,有可能自己就是路由器;也可能自己不是路由器,但与其它路由器相连。
也就是说,“默认网关”要么自己对数据包进行路由,要么丢给能进行路由的另一台设备。
(万一找不到能路由的设备,这个数据就被丢弃,于是网络通讯出错)
3.
当数据到达某个路由器之后,有如下几种可能——
3.1
该路由器正好是 B 所在子网的网关(与 B 直连),那就把数据包丢给 B,路由过程就结束啦;
3.2
亦或者,路由器会把数据包丢给另一个路由器(另一个路由器再丢给另一个路由器) …… 如此循环往复,最终到达目的地 B。
3.3
还存在一种可能性:始终找不到“主机 B”(有可能该主机“断线 or 关机 or 根本不存在”)。为了避免数据包长时间在网络上闲逛,还需要引入某种【数据包存活机制】(洋文叫做“Time To Live”,简称 TTL)。
通常会采用某个整数(TTL 计数)表示数据包能活多久。当主机 A 发出这个数据包的时候,这个“TTL 计数”就已经设置好了。每当这个数据包被路由器转发一次,“TTL 记数”就减一。当 TTL 变为零,这个数据包就死了(被丢弃)。

对于某些大型的复杂网络(比如互联网),每个路由器可能与其它 N 个路由器相连(N 可能很大)。对于上述的 3.2 情形,它如何判断:该转发给谁捏?

这时候,“路由算法”就体现出价值啦——一般来说,路由器内部会维护一张【路由表】。每当收到一个网络层的数据包,先取出数据包中的【目标地址】,然后去查这张路由表,看谁距离目标最近,就把数据包转发给谁。

总结:路由就类似一个个寝室敲门,问老张在不在里面,一个个敲下去。。。

关于电路交换与分组交换

电路交换:可以理解为打电话,要建立链接后,独占信道,进行通信;

分组交换:类似微信、email,是留言的形式,不建立连接,发过去就行,让数据包自己路由,在网络中跑动到目的地。

对于“电路交换”,一旦建立连接,同一个连接的所有数据都走相同的路径(会经过完全相同的路由器)。也就是说,传输的过程中,如果某个路由器挂掉了(网络掉线 or 硬件当机 or 软件崩溃)。那么,该路由器正在处理的 N 个连接全都要报废。而“分组交换”则更加灵活——即使某个路由器挂掉了,后续的数据包会自动转向另外的路由器,损失很小。

IP 地址

“IP 地址”的32比特,分为两部分:第1部分用来标识【子网】,第2部分用来标识该子网中的【主机】。

这两部分各占用多少比特,是不确定的。在这种情况下,“操作系统协议栈”如何知道哪些比特标识“子网”,哪些比特标识“主机”捏?奥妙在于【子网掩码】。所以,大伙儿在给系统配置 IP 地址的时候,通常都需要再设置一个【子网掩码】,就这个用途。

但目前 IPv4 地址正在枯竭,其最多表示【2的32次方】即42亿左右的不同地址,如今,全球网民几十亿。。。IP地址开始不够用了。

关于 IPv6 。IPv6 采用16字节的设计,可表达2的128次方,设计 IPv6 的人自豪地宣称:即使给地球上的每一粒沙子分配一个 IPv6 地址,依然绰绰有余(确实没有吹牛,“2的128次方”是天文数字)。

但 IPv6 的缺点在于,【无法】向下兼容原有的 IP 协议(原有的协议叫“IPv4”)。IPv6 的普及一直比较慢,这是主要原因。

网络地址转换(NAT)

用了这招,还是只要申请一个公网 IP,分配给内网的网关(网关有两个网卡,一个接内网,一个接公网)。然后在内网的网关配置 NAT 功能,自动就可以让内网的每台电脑访问外网。

网络层的设备

路由器

3层交换机

“3层交换机”是在“2层交换机”的基础上,增加了对网络层的处理。因此,它可以做到类似路由器的效果——在几个子网之间转发数据。

与路由器的差别在于:”3层交换机“链接的几个子网是【同种】的网络;而路由器可以链接【异种】网络。

ping命令

ping 使用 ICMP 协议测试某个远程主机是否可到达。

传输层

传输层的必要性

屏蔽”有链接 or 无连接“ 的差异

网络层实现了屏蔽【异种】网络的差异(如”以太网“,”ATM“,etc),但网络层有一个差异未解决:电路交换(有链接) & 分组交换(无连接)。

这个差异将由传输层完成弥补。

从”host“到”进程“

前面介绍的“网络层”,其设计是面向主机(电脑)。“网络层地址”也就是某个主机的地址。

而“传输层”是面向【进程】滴!因为传输层要提供给【网络软件】使用,而网络软件打交道的对象是【另一个网络软件】。因此,传输层必须在“网络层地址”的基础上,再引入某种新的标识,用来区分同一台主机上的不同【进程】。

传输层的端口

刚才谈“传输层的必要性”,提到说——“网络层地址”只能标识【主机】,而传输层必须要能标识【进程】。为了达到这个目的,于是就引入了“传输层端口”这个概念(为了打字省力,后续讨论简称为“端口”)。

当程序员使用传输层提供的 API 开发网络软件时,通常把“端口”与“网络地址”一起使用(构成“二元组”),就可以定位到某个主机上的某个进程。

即某个 port。

传输层的协议

为了让程序员可以更爽地使用传输层来开发网络软件,传输层既要提供“有连接”的风格,也要提供“无连接”的风格。关于这两种风格的对比,前面已经聊过,这里不再浪费口水。

具体到“互联网协议族”,有两个主要的传输层实现,分别是 TCP & UDP(前者是“有连接”,后者是“无连接”)。

套接字(socket API)

影响力最大的传输层封装库,当然是 socket API。它来自加州大学伯克利分校。

需要提供一些封装传输层的【库】(API)。程序员只需要调用这些【库】,就可以使用传输层的协议进行通讯啦。

业务层(上三层:会话层,表示层,应用层)

【上三层】更接近于“网络软件”,对应的是应用软件的业务逻辑,因此俺统称为“业务层”。

业务层的必要性

业务层显然是必要滴。因为传输层位于操作系统,它不可能去了解网络软件的业务逻辑。为了让网络软件能够相互通讯,肯定要在传输层之上再定义更高层的协议。

问题在于:网络软件千奇百怪,其业务逻辑各不相同,因此,“业务层如何设计”,【无】一定之规。有些软件只用一个协议来搞定所有的业务逻辑(只有一层);有些软件会参考 OSI,把业务逻辑的协议分为三层;还有些软件可能会分出更多的层次。

再强调一下:业务层的协议如何分层,完全看具体的业务逻辑,不要生搬硬套任何现有的参考模型。

总结:业务层目的是让网络软件之间能相互通信。

业务层的协议

HTTP

互联网的普及推动了 Web 的普及,而 Web 的普及使得 HTTP 成为信息时代的重要支柱。当你上网的时候,你看到的网页(HTML 页面)就是通过 HTTP 协议传输到你的浏览器上。

SSL/TLS

最早的 HTTP 协议是【明文】滴;为了强化安全性,后来又设计了 SSL 协议,用来【加密】HTTP 流量;再后来,SSL 升级为 TLS(这俩是同义词)。如今经常看到的 HTTPS 相当于“HTTP over TLS”。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!