一、OSI参考模型
1. OSI的来源
首先 osi 七层模型是什么?
OSI 是英文 Open System Interconnection 的简写,翻译成中文叫做 (开放系统互连参考模型),他是一个国际标准化组织制定的一个用于计算机或通信系统间互联的标准体系
怎么理解呢?你可以这么想,在之前很早的时候,世界上有各种生产计算机硬件和网络设备的厂家,大家你做你的我做我的,弄的很乱而且还都互不兼容,这时候国际上有一个很牛很牛的公认的组织,为了统一互联网,让他不那么复杂,更加容易管理而制定了一个规则,而这个规则大家必须都要遵守,这个就是 OSI 七层模型。
2、那七层是什么意思?
首先,这个七层模型呢他是一个虚拟的,就是理论上的规则,并不是一个什么摸得到的物理形状的类似于汽车模型的那种模型,那它具体是什么样的呢?你看下图
【纯个人手打,替老师传道,不求多大成就但愿 能帮到大家,在闲暇的时间里为大家共享一些工作经验和各种技术资源文章,希望帮助大家共同进步 也希望我的发布对你有所帮助,我的发布里有更多类似的文章可以查阅,喜欢的请点关注,谢谢。你们的关注是我不停发布的最大动力】
3、那这两个七层模型到底是怎么回事呢?
首先,你要把这两边的七层模型看成是两个人在写信,你给人家写信人家是不是得给你回信?这个就是两个模型中间的箭头。意思是有来有回。而你们两个人的来回信件呢都得经过这七个步骤,然后才能到达各自的手中。这就是为什么两边都画了七层模型
4、OSI七层模型基本功能是什么?
OSI模型通过七个层次化结构的模型,使不同的系统不同的网络之间实现可靠的通讯,因此,其最主要的功能就是帮助不同类型主机之间实现数据传输
5、那这七个层到底都对应了哪些东西呢?
(1)物理层:它对应了,网卡、网线、光纤,等
(2)数据链路层:它对应了,网桥、交换机、等
(3)网络层:路由器、三层交换机
(4)传输层、会话层、表示层、应用层、这些个在软件层面上和虚拟层面上的,所以他不 对应相关的物理设备,这四个层面呢,它对应的是相关的协议了。
比如说:传输层有:TCP UDP 协议 ;应用层有 http ftp 协议等,就是这个意思
但实际网管需要日常维护的只有:物理层、数据链路层、网络层、应用层 这五层
6、 各层功能定义
这里我们只对OSI各层进行功能上的大概阐述,不详细深究,因为每一层实际都是一个复杂的层。
这里我们就大概了解一下。
我们从最顶层——应用层 开始介绍。
整个过程以公司A和公司B的一次商业报价单发送为例子进行讲解。
(1) 应用层
OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。
我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等。
实际公司A的老板就是我们所述的用户,而他要发送的商业报价单,就是应用层提供的一种网络服务,当然,老板也可以选择其他服务,比如说,发一份商业合同,发一份询价单,等等。
(2) 表示层
表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。
如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。
数据压缩和加密也是表示层可提供的转换功能之一。
由于公司A和公司B是不同国家的公司,他们之间的商定统一用英语作为交流的语言,所以此时表示层(公司的文秘),就是将应用层的传递信息转翻译成英语。
同时为了防止别的公司看到,公司A的人也会对这份报价单做一些加密的处理。
这就是表示的作用,将应用层的数据转换翻译等。
(3) 会话层
会话层就是负责建立、管理和终止表示层实体之间的通信会话。
该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
会话层的同事拿到表示层的同事转换后资料,(会话层的同事类似公司的外联部),会话层的同事那里可能会掌握本公司与其他好多公司的联系方式,这里公司就是实际传递过程中的实体。他们要管理本公司与外界好多公司的联系会话。
当接收到表示层的数据后,会话层将会建立并记录本次会话,他首先要找到公司B的地址信息,然后将整份资料放进信封,并写上地址和联系方式。准备将资料寄出。
等到确定公司B接收到此份报价单后,此次会话就算结束了,外联部的同事就会终止此次会话。
(4) 传输层
传输层建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。
该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。
我们通常说的,TCP UDP就是在这一层。端口号既是这里的"端"。
传输层就相当于公司中的负责快递邮件收发的人,公司自己的投递员,他们负责将上一层的要寄出的资料投递到快递公司或邮局。
(5) 网络层
本层通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。
就是通常说的IP层。
这一层就是我们经常说的IP协议层。
IP协议是Internet的基础。
网络层就相当于快递公司庞大的快递网络,全国不同的集散中心,比如说,从深圳发往北京的顺丰快递(陆运为例啊,空运好像直接就飞到北京了),首先要到顺丰的深圳集散中心,从深圳集散中心再送到武汉集散中心,从武汉集散中心再寄到北京顺义集散中心。这个每个集散中心,就相当于网络中的一个IP节点。
(6) 数据链路层
将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。
数据链路层又分为2个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。
MAC子层处理CSMA/CD算法、数据出错校验、成帧等;LLC子层定义了一些字段使上次协议能共享数据链路层。
在实际使用中,LLC子层并非必需的。
(7) 物理层
实际最终信号的传输是通过物理层实现的。
通过物理介质传输比特流。规定了电平、速度和电缆针脚。
常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。
这些都是物理层的传输介质。
快递寄送过程中的交通工具,就相当于我们的物理层,例如汽车,火车,飞机,船。
7. 通信特点:对等通信
对等通信,为了使数据分组从源传送到目的地,源端OSI模型的每一层都必须与目的端的对等层进行通信,这种通信方式称为对等层通信。
在每一层通信过程中,使用本层自己协议进行通信。
二、TCP/IP五层模型
TCP/IP五层协议和OSI的七层协议对应关系如下:
在每一层都工作着不同的设备,比如我们常用的交换机就工作在数据链路层的,一般的路由器是工作在网络层的。
在每一层实现的协议也各不同,即每一层的服务也不同,下图列出了每层主要的协议。
1. 应用层
应用层向应用程序提供服务,这些服务按其向应用程序提供的特性分成组,并称为服务元素。
有些可为多种应用程序共同使用,有些则为较少的一类应用程序使用。
应用层为最高层,是直接为应用进程提供服务的。
其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务。
其服务元素分为两类:公共应用服务元素CASE和特定应用服务元素SASE。
CASE提供最基本的服务,它成为应用层中任何用户和任何服务元素的用户,主要为应用进程通信,分布系统实现提供基本的控制机制。
特定服务SASE则要满足一些特定服务,如文卷传送,访问管理,作业传送,银行事务,订单输入等。
这些将涉及到虚拟终端,作业传送与操作,文卷传送及访问管理,远程数据库访问,图形核心系统,开放系统互连管理等等。
应用层的标准有DP8649"公共应用服务元素",DP8650"公共应用服务元素用协议",文件传送,访问和管理服务及协议。
2. 传输层
传输层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用。
当网络层服务质量不能满足要求时,它将服务加以提高,以满足高层的要求;当网络层服务质量较好时,它只用很少的工作。
传输层还可进行复用,即在一个网络连接上创建多个逻辑连接。
传输层也称为运输层,是很重要的一层。
因为它是源端到目的端对数据传送进行控制从低到高的最后一层。
有一个既存事实,即世界上各种通信子网在性能上存在着很大差异。
例如电话交换网,分组交换网,公用数据交换网,局域网等通信子网都可互连,但它们提供的吞吐量,传输速率,数据延迟通信费用各不相同。
对于会话层来说,却要求有一性能恒定的界面。
传输层就承担了这一功能。
它采用分流/合流,复用/解复用技术来调节上述通信子网的差异,使会话层感受不到。
此外传输层还要具备差错恢复,流量控制等功能,以此对会话层屏蔽通信子网在这些方面的细节与差异。
传输层面对的数据对象已不是网络地址和主机地址,而是和会话层的界面端口。
上述功能的最终目的是为会话提供可靠的,无误的数据传输。
传输层的服务一般要经历传输连接建立阶段,数据传送阶段,传输连接释放阶段3个阶段才算完成一个完整的服务过程。
而在数据传送阶段又分为一般数据传送和加速数据传送两种。
3. 网络层
网络层的产生也是网络发展的结果。
在联机系统和线路交换的环境中,网络层的功能没有太大意义。
当数据终端增多时,它们之间有中继设备相连。
此时会出现一台终端要求不只是与唯一的一台而是能和多台终端通信的情况,这就是产生了把任意两台数据终端设备的数据链接起来的问题,也就是路由或者叫寻径。
另外,当一条物理信道建立之后,被一对用户使用,往往有许多空闲时间被浪费掉。
人们自然会希望让多对用户共用一条链路,为解决这一问题就出现了逻辑信道技术和虚拟电路技术。
网络层为建立网络连接和为上层提供服务,应具备以下主要功能:
· 路由选择和中继。
· 激活,终止网络连接。
· 在一条数据链路上复用多条网络连接,多采取分时复用技术 。
· 差错检测与恢复。
· 排序,流量控制。
· 服务选择。
· 网络管理。
4. 数据链路层
数据链路可以粗略地理解为数据通道。
物理层要为终端设备间的数据通信提供传输媒体及其连接。
媒体是长期的,连接是有生存期的。
在连接生存期内,收发两端可以进行不等的一次或多次数据通信。
每次通信都要经过建立通信联络和拆除通信联络两过程。
这种建立起来的数据收发关系就叫作数据链路。
而在物理媒体上传输的数据难免受到各种不可靠因素的影响而产生差错,为了弥补物理层上的不足,为上层提供无差错的数据传输,就要能对数据进行检错和纠错。
数据链路的建立,拆除,对数据的检错,纠错是数据链路层的基本任务。
链路层的主要功能:链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的功能来实现。
· 链路连接的建立,拆除,分离。
· 帧定界和帧同步。链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但无论如何必须对帧进行定界。
· 顺序控制,指对帧的收发顺序的控制。
· 差错检测和恢复。
还有链路标识,流量控制等等。
差错检测多用方阵码校验和循环码校验来检测信道上数据的误码,而帧丢失等用序号检测。
各种错误的恢复则常靠反馈重发技术来完成。
5. 物理层
物理层虽然处于最底层,却是整个计算机网络的基础。
物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。
物理层的媒体包括架空明线、平衡电缆、光纤、无线信道等。通信用的互连设备指DTE和DCE间的互连设备。
DTE即数据终端设备,又称物理设备,如计算机、终端等都包括在内。
而DCE则是数据通信设备或电路连接设备,如调制解调器等。
数据传输通常是经过DTE——DCE,再经过DCE——DTE的路径。
互连设备指将DTE、DCE连接起来的装置,如各种插头、插座。
LAN中的各种粗、细同轴电缆、T型接、插头,接收器,发送器,中继器等都属物理层的媒体和连接器。
物理层的主要功能:
(1) 为数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体连接而成。
一次完整的数据传输,包括激活物理连接,传送数据,终止物理连接。
所谓激活,就是不管有多少物理媒体参与,都要在通信的两个数据终端设备间连接起来,形成一条通路。
(2) 传输数据,物理层要形成适合数据传输需要的实体,为数据传送服务。
一是要保证数据能在其上正确通过,二是要提供足够的带宽(带宽是指每秒钟内能通过的比特(BIT)数),以减少信道上的拥塞。
传输数据的方式能满足点到点,一点到多点,串行或并行,半双工或全双工,同步或异步传输的需要。
三、 TCP/IP 基础
1. TCP/IP 的具体含义
从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分。TCP/IP 一词泛指这些协议,因此,有时也称 TCP/IP 为网际协议群。
互联网进行通信时,需要相应的网络协议,TCP/IP 原本就是为使用互联网而开发制定的协议族。因此,互联网的协议就是 TCP/IP,TCP/IP 就是互联网的协议。
网际协议群
2. 数据包
包、帧、数据包、段、消息
以上五个术语都用来表述数据的单位,大致区分如下:
- 包可以说是全能性术语;
- 帧用于表示数据链路层中包的单位;
- 数据包是 IP 和 UDP 等网络层以上的分层中包的单位;
- 段则表示 TCP 数据流中的信息;
- 消息是指应用协议中数据的单位。
每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。
数据包首部
网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。包首部就像协议的脸。
3. 数据处理流程
下图以用户 a 向用户 b 发送邮件为例子:
数据处理流程
① 应用程序处理
- 首先应用程序会进行编码处理,这些编码相当于 OSI 的表示层功能;
- 编码转化后,邮件不一定马上被发送出去,这种何时建立通信连接何时发送数据的管理功能,相当于 OSI 的会话层功能。
② TCP 模块的处理
- TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要在应用层数据的前端附加一个 TCP 首部。
③ IP 模块的处理
- IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,参考路由控制表决定接受此 IP 包的路由或主机。
④ 网络接口(以太网驱动)的处理
- 从 IP 传过来的 IP 包对于以太网来说就是数据。给这些数据附加上以太网首部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。
⑤ 网络接口(以太网驱动)的处理
- 主机收到以太网包后,首先从以太网包首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。
- 如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如 IP、ARP 等。这里的例子则是 IP 。
⑥ IP 模块的处理
- IP 模块接收到 数据后也做类似的处理。从包首部中判断此 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例子则是 TCP。
- 另外吗,对于有路由器的情况,接收端地址往往不是自己的地址,此时,需要借助路由控制表,在调查应该送往的主机或路由器之后再进行转发数据。
⑦ TCP 模块的处理
- ·在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。
⑧ 应用程序的处理
· 接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。
四、传输层中的 TCP 和 UDP
TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP。
- TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP 为提供可靠性传输,实行"顺序控制"或"重发控制"机制。此外还具备"流控制(流量控制)"、"拥塞控制"、提高网络利用率等众多功能。
- UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。
- TCP 和 UDP 的优缺点无法简单地、绝对地去做比较:TCP 用于在传输层有必要实现可靠传输的情况;而在一方面,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。TCP 和 UDP 应该根据应用的目的按需使用。
1. 端口号
数据链路和 IP 中的地址,分别指的是 MAC 地址和 IP 地址。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。
1.1 根据端口号识别应用
一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。
通过端口号识别应用
1.2 通过 IP 地址、端口号、协议号进行通信识别
- 仅凭目标端口号识别某一个通信是远远不够的。
通过端口号、IP地址、协议号进行通信识别
- ① 和② 的通信是在两台计算机上进行的。它们的目标端口号相同,都是80。这里可以根据源端口号加以区分。
- ③ 和 ① 的目标端口号和源端口号完全相同,但它们各自的源 IP 地址不同。
- 此外,当 IP 地址和端口号全都一样时,我们还可以通过协议号来区分(TCP 和 UDP)。
1.3 端口号的确定
- 标准既定的端口号:这种方法也叫静态方法。它是指每个应用程序都有其指定的端口号。但并不是说可以随意使用任何一个端口号。例如 HTTP、FTP、TELNET 等广为使用的应用协议中所使用的端口号就是固定的。这些端口号被称为知名端口号,分布在 0~1023 之间;除知名端口号之外,还有一些端口号被正式注册,它们分布在 1024~49151 之间,不过这些端口号可用于任何通信用途。
- 时序分配法:服务器有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。在这种方法下,客户端应用程序完全可以不用自己设置端口号,而全权交给操作系统进行分配。动态分配的端口号范围在 49152~65535 之间。
1.4 端口号与协议
· 端口号由其使用的传输层协议决定。因此,不同的传输层协议可以使用相同的端口号。
· 此外,那些知名端口号与传输层协议并无关系。只要端口一致都将分配同一种应用程序进行处理。
2. UDP
· UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。
- 并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况,UDP 也无法进行流量控制等避免网络拥塞行为。
- 此外,传输途中出现丢包,UDP 也不负责重发。
- 甚至当包的到达顺序出现乱序时也没有纠正的功能。
- 如果需要以上的细节控制,不得不交由采用 UDP 的应用程序去处理。
- UDP 常用于一下几个方面:1.包总量较少的通信(DNS、SNMP等);2.视频、音频等多媒体通信(即时通信);3.限定于 LAN 等特定网络中的应用通信;4.广播通信(广播、多播)。
3. TCP
- TCP 与 UDP 的区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在 UDP 中都没有。
- 此外,TCP 作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。
- 根据 TCP 的这些机制,在 IP 这种无连接的网络上也能够实现高可靠性的通信( 主要通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现)。
3.1 三次握手(重点)
- TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。
- 所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。
下面来看看三次握手的流程图:
三次握手
- 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
- 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
- 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
3.2 四次挥手(重点)
- 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
- 由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
下面来看看四次挥手的流程图:
四次挥手
- 中断连接端可以是客户端,也可以是服务器端。
- 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
- 第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
- 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
- 第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,
具体流程如下图:
同时挥手
3.3 通过序列号与确认应答提高可靠性
- 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。
- 在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。
- 未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端误以为数据没有到达目的地而重发数据。
- 此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。此时,源主机只要按照机制重发数据即可。
- 对于目标主机来说,反复收到相同的数据是不可取的。为了对上层应用提供可靠的传输,目标主机必须放弃重复的数据包。为此我们引入了序列号。
序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。通过序列号和确认应答号,TCP 能够识别是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输。
序列号和确认应答
3.4 重发超时的确定
- 重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过这个时间仍未收到确认应答,发送端将进行数据重发。最理想的是,找到一个最小时间,它能保证"确认应答一定能在这个时间内返回"。
- TCP 要求不论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况发生何种变化,都必须保持这一特性。为此,它在每次发包时都会计算往返时间及其偏差。将这个往返时间和偏差时间相加,重发超时的时间就是比这个总和要稍大一点的值。
- 在 BSD 的 Unix 以及 Windows 系统中,超时都以0.5秒为单位进行控制,因此重发超时都是0.5秒的整数倍。不过,最初其重发超时的默认值一般设置为6秒左右。
- 数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以2倍、4倍的指数函数延长。
- 此外,数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。
3.5 以段为单位发送数据
- 在建立 TCP 连接的同时,也可以确定发送数据包的单位,我们也可以称其为"最大消息长度"(MSS)。最理想的情况是,最大消息长度正好是 IP 中不会被分片处理的最大数据长度。
- TCP 在传送大量数据时,是以 MSS 的大小将数据进行分割发送。进行重发时也是以 MSS 为单位。
- MSS 在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在 TCP 首部中写入 MSS 选项,告诉对方自己的接口能够适应的 MSS 的大小。然后会在两者之间选择一个较小的值投入使用。
3.6 利用窗口控制提高速度
- TCP 以1个段为单位,每发送一个段进行一次确认应答的处理。这样的传输方式有一个缺点,就是包的往返时间越长通信性能就越低。
- 为解决这个问题,TCP 引入了窗口这个概念。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。如下图所示:
·
- 窗口控制
- 窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。上图中窗口大小为4个段。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。
3.7 滑动窗口控制
滑动窗口
- 上图中的窗口内的数据即便没有收到确认应答也可以被发送出去。不过,在整个窗口的确认应答没有到达之前,如果其中部分数据出现丢包,那么发送端仍然要负责重传。为此,发送端主机需要设置缓存保留这些待被重传的数据,直到收到他们的确认应答。
- 在滑动窗口以外的部分包括未发送的数据以及已经确认对端已收到的数据。当数据发出后若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。
- 收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序地将多个段同时发送提高通信性能。这种机制也别称为滑动窗口控制。
3.8 窗口控制中的重发控制
在使用窗口控制中, 出现丢包一般分为两种情况:
- ① 确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的,如下图:
部分确认应答丢失
- ② 某个报文段丢失的情况。接收主机如果收到一个自己应该接收的序列号以外的数据时,会针对当前为止收到数据返回确认应答。如下图所示,当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,因此,在窗口比较大,又出现报文段丢失的情况下,同一个序列号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答,就会将其对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称为高速重发控制。