​网络编程中最基本的概念就是面向连接和无连接协议。尽管从本质上来说,两者之间的区别并不难理解,但是对那些刚刚接触网络编程的人来说,却是个比较困难的问题。

如果两台计算机要进行通信,就必须以某种形式连接起来,那么无连接通信又是什么意思?

答案是:面向连接和无连接指的都是协议。也就是说,这些术语指的并不是物理介质本身,而是用来说明如何在物理介质上传输数据。面向连接和无连接协议可以,而且通常也确实会共享一条物理介质。

如果两者的区别与承载数据的物理介质无关,有何什么有关?他们的本质区别在于:对无连接协议来说,每个分组的处理都独立与所有其他的分组,而面向连接的协议来说,协议实现则维护了后继分组有关的状态信息。

无连接协议的分组被称为数据包(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添加的第二项特性就是端口的概念。

回到与电话/寄信的类比中来,我们可以把 TCP 连接中的网络地址当作一个办公室总机的电话号码,把端口号当作办公室中某台正被呼叫的特定电话的分机号。同理,可以将UDP网络地址当作一座公寓楼的地址,并把端口号当作公寓楼大厅中的个人邮箱

 

转载于:https://www.cnblogs.com/yjds/p/8597407.html

2、linux网络编程--无连接与面向连接的区别相关推荐

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

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

  2. 【Linux网络编程】无连接和面向连接协议

    00. 目录 文章目录 00. 目录 01. 概述 02. 附录 01. 概述 网络编程中最基本的概念就是面向连接(connection-oriented)和无连接(connectionless)协议 ...

  3. linux网络编程常用函数详解与实例(socket--bind--listen--accept)

    常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...

  4. 【Linux】一步一步学Linux网络编程教程汇总(更新中......)

    00. 目录 文章目录 00. 目录 01. 基础理论知识 02. 初级编程 03. 高级编程 04. LibEvent库 05. 06. 07. 01. 基础理论知识 [Linux网络编程]网络协议 ...

  5. 【Linux网络编程】TCP编程

    00. 目录 文章目录 00. 目录 01. TCP概述 02. TCP特点 03. TCP中CS架构 04. TCP相关函数 05. TCP服务端示例 06. TCP客户端示例 07. 附录 01. ...

  6. Linux网络编程——黑马程序员笔记

    01P-复习-Linux网络编程 02P-信号量生产者复习 03P-协议 协议: 一组规则. 04P-7层模型和4层模型及代表协议 分层模型结构: OSI七层模型: 物.数.网.传.会.表.应TCP/ ...

  7. linux网络编程(一)网络基础传输知识

    linux网络编程(一)网络传输基础知识 一.什么是协议? 二.使用步骤 典型协议 2.网络应用程序设计模式 C/S模式 B/S模式 优缺点 3.分层模型 4.TCP/IP四层模型 通信过程 5.协议 ...

  8. Linux网络编程基础

    2019独角兽企业重金招聘Python工程师标准>>> (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍 客户端和服务端 网络程序和普通的程序有一个最大的 ...

  9. 150集Linux网络编程培训视频吐血整理 | 网络基础

    学习视频来源:<黑马程序员 - Linux网络编程> 协议的概念 什么是协议 从应用的角度出发,协议可理解为"规则",是数据传输和数据的解释的规则. 假设,A.B双方欲 ...

  10. Linux网络编程——千峰物联网笔记

    B站视频:千峰物联网学科linux网络编程 网址:https://www.bilibili.com/video/BV1RJ411B761?p=1 目录 第一章:计算机网络概述 1.1计算机网络发展简史 ...

最新文章

  1. flashcom中远程共享对象SharedObject的用法
  2. MVC学习(四)几种分页的实现(3)
  3. Docker学习与和应用(二)_使用Docker
  4. PHP实现中文字符串截取无乱码
  5. 关抢占 自旋锁_互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
  6. 如何更改应用路径_【电脑】实用技巧分享:如何更改电脑桌面路径?
  7. 程序员新年要实现的10个愿望
  8. Java中OutOfMemoryError(内存溢出)的情况及解决办法
  9. java框架面试题及答案,年薪50W
  10. JAVA编写俄罗斯方块
  11. 网管员的任务与职责漫谈
  12. 2022QS世界大学学科排名出炉,计算机学科有哪些信息值得关注?
  13. Oracle 19c 安装步骤(超详细)
  14. Jetpack系列之Paging2.0 分页加载
  15. 布隆(Bloom Filter)过滤器——全面讲解,建议收藏
  16. C++ 每日一题13:数字金字塔
  17. 一键抠图:一款简单好用的图片处理软件(工具详资源)
  18. Bartender 4 for Mac(菜单栏应用管理软件)
  19. PMP之成本预测(BAC、EAC、ETC)
  20. R语言入门——数据读写

热门文章

  1. 从技术到求职,强烈推荐一下这9个牛逼的公众号,技术人必备
  2. pku 1459 最大流 SAP
  3. -rw-r--r--@ what's @
  4. 【iCore3 双核心板】例程三十六:DAC实验——输出直流电压
  5. 变相解决Unidac无法向Postgresql传游标RefCursor的问题
  6. 24-语言入门-24-cigarettes
  7. 移动开发不能不知道的事-meta
  8. FPGA实现任意分频 为所欲为——教你什么才是真正的任意分频
  9. Android性能优化---布局优化
  10. 猜数字的算法的一个简单实现