1. 概述

1.1分层结构

image-20230305145915487

应用层

应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间的通信和交互的规则。这里的进程就是指主机中正在运行的程序。常见的应用层协议有DNS、HTTP、SMTP等,应用层交互的数据单元称为报文

运输层

运输层(也叫传输层)的任务是负责两台主机中进程之间的通信提供通用的数据传输服务。运输层主要使用以下两种协议:

  • 传输控制协议TCP :提供面向连接的、可靠的数据传输服务,其数据的传输单位是报文段
  • 用户数据报协议UDP :提供无连接的、尽最大努力的数据传输服务(不保证数据的可靠性),其数据传输的单位是用户数据报
网络层

网络层负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传输。在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫做IP数据报,或简称为数据包。

数据链路层

数据链路层将网络层教下来的IP数据组装成帧,在两个相邻节点间的链路上传送

物理层

物理层上所传数据的单位是比特

数据在各层之间传输过程

image-20230317145934438

OSI参考模型把对等层次之间传送的数据单位称为该层的协议数据单元PDU(Protocol Data Unit),把层与层之间交互的数据称为 服务数据单元 SDU(Service Data Unit)

2. 物理层

物理层偏向硬件电路和通信原理层面的相关知识,忽略

3. 数据链路层

image-20230317150920315

数据链路层是把网络层交下来的IP数据报构成帧的发送到链路上,以及把接收到的帧中的数据取出来并上交给网络层。

image-20230317151137793

3.1 三个基本问题

数据链路层协议有许多种,但有三个基本问题则是共同的。这三个基本问题是:封装 成帧、透明传输和差错检测。下面分别讨论这三个基本问题。

封装成帧

image-20230317151304726

封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,这样就构成了一个

最大传送单元MTU : 每一种链路层协议规定的数据部分长度上限

image-20230317151517341

image-20230317151534967

SOHEOT 是 ASCII 码中的不可打印的控制字符。

透明传输

当传送的帧是用文本文件组成的帧时(文本文件中的字符都是从键盘上输入的),其数 据部分显然不会出现像SOH或EOT这样的帧定界控制字符。可见不管从键盘上输入什么字 符都可以放在这样的帧中传输过去,因此这样的传输就是透明传输。

image-20230317152037458

如果出现图中这种情况,使用字符填充的方法,即在数据部分出现的帧边界字符前插入一个转义字符 ESC

image-20230317152241227

差错检测

现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1。这就叫做比特差错。比特差错是传输差错中的一种。本小节所说的“差错”,如无特殊说明,就是指“比特错”。

循环冗余校验 CRC

使用CRC校验可以做到帧内的数据没有错误,即使有错误的帧数据也会被丢弃,所以数据链路层能够接收到的帧数据都是无差错的。但是会出现 帧丢失帧重复帧失序, 这是出现传输差错

3.2 PPP 协议

3.3 MAC地址

在局域网中,硬件地址又称为物理地址MAC地址(因为这种地址用在MAC帧中)。

IP 指定去哪里找寻目标主机,Mac 地址指定找哪台主机。

“名字指出我们所要寻找的那个资源,地址指出那个资源在何处,路由告诉我们如何到达该处。”

MAC地址长度是48位(6个字节),MAC地址是由 注册管理机构RA 统一管理,它负责分配地址字段的前三个字节。

MAC 帧的格式

我们知道适配器有过滤功能。但适配器从网络上每收到一个MAC帧就先用硬件检查MAC帧中的目的地址。如果是发往本站的帧则收下,然后再进行其他的处理。否则就将此帧丢弃,不再进行其他的处理。这样做就不浪费主机的处理机和内存资源。这里“发往本站的帧”包括以下三种帧:

  1. **单播(unicast)**帧(一对一),即收到的帧的MAC地址与本站的硬件地址相同。
  2. **广播(broadcast)**帧(一对全体),即发送给本局域网上所有站点的帧(全1地址)。
  3. **多播(multicast)**帧(一对多),即发送给本局域网上一部分站点的帧。

image-20230317154948353

4. 网络层

网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。这里的“数据报”(datagram)是互联网的设计者最初使用的名词,其实**数据报(或IP数据报)**就是我们经常使用的“分组”。在本书中,数据报和分组是同义词,可以混用。

4.1 网际协议IP

与IP协议配套使用的还有三个协议:

  • 地址解析协议ARP(Address Resolution Protocol)
  • 网际控制报文协议ICMP(Internet Control Message Protocol)
  • 网际组管理协议IGMP(Internet Group Management Protocol)

image-20230317160317172

分类的IP地址

整个的互联网就是一个单一的、抽象的网络。IP地址就是给互联网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32位的标识符。IP地址的结构使我们可以在互联网上很方便地进行寻址。IP地址现在由互联网名字和数字分配机构ICANN(Internet Corporation for Assigned Names and Numbers)进行分配。

所谓“分类的IP地址”就是将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个字段是网络号(net-id),它标志主机(或路由器)所连接到的网络。一个网络号在整个互联网范围内必须是唯一的。第二个字段是主机号(host-id),它标志该主机(或路由器)

IP地址可以记为:

IP地址 ::= {<网络号>, <主机号>}

image-20230317161039624

IP地址和硬件地址

这两种地址的区别。从层次的角度看,物理地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址(称IP地址为逻辑地址是因为IP地址是用软件实现的)。

image-20230317161350084

4.2 地址解析协议 ARP

在实际应用中,我们经常会遇到这样的问题:已经知道了一个机器(主机或路由器)的IP地址,需要找出其相应的硬件地址。地址解析协议ARP就是用来解决这样的问题的。RARP 通过MAC地址获取IP地址,现在的DHCP协议已包含该协议。

image-20230317161901784

每一台主机都设有一个ARP高速缓存(ARP cache),里面有本局域网上的各主机和路由器的IP地址到硬件地址的映射表,这些都是该主机目前知道的一些地址。那么主机怎样知道这些地址呢?我们可以通过下面的例子来说明。

image-20230317162154447

4.3 IP数据报的格式

image-20230317162418812

IP数据报首部的固定部分中的各字段

  1. 版本 占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4),还有IPV6

  2. 首部长度 占4位,可表示的最大十进制数值是15。请注意,首部长度字段所表示数的单位是32位字(1个32位字长是4字节)。

  3. 区分服务 8bit,一般不用

  4. 总长度 总长度指首部和数据之和的长度,单位为字节。

  5. 标识(identification) 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。

  6. 标志 占3位,但目前只有两位有意义。

    • 标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。
    • 标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。
  7. 片偏移 占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节64位)的整数倍。

    ​ 举例:

    image-20230317163134106

  8. 生存时间 占8位,生存时间字段常用的英文缩写是TTL(Time To Live),表明这是数据报在网络中的寿命。由发出数据报的源点设置这个字段。

  9. 协议 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个协议进行处理。

    image-20230317163353290

  10. 首部检验和 占16位。这个字段只检验数据报的首部,但不包括数据部分。这 是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存 时间、标志、片偏移等都可能发生变化)。

  11. 源地址 占32位。

  12. 目的地址 占32位。

IP数据报首部的可变部分

4.4 划分子网和构造超级网

  • TODO

4.5 网际控制报文协议 ICMP

为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP(Internet Control Message Protocol)。ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP是互联网的标准协议。但ICMP不是高层协议(看起来好像是高层协议,因为ICMP报文是装在IP数据报中,作为其中的数据部分),而是IP层的协议。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。ICMP报文格式如图所示。

image-20230317164134142

ICMP报文的种类

ICMP报文的种类有两种,即 ICMP差错报搞报文ICMP询问报文

ICMP报文的前4个字节是统一的格式,共有三个字段:类型、代码和检验和。接着4个字节的内容与ICMP的类型有关。最后面是数据字段,其长度取决于ICMP的类型。表4-8给出了几种常用的ICMP报文类型。

image-20230317185827427

四种差错报文

  1. 终点不可达 当路由器或主机不能交付数据报是就向源点发送终点不可达报文
  2. 时间超过 当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。
  3. 参数问题 当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
  4. 改变路由(重定向) 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。

image-20230317191154841

ICMP询问报文

  1. 回送请求和回答 ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
  2. 时间戳请求和回答 ICMP时间戳请求报文是请某台主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用于时钟同步和时间测量。

ICMP的一个重要应用就是分组网间探测PING(Packet InterNet Groper),用来测试两台主机之间的连通性。PING使用了ICMP回送请求与回送回答报文。PING是应用层直接使用网络层ICMP的一个例子。它没有通过运输层的TCP或UDP。

4.6 RIP协议的报文格式

image-20230317192107074

5. 运输层

网络层通信时主机到主机,运输层通信是主机中的进程之间的通信。

image-20230317192609311

运输层的两个主要协议:

  1. 用户数据报协议UDP 无连接的
  2. 传输控制协议TCP 面向连接

image-20230317192803850

image-20230317193328699

5.1 用户数据报协议 UDP

UDP 的主要特点:

  1. UDP是无连接的,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。

  2. UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里面有许多参数)。

  3. UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向

    image-20230317193552456

  4. UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。

  5. UDP支持一对一、一对多、多对一和多对多的交互通信

  6. UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。

UDP 的首部格式

image-20230317193735739

  1. 源端口 源端口号。在需要对方回信时选用。不需要时可用全0。
  2. 目的端口 目的端口号。这在终点交付报文时必须使用。
  3. 长度 UDP用户数据报的长度,其最小值是8(仅有首部)。
  4. 检验和 检测UDP用户数据报在传输中是否有错。有错就丢弃。

UDP用户数据报首部中检验和的计算方法有些特殊。在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部。所谓“伪首部”是因为这种伪首部并不是UDP用户数据报真正的首部。只是在计算检验和时,临时添加在UDP用户数据报前面,得到一个临时的UDP用户数据报。检验和就是按照这个临时的UDP用户数据报来计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。

5.2 传输控制协议 TCP

TCP主要特点

  1. TCP 是面向连接的运输层协议
  2. 每一条TCP连接只能有两个端点
  3. TCP 提供可靠交付的服务
  4. TCP提供全双工通信
  5. 面向字节流

TCP 的连接

TCP 把连接作为最基本的抽象。TCP连接的端点叫做套接字(socket)

套接字 socket = (IP地址 :端口号)

IP地址区分主机,端口号区分主机上运行的进程。

可靠传输的工作原理

网络层IP协议提供的是不可靠的传输,TCP使用一定的措施是传输可靠

停止等待协议

连续ARQ协议

TCP 报文段的首部格式

image-20230317195402087

首部固定部分各字段的意义如下:

  1. 源端口和目的端口 各占2个字节,分别写入源端口号和目的端口号。
  2. 序号 占4字节。序号范围是[0,232-1],共232(即4294967296)个序号。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
  3. 确认号 占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。请注意,现在的确认号不是501,也不是700,而是701。总之,应当记住: 若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。
  4. 数据偏移 占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。但应注意,“数据偏移”的单位是32位字(即以4字节长的字为计算单位)。
  5. 保留 占6位,保留为今后使用,但目前应置为0。
  6. 紧急URG(URGent) 当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送。
  7. 确认ACK(ACKnowledgment) 仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
  8. 推送PSH(PuSH) 当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
  9. 复位RST(ReSeT) 当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也可称为重建位或重置位。
  10. 同步SYN(SYNchronization) 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。
  11. 终止FIN(FINis) 用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
  12. 窗口 占2字节。窗口值是[0,216-1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。
  13. 检验和 占2字节。检验和字段检验的范围包括首部和数据这两部分。
  14. 紧急指针 占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为零时也可发送紧急数据。
  15. 选项 长度可变,最长可达40字节。当没有使用“选项“时,TCP的首部长度是20字节。

5.3 TCP 可靠传输的实现

5.4 TCP的流量控制

5.5 TCP的拥塞控制

TCP进行拥塞控制的算法有四种,即慢开始(slow-start)拥塞避免(congestionavoidance)快重传(fast retransmit)快恢复(fast recovery)。下面就介绍这些算法的原理。

5.6 TCP的运输连接管理

image-20230317201316469

image-20230317201418283

参考

  • 《计算机网络》谢仁希 第7版