码迷,mamicode.com
首页 > 系统相关 > 详细

Linux网络编程——连接和面向连接的协议之间没有区别

时间:2015-12-02 14:14:30      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

网络编程中最重要的概念就是连接取向(connection-oriented)和无连接(connectionless)协议。虽然本质。两者之间的区别是不难理解,编程的人来说,却是个非常easy混淆的问题。

这个问题与上下文有些关联:非常显然。假设两台计算机要进行通信,就必须以某种形式“连接”起来。那“无连接通信”又是什么意思呢?


答案是:面向连接和无连接指的都是协议。

也就是说,这些术语指的并非物理介质本身。而是用来说明怎样在物理介质上数据传输的。面向连接和无连接协议能够,并且通常也确实会共享同一条物理介质。



假设两者的差别与承载数据的物理介质无关,又和什么有关呢?它们的本质差别在于,对无连接协议来说,每一个分组的处理都独立于全部其它分组,而对面向连接的协议来说。协议实现则维护了与后继分组有关的状态信息。


无连接协议中的分组被称为数据报(datagram)。每一个分组都是独立寻址。并由应用程序发送的。从协议的角度来看。每一个数据报都是一个独立的实体,与在两个同样的对等实体之间传送的不论什么其它数据报都没有关系,这就意味着协议非常可能是不可靠的。也就是说。网络会尽最大努力传送每一个数据报。但并不保证数据报不丢失、不延迟或者不错序传输。


还有一方面,面向连接的协议则维护了分组之间的状态。使用这样的协议的应用程序通常都会进行长期的对话。记住这些状态。协议就能够提供可靠的传输。比方,发送端能够记住哪些数据已经发送出去了但还未被确认。以及数据是什么时候发送的。

假设在某段时间间隔内没有收到确认。发送端能够重传数据。

接收端能够记住已经收到了哪些数据。并将反复的数据丢弃。假设分组不是按序到达的,接收端能够将其保存下来,直到逻辑上先于它的分组到达为止。


典型的面向连接协议有三个阶段。第一阶段,在对等实体间建立连接。接下来是传输数据阶段,在这个阶段中,数据在对等实体间传输。最后,当对等实体完毕传输数据时。连接被拆除。


一种标准的类比是:使用无连接协议就像寄信。而使用面向连接的协议就像打电话。


给朋友寄信时,每封信都是一个独立寻址且自包括的实体。

邮局在处理这些信件时不会考虑到两个通信者之间的不论什么其它信件。邮局不会维护以往通信者的历史记录--也就是说,它不会维护信件之间的状态。邮局也不保证信件不丢失、不延迟、不错序。这样的方式就相应于无连接协议发送数据报的方式。(用明信片进行类比会更合适一些,由于写错地址的信件会被退回发信人。而(和典型的无连接协议数据报一样)明信片则不会。)


如今来看看不是给朋友寄信。而是打电话时会发生些什么事情。


首先。拨朋友的号码来发起呼叫。朋友应答,会说“嗨”之类的话。然后我们回应:“嗨,Lucy。

我是 Mike。

”我们和朋友聊一会儿,然后互说再见并挂机。这是面向连接协议中发生的典型状况。在连接建立阶段,一端与其对等实体联系,交换初始问候信息,对会话中要用到的一些參数和选项进行沟通。然后连接进入传输数据阶段。



在电话交谈的过程中。两端用户都知道他们在和谁说话,因此不是必需不停地说“这是 Mike 在跟 Lucy 说话”。也不是必需在每次说话之前都拨一次朋友的电话号码——我们的电话已经连接起来了。同理。在面向连接协议的传输数据阶段,也不是必需说明我们自己或对等实体的地址。连接为我们维护的状态中包括了这些地址。我们仅仅要发送数据即可了,不须要考虑寻址或其它与协议相关的问题。

就像用电话交谈一样。连接的任一端完毕数据的传输时,都要通知其对等实体。两端都完毕传输时,要依次将连接拆除。


既然无连接协议有这么多的缺点,大家可能会奇怪。为什么还要使用这样的协议呢?我们会看到。在非常多情况下,使用无连接协议构建应用程序都是有意义的。比方,使用无连接协议能够非常方便地支持一对多和多对一通信。而面向连接协议通常都须要多个独立的连接才干做到。但更重要的是,无连接协议是构建面向连接协议的基础。TCP/IP 是基于一个4层的协议栈,例如以下图所看到的:

技术分享

如图所看到的,TCP 和 UDP 都是构建在 IP 之上的。因此,IP 是构建整个 TCP/IP 协议族的基础。

但 IP 提供的是一种尽力而为的、不可靠的无连接服务。它接收来自其上层的分组,将它们封装在一个 IP 分组中,依据路由为分组选择正确的硬件接口。从这个接口将分组发送出去。一旦将分组发送出去了,IP 就不再关心这个分组了。和全部无连接协议一样。它将分组发送出去之后就不再记得这个分组了。


这样的简单性也是 IP 的主要长处。由于它对底层的物理介质没有作不论什么如果,所以在不论什么能够承载分组的物理链路上都能够执行 IP。比如,IP 能够执行在简单的串行链路、以太网和令牌环 LAN、X.25 和使用 ATM(Asychronous Transfer Mode。异步转移模式)的 WAN、CDPD(Cellular Digital Packet Data,无线蜂窝数字分组数据)网,以及非常多其它网络上。虽然这些网络技术之间有非常大的差异,但 IP 对它们一视同仁。除了觉得它们能够转发分组之外没有对其作不论什么如果。这样的机制隐含了非常深的意义。IP 能够执行在不论什么能够承载分组的网络上,所以整个 TCP/IP 协议族也能够。


如今我们来看看 TCP 是如何利用这样的简单的无连接服务来提供可靠的面向连接服务的。TCP 的分组被称为段(segment),是放在 IP 数据报中发送的。因此,根本无法假定这些分组会抵达目的地,更不用说保证分组无损坏且以原来的顺序到达了。


为了提供这样的可靠性,TCP 向主要的 IP 服务中加入了三项功能
首先。它为 TCP 段中的数据提供了校验和。这样有助于确保抵达目的地的数据在传输过程中不会被网络损坏。
第二,它为每字节分配了一个序列号,这样,假设数据抵达目的地时真的错序了,接收端也可以依照恰当的顺序将其重装起来。当然,TCP 并没有为每字节都附加一个序列号。实际上,每一个 TCP 段的首部都包括了段中第一字节的序列号。这样,就隐含地知道了段中其它字节的序列号。
第三。TCP 提供了一种确认-重传机制,以确保终于每一个段都会被传送出去。


还有一方面,UDP 为编写应用程序的程序猿提供了一种不可靠的无连接服务

其实,UDP 仅仅向底层的 IP 协议中加入了两项功能。

首先,它提供了一个可选的校验和来检測数据的损坏情况。虽然 IP 也有校验和,但它仅仅对 IP 分组首部进行计算,所以,TCP 和 UDP 也都提供了校验和来保护它们自己的首部和数据。

其次,UDP 向 IP加入的第二项特性就是port的概念。


回到与电话/寄信的类比中来。我们能够把 TCP 连接中的网络地址当作一个办公室总机的电话号码,把port数作为一个站的办公室被称为一个特定的电话分机号码。同样,可以UDP网络地址地址公寓大楼,而port数作为一座公寓楼的大堂在个人邮箱。

Linux网络编程——连接和面向连接的协议之间没有区别

标签:

原文地址:http://www.cnblogs.com/mengfanrong/p/5012619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!