网络编程中最重要的概念就是连接取向(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网络编程——连接和面向连接的协议之间没有区别的更多相关文章

  1. Linux网络编程之聊天程序(TCP协议之select)

    服务器端:server.c #include <stdio.h> #include <stdlib.h> #include <errno.h> #include & ...

  2. linux网络编程中阻塞和非阻塞socket的区别

    读操作 对于阻塞的socket,当socket的接收缓冲区中没有数据时,read调用会一直阻塞住,直到有数据到来才返 回.当socket缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数.当 ...

  3. linux网络编程_1

    本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...

  4. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  5. [转] - Linux网络编程 -- 网络知识介绍

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  6. 【转】Linux网络编程入门

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  7. 《转》Linux网络编程入门

    原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...

  8. linux 网络编程

    linux网络编程中主要分为服务器和客户端两部分,而网络编程中又分为TCP和UDP两种.TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. ...

  9. linux网络编程基础--(转自网络)

    转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接 ...

随机推荐

  1. UVa 11879 - Multiple of 17

    称号:计算一个数字是不17倍数. 说明:串,睑板. 简单的问题,直接推论可以是. 设定 n = 10a + d:(0 ≤ d ≤ 9) a - 5d = 51a - 5n,假设n被17整除,这个数必定 ...

  2. Java中动态代理技术生成的类与原始类的区别

    用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后 ...

  3. T-SQL基础(5) - 表表达式

    1.派生表(derived table)select YEAR(orderdate) as orderyear, COUNT(distinct custid) as numcustsfrom Sale ...

  4. Java Tread多线程(0)一个简单的多线程实例

    作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...

  5. rac安装grid报INS-41112错误

    原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...

  6. offsetTop和scrollTop差异

    最近写组件,这两个属性的结果搞的有点晕,我检查的文件及资料,这两个性质如下面总结: 他一直在offsetLeft.offsetTop,scrollLeft.scrollTop这些方法都是非常迷茫,花一 ...

  7. hdu 5077 NAND(暴力打表)

    题目链接:hdu 5077 NAND 题目大意:Xiaoqiang要写一个编码程序,然后依据x1,x2,x3的值构造出8个字符.如今给定要求生成的8个字符.问 说Xiaoqiang最少要写多少行代码. ...

  8. UI设计学习路径(一个)—好酒也怕巷子深

    来源 參与米老师对项目的验收的时候.听了老师对UI的看法才注意UI这块内容.非常奇怪为什么我们总是不能注意到本该注意的问题呢?软件开发难道仅仅是功能的实现不包含界面设计吗?当然不是.问题的根源在于我们 ...

  9. MMTool制作Ozmosis引导BIOS完美引导OS X系统

    Ozmosis引导是德国黑苹果爱好者制作的一个引导程序,目前仍处于测试版,有了它,你可以不用再使用四叶草.变色龙之类引导工具,相对而言它更象白苹果.Ozmosis是基于AMI公司bios的硬件引导驱动 ...

  10. all about AIX MPIO

    Multipath  I/O (多路径)   在计算机存储技术里,多路径提供了容错和性能提高,在计算机系统里CPU有多条物理路径通道,块存储设备通过总线,控制器,交换设备以及桥接设备来连接.     ...