2015-06-04 20:48:58 srf1986 阅读数 2161

计算机网络(第5版)

这是第二遍读计算机网络了,第一次是全是浏览,相当于对网络来了一次漫游,整体上知道网络的一些基本概念和整本书的结构,第二遍阅读就要好好理解喽,再次留下读书笔记,希望能与大家多拍砖,共同学习网络。

第一章的学习

首先,了解几个概念:

互联网(英特网):百度百科给出解释——网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。我理解就是当今地球上所有能连在一起的网络之和,包含有线、无线、还有卫星网络。

以太网:百度百科给出解释——以太网(Ethernet)指的是由Xerox公司创建并由Xerox、Intel和DEC公司联合开发的基带局域网规范,是当今现有局域网采用的最通用的通信协议标准。以太网络使用CSMA/CD(载波监听多路访问及冲突检测)技术,并以10M/S的速率运行在多种类型的电缆上。以太网与IEEE802.3系列标准相类似。我理解就是当今的有线宽带。对应协议802.3

万维网:简称web,百度百科给出解释——WWW是环球信息网的缩写,(亦作“Web”、“WWW”、“'W3'”,英文全称为“World Wide Web”),中文名字为“万维网”,"环球网"等,常简称为Web。 分为Web客户端和Web服务器程序。 WWW可以让Web客户端(常用浏览器)访问浏览Web服务器上的页面。 是一个由许多互相链接的超文本组成的系统,通过互联网访问。在这个系统中,每个有用的事物,称为一样“资源”;并且由一个全局“统一资源标识符”(URI)标识;这些资源通过超文本传输协议(Hypertext Transfer Protocol)传送给用户,而后者通过点击链接来获得资源。我理解,就是互联网上,提供的使用HTTP协议的一个应用。

wifi:百度百科给出解释——Wi-Fi是一种可以将个人电脑、手持设备(如pad、手机)等终端以无线方式互相连接的技术,事实上它是一个高频无线电信号。我理解解释现在常用的2.4G 5G的无线网络。对应协议802.11

OSI参考模型:就是常说的网络七层模型,物、数、网、传、会、表、应(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层),OSI参考模型有很强的理论意义,当时按照书中的说法、糟糕的时机、技术、实现、政策,使OSI参考模型更具备理论意义。

TCP/IP参考模型:使用四层模型链路层、互联网层、传输层、应用层,对应OSI参考模型为,链路层——物理层、数据链路层,互联网层——网络层,传输层——传输层,应用层——会话层、表示层、应用层。

可靠服务——带确认方式的通信。

不可靠服务——不带确认方式的通信。

初次形成网络连接逻辑:骨干网有以太网组成,下面是各级运营商,终端用户可用通过有线方式(以太网)、无线方式(WIFI、3G/4G移动互联网)接入网络中,组成了当今的互联网。


2019-06-13 21:58:57 coder_what 阅读数 1492

计算机网络网络层

Copyright©stonee

趁年轻抓紧奋斗吧

约定:本文是针对于《计算机网络》第七版(谢希仁)中第四章的知识点总结,不适合单独看,结合课本或者PPT中的图片复习更佳

  • 网络层提供的是无连接,尽最大努力交付的数据报服务,面向连接由运输层提供
  • 虚电路服务和数据报服务的区别

1. IP

  • IP在ARP之上,在ICMPIGMP之下,它们都在网络层
  • 网络层由路由器分组转发,因为路由器要接入多个网络,所以路由器最少有两个IP
  • 网桥互连的局域网中只能有一个网络号
IP协议格式
  • 首部的固定部分一共20B
  • 版本(4bit) + 首部长度(4bit) + 区分服务(1B) + 总长度(2B) + 标识(2B) + 标志(3bit) + 片偏移(13bit) + 生存时间(1B) + 协议(1B) + 首部检验和(2B) + 源地址(4B) + 目的地址(4B) + 可选部分(max 40B)
  • 版本说明是IPv4还是v6
  • 首部长度1bit指的是4个字节,首部长度最小为0101,即5*4 = 20B,因为首部的固定部分是20B,最大为15 * 4 = 60B
  • 总长度 = 首部长度 + 数据长度,所以数据长度 = 2^16 - 1 - 首部长度 ( 字节)
  • 因为IP数据报的长度不能超过MTU(一太网中为1500B),所以IP规定IP数据报的长度小于576B,需要通过标识、标志位和片偏移进行分片
  • 首部检验和只检验首部,
IP地址分类
  • 是互联网的表示符,唯一的32bit

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

  • ABC类IP地址都是单播地址

    • A: 0/8 + 24 1~126
    • B: 10/16 + 16 128.1 ~ 191.255
    • C: 110/24 + 8 192.0.1~223.255.255
  • D: 1110/32 多播,E: 1111/32以后备用

  • 点分十进制法,每8bit为一组,一共四组

  • 同一个主机连到不同的网络上时必须要有不同的IP

  • 在同一个局域网上的主机或者路由器的IP的网络号必须是一样的

ARP
  • 解决的是同一局域网中IP和MAC映射的问题,如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络
  • ARP具有高速缓存,以此可以产生ARP欺骗的hack攻击
  • 主机通过广播发送ARP请求
路由器分组转发算法

路由表有目标主机所在网络和下一跳地址组成

  • 先将数据帧的帧头帧尾去掉,从首部提取出IP地址
  • 从IP地址中找出网络地址,若直接相连,则交付
  • 否则间接交付:
    • 若路由表中有目的地址的特定路由则转发给指明的路由
    • 否则如果路由表中有到目的网络的路由则转发
    • 否则转发给默认路由
    • 否则报告分组出错

2. 划分子网和构造超网

  • 为了缓解IP地址不够用的问题
  • 划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络
  • 子网号是从主机号中划分的,同时子网号不一定占前八位,位数和位置都可以改,也可以不连续
  • 将2级IP转换为3级IP:::= {<网络号>, <子网号>, <主机号>}
子网掩码
  • 用来判断是否划分了子网,同时如果划分可以找出IP中的子网部分

  • 划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数

  • 如果不划分子网,则该网络的子网掩码就是默认子网掩码,即网络号全1,其余全0

  • 子网路由器分组转发算法

    路由表有目标主机所在网络、子网掩码和下一跳地址组成

    • 先提取IP
    • 再让路由器中各网络中的子网掩码AND,如果匹配,则交付,否则
      • 若路由表中有目的地址的特定路由则转发给指明的路由
      • 否则对路由表中的每一行,将子网掩码和 D 逐位AND。若结果与该行的目的网络地址匹配,则转发
      • 否则转发给默认路由
      • 否则报告分组出错
构造超网
  • 通过CIDR消除了A,B,C类地址以及划分子网的概念
  • 路由聚合也称为构造超网
    • 几个地址块具有相同的前缀
    • 聚合后的地址块包含聚合前几个地址块的所有IP地址
  • IP ::= {<网络前缀>, <主机号>}
  • 斜线记法
  • CIDR中的地址掩码
  • 不能说任意两个相邻的CIDR地址块可以聚合成一个CIDR地址块
  • 超网路由表由目标主机网络前缀下一跳地址组成
  • 在查找路由表时可能会得到不止一个匹配结果,应当从匹配结果中选择具有最长网络前缀的路由
  • 使用二叉线索查找路由表

3.ICMP

  • 为了更有效转发IP数据包和提高成功交付的机会
  • ICMP首部在IP报的数据部分,但是ICMP协议是IP层的协议
ICMP报文格式

类型(1B) + 代码(1B) + 检验和(2B) + 4(B) + 数据部分

差错报文
  • 终点不可达 、时间超过 、参数问题 、改变路由(重定向)
  • 不发送ICMP报文的几种情况
    • 特殊地址
    • 多播地址数据报
    • 分片后的数据报
    • ICMP差错报文
询问报文
  • 回送请求和回答报文
  • 时间戳请求和回答报文

4. 路由选择协议

  • 静态路由选择策略,即非自适应路由选择,简单和开销较小,但不能及时适应网络状态的变化。
  • 动态路由选择策略,即自适应路由选择,能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大
  • 互联网采用分层次的路由选择协议
  • 自制系统AS对其他 AS 表现出的是一个单一的和一致的路由选择策略
IGP
  • AS内部使用的内部网关协议

  • **RIP **是一种分布式的、基于距离向量的路由选择协议

    • 选择最短路由
    • 不能使用多条路由
    • 按固定时间间隔和相邻路由交换当前知道的所有信息
    • 使用与小型互联网,距离等16即相等于不可达
    • RIP使用UDP进行传输
    • 首部(4B) + 路由(4B) : 路由部分最多25个路由信息,所以RIP最多4+20*25=504字节
    • RIP2具有简单的鉴别功能,此时路由部分最多24个路由信息
    • 好消息传播得快,坏消息传播得慢
    • 当网络出现故障时,要经过比较长的时间 (例如数分钟) 才能将此信息传送到所有的路由器
  • OSPF开放最短路由优先,克服RIP缺点发明出来的

    OSPF RIP
    使用洪泛法向局域网中所有路由器发送副本信息 RIP只发送周围几个
    发送与本路由器相邻的所有路由器的链路状态 只发送到所有网络的距离和下一跳路由
    只有当链路状态变化时才发送信息 定期交换
    通过IP发送 通过UDP发送
    • 如果网络中有多条代价相同的路径,可以把通信量进行分配,叫做负载均衡
    • OSPF可以针对同类型业务计算出不同路由
    • OSPF支持可变长子网和CIDR
    • OSPF具有鉴别功能
    • 五种类型:问候组、数据库状态描述组、链路状态请求组、更新组、确认组
    • 当互联网规模很大时,OSPF 协议要比距离向量协议 RIP 好得多
    • OSPF没有“坏消息传播得慢”的问题
EGP
  • 不同AS使用的协议
  • BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由
    • 每个AS都要选出至少一个BGP发言人
    • BGP发言人先建立TCP连接,利用该链接再建立会话
    • 彼此交换路由信息的BGP发言人称为临站或者对等站
    • BGP支持CIDR
    • BGP刚运行时,需要和临站交换整个路由表,但是以后只需要交换变化的路由表
    • 四种报文:打开、更新、保活、通知
路由器组成
  • 主要功能是分组转发路由选择
  • 在这里插入图片描述
  • 路由器中的输入或输出队列产生溢出是造成分组丢失的重要原因
  • 通过存储器、总线、纵横交换结构

5. IPv6

  • 从IPv4过渡为IPv6
  • IPv6具有:更大的地址空间、扩展的地址层次结构、灵活的首部格式、改进的选项、支持自动配置(不需要DHCP)、由4字节对齐改为8字节对齐
  • 格式
    • IPv6每个地址占128bit,每16位用**:**区分
    • 版本(4bit) + 通信量类(1B) + 流标号(20bit) + 有效载荷长度(2B) + 下一个首部(1B) + 跳数限制(1B) + 源地址(16B) + 目的地址(16B) + 有效载荷(扩展首部/数据)(64kB)
    • 流标号用于实时视频传输等
    • 有效载荷长度指除了基本首部之外的长度
    • 在任一地址中只能使用一次零压缩
    • 点分十进制
  • IPv6把IPv4首部的选项功能放到扩展首部中,扩展首部留给主机来处理,提高了路由器处理效率
  • IPv6支持单播、多播、任播
IPv4到IPv6的过渡
  • 双协议栈

  • 隧道技术:把IPv6数据报封装成IPv4数据部分

  • IPV4的ICMP、IGMP和ARP到IPV6时合成了ICMPv6

    • 面向报文的协议

6. IP多播

  • 多播地址只能用于目的地址,不能用于源地址
  • 多播也叫组播,是由一个源点发送到多个终点
  • 根据规定MAC地址为01-00-5E-00-00-00 ~ 01-00-5E-7F-FF-FF 为多播地址,只有23位可以用,只能和D类的后23位匹配,D类有28位可供分配,这就导致了D类的前五位并没有用
  • 多播和单播的区别就是它使用D类IP地址作为目的地址,并且使用IGMP
  • IGMP:让本地局域网中的多播路由器知道该局域网中是否有主机参加或退出某个多播组
    • 加入多播组,发送IGMP报文,声明自己加入该组
    • 多播路由器收到报文后,将改组成员关系转发给其他多播路由器
    • 本地多播路由器要周期性探寻本地局域网上的主机,只要有一个主机响应,就认为该组是活跃的
    • 在 IGMP 的询问报文,主机在 0 到 N (默认10s)之间随机选择发送响应所需经过的时延。对应于最小时延的响应最先发送。只要有本组的其他主机先发送了响应,自己就可以不再发送响应了
  • 多播路由选择协议: 将多播数据以最小代价传给组成员
    • 找出以源主机为根节点的多播转发树
    • 洪泛与剪除:适用于较小多播组
    • 隧道技术:适用于地理位置分散
    • 基于核心的发现技术:多播组的大小在较大范围内变化
  • 多播路由选择协议: 将多播数据以最小代价传给组成员

7. VPN & NAT

  • 解决本地地址和全球地址的二义性:
    • RFC1918指明了专用地址,互联网中的路由器对专用地址不转发
    • 三个专用地址快:10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
  • 专用IP地址也叫做可重用地址
  • 以公用网作为各专用网的载体,这样的专用网是VPN
  • 一般VPN都需要加密,用隧道技术实现VPN
  • NAT使得在专用网上使用专用地址的主机互联网上的主机通信(并不需要加密)
    • 有专门的NAT路由器来负责进入和离开专用网时的IP转换

8. 多协议标记交换MPLS

  • 因为路由表示按照最长匹配原则进行,当路由表很大时,可以采用硬件来转发标记的分组
  • 通过专用的 标记交换路由器进行转发
  • 对打上标记的IP数据通过硬件转发,提高效率,使路由表查表时不再上升到第三层查找,直接在第二层通过标记交换路由器进行转发
    • 多协议表现在上次可以采用IP,IPX,下层可以采用PPP,以太网,ATM等
    • 对每个分组按照FEC为MPLS中的LSR打上LSP路径
    • FEC可用于负载均衡
  • MPLS在IP数据报之下,即MPLS封装了IP数据报
  • 标记值(20bit) + 试验(3bit) + S(1bit) + TTL(1B)

问题

  • 路由器中也至少有两个MAC吗
  • 为什么多播是D类
    • 因为规定
2019-05-11 15:07:50 qq_36982160 阅读数 206

彩蛋

计算机网络谢希仁第七版原版ppt获取方式:公众号后台回复”N3“即可获取。

由于公众号不支持显示LaTeX公式且公众号排版混乱,建议大家关注微信公众号"IT工匠",后台回复"N4-2"获取xmind源文件以及本文原文pdf文件获取更佳阅读体验。

本文主要内容:

计算机网络第三弹——数据链路层

数据链路层概述

数据链路层是计算机网络五层协议体系结构的第2层(从下往上计数),在整个体系结构中有非常重要的作用:

image-20190510163257245

图1:不同主机之间通信时数据链路层的地位

如图1所示,上半部分表示主机H1与主机H2通信所需经过的结点,下半部分是每一个结点对应拥有的计算机网络体系结构的抽象模型,可以看到网络中的主机、路由器等都必须经过数据链路层。

image-20190510163509740

图2:局域网中数据链路层的地位

如图2所示,局域网中的主机、交换机等都必须实现数据链路层。

综上,数据链路层是实现设备之间通信的非常重要的一层。

数据链路层使用的两种信道

点对点信道

image-20190510164355614

图3:点对点信道示意图

如图3所示,点对点信道是使用一对一的点对点通信方式。

广播信道

image-20190510164447038

图4:广播信道示意图

如图4所示,广播信道使用的是一对多的广播通信方式,因此必须使用专用的共享信道协议来协调这些主机的数据发送。

使用点对点信道的数据链路层

几个概念的明确:

链路

链路(link):也称物理链路**,从一个结点到相邻结点的一段物理线路(有线或无线),中间没有任何交换结点。一条链路只是一条通路的一个组成部分

数据链路

数据链路(data link):也称逻辑链路,当需要在一条线路上传送数据时,除了必须有一条物理线路之外,还必须有一些必要的通信协议来控制这些数据的传输,若把实现这些协议的硬件软件加到链路上,就构成了数据链路

现在最常用的方法是使用网络适配器(即网卡)来实现这些协议的硬件和软件。

一般的适配器都包括了数据链路层和物理层这两层的功能。

image-20190510165201270

图5:使用点对点信道的数据链路层

数据链路层把网络层交付下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并交付给网络层。如图5所示,点对点信道的数据链路层在进行通信时的主要步骤如下:

1:结点A的数据链路层将网络层传下来的IP数据报添加首部和尾部封装成帧

2:结点A将封装好的帧发送给结点B的帧;

3:若结点B的数据链路层受到的帧无差错,则从受到的帧中提取出IP数据报交付至网络层,否则丢弃这个帧。

image-20190510165724541

图6

注意,数据链路层不需要考虑物理层如何实现比特传输的细节。甚至还可以更简单地设想好像是沿着两个数据链路层之间的水平方向把帧直接发送到对方,如图6所示,这也是我们把计算机网络体系结构分层的目的之一。

三个基本问题

上一节的最后描述了点对点信道的数据链路层在进行通信时的主要步骤,那么为了完成数据链路层的工作,我们需要解决三个问题:封装成帧透明传输差错检测,虽然数据链路层协议有很多种,但是上述三个基本问题是共同需要解决的

封装成帧

封装成帧 (framing) 就是在一段数据的前后分别添加首部尾部,然后就构成了一个帧。 首部和尾部的一个重要作用就是进行帧定界,即确定帧的界限,进而识别出帧的开始和结束。

image-20190510170341838

图7:帧的组成部分

如图7所示,一个完整的帧包括首部数据部分尾部三个部分,发送帧的时候是从首部开始发送,尾部最后发送,很明显为了提高帧的传输效率,我们应该尽量使帧的数据部分尽可能地大于首部和尾部的长度。但是数据链路层的每一种协议都规定了所能传送的帧的数据部分长度上限——最大传送单元(MTU,Maximum Transfer Unit),图7展示了帧的各个部分以及数据部分与MTU部分的关系。

用控制字符进行帧定界的方法举例

image-20190510170955860

图8:用控制字符进行帧定界

如图8所示,当数据是由可打印的 ASCII 码组成的文本文件时,帧定界可以使用特殊的帧定界符。 控制字符 SOH (Start Of Header) 放在一帧的最前面,表示帧的首部开始。另一个控制字符 EOT (End Of Transmission) 表示帧的结束。

当数据在传输中出现差错时,帧定界的作用更加明显。假定发送端在、尚未发送完一帧 时突然出现故障中断了传送,但随后又很快恢复正常,于是重新从头开始发送刚才的帧,由于使用了帧定界符,接收端就知道前面接收到的帧是个不完整的帧(因为它只有首部SOH而没有尾部EOT),应该丢弃,而后面受到的数据有明确的首部和尾部,因此这是一个完整的帧,应该收下。

透明传输

由于帧的开始和结束的标记使用专门指明的控制字符,因此所传输的数据中的任何8比特的组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误,如图9所示:

image-20190510171541099

图9:数据部分恰好出现与EOT一样的代码

如图9所示,当数据部分出现了和SOH或EOT一样的代码时,数据链路层就会错误地"找到帧的边界"。

透明传输的定义是:某一个实际存在的事物看起来却好像不存在一样。在数据链路层透明传输表示无论什么样的比特组合的数据,都能够按照原样没有差错地通过这个数据链路层。很明显,上面提到的图9中帧的传输很明显就不是**“透明传输”**。

为了实现透明传输,我们可以使用字节填充 (byte stuffing)字符填充 (character stuffing),具体的做法是:

发送端的数据链路层在数据中出现控制字符**“SOH”“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是1B)。 接收端的数据链路层在将数据送往网络层之前删除插入的转义字符**。 如果转义字符也出现在数据当中,那么应在转义字符前面插入一个转义字符 ESC当接收端收到连续的两个转义字符时,就删除其中前面的一个,如图10所示:

image-20190510172227072

图10:字节填充解决透明传输问题图示

差错检测

现实的通信链路都不会是理想的,这也就是说,比特在传输过程中可能会产生差错:1可能会变成0、0可能会变成1.这就叫比特差错,如不加特殊说明,本文所说的**"差错"就是指比特差错**。

误码率 BER (Bit Error Rate)的概念:在一段时间内,传输错误的比特所传输比特总数的比率称为误码率 BER (Bit Error Rate)

误码率与信噪比有很大的关系。 为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。 在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC 的检错技术,具体原理入下:

循环冗余检验

循环冗余检验的流程如下:

  • 发送端

    1:在发送端,先把数据划分为组,假定每组k个比特。

    2:在每组数据M后面添加供差错检测用的n位冗余码,然后一起发送出去。

    冗余码的计算方法:

    1:用二进制的模 2 运算进行2n2^n 乘 M 的运算,这相当于在 M 后面添加 n 个 0。

    2:得到的 (k + n) 位的数除以事先选定好的长度为 (n + 1) 位的除数 P,得出商是 Q 而余数是 R,余数 R 比除数 P 少 1 位,即 R 是 n 位。

    3:将余数 R 作为冗余码拼接在数据 M 后面,一起发送出去。

  • 接收端

    接收端对收到的每一帧进行CRC检验,检验的方法是使用接收到的数据除以接收端与发送端事先约定好的除数P(模2运算),然后:

    (1) 若得出的余数 R = 0,则判定这个帧没有差错,就接受 (accept)。

    (2) 若余数 R ≠ 0,则判定这个帧有差错,就丢弃。

    但这种检测方法并不能确定究竟是哪一个或哪几个比特出现了差错。 只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小很小。

  • 举例

    比如要发送的数据M=101001,即k=6,事先约定好的除数P=1101,由于P为n+1=4位,所以n=3,冗余码的计算流程如下:

    1:在M后面添加n个0,得到k+n位数:101001000

    2:给得到的k+n位数初以P:

    image-20190510174536621

    得到余数R=001

    3:将余数R=001作为冗余码拼接在数据M后面,即M=101001001。

    接收端接收到101001001后的检验流程如下:

    使用101001001除以P(1101),得到余数0,说明无差错,接受。

在数据后面添加上的冗余码称为帧检验序列 FCS (Frame Check Sequence)。 循环冗余检验 CRC 和帧检验序列 FCS 并不等同。 CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。 FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法

一种较为方便的方法是使用多项式来表示循环冗余检验过程,我们可以用多项式:
P(X)=X3+X2+1 P(X)=X^3+X^2+1
来表示上述例子中的除数P=1101.

从以上讨论不难看出,如果数据链路层 不以帧为单位进行数据传送,就无法加入冗余码来进行差错检验。因此,如果要在数据链路层进行差错检测,就必须把数据划分为帧,每一帧都加上冗余码,一帧一帧地传送,然后在接收方逐帧进行差错检验。

注意:

1:仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受 (accept)

2:“无差错接受”是指:“凡是接受的帧(即不包括丢弃的帧),我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错”。接收端丢弃的帧虽然曾经收到了,但最终还是因为有差错被丢弃,即没有被接受。 也就是说:“凡是接收端数据链路层接受的帧都没有传输差错”(有差错的帧就丢弃而不接受)。

3:单纯使用 CRC 差错检测技术不能实现“无差错传输”或“可靠传输”。因为可靠传输指的是发送端发送什么、接收端就接收什么,而传输差错可以分为两类,一类是比特差错,数据链路层使用CRC检验可以解决这个问题,还有一类是帧丢失、帧重复、帧失序的错误,这类错误中并没有出现比特错误,而是以为单位出错的,所以CRC并没有解决这个问题.

5: 要做到“无差错传输”(即发送什么就收到什么)就必须再加上确认和重传机制。 本章介绍的数据链路层协议都不是可靠传输的协议。

6:现在互联网对于数据链路层采取了区别对待的策略:

  • 对于通信质量好的有线传输链路:数据链路层不适用确认和重传机制,即不要求数据链路层向上提供可开传输的服务。
  • 对于通信质量差的无线传输链路:数据链路层使用确认和重传机制,向上提供可靠运输的服务。

点对点协议PPP

对于点对点的链路,目前使用的最广泛的数据链路层协议是点对点协议PPP(Point-to-Point Protocol)

我们知道,互联网用户通常都要接入到某个ISP才能接入到互联网。PPP协议就是用户计算机和ISP进行通信时所使用的数据链路层协议,如图11所示:

image-20190510184320611

图11:用户到ISP的链路使用PPP协议

PPP协议应满足的要求:

  • 简单 —— 这是首要的要求。
  • 封装成帧 —— 必须规定特殊的字符作为帧定界符。
  • 透明性 —— 必须保证数据传输的透明性。
  • 多种网络层协议 —— 能够在同一条物理链路上同时支持多种网络层协议。
  • 多种类型链路 —— 能够在多种类型的链路上运行。
  • 差错检测 —— 能够对接收端收到的帧进行检测,并立即丢弃有差错的帧。
  • 检测连接状态 —— 能够及时自动检测出链路是否处于正常工作状态。
  • 最大传送单元 —— 必须对每一种类型的点对点链路设置最大传送单元 MTU 的标准默认值,促进各种实现之间的互操作性。
  • 网络层地址协商 —— 必须提供一种机制使通信的两个网络层实体能够通过协商知道或能够配置彼此的网络层地址。
  • 数据压缩协商 —— 必须提供一种方法来协商使用数据压缩算法。

PPP协议不需要的功能:

  • 纠错
  • 流量控制
  • 序号
  • 多点线路
  • 半双工或单工链路

PPP协议的帧格式

image-20190510194344201

图12:PPP协议的帧格式

如图12所示,PPP 帧的首部和尾部分别为 4 个字段和 2 个字段。

  • 标志字段 F = 0x7E (符号“0x”表示后面的字符是用十六进制表示。十六进制的 7E 的二进制表示是 01111110)。
  • 地址字段 A 只置为 0xFF。地址字段实际上并不起作用
  • 控制字段 C 通常置为 0x03。
  • 协议字段,占用2个字节:
    • 0x0021时表示PPP帧的信息字段为IP数据报
    • 0xC021时表示PPP帧的信息字段为PPP链路控制协议LCP的数据
    • 0x8012时表示信息字段是网络控制数据
  • 信息字段(IP数据报)的长度是可变的,不超过1500字节
  • PPP 是面向字节的,所有的 PPP 帧的长度都是整数字节

字节填充(异步传输时使用)

当信息字段出现和标志字段一样的比特(0x7E,01111110)组合时,必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中,PPP异步传输时将转义符定义为0x7D(即01111101),并使用字节填充,方法如下:

image-20190510195921873

图13:字节填充示意图

1:将信息字段中出现的每一个0x7E替换为2字节序列0x7D,0x5E

2:若信息字段出现一个0x7D字节,则把0x7D转变为0x7D,0x5E

3:若信息字段出现ASCII码的控制字符,则在该字符前面加入一个0x7D字节,例如出现0x30(在控制字符中是"传输结束"ETX),就要把他转变为2字节序列0x7D,0x23.

由于在发送端进行了字节填充,因此链路上传送的信息字节数就超过了原来的信息字节数。但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复原来的信息。

零比特填充(同步传输时使用)

PPP 协议用在 SONET/SDH 链路时,使用同步传输(一连串的比特连续传送)。这时 PPP 协议为了避免出现信息字段出现和标志字段(0x7E,01111110)一样的比特组合的问题,采用零比特填充方法来实现透明传输。

image-20190510200330165

图14:零比特填充示意图

其原理如图14所示,在发送端,只要发现有 5 个连续 1,则立即填入一个 0。 接收端对帧中的比特流进行扫描。每当发现 5 个连续1时,就把这 5 个连续 1 后的一个 0 删除。

PPP协议不提供使用序号和确认的可靠传输服务

PPP 协议之所以不使用序号和确认机制是出于以下的考虑:

  • 在数据链路层出现差错的概率不大时,使用比较简单的 PPP 协议较为合理。
  • 在因特网环境下,PPP 的信息字段放入的数据是 IP 数据报。数据链路层的可靠传输并不能够保证网络层的传输也是可靠的。
  • 帧检验序列 FCS 字段可保证无差错接受

PPP协议的工作状态

PPP协议的组成:

  • 一个将 IP 数据报封装到串行链路的方法。

  • 链路控制协议 LCP (Link Control Protocol)。

  • 网络控制协议 NCP (Network Control Protocol)。

PPP协议的工作状态:

image-20190510201146843

图15:PPP协议的工作状态

如图15所示,PPP协议的工作状态主要分为:

  • 用户拨号接入 ISP 时,路由器的调制解调器对拨号做出确认,并建立一条物理连接(对应于链路静止\to链路建立)。
  • PC 机向路由器发送一系列的 LCP 分组(封装成多个 PPP 帧)。
  • 这些分组及其响应选择一些 PPP 参数,并进行网络层配置,NCP 给新接入的 PC 机分配一个临时的 IP 地址,使 PC 机成为因特网上的一个主机。
  • 通信完毕时,NCP 释放网络层连接,收回原来分配出去的 IP 地址。接着,LCP 释放数据链路层连接。最后释放的是物理层的连接。

可见,PPP 协议已不是纯粹的数据链路层的协议,它还包含了物理层网络层的内容。

使用广播信道的数据链路层

局域网的数据链路层

局域网最主要的特点是:

  • 网络为一个单位所拥有;
  • 地理范围和站点数目均有限。

局域网具有如下主要优点

  • 具有广播功能,从一个站点可很方便地访问全网。局域网上的主机可共享连接在局域网上的各种硬件和软件资源。 便
  • 于系统的扩展和逐渐地演变,各设备的位置可灵活调整和改变。 提高了系统的可靠性、可用性和残存性。

image-20190510202636666

图16:局域网的拓扑结构

如图16所示为局域网的几种常见的拓扑结构。

image-20190510202850799

图17:共享的广播信道

如图17所示,使用广播信道的数据链路层使用的是共享的信道,这种机制的问题是若多个设备在共享的广播信道上同时发送数据,则会造成彼此干扰,导致发送失败。要解决这一问题在技术上主要有两种方法:

1:静态划分信道(在物理层时已经介绍过)

  • 频分复用
  • 时分复用
  • 波分复用
  • 码分复用

2:动态媒体接入控制(多点接入)

  • 随机接入

    所有用户可随机发送信息,如果恰巧两个或更多用户同一时刻发送信息,那么在共享媒体上就要产生碰撞(即发生了冲突),使得这些用户的发送都失败。因此,必须要有解决碰撞冲突的网络协议。

  • 受控接入

    用户不能随机地发送信息,必须服从一定的控制。这类典型代表有分散控制的令牌环局域网集中控制的多点线路探寻(polling),或称轮询

适配器的作用

  • 网络接口板又称为通信适配器 (adapter)网络接口卡 NIC (Network Interface Card),或“网卡”。
  • 适配器功能如图18所示:
    • 进行串行/并行转换
    • 对数据进行缓存
    • 在计算机的操作系统安装设备驱动程序。
    • 实现以太网协议。

image-20190510203929066

图18:网卡的作用

CSMA/CD协议

image-20190510204209754

图19:最初的以太网结构

最初的以太网是将许多计算机都连接到一根总线上。易于实现广播通信。当初认为这样的连接方法既简单又可靠,因为总线上没有有源器件,如图19所示。

为了实现一对一通信,将接收站的硬件地址写入帧首部中的目的地址字段中。仅当数据帧中的目的地址与适配器的硬件地址一致时,才能接收这个数据帧,如图20所示。

image-20190510204350828

图20

这种方法的缺点就是若多台计算机或多个站点同时发送时 ,会产生发送碰撞或冲突,导致发送失败。

为了通信的简便,以太网采取了两种重要的措施:

1:采用较为灵活的无连接的工作方式

  • 不必先建立连接就可以直接发送数据。
  • 对发送的数据帧不进行编号,也不要求对方发回确认。这样做的理由是局域网信道的质量很好,因信道质量产生差错的概率是很小的
  • 以太网提供的服务是不可靠的交付,即尽最大努力的交付。
  • 当目的站收到有差错的数据帧时就丢弃此帧,其他什么也不做。差错的纠正由高层(TCP或UDP)来决定。
  • 如果高层发现丢失了一些数据而进行重传,但以太网并不知道这是一个重传的帧,而是当作一个新的数据帧来发送

2:以太网发送的数据都使用曼彻斯特 (Manchester) 编码,如图21所示:

image-20190510204909832

图21:曼彻斯特编码示意图

曼彻斯特编码缺点是:它所占的频带宽度比原始的基带信号增加了一倍(因为每秒传送的码元数加倍了)。

下面介绍CSMA/CD:

CSMA/CD 含义载波监听多点接入 / 碰撞检测 (Carrier Sense Multiple Access with Collision Detection) 。

**“多点接入”**表示许多计算机以多点接入的方式连接在一根总线上。

“载波监听”是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞

总线上并没有什么“载波”。因此, “载波监听”就是用电子技术检测总线上有没有其他计算机发送的数据信号。

“碰撞检测”就是计算机边发送数据边检测信道上的信号电压大小。当几个站同时在总线上发送数据时,总线上的信号电压摆动值将会增大(互相叠加)。当一个站检测到的信号电压摆动值超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。所谓“碰撞”就是发生了冲突。因此“碰撞检测”也称为**“冲突检测”**。

检测到碰撞之后:

在发生碰撞时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息来。每一个正在发送数据的站,一旦发现总线上出现了碰撞,就要立即停止发送,免得继续浪费网络资源,然后等待一段随机时间后再次发送。

CSMA/CD协议的工作流程如图22所示:

image-20190510205416402

图22:CSMA/CD协议工作流程

这里就有一个问题了,**既然已经进行了"载波监听",理论上来说不可能再出现碰撞了啊,为什么还需要进行碰撞检测呢?**这是因为信号传播实验会对载波监听产生影响,如图23所示,在局域网的分析中,通常把单程端到端的传播时延记为τ\tau

  • t=0t=0时,A发送数据,B检测到信道为空闲
  • t=τδt=\tau-\delta时(τ&gt;δ&gt;0\tau&gt;\delta&gt;0),A发送的数据还没有到达B,由于B检测到信道是空闲的,B发送数据
  • 经过时间δ/2\delta/2之后,即在t=τδ/2t=\tau-\delta/2时,A发送的数据和B发送的数据产生碰撞,但是A和B都不知道发生了碰撞
  • t=τt=\tau时,B检测到发生了碰撞,停止发送数据
  • t=2τδt=2\tau-\delta时,A检测到发生了碰撞,因而也停止发送数据

结果是A和B均发送数据失败,二者都要推迟一段时间后发送数据

image-20190510223125399

图23

由此可见,每一个站在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。这一小段时间是不确定的,它取决于另一个发送数据的站到本站的距离。因此,以太网不能保证某一时间之内一定能够把自己的数据成功地发送出去(因为存在产生碰撞的可能)。以太网的这一特点称为发送的不确定性。如果希望在以太网上发生碰撞的机会很小,必须使整个以太网的平均通信量小于以太网的最高数据率

从图22可以看出,最先发送数据帧的A站,在发送数据后至多经过2τ2\tau就可以知道所发送的数据是否遭受了碰撞,这个至多成立的条件就是δ0\delta \to 0的情况。因此以太网的端到端往返时间2τ2\tau称为争用期,争用期又称碰撞窗口(collision window)。一个站点发送完数据之后只有经过争用期这端时间之后还没有检测到碰撞,才能肯定这次发送不会产生碰撞。

二进制指数类型退避算法(truncated binary exponential type)

发生碰撞的站在停止发送数据后,要推迟(退避)一个随机时间才能再发送数据。以太网使用**二进制指数类型退避算法(truncated binary exponential type)**来确定碰撞重传的时机,具体算法如下:

  • 基本退避时间取为争用期 2τ 。

  • 从整数集合$ [0, 1, … , (2^k- 1)]$ 中随机地取出一个数,记为 r。重传所需的时延就是 r 倍的基本退避时间

  • 参数 k 按下面的公式计算:
    k=Min[,10] k = Min[重传次数, 10]

    即当 k ≤10 时,参数 k 等于重传次数。

  • 当重传达 16 次仍不能成功时即丢弃该帧,并向高层报告

例如:

  • 第 1 次冲突重传时: k = 1,r 为 {0,1} 集合中的任何一个数。
  • 第 2 次冲突重传时: k = 2,r 为 {0,1,2,3} 集合中的任何一个数。
  • 第 3 次冲突重传时: k = 3,r 为 {0,1,2,3,4,5,6,7} 集合中的任何一个数。

最短有效帧长:

现在考虑一种情况。某个站发送了一个很短的帧,但在发送完毕之前并没有检测出碰撞。假定这个帧在继续向前传播到达目的站之前和别的站发送的帧发生了碰撞,因而目的站将收到有差错的帧(当然会把它丢弃)。可是发送站却不知道这个帧发生了碰撞,因而不会重传这个帧。这种情况显然是我们所不希望的。为了避免发生这种情况,以太网规定了一个最短帧长64字节,即512 bit。如果要发送的数据非常少,那么必须加入一些填充字节,使帧长不小于64字节。对于10Mbit/s以太网,发送512 bit需要51.2 μs\mu s,也就是上面提到的争用期。由此可见,以太网在发送数据时,如果在争用期(共发送了64字节)没有发生碰撞,那么后续发送的数据就一定不会发生冲突。换句话说,如果发生碰撞,就一定是在发送的前64字节之内。由于一检测到冲突就立即中止发送,这时已经发送出去的数据一定小于64宇节,因此凡长度小于64字节的帧都是由于冲突而异常中止的无效帧。只要收到了这种无效帧,就应当立即将其丢弃。

覆盖范围:

考虑这样一个问题:在 10 Mbit/s 以太网 51.2 μs 的争用期内,信号能传输多远的距离

以太网上最大的端到端单程时延必须小于争用期的一半(即 25.6 μs),这相当于以太网的最大端到端长度约为 5 km。事实上,实用的以太网的覆盖范围远没有这样大。因此,实用的以太网都能在争用期51.2 μs 内检测到可能发生的碰撞。

实际上,以太网的争用期之所以定位51.2 μs ,除了考虑以太网的端到端时延,还考虑到了许多其他因素,如存在的转发器所增加的时延,以及下面要介绍的干扰信号的持续时间等。

强化碰撞:

当发送数据的站一旦发生了碰撞时,除了立即停止发送数据外,还要继续发送32bit或者48bit的人为干扰信号(jamming signal),以便让所有用户都知道已经发生了碰撞,如图24所示,对于10Mbit/s以太网,发送32bit只需要3.2μs\mu s,发送48bit只需要4.8μs\mu s.

image-20190511102425762

图24:干扰信号的发送

注意:B也能够检测到冲突,并立即停止发送数据帧,接着就发送干扰信号,这里为了简单起见,只画出 A 发送干扰信号的情况。

CSMA/CD 协议的重要特性

  • 使用 CSMA/CD 协议的以太网不能进行全双工通信而只能进行双向交替通信(半双工通信)
  • 每个站在发送数据之后的一小段时间内,存在着遭遇碰撞的可能性
  • 这种发送的不确定性使整个以太网的平均通信量远小于以太网的最高数据率

CSMA/CD 协议的要点:

image-20190510224509544

图25:CSMA/CD协议流程

使用集线器的星形拓扑

传统以太网最初是使用粗同轴电缆,后来演进到使用比较便宜的细同轴电缆,最后发展为使用更便宜和更灵活的双绞线。 采用双绞线的以太网采用星形拓扑,在星形的中心则增加了一种可靠性非常高的设备,叫做集线器 (hub)

传统以太网使用的是同轴电缆,采用的是总线型拓扑结构,如图26所示:

image-20190511102835046

图26:使用同轴电缆对应的总线型拓扑结构

采用双绞线的以太网对应的是包含集线器的星形拓扑结构,如图27所示:

image-20190511103034621

图27:使用同轴电缆和集线器的星形拓扑结构

如图27所示,双绞线以太网总是和集线器配合使用,每个站需要用两根无屏蔽双绞线(放在一根电缆内),一根负责发送、另一个根负责接收,双绞线的两端使用RJ-45插头,由于集线器使用了大规模的集成电路芯片,因此集线器的可靠性得到了大大的提高。。

1990年,IEEE制定出了采用双绞线的星形以太网10BASE-T的标准802.3i,10BASE-T的通信距离稍短,每个站到集线器的距离不超过100m

10BASE-T的代表意义如下:

  • 10:速率为10Mbit/s
  • BASE:基带
  • T:双绞线

10BASE-T 以太网在局域网中的统治地位:

这种 10 Mbit/s 速率的无屏蔽双绞线星形网的出现,既降低了成本,又提高了可靠性。 具有很高的性价比。 10BASE-T 双绞线以太网的出现,是局域网发展史上的一个非常重要的里程碑,它为以太网在局域网中的统治地位奠定了牢固的基础。 从此以太网的拓扑就从总线形变为更加方便的星形网络,而以太网也就在局域网中占据了统治地位

集线器的一些特点:

集线器是使用电子器件来模拟实际电缆线的工作,因此整个系统仍然像一个传统的以太网那样运行。 使用集线器的以太网在逻辑上仍是一个总线网,各工作站使用的还是 CSMA/CD 协议,并共享逻辑上的总线。 集线器很像一个多接口的转发器,工作在物理层。 集线器采用了专门的芯片,进行自适应串音回波抵消,减少了近端串音

以太网的信道利用率

多个站在以太网上同时工作就可能会发生碰撞。 当发生碰撞时,信道资源实际上是被浪费了。因此,当扣除碰撞所造成的信道损失后,以太网总的信道利用率并不能达到 100%

假设τ 是以太网单程端到端传播时延。则争用期长度为 2τ ,即端到端传播时延的两倍。检测到碰撞后不发送干扰信号。 设帧长为 L (bit),数据发送速率为 C (bit/s),则帧的发送时间为 T0 = L/C (s)

一个站在发送帧时出现了碰撞。经过一个争用期 2τ 后,可能又出现了碰撞。这样经过若干个争用期后,一个站发送成功了。假定发送帧需要的时间是 T0,如图28所示:

image-20190511104117307

图28

注意到,成功发送一个帧需要占用信道的时间T0 + τ ,比这个帧的发送时间要多一个单程端到端时延 τ 。 这是因为当一个站发送完最后一个比特时,这个比特还要在以太网上传播。 在最极端的情况下,发送站在传输媒体的一端,而比特在媒体上传输到另一端所需的时间是 τ 。

要提高以太网的信道利用率,就必须减小 τ 与 T0 之比。 在以太网中定义了参数 a ,它是以太网单程端到端时延 τ 与帧的发送时间 T0 之比:
a=τ/To a=\tau /T_o
a → 0,表示一发生碰撞就立即可以检测出来, 并立即停止发送,因而信道利用率很高a 越大,表明争用期所占的比例增大,每发生一次碰撞就浪费许多信道资源,使得信道利用率明显降低

对以太网参数 a 的要求:

为提高利用率,以太网的参数 a 的值应当尽可能小些。

对以太网参数 a 的要求是:

  • 当数据率一定时,以太网的连线的长度受到限制,否则 τ 的数值会太大。
  • 以太网的帧长不能太短,否则 T0 的值会太小,使 a 值太大。

信道利用率的最大值 SmaxS_{max}

理想化的情况下,以太网上的各站发送数据都不会产生碰撞(这显然已经不是 CSMA/CD,而是需要使用一种特殊的调度方法),即总线一旦空闲就有某一个站立即发送数据。 发送一帧占用线路的时间是 T0 + τ ,而帧本身的发送时间是 T0。于是,我们可计算出理想情况下的极限信道利用率 SmaxS_{max} 为:
Smax=T0T0+τ=11+a S_{max}=\frac{T_0}{T_0+\tau}=\frac{1}{1+a}
只有当参数 a 远小于 1 才能得到尽可能高的极限信道利用率。 据统计,当以太网的利用率达到 30% 时就已经处于重载的情况。很多的网络容量被网上的碰撞消耗掉了。

以太网的MAC层

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

请注意,如果连接在局域网上的主机或路由器安装有多个适配器,那么这样的主机或路由器就有多个“地址”。更准确些说,这种 48 位“地址”应当是某个接口的标识符

48位的MAC地址

IEEE 802 标准规定 MAC 地址字段可采用 6 字节 ( 48位)2 字节 ( 16 位) 这两种中的一种。 IEEE 的注册管理机构 RA 负责向厂家分配地址字段 6 个字节中的前三个字节 (即高位 24 位),称为组织唯一标识符。 地址字段 6 个字节中的后三个字节 (即低位 24 位) 由厂家自行指派,称为扩展唯一标识符,必须保证生产出的适配器没有重复地址,如图29所示:

image-20190511105232391

图29:48位MAC地址的组成

一个地址块可以生成 2242^{24} 个不同的地址。这种 48 位地址称为 MAC-48,它的通用名称是 EUI-48。 生产适配器时,6 字节的 MAC 地址已被固化在适配器的 ROM,因此,MAC 地址也叫做硬件地址 (hardware address)物理地址。 “MAC 地址”实际上就是适配器地址适配器标识符 EUI-48

单站地址、组地址、广播地址

IEEE 规定地址字段的第一字节的最低位为 I/G 位。I/G 表示 Individual / Group。

  • 当 I/G 位 = 0 时,地址字段表示一个单站地址
  • 当 I/G 位 = 1 时,表示组地址,用来进行多播(以前曾译为组播)。此时,IEEE 只分配地址字段前三个字节中的 23 位

当 I/G 位分别为 0 和 1 时,一个地址块可分别生成 2232^{23}单个站地址和$ 2^{23}$ 个组地址所有 48 位都为 1 时,为广播地址,只能作为目的地址使用。

全球化管理、本地管理

IEEE 把地址字段第一字节的最低第 2 位规定为 G/L 位,表示 Global / Local。

  • 当 G/L 位 = 0 时,是全球管理保证在全球没有相同的地址),厂商向 IEEE 购买的 OUI 都属于全球管理。
  • 当 G/L 位 = 1 时, 是本地管理,这时用户可任意分配网络上的地址

适配器检查MAC地址

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

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

所有的适配器都至少能够识别前两种帧,即能够识别单播地址广播地址。 有的适配器可用编程方法识别多播地址,当操作系统启动时,它就把适配器初始化,使适配器能够识别某些多播地址,显然, 只有目的地址才能使用广播地址和多播地址

以太网适配器还可设置为一种特殊的工作方式,即混杂方式 (promiscuous mode) ,此方式工作的以太网适配器只要**“听到”有帧在以太网上传输就都接收下来,而不管这些帧时发往哪个站的**。请注意,这种方式实际上是**"窃听"其他站点的通信但并不中断其他站点的通信**,网络上的黑客常利用这种方法非法获取网上用户的口令。

当然,混杂方式有时也是非常有用的,比如网络维护人员和管理人员需要这种方式来监视和分析以太网上的流量。一种很有用的网络工具叫**嗅探器(sniffer)**就设置为混杂方式的网络适配器。

MAC帧的格式

常用的以太网 MAC 帧格式有两种标准:

  • DIX Ethernet V2 标准
  • IEEE 的 802.3 标准

最常用的 MAC 帧是以太网 V2 的格式,这里主要介绍这个V2格式:

image-20190511111242782

图30:以太网V2的MAC帧格式

如图30所示,V2的MAC帧由以下几个部分组成:

  • 目的地址,占6字节
  • 源地址,占6字节
  • 类型,占2字节,作用是标识上一层(网络层)用的什么协议,以便把收到的MAC帧上交给上一层相应的协议
  • 数据,长度在46到1500字节之间,1500很好理解,它是数据链路层规定的数据部分最长字节数,46是这么得出的:最小长度64字节减去18字节的首部和尾部。
  • 帧检验序列FCS:用作CRC检验

这里有个问题,MAC帧中并没有表示数据字段长度的字段,这样接收方的MAC子层怎么知道应该从接收到的以太网帧中取出多少字节的数据交付给上一层协议呢

答案:我们在发送数据的时候使用的是曼彻斯特编码,曼彻斯特编码的特点是其每一个码元的正中间一定又一次电压的转换(从高到低或者从低到高),当发送方把一个以太网帧发送完成后,就不再发送其他码原了,因此,接收方很容易可以找到以太网帧结束的位置,然后从结束的位置向前找4个字节(FSC的长度),就能找到数据字段结束的位置。

与以太网 V2 MAC 帧格式相似,区别在于:

  • IEEE 802.3 规定的 MAC 帧的第三个字段是“长度 / 类型”。
    • 当这个字段值大于 0x0600 时(相当于十进制的 1536),就表示“类型”。这样的帧和以太网 V2 MAC 帧完全一样。
    • 当这个字段值小于 0x0600 时才表示“长度”。
  • 当“长度/类型”字段值小于 0x0600 时,数据字段必须装入上面的逻辑链路控制 LLC 子层的 LLC 帧。

现在市场上流行的都是以太网 V2 MAC 帧,但大家也常常把它称为 IEEE 802.3 标准的 MAC 帧。

无效的MAC帧
  • 数据字段的长度与长度字段的值不一致,这里的长度字段实际上是上面所讲的类型字段,当这个字段的值大于0x600时,就表示类型,小于0x600时表示长度,实际上这个字段表示长度时并没有什么实际意义,因为我们前面讲了,以太网使用曼彻斯特编码,长度字段可以自己判断。
  • 帧的长度不是整数个字节;
  • 用收到的帧检验序列 FCS 查出有差错;
  • 数据字段的长度不在 46 ~ 1500 字节之间。
  • 有效的 MAC 帧长度为 64 ~ 1518 字节之间。

对于检查出的无效 MAC 帧就简单地丢弃。以太网不负责重传丢弃的帧。

拓展的以太网

在许多情况下,我们希望对以太网的覆盖范围进行拓展,本节主要介绍以太网的拓展方法,这种拓展的以太网在网络层看来仍然是一个网络

在物理层拓展以太网

使用光纤拓展

主机使用光纤(通常是一对光纤)和一对光纤调制解调器连接到集线器。 很容易使主机和几公里以外的集线器相连接,如图31所示:

image-20190511113537425

图31:主机使用光纤和一对光纤调制解调器连接到集线器<

使用集线器拓展

将多个以太网段连成更大的、多级星形结构的以太网,如图32所示:

image-20190511113647614

图32:使用集线器拓展以太网

优点 :

  • 使原来属于不同碰撞域的以太网上的计算机能够进行跨碰撞域的通信。
  • 扩大了以太网覆盖的地理范围。

缺点:

  • 碰撞域增大了,但总的吞吐量并未提高
  • 如果不同的碰撞域使用不同的数据率,那么就不能用集线器将它们互连起来

这里提到了一个碰撞域的概念,我们来看看什么是碰撞域

碰撞域(collision domain)又称为冲突域,是指网络中一个站点发出的帧会与其他站点发出的帧产生碰撞或冲突的那部分网络碰撞域越大,发生碰撞的概率越高

在数据链路层拓展以太网

扩展以太网更常用的方法是在数据链路层进行。早期使用网桥,现在使用以太网交换机,如图33所示:

image-20190511114029465

图33:网桥和交换机拓展以太网的示意图

什么是网桥:

网桥工作在数据链路层。 它根据 MAC 帧的目的地址对收到的帧进行转发过滤。 当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧的目的 MAC 地址,然后再确定将该帧转发到哪一个接口,或把它丢弃。

什么是交换机:

以太网交换机实质上就是一个多接口的网桥,通常都有十几个或更多的接口。每个接口都直接与一个单台主机或另一个以太网交换机相连,并且一般都工作在全双工方式。以太网交换机具有并行性,能同时连通多对接口,使多对主机能同时通信

交换机的特点
  • 相互通信的主机都是独占传输媒体,无碰撞地传输数据,如图34所示:

image-20190511114329921

图34:以太网交换机的每一个接口都是一个碰撞域
  • 以太网交换机的接口有存储器,能在输出端口繁忙时把到来的帧进行缓存

  • 以太网交换机是一种即插即用设备,其内部的帧交换表(又称为地址表)是通过自学习算法自动地逐渐建立起来的。

  • 以太网交换机使用了专用的交换结构芯片,用硬件转发,其转发速率要比使用软件转发的网桥快很多

  • 以太网交换机的性能远远超过普通的集线器,而且价格并不贵

交换机的优点:

  • 用户独享带宽,增加了总容量,如图35所示:

    image-20190511114622176

    图35
  • 共享总线以太网转到交换式以太网时,所有接入设备的软件和硬件、适配器等都不需要做任何改动。

  • 以太网交换机一般都具有多种速率的接口,方便了各种不同情况的用户。

以太网交换机的交换方式:

  • 存储转发方式

    把整个数据帧先缓存后再进行处理。

  • 直通 (cut-through) 方式

    接收数据帧的同时就立即按数据帧的目的 MAC 地址决定该帧的转发接口,因而提高了帧的转发速度。

    缺点是它不检查差错就直接将帧转发出去,因此有可能也将一些无效帧转发给其他的站。

在某些情况下,仍需要采用基于软件的存储转发方式进行交换,例如,当需要进行线路速率匹配、协议转换或差错检测时。

以太网交换机的自学习功能

image-20190511132304145

图36:以太网交换机中的交换表

如图36-a所示,我们假设当前交换机有4个接口,各连接一台计算机,其MAC地址分别是A、B、C、D,一开始以太网交换机中的交换表示空的,然后:

  • A向B发送一帧,交换机在交换表中根据帧的目的地址查找对应的接口,由于当前交换表是空的,所以没有找到,所以使用将当前帧广播给出了接口1之外的所有接口(因为当前帧是从接口1发送出来的,广播的时候自然就不用再广播给接口1了),由于可以从当前帧中找到源地址即A,所以将A-1加入到交换表中,当B、C、D收到交换机的广播之后,由于C、D的MAC地址与当前帧的目的地址不一样,所以舍弃收到的当前帧,而B的MAC地址与当前帧的目的地址一样,所以收下当前帧。
  • B要向A发送一帧,由于经历了上一步,这时交换机的交换表中有了A-1这一行,所以交换机直接将B发送给A的帧发送到接口1,而不用再广播给C、D,同时由于当前帧的源地址是B,所以将B-3这一行添加到交换表中

经历了以上两步之后,交换机的交换表如图36-所示,同理可将C、D也更新至交换表。

以上就是以太网交换机的自学习过程。

考虑到可能有时要在交换机的接口更换主机,或者主机要更换其网络适配器,这就需要更改交换表中的项目。为此,在交换表中每个项目都设有一定的有效时间。过期的项目就自动被删除

以太网交换机的这种自学习方法使得以太网交换机能够即插即用,不必人工进行配置,因此非常方便。

交换机的自学习和转发帧的流程如图37所示:

image-20190511133308369

图37:交换机自学习和转发帧的步骤

有时为了增加网络的可靠性,在使用以太网交换机组网时,往往会增加一些冗余的链路,在这种情况下,自学习的过程就可能导致以太网帧在网络的某个环路中无限制地兜圈子,我们以图38为例说明:

image-20190511133530208

图38

假定一开始主机A通过交换机#1向主机B发送一帧,那么就会存在这么一条路径:

A -> #1.1 ->#1.3->#2.1->#2.2->#1.4->#1.3,这样就会无限制地循环下去,白白浪费了网络资源。

为了解决这种兜圈子的问题,IEEE802.1D标准制定了一个生成树协议STP(Spanning Tree Protocol),思路是不改变网络的实际拓扑,但在逻辑上则切断某些链路,使得从一台主机到所有其他主机的路径是无环路的树状结构,从而消除了兜圈子现象,如图39所示:

image-20190511133940342

图39

上图中,左边是原始的拓扑结构,存在回路,右边去切断了某些链路(虚线部分),这样没有影响整个网络的拓扑结构(该连通的还是能连通),但是解决了回路循环问题

从总线以太网到星形以太网

早期,以太网采用无源的总线结构。 现在,采用以太网交换机的星形结构成为以太网的首选拓扑。 总线以太网使用 CSMA/CD 协议,以半双工方式工作。 以太网交换机不使用共享总线,没有碰撞问题,因此不使用 CSMA/CD 协议(相关的"争用期”也没有了),以全双工方式工作。但仍然采用以太网的帧结构

image-20190511134256932

图40:总线结构的以太网(左)、星形结构的以太网(右)

虚拟局域网

局域网存在以下几个问题:

  • 扩展性
  • 安全性
  • 可管理性 等

image-20190511135314548

图41

总线以太网和10Base-T星形以太网的所有计算机都处于同一个碰撞域(冲突域)、同一个广播域中,如图41所示。

广播域(broadcast domain):指这样一部分网络,其中任何一台设备发出的广播通信都能被该部分网络中的所有其他设备所接收。

采用以太网交换机的星形以太网每一个接口都处于一个独立的碰撞域中,但所有计算机都处于同一个广播域中,如图42所示:

image-20190511135454707

图42

利用以太网交换机可以很方便地实现虚拟局域网 VLAN (Virtual LAN)。 IEEE 802.1Q 对虚拟局域网 VLAN 的定义: 虚拟局域网 VLAN 是由一些局域网网段构成的与物理位置无关逻辑组,而这些网段具有某些共同的需求。每一个 VLAN 的帧都有一个明确的标识符指明发送这个帧的计算机是属于哪一个 VLAN

虚拟局域网其实只是局域网给用户提供的一种服务,而并不是一种新型局域网。由于虚拟局域网是用户网络资源逻辑组合,因此可按照需要将有关设备和资源非常方便地重新组合,使用户从不同的服务器或数据库中存取所需的资源。

image-20190511135931360

图43

如图43所示,设有10台计算分别处于3个楼层中,使用以太网交换机可以很轻松地将这10台计算机划分为3个虚拟局域网VLAN1、VLAN2、VLAN3,每一个虚拟局域网都是一个广播域,VLAN1、VLAN2、VLAN3是3个不同的广播域,当 B1 向 VLAN2 工作组内成员发送数据时, 工作站 B2 和 B3 将会收到其广播的信息。VLAN1 和 VLAN3 中的工作站 A1,A2 和 C1 等都不会收到 B1 发出的广播信息。

虚拟局域网限制了接收广播信息的工作站数,使得网络不会因传播过多的广播信息 (即**“广播风暴”)** 而引起性能恶化。

虚拟局域网的帧格式:

IEEE 批准了 802.3ac 标准,该标准定义了以太网的帧格式的扩展,以支持虚拟局域网。 虚拟局域网协议允许在以太网的帧格式中插入一个4字节的标识符,称为 VLAN 标记 (tag),用来指明该帧属于哪一个虚拟局域网。 插入VLAN标记得出的帧称为 802.1Q 帧或带标记的以太网帧,如图44所示:

image-20190511141058140

图44:虚拟局域网的帧格式

那么在整个以太网上,各个站点的帧是这么传送的:

image-20190511141156668

图45

如图45所示,在计算机与交换机之间采用的还是标准的以太网帧,但是在交换机与交换机之间采用的是具有VLAN标记的802.1Q帧。

虚拟局域网的优点:

  • 改善了性能
  • 简化了管理
  • 降低了成本
  • 改善了安全性

高速以太网

随着电子技术的发展,以太网的速率也不断提升,从传统的10Mbit/s以太网一直发展到现在常用的1Gbit/s的吉比特以太网,甚至更快的以太网,本节简单介绍几种高速以太网技术。

100BASE-T以太网

速率达到或超过 100 Mbit/s 的以太网称为高速以太网。 100BASE-T 在双绞线上传送 100 Mbit/s 基带信号的星形拓扑以太网,仍使用 IEEE 802.3 的 CSMA/CD 协议。 100BASE-T 以太网又称为快速以太网 (Fast Ethernet)。 1995 年IEEE已把 100BASE-T 的快速以太网定为正式标准,其代号为 IEEE 802.3u。

100BASE-T以太网的特点:

  • 可在全双工方式下工作而无冲突发生。在全双工方式下工作时**,不使用 CSMA/CD 协议**。
  • MAC 帧格式仍然是 802.3 标准规定的。
  • 保持最短帧长不变,但将一个网段的最大电缆长度减小到 100 米。
  • 帧间时间间隔从原来的 9.6 μs 改为现在的 0.96 μs 。

100 Mbit/s 以太网的三种不同的物理层标准:

  • 100BASE-TX

    • 使用 2 对 UTP 5 类线 或 屏蔽双绞线 STP。

    • 网段最大程度:100 米。

  • 100BASE-T4

    • 使用 4 对 UTP 3 类线 或 5 类线。
    • 网段最大程度:100 米。
  • 100BASE-FX

    • 使用 2 对光纤。
    • 网段最大程度:2000 米。

吉比特以太网

允许在 1 Gbit/s 下以全双工和半双工两种方式工作。 使用 IEEE 802.3 协议规定的帧格式。 在半双工方式下使用 CSMA/CD 协议全双工方式不使用 CSMA/CD 协议。 与 10BASE-T 和 100BASE-T 技术向后兼容。

吉比特以太网可用作现有网络的主干网,也可在高带宽(高速率)的应用场合中。

吉比特以太网的物理层

使用两种成熟的技术:一种来自现有的以太网,另一种则是美国国家标准协会 ANSI 制定的光纤通道 FC (Fiber Channel)

使用以太网进行宽带接入

以太网宽带接入具有以下特点:

  • 可以提供双向的宽带通信。
  • 可以根据用户对带宽的需求灵活地进行带宽升级。
  • 可以实现端到端的以太网传输,中间不需要再进行帧格式的转换。这就提高了数据的传输效率且降低了传输的成本。
  • 不支持用户身份鉴别。
PPPoE

PPPoE (PPP over Ethernet) 的意思是“在以太网上运行 PPP”,它把 PPP 协议与以太网协议结合起来 —— 将 PPP 帧再封装到以太网中来传输。 现在的光纤宽带接入 FTTx 都要使用 PPPoE 的方式进行接入。在 PPPoE 弹出的窗口中键入在网络运营商购买的用户名和密码,就可以进行宽带上网了。 利用 ADSL 进行宽带上网时,从用户个人电脑到家中的 ADSL 调制解调器之间,也是使用 RJ-45 和 5 类线(即以太网使用的网线)进行连接 的,并且也是使用 PPPoE 弹出的窗口进行拨号连接的。

总结

  • 链路是从一个结点到相邻结点的一段物理线路,数据链路则是在链路的基础上增加了一些必要的硬件(如网络适配器)和软件(如协议的实现)。
  • 数据链路层使用的信道主要有点对点信道和广播信道两种。
  • 数据链路层传送的协议数据单元是帧。数据链路层的三个基本问题则是封装成帧、透明传输和差错检测。
  • 循环冗余检验CRC是一种检错方法,而帧检验序列FCS是添加在数据后面的冗余码。
  • 点对点协议PPP是数据链路层使用最多的一种协议,它的特点是简单只检测差错,而不是纠正差错不使用序号,也不进行流量控制可同时支持多种网络层协议。
  • PPPoE是为宽带上网的主机使用的链路层协议。
  • 局域网的优点是具有广播功能,从一个站点可很方便地访问全网便于系统的扩展和逐渐演变;提高了系统的可靠性、可用性和生存性。
  • 共享通信媒体资源的方法有二:一是静态划分信道(各种复用技术),二是动态媒体接入控制,又称为多点接入(随机接入或受控接入)。
  • IEEE 802委员会曾把局域网的数据链路层拆成两个子层,即逻辑链路控制(LLC)子层(与传输媒体无关)和媒体接入控制(MAC)子层(与传输媒体有关)。但现在LLC子层已成为历史。计算机与外界局域网的通信要通过通信适配器(或网络适配器),它又称为网络接口卡或网卡。
  • 计算机的硬件地址就在适配器的ROM中。以太网采用无连接的工作方式,对发送的数据帧不进行编号,也不要求对方发回确认。目的站收到有差错帧就把它丢弃,其他什么也不做。
  • 以太网采用的协议是具有冲突检测的载波监听多点接入CSMA/CD.协议的要点是发送前先监听,边发送边监听,一旦发现总线上出现了碰撞,就立即停止发送。然后按照退避算法等待一段随机时间后再次发送。因此,每一个站在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。以太网上各站点都平等地争用以太网信道。
  • 传统的总线以太网基本上都是使用集线器的双绞线以太网。这种以太网在物理上是星形网,但在逻辑上则是总线形网。集线器工作在物理层,它的每个接口仅仅简单地转发比特,不进行碰撞检测。
  • 以太网的硬件地址,即B4AC地址实际上就是适配器地址或适配器标识符,与主机所在的地点无关。源地址和目的地址都是48位长。以太网的适配器有过滤功能,它只接收单播帧、广播帧或多播帧。
  • 使用集线器可以在物理层扩展以太网(扩展后的以太网仍然是一个网络)。
  • 交换式集线器常称为以太网交换机或第二层交换机(工作在数据链路层)。它就是一个多接口的网桥,而每个接口都直接与某台单主机或另一个集线器相连,且工作在全双工方式。以太网交换机能同时连通许多对的接口,使每一对相互通信的主机都能像独占通信媒体那样,无碰撞地传输数据。
  • 高速以太网有100 lvibit/s的快速以太网、吉比特以太网和IO Gbit/s的10吉比特以太网。最近还发展到100吉比特以太网。在宽带接入技术中,也常使用高速以太网进行接入。
2019-05-13 18:48:04 qq_36982160 阅读数 74

计算机网络第五弹——运输层

彩蛋

计算机网络谢希仁第七版原版ppt获取方式:公众号后台回复”N3“即可获取。

由于公众号不支持显示LaTeX公式且公众号排版混乱,建议大家关注微信公众号"IT工匠",后台回复"N4-4"获取xmind源文件以及本文原文pdf文件获取更佳阅读体验。

本文主要内容:

计算机网络第五弹——运输层

运输层协议概述

进程之间的通信

从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分最高层,同时也是用户功能中的最低层,当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。

“逻辑通信”的意思是“好像是这样通信,但事实上并非真的这样通信”。从IP层来说,通信的两端是两台主机,但**“两台主机之间的通信”这种说法还不够清楚,严格地讲,两台主机进行通信就是两台主机中的应用进程互相通信。从运输层的角度看,通信的真正端点并不是主机而是主机中的进程**,也就是说,端到端的通信是应用进程之间的通信。

即**“主机 A 的某个进程和主机 B 上的另一个进程进行通信”**, 简称为“计算机之间通信”

运输层具有屏蔽作用,即运输层向高层用户屏蔽了下面网络核心的细节,它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别。 当运输层采用面向连接的 TCP 协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。 当运输层采用无连接的 UDP 协议时,这种逻辑通信信道是一条不可靠信道

运输层和网络层的主要区别

  1. 网络层为主机之间提供逻辑通信,运输层为应用进程之间提供端到端的逻辑通信
  2. 运输层要对报文进行差错检测,在网络层,IP数据报首部中的检验和字段只检验首部是否出现差错而不检查数据部分

复用

发送方在不同的应用进程可以使用同一个运输层协议 传送数据(当然需要加上适当的首部)。

分用

接收方的运输层在剥去报文的首部之后能够把这些数据正确交付给目的进程。

运输层的两个主要协议

如图1-1所示,运输层主要有2个协议:

  1. 用户数据报协议 UDP (User Datagram Protocol)
  2. 传输控制协议 TCP (Transmission Control Protocol)

image-20190513112310121

图1-1:TCP/IP体系中的运输层协议

按照OSI术语,两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit),但是在TCP/IP体系中, TCP 传送的数据单位协议是 TCP 报文段(segment), UDP 传送的数据单位协议是 UDP 报文或用户数据报

TCP与UDP的对比

对比项 TCP UDP
是否面向连接 无连接的协议,提供无连接服务; 面向连接的协议,提供面向连接服务;
传输的TPDU 其传送的运输协议数据单元TPDU是 UDP 报文或用户数据报; 其传送的运输协议数据单元TPDU是 TCP 报文;
是否支持单播、多播、广播 支持单播、多播、广播; 支持点对点单播,不支持多播、广播;
是否可靠 不提供可靠交付; 提供可靠服务;
复杂性 简单。适用于很多应用,如:多媒体应用等。 复杂。用于大多数应用,如:万维网、电子邮件、文件传送等。

使用 UDP 和 TCP 的典型应用和应用层协议

image-20190513112901952

图1-2

需要注意的是:

  1. 运输层UDP 用户数据报网络层IP数据报有很大区别。

    IP 数据报要经过互连网中许多路由器的存储转发UDP 用户数据报是在运输层端到端抽象的逻辑信道中传送的。

  2. TCP 报文段是在运输层抽象的端到端逻辑信道中传送,这种信道是可靠的全双工信道。但这样的信道却不知道究竟经过了哪些路由器,而这些路由器也根本不知道上面的运输层是否建立了 TCP 连接

运输层的端口

运行在计算机中的进程是用进程标识符来标志的, 但运行在应用层的各种应用进程却不应当让计算机操作系统指派它的进程标识符,这是因为在互联网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符,为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法对 TCP/IP 体系的应用进程进行标志

但是,把一个特定及其上运行的特定进程指明为互联网上通信的最后终点还是不可行的。这是因为进程的创建和撤销都是动态的,发送方几乎无法识别其他机器上的进程。另外,我们往往需要利用目的主机提供的功能来识别终点,而不需要知道实现这个功能的进程(例如,要和互联网上的某个邮件服务器联系,并不一定要知道这个服务器功能是由目的主机上的哪个进程创建的)。

解决上述问题的方法就是在运输层使用协议端口号 (protocol port number),或通常简称为端口 (port)。 虽然通信的终点是应用进程,但我们可以把端口想象是通信的终点,因为我们只要把要传送的报文交到目的主机的某一个合适的目的端口,剩下的工作(即最后交付目的进程)就由 TCP 来完成。

注意这种在协议栈层间的抽象的协议端口是软件端口,和路由器或交换机上的硬件端口是完全不同的概念,硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。

TCP/IP 运输层端口

端口用一个 16 位端口号进行标志,允许有65,535个不同的端口号。 端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程,在互联网中,不同计算机的相同端口号是没有联系的

由此可见,两个计算机中的进程要互相通信,必须知道对方的端口号(为了找到对方计算机中的应用进程) 和 对方的 IP 地址(为了找到对方的计算机)。

端口的分类

image-20190513114256169

图1-3:端口的分类

如图1-3,端口分为以下几类:

服务端使用的端口
  1. 熟知端口,数值一般为 0 ~ 1023。
  2. 登记端口号,数值为 1024 ~ 49151,为没有熟知端口号的应用程序使用的。使用这个范围的端口号必须在 IANA 登记,以防止重复。
客户端使用的端口

又称为短暂端口号,数值为 49152 ~ 65535,留给客户进程选择暂时使用。 当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号,通信结束后,这个端口号可供其他客户进程以后使用

常用的熟知端口

如图1-4所示:

image-20190513114402164

图1-4:常用的熟知端口

用户数据报协议UDP

UDP概述

UDP只在IP的数据报服务之上增加了很少一点的功能:

  1. 复用和分用
  2. 差错检测功能
  3. UDP增加了端口号

UDP的主要特点

  1. UDP 是无连接的,发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。

  2. UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表

  3. UDP 是面向报文的。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。UDP 一次交付一个完整的报文

    发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层,UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界,应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文:

    • 若报文太长,UDP把它交给IP层之后,IP层传送时可能要进行分片,这会降低IP层的效率。
    • 若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太大,这也降低了IP层的效率。
  4. UDP 没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低,这对某些实时应用(如IP电话、视频会议)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但却不允许数据有太大的时延,UDP正好满足这种需求。

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

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

UDP首部格式

用户数据报 UDP 有两个字段:数据字段首部字段

首部字段

首部字段有 8 个字节,由 4 个字段组成,每个字段都是 2 个字节。

image-20190513134448728

图2-1:UDP用户数据报的首部和伪首部

如图2-1,UDP的首部主要由以下4个字段组成:

  1. 源端口

    在需要对方回信时选用,不需要时可用全0.

  2. 目的端口

    在终点交付报文的时候必须使用,当运输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应的端口,上交给最后的终点——应用进程。如果接收方UDP发现收到的报文中的目的端口不正确,就是用网际控制报文协议ICMP发送"端口不可达"差错报文给发送放,我们在网络层的文章中提到的traceroute命令就是让发送的UDP用户数据报故意使用一个非法的UDP端口,结果ICMP就返回"端口不可达"报文,因而达到测试的目的。请注意,虽然在 UDP 之间的通信要用到端口号,但由于 UDP 的通信是无连接的,因此不需要使用套接字来建立连接

  3. 长度

    UDP用户数据报的长度,其最小值是8(仅有首部)

  4. 校验和

    检测UDP用户数据报在传输中是否有错,有错就丢弃。

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

注意这里有一个伪首部,其组成为:

  1. 源IP地址
  2. 目的IP地址
  3. 全0
  4. IP首部中的协议字段的值,UDP为17
  5. UDP用户数据报的长度

UDP计算检验和的方法和IP数据报的检验和的计算方法类似,不同点是IP数据报的检验和只检验IP数据报的首部,但UDP的检验和是把首部和数据部分一起都检测

检验和的计算方法如图2-2所示:

image-20190513135928608

图2-2:计算UDP检验和的例子

注意:进行反码运算时,最高位如果有进位,应该将进位加到最低位,比如如果是"101"+“100"按照普通二进制加法应该等于"1001”,但是在这里结果就应该是"010"

这里需要注意的是若UDP用户数据报的数据部分不是偶数个字节,则要填入一个全0的字节(但此字节不发送)。

在接收方,把收到的UDP用户数据连同伪首部(以及可能的填充全零字节)一起,按照二进制反码求这些16位字的和,若结果全为1表示无差错,否则说明出现差错,就应该丢弃这个UDP数据报(或者可以上交给上层,但附上有差错的警告)。

传输控制协议TCP概述

TCP最主要的特点

  1. TCP 是面向连接的运输层协议,在无连接的、不可靠的 IP 网络服务基础之上提供可靠交付的服务。为此,在 IP 的数据报服务基础之上,增加了保证可靠性的一系列措施。
  2. 每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的(一对一)
  3. TCP 提供可靠交付的服务
  4. TCP 提供全双工通信
  5. 面向字节流: TCP 中的**“流”(stream)** 指的是流入或流出进程的字节序列。 “面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(比如,发送方应用程序交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把接收到的字节流交付给了上层的应用程序),但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。

image-20190513141939953

图3-1:TCP面向字节流的概念

注意:

TCP 连接是一条虚连接而不是一条真正的物理连接。

TCP 对应用进程一次把多长的报文发送到 TCP 的缓存中是不关心的

TCP 根据对方给出的窗口值当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)。

TCP 可把太长的数据块划分短一些再传送,TCP 也可等待积累有足够多的字节后再构成报文段发送出去。

TCP的连接

TCP 把连接作为最基本的抽象

每一条 TCP 连接有两个端点,而TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口,TCP 连接的端点叫做套接字 (socket)插口端口号拼接到 (contatenated with) IP 地址即构成了套接字,即套接字的组成为:
socket=(IP) 套接字socket=(IP地址:端口号)
例如:
socket=(192.168.0.08808) 套接字socket=(192.168.0.0:8808)

每一条 TCP 连接唯一地被通信两端的**两个端点(即两个套接字)**所确定。即:
TCP{socket1,socket2}={(IP1:port1),(IP2:port2)} TCP连接::\{socket1,socket2\}=\{(IP1:port1),(IP2:port2)\}
同一个 IP 地址可以有多个不同的 TCP 连接,同一个端口号也可以出现在多个不同的 TCP 连接中。

注意同一个名词socket可以表示多种不同的意思,比如:

  1. 应用编程接口 API 称为 socket API, 简称为 socket。
  2. socket API 中使用的一个函数名也叫作 socket。 调
  3. 用 socket 函数的端点称为 socket。
  4. 调用 socket 函数时其返回值称为 socket 描述符,可简称为 socket。
  5. 在操作系统内核中连网协议的 Berkeley 实现,称为 socket 实现。

上面这些socket的意思都和本文所说的**socket(端口号拼接到IP地址后)**不同。

可靠传输的工作原理

我们知道,TCP的报文段是交给IP层传送的,但IP层只能尽最大努力提供服务,也就是说,TCP下面的网络所提供的是不可靠的传输,因此,TCP必须采用适当的措施才能使两个运输层之间的通信变得可靠。

我们理想的可靠传输应该满足:

  1. 传输信道不会出错
  2. 不管发送放以什么速度发送,接收端总能来得及接收

在这样的理想传输条件下,不需要采取任何措施就能够实现可靠传输。然而实际的网络都不具备以上两个理想条件。必须使用一些可靠传输协议,在不可靠的传输信道实现可靠传输,只能通过一系列协议来尽力和上述的理想传输效果接近,采用的策略是:

  1. 自动检测差错,如果出现差错就重新传输
  2. 如果接收方来不及接收,就通知发送放发慢点

停止等待协议

“停止等待”就是每发送完一个分组就停止发送,等待对方的确认,在收到确认后再发送下一个分组, 全双工通信的双方既是发送方也是接收方。 为了讨论问题的方便,我们仅考虑 A 发送数据,而 B 接收数据并发送确认,因此 A 叫做发送方,而 B 叫做接收方,这里就需要讨论两种情况:无差错情况出现差错情况

无差错情况

image-20190513143745608

图4-1:无差错情况

无差错情况如图4-1,A 发送分组 M1,发完就暂停发送,等待 B 的确认 (ACK),B 收到了 M1 向 A 发送 ACK,A 在收到了对 M1 的确认后,就再发送下一个分组 M2。

出现差错的情况

在接收方 B 会出现两种情况:

  1. B 接收 M1 时检测出了差错,就丢弃 M1,其他什么也不做(不通知 A 收到有差错的分组)。
  2. M1 在传输过程中丢失了,这时 B 当然什么都不知道,也什么都不做。

在这两种情况下,B 都不会发送任何信息, 但A都必须重发分组直到B正确接收为止,这样才能实现可靠通信。

那么这时有几个问题:

  1. A如何知道 B 是否正确收到了 M1 呢?

    解决方法:超时重传 ,A 为每一个已发送的分组都设置了一个超时计时器,A 只要在超时计时器到期之前收到了相应的确认,就撤销该超时计时器,继续发送下一个分组 M2 ,若A在超时计时器规定时间内没有收到B的确认,就认为分组错误或丢失,就重发该分组

  2. 若分组正确到达B,但B回送的确认丢失或延迟了,A未收到B的确认,会超时重发,B 可能会收到重复的 M1 ,B如何知道收到了重复的分组,需要丢弃呢?

    解决方法:编号 A为每一个发送的分组都进行编号,若B收到了编号相同的分组,则认为收到了重复分组,丢弃重复的分组,并回送确认, B为发送的确认也进行编号,指示该确认是对哪一个分组的确认, A根据确认及其编号,可以确定它是对哪一个分组的确认,避免重复发送,若为重复的确认,则将其丢弃。

确认丢失和确认迟到

确认丢失:

若 B 所发送的对 M1 的确认丢失了,那么 A 在设定的超时重传时间内不能收到确认,但 A 并无法知道:是自己发送的分组出错、丢失了,或者 是 B 发送的确认丢失了。因此 A 在超时计时器到期后就要重传 M1。 假定 B 又收到了重传的分组 M1。这时 B 应采取两个行动:

第一,丢弃这个重复的分组 M1,不向上层交付。

第二,向 A 发送确认,不能认为已经发送过确认就不再发送,因为 A 之所以重传 M1 就表示 A 没有收到对 M1 的确认。

确认迟到:

传输过程中没有出现差错,但 B 对分组 M1 的确认迟到了,A 会收到重复的确认。对重复的确认的处理很简单:收下后就丢弃, B 仍然会收到重复的 M1,并且同样要丢弃重复的 M1,并重传确认分组。

注意:在发送完一个分组后,必须暂时保留已发送的分组的副本,以备重发分组确认分组都必须进行编号,超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些

自动重传请求ARQ:

通常 A 最终总是可以收到对所有发出的分组的确认。如果 A 不断重传分组但总是收不到确认,就说明通信线路太差,不能进行通信。 使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。 像上述的这种可靠传输协议常称为自动重传请求 ARQ (Automatic Repeat reQuest)。意思是重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。

信道利用率

image-20190513145248411

图4-2:停止等待协议的信道利用率太低

如图4-2所示,假设发送放发送分组的时间是TDT_D,接收方发送确认的时间是TAT_A,那么信道利用率为:
U=TDTD+RTT+TA U=\frac{T_D}{T_D+RTT+T_A}
这里的RTTRTT是往返时间,可以看出,当往返时间 RTT 远大于分组发送时间 TD 时,信道的利用率就会非常低, 若出现重传,则对传送有用的数据信息来说,信道的利用率就还要降低。

为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。 流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地传送。 由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率,如图4-3所示。

image-20190513145551309

图4-3:流水线传输可显著提高信道利用率

当使用流水线传输时,就要使用下面介绍的ARQ协议滑动窗口协议

连续ARQ协议

基本思想:

发送方一次可以发出多个分组,使用滑动窗口协议控制发送方和接收方所能发送和接收的分组的数量和编号。每收到一个确认,发送方就把发送窗口向前滑动。接收方一般采用累积确认的方式,采用回退N(Go-Back-N)方法进行重传image-20190513150321635

图4-4:连续ARQ协议的工作原理

累计确认:

接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。

优点:容易实现,即使确认丢失也不必重传

缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。

比如:如果发送方发送了前5个分组,而中间的第3个分组丢失了(第4、5个没丢失),这时接收端就对前2个分组发出确认,发送方无法知道后面3个分组的丢失情况,只能将后面的3个分组都全部重发一遍,这叫做Go-Back-N(回退N),表示需要再回退回来重传已经发送的某N个分组。可见当通信线路质量不好的时候,连续ARQ协议会带来负面影响。

在深入讨论TCP的可靠传输之前,我们先来了解一下TCP的报文段首部的格式。

TCP报文段的首部格式

TCP 虽然是面向字节流的,但 TCP 传送的数据单元却是报文段。 一个 TCP 报文段分为首部数据两部分,而 TCP 的全部功能都体现在它首部中各字段的作用。

TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项 (n 是整数),因此 TCP 首部的最小长度是 20 字节

image-20190513151036556

图5-1:TCP报文段的首部格式

如图5-1,TCP报文段的首部主要由以下字段组成:

  1. 源端口目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口,运输层的复用分用功能都要通过端口才能实现。

  2. 序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号,序号字段的值则指的是本报文段所发送的数据的第一个字节的序号

  3. 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号

  4. 数据偏移(即首部长度)——占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位字(以 4 字节为计算单位)

  5. 保留字段——占 6 位,保留为今后使用,但目前应置为 0。

  6. 紧急 URG —— 当 URG = 1 时,表明紧急指针字段有效,它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

  7. 确认 ACK —— 只有当 ACK =1 时确认号字段才有效,当 ACK =0 时,确认号无效。

  8. 推送 PSH (PuSH) —— 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付

  9. 复位 RST (ReSeT) —— 当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接

  10. 同步 SYN —— 同步 SYN = 1 表示这是一个连接请求连接接受报文。

  11. 终止 FIN (FINish) —— 用来释放一个连接,FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

  12. 窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。

  13. 检验和 —— 占 2 字节。检验和字段检验的范围包括首部数据这两部分,在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部(在计算检验和时,临时把 12 字节的“伪首部”和 TCP 报文段连接在一起,伪首部仅仅是为了计算检验和。)。

  14. 紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)

  15. 选项字段 —— 长度可变。

    1. TCP 最初只规定了一种选项,即最大报文段长度 MSSMSS (Maximum Segment Size) 是 TCP 报文段中的数据字段的最大长度,数据字段加上 TCP 首部才等于整个的 TCP 报文段。 所以,MSS是“TCP 报文段长度减去 TCP 首部长度”,MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节" 。MSS 与接收窗口值没有关系,若选择较小的 MSS 长度,网络的利用率就降低。 若 TCP 报文段非常长,那么在 IP 层传输时就有可能要分解成多个短数据报片,在终点要把收到的各个短数据报片装配成原来的 TCP 报文段,当传输出错时还要进行重传,这些也都会使开销增大。 因此,MSS 应尽可能大些,只要在 IP 层传输时不需要再分片就行, 但最佳的 MSS 是很难确定的。
    2. 窗口扩大选项 ——占 3 字节,其中有一个字节表示移位值 S,新的窗口值等于 TCP 首部中的窗口位数增大到 (16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小。
    3. 时间戳选项——占 10 字节,其中最主要的字段时间戳值字段(4 字节)和时间戳回送回答字段(4 字节)。
    4. 选择确认选项——在后面的"选择确认SACK"节介绍。
  16. 填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。

TCP可靠传输的实现

本节我们介绍TCP可靠传输的实现,为了讲述可靠传输原理的方便,我们假定数据传输只在一个方向进行,即A发送数据,B给出确认。

以字节为单位的滑动窗口

TCP 使用流水线传输和滑动窗口协议实现高效、可靠的传输, TCP 的滑动窗口是以字节为单位的

发送方 A 和接收方 B 分别维持一个发送窗口和一个接收窗口

发送窗口表示:在没有收到确认的情况下,可以连续把窗口内的数据全部发送出去

接收窗口表示只允许接收落入窗口内的数据

TCP的滑动窗口是以字节为单位的,为了便于说明滑动窗口的工作原理,我们故意把后面图5-2至图5-5中的字节编号都取得很小。现假定A收到了B发来的确认报文段,其中窗口是20字节,而确认号是31(这表明B期望收到的下一个序号是31,而序号30为止的数据已经收到了)。根据这两个数据,A就构造出自己的发送窗口,如图5-2所示。

image-20190513153529311

图5-2:根据B给出的窗口值,A构造自己的发送窗口

我们先讨论发送方A的发送窗口。发送窗口表示在没有收到B的确认的情况下,A可以连续把窗口内的数据都发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。发送窗口里面的序号表示允许发送的序号。显然,窗口越大,发送方就可以在收到对方确认之前连续发送更多的数据,因而可能获得更高的传输效率。在上面的TCP报文段的首部格式一节我们已经讲过,接收方会把自己的接收窗口数值放在窗口字段中发送给对方,因此,A的发送窗口定不能超过B的接收窗口数值。在后面的TCP的拥塞控制一节我们将要讨论,发送方的发送窗口大小还要受到当时网络拥塞程度的制约,但在目前,我们暂不考虑网络拥塞的影响。发送窗口后沿的后面部分表示己发送且已收到确认,这些数据显然不需要再保留了。而发送窗口前沿的前面部分表示不允许发送的,因为接收方都没有为这部分数据保留临时存放的缓存空间。发送窗口的位置由窗口前沿和后沿的位置共同确定。发送窗口后沿的变化情况有两种可能,即不动(没有收到新的确认)前移(收到了新的确认)。发送窗口后沿不可能向后移动,因为不能撤销掉己收到的确认。发送窗口前沿通常是不断向前移动,但也有可能不动,这对应于两种情况:一是没有收到新的确认,对方通知的窗口大小也不变;一是收到了新的确认但对方通知的窗口缩小了,使得发送窗口前沿正好不动。发送窗口前沿也有可能向后收缩,这发生在对方通知的窗口缩小了,但TCP的标准强烈不赞成这样做。因为很可能发送方在收到这个通知以前已经发送了窗口中的许多数据,现在又要收缩窗口,不让发送这些数据,这样就会产生一些错误。

image-20190513154641268

图5-3:A发送了11个字节的数据

现在假定A发送了序号为31~41的数据。这时,发送窗口位置并未改变(图5-3),但发送窗口内靠后面有11个字节(灰色小方框表示)表示己发送但未收到确认,而发送窗口内靠前面的9个字节(42~50)是允许发送但尚未发送的

从以上所述可以看出,要描述一个发送窗口的状态需要三个指针P1,P2和P3(图5-3)。指针都指向字节的序号,这三个指针指向的几个部分的意义如下:

小于P1的是已发送并已收到确认的部分,而大于P3的是不允许发送的部分。

P3-P1=A的发送窗口

P2-P1=已发送但尚未收到确认的字节数

P3-P1=允许发送但当前尚未发送的字节数(又称为可用窗口有效窗口)

再看一下B的接收窗口,B的接收窗口大小是20。在接收窗口外面,到30号为止的数据是已经发送过确认,并且已经交付主机了。因此在B可以不再保留这些数据。接收窗口内的序号(31~50)是允许接收的,在图5-3中,B收到了序号为32和33的数据,这些数据没有按序到达,因为序号为31的数据没有收到(也许丢失了,也许滞留在网络中的某处)。请注意,B只能对按序收到的数据中的最高序号给出确认,因此B发送的确认报文段中的确认号仍然是31(即期望收到的序号),而不能是32或33。

image-20190513155227629

图5-4:A收到新的确认号,发送窗口向前滑动

现在假定B收到了序号为31的数据,并把序号为31~33的数据交付主机,然后B删除这些数据。接着把接收窗口向前移动3个序号(图5-4),同时给A发送确认,其中窗口值仍为20,但确认号是34。这表明B已经收到了到序号33为止的数据。我们注意到,B还收到了序号为37,38和40的数据,但这些都没有按序到达,只能先暂存在接收窗口中。A收到B的确认后,就可以把发送窗口向前滑动3个序号,但指针P2不动。可以看出,现在A的可用窗口增大了,可发送的序号范围是42~53.

image-20190513155500658

图5-5:发送窗口内的序号都属于已发送但未收到确认

A在继续发送完序号42~53的数据后,指针P2向前移动和P3重合,发送窗口内的序号都已用完,但还没有再收到确认(图5-5)。由于A的发送窗口已满,可用窗口已减小到零,因此必须停止发送。请注意,存在下面这种可能性,就是发送窗口内所有的数据都已正确到达B,B也早已发出了确认。但不幸的是,所有这些确认都滞留在网络中。在没有收到B的确认时,A不能猜测,或许B收到了吧!为了保证可靠传输,A只能认为B还没有收到这些数据。于是,A在经过一段时间后(由超时计时器控制)就重传这部分数据,重新设置超时计时器,直到收到B的确认为止。如果A收到确认号落在发送窗口内,那么A就可以使发送窗口继续向前滑动,并发送新的数据。

发送缓存

发送方的应用进程把字节流写入 TCP 的发送缓存,发送窗口通常只是发送缓存的一部分。

发送缓存用来暂时存放:

  1. 发送应用程序传送给发送方 TCP 准备发送的数据;
  2. TCP 已发送出但尚未收到确认的数据。

image-20190513155904506

接收缓存

接收方的应用进程从 TCP 的接收缓存中读取字节流。

接收缓存用来暂时存放:

  1. 按序到达的、但尚未被接收应用程序读取的数据;
  2. 不按序到达的数据。

image-20190513160002978

注意:

  1. A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。
  2. TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程
  3. TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销。

接收方发送确认:

接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上。 但请注意两点:

  1. 接收方不应过分推迟发送确认,否则会导致发送方不必要的重传,这反而浪费了网络的资源
  2. 捎带确认实际上并不经常发生,因为大多数应用程序很少同时在两个方向上发送数据。

超时重传时间的选择

重传机制是 TCP 中最重要最复杂的问题之一。 TCP 每发送一个报文段,就对这个报文段设置一次计时器, 只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段,重传时间的选择是 TCP 最复杂的问题之一。

由于TCP的下层是互联网环境,发送的报文段可能只经过一个高速率的局域网,也可能经过多个低速率的网络,并且每个IP数据报所选择的路由还可能不同。如果把超时重传时间设置得太短,就会引起很多报文段的不必要的重传,使网络负荷增大。但若把超时重传时间设置得过长,则又使网络的空闲时间增大,降低了传输效率。

那么,运输层的超时计时器的超时重传时间究竟应设置为多大呢?

TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间之差就是报文段的往返时间RTT。TCP保留了RTT的一个**加权平均往返时间RTTs(这又称为平滑的往返时间,S表示Smoothed。因为进行的是加权平均,因此得出的结果更加平滑)。

当第一次测量到RTT样本时,RTTs值就取为所测量到的RTT样本值。但以后每测量到一个新的RTT样本,就按下式重新计算一次RTTs:
RTTs=(1α)×(RTTs)+α×(RTT) 新的RTTs=(1-\alpha)\times (旧的RTTs)+\alpha \times(新的RTT样本)

在上式中,0&lt;α&lt;10&lt; \alpha &lt;1。若a很接近于零,表示新的RTTs值和旧的RTTs值相比变化不大,而对新的RTT样本影响不大(RTT值更新较慢)。若选择a接近于1,则表示新的RTTs值受新的RTT样本的影响较大(RTT值更新较快)。

推荐的a值为1/8,即0.125,用这种方法得出的加权平均往返时间RTTs就比测量出的RTT值更加平滑。

显然,超时计时器设置的超时重传时间RTO(RetransmissionTime-Out)略大于上面得出的加权平均往返时间RTTs。

RFC 6298建议使用下式计算RTO:
RTO=RTTs+4×RTTD RTO=RTTs+4\times RTT_D

而RTTD是RTT的偏差的加权平均值,它与RTTs和新的RTT样本之差有关。RFC6298建议这样计算RTTDRTT_D:当第一次测量时,RTTDRTT_D 值取为测量到的RTT样本值的一半,在以后的测量中,则使用下式计算加权平均的RTTDRTT_D
RTTD=(1β)×(RTTD)+β×RTTsRTT 新的RTT_D=(1-\beta)\times(旧的RTT_D)+\beta \times |RTT_s-新的RTT样本|

这里的β\beta是个小于1的系数,它的推荐值是I/4,即0.25。

image-20190513161905217

图5-6

上面所说的往返时间的测量,实现起来相当复杂。试看下面的例子,如图5-6所示,发送出一个报文段,设定的重传时间到了,还没有收到确认。于是重传报文段。经过了一段时间后,收到了确认报文段。现在的问题是如何判定此确认报文段是对先发送的报文段的确认,还是对后来重传的报文段的确认?由于重传的报文段和原来的报文段完全一样,因此源主机在收到确认后,就无法做出正确的判断,而正确的判断对确定加权平均RTTs的值关系很大。若收到的确认是对重传报文段的确认,但却被源主机当成是对原来的报文段的确认,则这样计算出的RTTs和超时重传时间RTO就会偏大。若后面再发送的报文段又是经过重传后才收到确认报文段,则按此方法得出的超时重传时间RTO就越来越长。

根据以上所述,Kam提出了一个算法,在计算加权平均RTTS时,只要报文段重传了,就不采用其往返时间样本。这样得出的加权平均RTTS和RTO就较准确,但是,这又引起新的问题。设想出现这样的情况报文段的时延突然增大了很多,因此在原来得出的重传时间内,不会收到确认报文段,于是就重传报文段,但根据Kam算法,不考虑重传的报文段的往返时间样本,这样,超时重传时间就无法更新

因此要对Kam算法进行修正。方法是报文段每重传一次,就把超时重传时间RTO增大一些。典型的做法是取新的重传时间为旧的重传时间的2倍。当**不再发生报文段的重传时,才根据上面给出的(6)式计算超时重传时间。**实践证明,这种策略较为合理。总之,Kam算法能够使运输层区分开有效的和无效的往返时间样本,从而改进了往返时间的估测,使计算结果更加合理。

选择确认SACK

问题:若收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据,那么能否设法只传送缺少的数据而不重传已经正确到达接收方的数据? 答案是可以的,选择确认 SACK (Selective ACK) 就是一种可行的处理方法。

image-20190513162452515

图5-7:接收到的字节流信号不连续

如图5-7所示,TCP 的接收方在接收对方发送过来的数据字节流的序号不连续,结果就形成了一些不连续的字节块。

和前后字节不连续的每一个字节块都有两个边界:左边界右边界

第一个字节块的左边界 L1 = 1501,但右边界 R1 = 3001。左边界指出字节块的第一个字节的序号,但右边界减 1 才是字节块中的最后一个序号

第二个字节块的左边界 L2 = 3501,而右边界 R2 = 4501。

如果要使用选择确认,那么在建立 TCP 连接时,就要在 TCP 首部的选项中加上**“允许 SACK”的选项,而双方必须都事先商定好。 如果使用选择确认,那么原来首部中的“确认号字段”的用法仍然不变**。只是以后在 TCP 报文段的首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界。 由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉 4 字节,因此在选项中最多只能指明 4 个字节块的边界信息。

TCP的流量控制

利用滑动窗口的流量控制

一般说来,我们总是希望数据传输得更快一些,但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失流量控制 (flow control) 就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞

利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。

我们来看一个例子:

image-20190513162923408

图6-1:利用可变窗口进行流量控制举例

设A向B发送数据。

在连接建立时,B告诉了A:"我的接收窗口rwnd=400“,(这里rwnd表示receiver window)。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。请注意,TCP的窗口单位是字节,不是报文段,TCP连接建立时的窗口协商过程在图中没有显示出来。再设每一个报文段为100字节长,而数据报文段序号的初始值设为1(见图中第一个箭头上面的序号seq=1,图中右边的注释可帮助理解整个过程)。

请注意,图中箭头上面大写ACK表示首部中的确认位ACK,小写ack表示确认字段的值。我们应注意到,接收方的主机B进行了三次流量控制。第一次把窗口减小到rwnd=300,第二次又减到rwnd=100,最后减到rwnd=0,即不允许发送方再发送数据了,这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。我们还应注意到,B向A发送的三个报文段都设置了ACK=1,只有在ACK=1时确认号字段才有意义

死锁问题:

现在我们考虑1种情况。在图6-1中,B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间于,是B向A发送了rwnd=400的报文段,然而这个报文段在传送过程中丢失了。A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据,如果没有其他措施,这种互相等待的死锁局面将一直延续下去。为了解决这个问题,TCP为每一个连接设有一个持续计时器(persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值,如果窗口仍然是零,那么收到这个报文段的一方就重新设置持续计时器,如果窗口不是零,那么死锁的僵局就可以打破了。

TCP的传输效率

应用进程把数据传送到TCP的发送缓存后,剩下的发送任务就由TCP来控制了,可以用不同的机制来控制 TCP 报文段的发送时机:

  1. 第一种机制是 TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。
  2. 第二种机制是由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送 (push) 操作。
  3. 第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去。

如何控制 TCP 发送报文段的时机仍然是一个较为复杂的问题。

发送方糊涂窗口综合症

发送方 TCP 每次接收到一字节的数据后就发送。 这样,发送一个字节需要形成 41 字节长的 IP 数据报。效率很低。 解决方法:使用 Nagle 算法

Nagle 算法:

若发送应用进程把要发送的数据逐个字节地送到 TCP 的发送缓存,则发送方就把第一个数据字节先发送出去把后面到达的数据字节都缓存起来

当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。

只有在收到对前一个报文段的确认后才继续发送下一个报文段

到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段

接收方糊涂窗口综合症

当接收方的 TCP 缓冲区已满,接收方会向发送方发送窗口大小为 0 的报文。 若此时接收方的应用进程以交互方式每次只读取一个字节,于是接收方又发送窗口大小为一个字节的更新报文,发送方应邀发送一个字节的数据(发送的 IP 数据报是 41 字节长),于是接收窗口又满了,如此循环往复。

解决方法:

让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。只要出现这两种情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。

TCP的拥塞控制

拥塞控制的一般原理

在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种现象称为拥塞 (congestion), 最坏结果:系统崩溃

网络拥塞往往是由许多因素引起的。例如:

  1. 点缓存的容量太小;
  2. 链路的容量不足;
  3. 处理机处理的速率太慢;
  4. 拥塞本身会进一步加剧拥塞;

出现拥塞的原因:
&gt; \sum对资源的需求&gt;可用资源

增加资源能解决拥塞问题 吗?

**不能。**这是因为网络拥塞是一个非常复杂的问题。简单地采用上述做法,在许多情况下,不但不能解决拥塞问题,而且还可能使网络的性能更坏。

网络拥塞往往是由许多因素引起的,例如:

  1. 增大缓存,但未提高输出链路的容量和处理机的速度,排队等待时间将会大大增加,引起大量超时重传,解决不了网络拥塞;
  2. 提高处理机处理的速率会会将瓶颈转移到其他地方;

拥塞控制与流量控制的区别

拥塞控制 流量控制
防止过多的数据注入到网络中,使网络中的路由器或链路不致过载 抑制发送端发送数据的速率,以使接收端来得及接收;
是一个全局性的过程,涉及到与降低网络传输性能有关的所有因素。 是点对点通信量的控制,是端到端的问题;

拥塞控制的前提:网络能够承受现有的网络负荷。实践证明,拥塞控制是很难设计的,因为它是一个动态问题。分组的丢失是网络发生拥塞的征兆而不是原因。在许多情况下,甚至正是拥塞控制本身成为引起网络性能恶化、甚至发生死锁的原因。

开环控制和闭环控制

开环控制 闭环控制
在设计网络时,事先考虑周全,力求工作时不发生拥塞; 基于反馈环路的概念;
根据网络当前的运行状态采取相应控制措施;
思路:力争避免发生拥塞。 思路:在发生拥塞后,采取措施进行控制,消除拥塞。

TCP的拥塞控制方法

TCP 采用基于窗口的方法进行拥塞控制,该方法属于闭环控制方法

TCP发送方维持一个拥塞窗口 cwnd (Congestion Window)发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。 发送窗口大小不仅取决于接收方窗口,还取决于网络的拥塞状况
=Min() 真正的发送窗口值 = Min (接收方窗口值,拥塞窗口值)

控制拥塞窗口的原则

  1. 只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。
  2. 只要网络出现拥塞有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。

拥塞的判断

重传定时器超时:网络已经发生了拥塞。

收到三个重复的 ACK:预示网络可能会出现拥塞(实际可能还未发生拥塞)。

TCP拥塞控制算法

四种拥塞控制算法( RFC 5681) :

  1. 慢开始 (slow-start)
  2. 拥塞避免 (congestion avoidance)
  3. 快重传 (fast retransmit)
  4. 快恢复 (fast recovery)
慢开始

拥塞窗口 cwnd 控制方法:在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个 SMSS 的数值
cwnd=min(N,SMSS) 拥塞窗口 cwnd 每次的增加量 = min (N, SMSS)
其中 N 是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。 不难看出,当 N < SMSS 时,拥塞窗口每次的增加量要小于 SMSS(最大报文段)。 用这样的方法逐步增大发送方的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。

image-20190513165852021

图7-1:发送方每次收到一个确认就把窗口cwnd加1

如图7-1,发送方每次收到一个确认就把窗口cwnd加1,这样,第一轮发送1个报文,第二轮可以发送2个报文,第三轮发送4个报文,在超时之前,每经过一个传输轮次,拥塞窗口就加倍,窗口大小会按指数增加,不慢!

使用慢开始算法后,每经过一个传输轮次 (transmission round),拥塞窗口 cwnd 就加倍。 一个传输轮次所经历的时间其实就是往返时间 RTT。 “传输轮次”更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。 例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间

设置慢开始门限状态变量 ssthresh:

慢开始门限 ssthresh 的用法如下:

  1. 当 cwnd < ssthresh 时,使用慢开始算法。
  2. 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法
  3. 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
拥塞避免

思路:让拥塞窗口 cwnd 缓慢地增大,避免出现拥塞。 每经过一个传输轮次,拥塞窗口 cwnd = cwnd + 1, 使拥塞窗口 cwnd 按线性规律缓慢增长, 在拥塞避免阶段,具有 “加法增大” (Additive Increase) 的特点。

image-20190513170259141

图7-2:发送方每经过一个传输轮次就把窗口cwnd加1

重点:无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时)ssthresh = max (cwnd/2,2) , cwnd = 1,执行慢开始算法

**目的:**迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

image-20190513170623243

图7-3:TCP拥塞窗口cwnd在拥塞控制时的变化情况

当 TCP 连接进行初始化时,将拥塞窗口置为 1,图中的窗口单位不使用字节而使用报文段,慢开始门限的初始值设置为 16 个报文段,即 ssthresh = 16。

“拥塞避免”并非指完全能够避免了拥塞,利用以上的措施要完全避免网络拥塞还是不可能的, “拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

快重传

发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。 使用快重传可以使整个网络的吞吐量提高约20%。

不难看出,快重传并非取消重传计时器,而是在某些情况下可以更早地(更快地)重传丢失的报文段。

采用快重传 FR (Fast Retransmission) 算法可以让发送方尽早知道发生了个别报文段的丢失。 快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。

举例:

image-20190513171014132

图7-4

如图7-4,接收方收到三个连续的 对 M2 的重复确认,立即重传 M3

快恢复

当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR (Fast Recovery) 算法:

  1. 慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2 ;
  2. 新拥塞窗口 cwnd = 慢开始门限 ssthresh ;
  3. 开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。

加法增大,乘法减小 (AIMD):

可以看出,在拥塞避免阶段,拥塞窗口是按照线性规律增大的。这常称为**“加法增大” AI (Additive Increase)**。

当出现超时或3个重复的确认时,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。这常称为**“乘法减小”MD (Multiplicative Decrease)。**

二者合在一起就是所谓的 AIMD 算法

TCP拥塞控制流程图

image-20190513171311661

主动队列管理AQM

TCP 拥塞控制网络层采取的策略有密切联系, 若路由器对某些分组的处理时间特别长,那么这就可能使这些分组中的TCP报文段经过很长时间才能到达终点,结果引起发送方超时,对这些报文段进行重传。,重传会使 TCP 连接的发送端认为在网络中发生了拥塞,但实际上网络并没有发生拥塞, 对 TCP 拥塞控制影响最大的就是路由器的分组丢弃策略。

“先进先出”FIFO 处理规则

路由器的队列通常都是按照**“先进先出”FIFO (First In First Out)** 的规则处理到来的分组。 当队列已满时,以后再到达的所有分组(如果能够继续排队,这些分组都将排在队列的尾部)将都被丢弃,这就叫做尾部丢弃策略 (tail-drop policy)。 路由器的尾部丢弃往往会导致一连串分组的丢失,这就使发送方出现超时重传使 TCP 进入拥塞控制的慢开始状态,结果使 TCP 连接的发送方突然把数据的发送速率降低到很小的数值

更为严重的是,在网络中通常有很多的 TCP 连接,这些连接中的报文段通常是复用在网络层的 IP 数据报中传送的。 在这种情况下,若发生了路由器中的尾部丢弃,就可能会同时影响到很多条 TCP 连接,结果使这许多 TCP 连接在同一时间突然都进入到慢开始状态,这在 TCP 的术语中称为全局同步 (global syncronization)。,全局同步使得全网的通信量突然下降了很多,而在网络恢复正常后,其通信量又突然增大很多

主动队列管理AQM

1998 年提出了主动队列管理 AQM (Active Queue Management)。 所谓“主动”就是不要等到路由器的队列长度已经达到最大值时才不得不丢弃后面到达的分组,而是在队列长度达到某个值得警惕的数值时(即当网络拥塞有了某些拥塞征兆时),就主动丢弃到达的分组, AQM 可以有不同实现方法,其中曾流行多年的就是随机早期检测 RED (Random Early Detection)。

随机早期检测RED

使路由器的队列维持两个参数:队列长度最小门限 THmin最大门限 Thmax 。 RED 对每一个到达的分组都先计算平均队列长度 LAV

  1. 若平均队列长度小于最小门限 THmin,则将新到达的分组放入队列进行排队
  2. 若平均队列长度超过最大门限 Thmax ,则将新到达的分组丢弃
  3. 若平均队列长度在最小门限 THmin 和最大门限 Thmax 之间,则按照某一概率 p 将新到达的分组丢弃

TCP的运输连接管理

TCP 是面向连接的协议, TCP 连接有三个阶段:

  1. 连接建立
  2. 数据传送
  3. 连接释放

TCP 连接的管理就是使 TCP 连接的建立和释放都能正常地进行

TCP 连接建立过程中要解决的三个问题:

  1. 要使每一方能够确知对方的存在。
  2. 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)。
  3. 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

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

TCP的连接

TCP 建立连接的过程叫做握手, 握手需要在客户和服务器之间交换三个 TCP 报文段,称之为三报文握手, 采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。

image-20190513172229316

图8-1:用三报文握手建立TCP连接

如图8-1所示,假定主机A是客户机,主机B是服务器,初始两端的TCP进程都处于CLOSED(关闭)状态。图中在主机下面的方框分别是TCP进程所处的状态,请注意,在本例中,A主动打开连接,而B被动打开连接。

一开始,B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求,然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求,如有,即作出响应。

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

  2. B收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。

  3. TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。TCP的标准规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。

这时,TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。当B收到A的确认后,也进入ESTABLISHED状态。

上面给出的连接建立过程叫做三报文握手。请注意,在图8-1中B发送给A的报文段,也可拆成两个报文段。可以先发送一个确认报文段(ACK=1,ack=x+1),然后再发送一个同步报文段(SYN=1,seq=y)。这样的过程就变成了四报文握手,但效果是一样的。

为什么A最后还要发送一次确认呢?

这主要是为防止已失效的连接请求报文段突然又传送到了B,因而产生错误。所谓**"己失效的连接请求报文段"是这样产生的:考虑一种正常情况,A发出连接请求,但因连接请求报文丢失而未收到确认**。于是A再重传一次连接请求,后来收到了确认,建立了连接,数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B,没有"己失效的连接请求报文段“

现假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段,但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。假定不采用报文握手,那么只要B发出确认,新的连接就建立了。由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立了,并1直等待A发来数据,B的许多资源就这样白白浪费了。

TCP连接的释放

image-20190513173103174

图8-2:TCP连接释放的过程

TCP连接释放过程比较复杂,我们仍结合双方状态的改变来阐明连接释放的过程。

数据传输结束后,通信的双方都可释放连接,现在A和B都处于ES丁人BLISHED状态(图8-2)。

  1. A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1。这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。请注意,TCP规定,FIN报文段即使不携带数据,它也消耗掉1个序号。

  2. B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭(half-close)状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收。也就是说,从B到A这个方向的连接并未关闭,这个状态可能会持续一段时间。

  3. A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN=1。现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次已发送过的确认号ack=u+1。这时B就进入LAST-ACK(最后确认)状态,等待A的确认。

  4. A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack.=w+1,而自己的序号是seq=u+1(根据TCP标准,前面发送过的FIN报文段要消耗一个序号)。然后进入到TIME-WAIT(时间等待)状态。

请注意,现在TCP连接还没有释放掉。必须经过时间等待计时器(TIME-WAITtimer)设置的时间2MSL后,A才进入到CLOSED状态。时间MSL叫做最长报文段寿命(Maximum Segment Lifetime),RFC 793建议设为2分钟。但这完全是从工程上来考虑的,对于现在的网络,MSL=2分钟可能太长了一些。因此TCP允许不同的实现可根据具体情况使用更小的MSL值。因此,从A进入到TIME-WWT状态后,要经过4分钟才能进入到CLOSED状态,才能开始建立下一个新的连接。当A撤销相应的传输控制块TCB后,就结束了这次的TCP连接。

为什么A在TIME-WAIT状态必须等待2MSL的时间呢?

第一,为了保证A发送的最后一个ACK报文段能够到达B,这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认,重新启动2MSL计时器。最后,A和B都正常进入到CLOSED状态。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后立即释放连接,那么就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常步骤进入CLOSED状态

第二,防止上一节提到的。**“已失效的连接请求报文段”**出现在本连接中。A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。B只要收到了A发出的确认,就进入CLOSED状态。同样,B在撤销相应的传输控制块TCB后,就结束了这次的TCP连接。我们注意到,B结束TCP连接的时间要比A早一些。

上述的TCP连接释放过程是四报文握手。除时间等待计时器外,TCP还设有一个保活计时器(keepalive timer),设想有这样的情况:客户已主动与服务器建立了TCP连接,但后来客户端的主机突然出故障。显然,服务器以后就不能再收到客户发来的数据,因此,应当有措施使服务器不要再白白等待下去,这就是使用保活计时器。服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两小时。若两小时没有收到客户的数据,服务器就发送一个探测报文段,以后则每隔75秒钟发送一次。若一连发送10个探测报文段后仍无客户的响应,服务器就认为客户端出了故障,接着就关闭这个连接。

总结

  • 运输层提供应用进程间的逻辑通信,也就是说,运输层之间的通信并不是真正在两个运输层之间直接传送数据。运输层向应用层屏蔽了下面网络的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。
  • 网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。
  • 运输层有两个主要的协议TCP和UDP,它们都有复用和分用,以及检错的功能。当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工通信的可靠信道。当运输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道。
  • 运输层用一个16位端口号来标志一个端口。端口号只具有本地意义,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。在互联网的不同计算机中,相同的端口号是没有关联的。
  • 两台计算机中的进程要互相通信,不仅要知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。
  • 运输层的端口号分为服务器端使用的端口号(0~1023)指派给熟知端口号,(1024~49151)是登记端口号和客户端暂时使用的端口号(49152~65535)。
  • UDP的主要特点是(1)无连接;(2)尽最大努力交付;(3)面向报文;(4)无拥塞控制;(5)支持一对一、一对多、多对一和多对多的交互通信忙;(6)首部开销小(只有四个字段源端口、目的端口、长度、检验和)。
  • TCP的主要特点是(1)面向连接;(2)每一条TCP连接只能是点对点的(一对一);(3)提供可靠交付的服务;(4)提供全双工通信;(5)面向字节流。
  • TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点。这样的端点就叫做套接字(socket)或插口。套接字用(IP地址端口号)来表示。
  • 停止等待协议能够在不可靠的传输网络上实现可靠的通信。每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。分组需要进行编号。
  • 超时重传是指只要超过了一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求ARQ。
  • 在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。
  • 连续ARQ协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组都可连续发送出去,而不需要等待对方的确认。接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已正确收到了。
  • TCP报文段首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项(N是整数)。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
  • TCP首部中的确认号是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N则表明到序号N-1为止的所有数据都已正确收到。
  • TCP首部中的窗口字段指出了现在允许对方发送的数据量。窗口值是经常在动态变化着的。
  • TCP使用滑动窗口机制。发送窗口里面的序号表示允许发送的序号。发送窗口后沿的后面部分表示已发送且己收到了确认,而发送窗口前沿的前面部分表示不允许发送。发送窗口后沿的变化情况有两种可能,即不动(没有收到新的确认)和前移(收到了新的确认)。发送窗口前沿通常是不断向前移动的。
  • 流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
  • 流量控制是一个端到端的问题,是接收端抑制发送端发送数据的速率,以便使接收端来得及接收。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
  • 为了进行拥塞控制,TCP的发送方要维持一个拥塞窗口cwnd的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接收窗口中较小的一个。
  • TCP的拥塞控制采用了四种算法,即慢开始、拥塞避免、快重传和快恢复。在网络层,也可以使路由器采用适当的分组丢弃策略(如主动队列管理AQM),以减少网络拥塞的发生。
  • 运输连接有三个阶段,即连接建立、数据传送和连接释放。主动发起TCP连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。TCP的连接建立采用三报文握手机制。服务器要确认客户的连接请求,然后客户要对服务器的确认进行确认。TCP的连接释放采用四报文握手机制。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后就进入半关闭状态。当另一方也没有数据再发送时,则发送连接释放通知,对方确认后就完全关闭了TCP连接。

linux笔记-网络配置

阅读数 246

没有更多推荐了,返回首页