摘抄自《计算机网络(第7版)-谢希仁》教材,读书笔记。
OSI 的七层协议体系结构的概念清楚,理论也较完整,但它既复杂又不实用。
TCP/IP 的体系结构则不同,但它现在却得到了非常广泛的应用。TCP/IP 是一个四层的体系结构,它包含应用层、运输层、网际层和网络接口层(用网际层这个名字是强调这一层是为了解决不同网络的互连问题)。不过从实质上将,TCP/IP 只有最上面的三层,因为最下面的网络接口层并没有什么具体内容。
互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议 IP(Internet Protocol) 和许多种路由选择协议,因此互联网的网络层也叫做网际层或 IP 层。
链路层
局域网虽然是个网络,但我们并不把局域网放在网络层中讨论。这是因为在网络层要讨论的问题是多个网络互联的问题,是讨论分组(packet)怎样从一个网络,通过路由器,转发到另一个网络。在本章中我们研究的是在同一个局域网中,分组(packet)怎样从一台主机传送到另一台主机,但并不经过路由器转发。从整个互联网来看,局域网仍属于数据链路层的范围。
packet 小包裹、信息包,在教材中一般翻译为“分组”,但“分组”在日常对话中多理解成动词,给读者造成困扰。分组:
- 网络专有名词。大多数计算机网络都不能连续地传送任意长的数据,所以实际上网络系统把数据分割成小块,然后逐块地发送,这种小块就称作分组(packet)。也有些书籍把分组定义为网络层的协议数据单元。
- 动词。把一堆人或物划分成几组人或物。
链路层使用的信道主要有两种类型:1)点对点信道 2)广播信道。局域网使用的是广播信道。
对于点对点的链路,点对点协议 PPP 则是目前使用得最广泛的数据链路层协议。 PPP 协议就是用户计算机和 ISP 网络服务提供商进行通信时所使用的数据链路层协议(计算机还未获取到 IP 地址,不可能使用 IP 协议/网络层)。
Ethernet 以太网已经在局域网市场占据了绝对优势。现在以太网几乎成为了局域网的同义词。
48 位的 MAC 地址中存在 2 个特殊位分别指示:0单个站地址/1组地址,全球管理/本地管理。
发往本站的 MAC 帧包括三种帧:单播帧、广播帧、多播帧。以太网适配器的混杂模式,不再过滤 MAC 帧,“窃听”发往本站、其他站的所有帧。
交换式集线器(switching hub)通常称为以太网交换机(switch)或第二层交换机(L2 switch),强调这种交换机工作在数据链路层。
利用以太网交换机可以很方便地实现虚拟局域网 VLAN(Virtual LAN)。插入 VLAN 标记得出的帧称为802.1Q 帧。
现在以太网的工作范围已经从局域网扩大到城域网和广域网,从而实现了端到端的以太网传输。
网络层
由于传输网络不提供端到端的可靠传输服务,这就使网络中的路由器比较简单。如果主机中的进程之间的通信需要是可靠的,那么就由网络的主机中的运输层负责(包括差错处理、流量控制等)。
IP 地址的编址方法共经过三个历史阶段:
- 分类的 IP 地址
- 子网的划分
- 无分类编址 CIDR (构成超网)
IP 地址 ::= {<网络号>, <主机号>}
具有不同网络号的局域网必须使用路由器进行互连。
近年来已经广泛使用无分类 IP 地址进行路由选择,A 类、B 类和 C 类地址的区分已经成为历史。
主机和路由器都是使用路由表 判断直接交付还是间接交付。
IP 地址 ::= {<网络号>, <子网号>, <主机号>}
划分子网只是把 IP 地址的主机号这部分进行再划分,而不改变 IP 地址原来的网络号。
IP 地址 ::= {<网络前缀>, <主机号>}
CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念。
P145 地址聚合和最长前缀匹配
路由选择协议
= 路由表中的路由是怎么得出的。
在目前的互联网中,一个大的 ISP 就是一个自治系统。这样,互联网就把路由选择协议划分为两大类,即:
- 内部网关协议 IGP (Interior Gateway Protocol):而在自治系统内部的路由选择叫做域内路由选择。 =内部路由器协议 IRP
- 外部网关协议 EGP (External Gateway Protol):自治系统之间的路由选择也叫做域间路由选择。 = 外部路由器协议 ERP
多播 P176
IP 多播是需要在互联网上增加更多的智能才能提供的一种服务。当分组(packet)到达目的局域网时,由于局域网具有硬件多播功能,因此不需要复制分组,在局域网上的多播组成员都能收到这个视频分组。
硬件多播,是不是就是 VLAN 虚拟局域网广播的能力? 但 VLAN 的实现并未用到 MAC 的多播地址。 但在当前章节讲解硬件多播时是使用了 MAC 的多播地址的。
在互联网范围的多播要靠路由器来实现,这些路由器需要增加一些能够识别多播数据报的软件。能够运行多播协议的路由器称为多播路由器。
P179 IANA 拥有的以太网多播地址的范围,是怎么得出的?以太网的多播地址怎么使用实现多播的?
IP 多播需要两种协议:仅有 IGMP 协议(网际组管理协议)是不能完成多播任务的,还需要多播路由选择协议。但多播路由选择协议则尚未标准化。
收消息需要加组:主机向多播路由器发送加组报文,多播路由器把这种组成员关系转发给互联网上的其他多播路由器。
发消息不需要加组:任何进程可以在任何时候向任何一个多播组发送多播数据报,这个进程并不需要加入这个多播组。
- 多次加组有什么影响?每秒一次的重复加组算得上广播风暴吗?会引起网络拥塞吗?
- 加组为什么还需要端口?
- 编码时如何判断加组是否成功?判断 IGMP 是否发给了路由器吗?
- 广播风暴
交换机知识–组播管理 - TP-LINK商用网络 ,交换机会侦听主机和路由器之间的 IGMP 报文。
针对组播帧,非管理型交换机均把收到的组播帧广播到其他端口,从而实现转发。
大部分管理型交换机使用 IGMP 或 IGMP Snooping 协议维护组播组,可以实现更好的组播维护机制。
IGMP Snooping 通过侦听和分析三层组播设备与主机之间发送的组播报文来控制这些组播组,有利于抑制二层网络中不必要的组播数据转发,节省网络带宽。
运输层
UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。若报文太长,UDP 把它交给 IP 层后,IP 层在传送时可能要进行分片。
在接收方的 UDP,对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层地应用进程。如果发送方报文太长,接收方就需要粘包。
Qt 组播
Qt 加组 joinMulticastGroup()
什么情况下会失败?
- 没有连接交换机/路由器不会失败;
- 指定不存在的网卡时,会失败;
组播发送 IGMP 报文时,如果不指定网卡,则通过哪个接口发送 IGMP 报文和主机路由有关:
- 一旦没有使用目标网络的网卡发送报文就会出错,收不到组播数据。
- 明确指示通过某个网卡发送或(无法筛选出目标网卡时)所有网卡都发送 IGMP 报文。
Qt 中通过指定接口加组:bool QUdpSocket::joinMulticastGroup(const QHostAddress &groupAddress, const QNetworkInterface &iface)
可以通过一个 socket 加多个组,IP 组播和端口号无关,但运输层聚合、分发数据时依赖端口号,所以一个 socket 能否绑定 bind()
多个端口? 或者监听不同端口的多个 socket 使用相同的数据处理函数。
在网络中实现组播是通过约定,并不存在实体。接收者的角色和服务端类似,绑定端口=发送者的目标端口。
思考:向某个组发送报文时,能否忽略端口号(接收者不绑定或者绑定任意端口都可以接收组播报文)呢?