因特网使用的IP协议是无连接的,因此其传输是不可靠的。

这样easy使人们感到因特网非常不可靠,那为什么当初不直接把它设计为可靠的?

先打一个例如。邮局寄送的平信非常像无连接的IP数据报。每封平信可能走不同的传送路径,同一时候平信也不保证不丢失。当我们发现收信人没有收到寄出的平信时,去找邮局索赔是没实用的。邮局会说:“平信不保证不丢失。怕丢失就请你寄挂号信”。可是大家并不会将全部的信件都用挂号方式邮寄,这是由于邮局从来不会任意地将平信丢弃,而丢失平信的概率并不大。况且寄挂号信要多花些钱,还要去邮局排队,太麻烦。总之,虽然寄平信有可能会丢失,但绝大多数的信件还是平信,由于寄平信方便、廉价。

我们知道,传统的电信网的最基本的用途是进行电话通信。

普通的电话机很easy,没有什么智能,因此电信公司就不得不把电信网设计得很好,这样的电信网可以保证用户通话时的通信质量。这点对使用很easy的电话机的用户则是很方便的。

但电信公司为了建设可以确保传输质量的电信网则付出了巨大的代价(使用昂贵的程控交换机和网管系统)。

数据的传送显然必须是非常可靠的。当初美国国防部在设计 ARPANET 时有一个非常重要的讨论内容就是:“谁应当负责传输数据的可靠性?”这时出现了两种对立的意见。

一种意见是主张应当像电信网那样,由通信网络负责传输数据的可靠性(由于电信网的发展历史及其技术水平已经证明了人们能够将网络设计得相当可靠)。但还有一种意见则坚决主张由用户的主机负责传输数据的可靠性。这里最重要的理由是:这样能够使计算机网络廉价、灵活,同一时候还能够满足军事上的各种特殊的需求。

以下用一个简单样例来说明这一问题。

设主机 A 通过因特网向主机 B 传送文件(例如以下图所看到的)。如何才干实现文件数据的可靠传输呢?

如依照电信网的思路,就是设法(这须要花费相当多的钱)将不可靠的因特网做成为可靠的因特网。

但设计计算机网络的人採用第二种思路。即设法实现端到端的可靠传输。

提出这样的思路的人觉得,计算机网络和电信网的一个重大差别就是终端设备的性能差别非常大。

电信网的终端是非常easy的、没有什么智能的电话机。因此电信网的不可靠必定会严重地影响人们利用电话的通信。但计算机网络的终端是有非常多智能的主机。这样就使得计算机网络和电信网有两个重要差别。第一,即使传送数据的因特网有一些缺陷(如造成比特差错或分组丢失),但具有非常多智能的终端主机仍然有办法实现可靠的传输数据(比如。可以及时发现差错并通知发送方重传刚才出错的数据)。

第二,即使网络可以实现
100% 地无差错传输,端到端的传输数据仍然有可能出现差错。

为了说明这点,我们能够用一个简单样例来说明这个问题。这就是主机 A 向主机 B 传送一个文件的情况。

文件是通过一个文件系统存储在主机 A 的硬盘中。主机 B 也有一个文件系统,用来接收和存储从 A 发送过来的文件。应用层使用的应用程序如今就是文件传送程序,这个程序一部分在主机 A 执行,还有一部分在主机 B 执行。

如今讨论文件传送的大致步骤:

(1)主机 A 的文件传送程序调用文件系统将文件从硬盘中读出。然后文件系统将文件传递给文件传送程序。

(2)主机 A 请求数据通信系统将文件传送到主机 B。

这里包含使用一些通信协议和将数据文件划分为适当大小的分组。

(3)通信网络将这些数据分组逐个传送给主机 B。

(4)在主机 B。数据通信协议将收到的数据传递给文件传送应用程序在主机 B 执行的那一部分。

(5)在主机 B,文件传送程序请求主机 B 的文件系统将收到的数据写到主机 B 的硬盘中。

在以上的几个步骤中,都存在使数据受到损伤的一些因素。

比如:

(1)尽管文件原来是正确写在主机 A 的硬盘上,但在读出后就可能出现差错(如在磁盘存储系统中的硬件出现了故障)。

(2)文件系统、文件传送程序或数据通信系统的软件在对文件里的数据进行缓存或复制的过程中都有可能出现问题。

(3)主机 A 或 B 的硬件处理机或存储器在主机 A 或 B 进行数据缓存或复制的过程中也有可能出现问题。

(4)通信系统在数据传输分组时有可能产生检測不出来的比特差错或甚至丢失某些分组。

(5)主机 A 或 B 都有可能在进行数据处理的过程中突然崩溃。

由此可看出。即使对于这样一个简单的文件传送任务。只使通信网络很可靠并不能保证文件从主机 A 硬盘到主机 B 硬盘的传送是可靠的。

也就是说。花费许多的钱将通信网络做成为很可靠的,对传送计算机数据来说是得不偿失的。既然如今的终端设备有智能,就应当把网络设计得简单些,而让具有智能的终端来完毕“使传输变得可靠”的任务。

于是。计算机网络的设计者採用了一种策略,这就是“端到端的可靠传输”。

更详细些,就是在运输层使用面向连接的 TCP 协议,它可保证端到端的可靠传输。仅仅要主机 B 的 TCP 发现了数据的传输有差错,就告诉主机 A 将出现差错的那部分数据重传,直到这部分数据正确传送到主机 B 为止。而 TCP 发现不了数据有差错的概率是非常小的。採用这种建网策略,既可以使网络部分价格廉价和灵活可靠。又可以保证端到端的可靠传输。



这样,我们能够这样想像。将因特网的范围略微扩大一些,即扩大到主机中的运输层。

因为运输层使用了 TCP 协议。使得端到端的传输数据成为可靠的,因此这样扩大了范围的因特网就成为可靠的网络。



因此。说“因特网提供的传输数据是不可靠的”或“因特网提供的传输数据是可靠的”这两种说法都能够在文献中找到,问题是是如何界定因特网的范围。假设说因特网提供的传输数据是不可靠的,那么这里的因特网指的是不包含主机在内的网络(仅有下三层)。说因特网提供的传输数据是可靠的。就表明因特网的范围已经扩大到主机的运输层。



再回到通过邮局寄平信的样例。当我们寄出一封平信后。能够等待收信人的确认(通过他的回信)。假设隔了一些日子还没有收到回信,我们能够将该信件再寄一次。这就是将“端到端的可靠传输”的原理用于寄信的样例。

因特网的IP协议是不可靠无连接的,那为什么当初不直接把它设计为可靠的?的更多相关文章

  1. TCP/IP协议原理与应用笔记23:路由选择模块 和 路由表的设计

    1. 路由选择模块 和 路由表的设计 2. 路由选择算法(路由模块在路由表中查找算法) (1)用IP分组中的目的IP地址查找路由表,使用匹配表项的下一跳地址完成分组交付 (2)匹配条件: dIP &a ...

  2. TCP/IP协议原理与应用笔记24:网际协议(IP)之 IP协议的简介

    1. IP协议:(网际协议) 2. IP协议(不可靠无连接数据报协议) (1)连接 vs. 可靠性 连接:面向连接.无连接 可靠:差错控制.流量控制等 面向连接不一定保证可靠,无连接不一定不可靠 在连 ...

  3. 计算机网络自学之路-----IP协议(3)

    前面一期说到了IP层的IP协议跟ARP协议,因为IPV4协议自身有些不足的地方,为了弥补这些不足,又引入了一些别的协议.觉得这种弥补方式治标不治本~~ 1)ICMP网络控制报文协议 2)CIDR无类域 ...

  4. 【TCP/IP 协议】 TCP/IP 基础

    总结 : 通过学习 TCP/IP 基础, 并总结相关笔记 和 绘制思维导图 到博客上, 对 TCP/IP 框架有了大致了解, 之后开始详细学习数据链路层的各种细节协议, 并作出笔记; 博客地址 : h ...

  5. tcp ip协议笔记(1)——简单介绍

    前言 本人记性不佳,看书健忘,以此笔记来记录看书后自己所知所想,已达到加深对tcp ip的理解.本笔记不过我看完书后自己所写的总结,权当是书后复习. 一.为什么会有tcp ip协议        ...

  6. tcp/ip协议学习笔记一

    一. 简述 以前在学校学习计算机网络的时候学习多是网络7层模型OSI,了解了一些基本的计算机网络概念和协议通信格式,但是一直没弄明白其中的原理,包括各层之间的关系,应用,还有一些常见的令牌环网到底是什 ...

  7. OSI七层模型详解 TCP/IP协议

      总结 OSI中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 表示层 数据格式化,代码转 ...

  8. TCP、UDP、IP 协议分析

    http://rabbit.xttc.edu.cn/rabbit/htm/artical/201091145609.shtml  http://bhsc881114.github.io/2015/06 ...

  9. TCP、UDP、IP协议分析

    此篇文章的原创作者是:草根老师博客(程姚根) chengyaogen.blog.chinaunix.net 感谢原作者! 互连网早期的时候,主机间的互连使用的是NCP协议.这种协议本身有很多缺陷,如: ...

随机推荐

  1. 用c#开发微信(10) JSSDK 基本用法 分享接口“发送到朋友”

    微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享. ...

  2. AsyncTask的用法总结

    这几天被AsyncTask虐得不行,在此总结下 首先: AsyncTask的参数介绍 在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占 ...

  3. Ubuntu 安装启动Tomcat

    首先下载ubuntu 的tar包 官网: http://tomcat.apache.org/download-80.cgi 安装启动 1 .下载对应的tar 2 .解压任意文件夹下,更改名字tomca ...

  4. Linux系统中如何添加自己的库文件路径

    库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用 ...

  5. php 中 return exit break contiue 详解

    return.break和contiue是语言结构,就如同if语句之类的,但是exit却是个函数. 1.exit函数 作用:Output a message and terminate the cur ...

  6. wxWidgets帮助文档(1)

    IMPLEMENT_APP IMPLEMENT_APP(className) 这是在应用程序中使用类的实现文件的应用程序类wxWidgets动态建筑.你用这个代替Old form: MyApp myA ...

  7. Java 23种设计模式详尽分析与实例解析之三--行为型模式

    Java设计模式 行为型模式 职责链模式 模式动机:职责链可以是一条直线.一个环或者一个树形结构.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理组织成一条链,并使请求链传递,由链上的处理者 ...

  8. Kendo UI开发教程(24): 单页面应用(二) Router 类

    Route类负责跟踪应用的当前状态和支持在应用的不同状态之间切换.Route通过Url的片段功能(#url)和流量器的浏览历史功能融合在一起.从而可以支持把应用的某个状态作为书签添加到浏览器中.Rou ...

  9. 【cocos2d-js公文】十七、事件分发机制

    简单介绍 游戏开发中一个非常重要的功能就是交互,假设没有与用户的交互.那么游戏将变成动画,而处理用户交互就须要使用事件监听器了. 总概: 事件监听器(cc.EventListener) 封装用户的事件 ...

  10. Android 环境变量配置(Mac)

    Mac 系统10.10,自带的就是jdk1.6,因为工作需要就升级到了1.7,要从新配置环境变量了 mac 默认是自带的有jdk1.6 安装路径为: /System/Library/Framework ...