网络编程中最重要的概念就是连接取向(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数作为一座公寓楼的大堂在个人邮箱。

转载于:https://www.cnblogs.com/mengfanrong/p/5012619.html

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

  1. Linux网络编程 - 套接字与协议族

    一 理解网络编程和套接字(socket) 1.1 网络编程和套接字概要 网络编程就是编程程序使两台连网的计算机可以互相交换数据.那么,这两台计算机之间用什么传输数据呢?首先需要物理连接.如今大部分计算 ...

  2. 【Linux网络编程】因特网的IP协议是不可靠无连接的,那为什么当初不直接把它设计为可靠的?

    因特网使用的IP协议是无连接的,因此其传输是不可靠的.这样容易使人们感到因特网很不可靠,那为什么当初不直接把它设计为可靠的? 先打一个比方.邮局寄送的平信很像无连接的IP数据报.每封平信可能走不同的传 ...

  3. Linux网络编程(网络层)-ip协议/地址管理/路由选择

    网络层:负责地质管理与路由选择 IP协议: 注: udp报文大小大于MTU,则会在网络层进行数据分片,分割成多个小的数据分片进行传输 MTU:最大传输单元 (链路层所限制的一个最大数据帧大小)以太网默 ...

  4. 5、linux网络编程--C/S与B/S架构的区别

    一.概述: 在这个信息急剧膨胀的社会,我们不得不说,人类正在进入一个崭新的时代,那就是信息时代.信息时代等等一个主要特征就是计算机网络的应用.计算机网络哟从最初的集中式计算经过了clent/serve ...

  5. linux网络编程之地址结构sockaddr和sockaddr_in的区别

    1.介绍sockaddr 结构体struct sockaddr在/usr/include/linux/socket.h中定义 struct sockaddr {unsigned short sa_fa ...

  6. Linux网络编程之实现服务器与客户端之间的通讯

    系列文章目录 文章目录 系列文章目录 前言 服务端代码 客户端代码 前言 利用socket实现服务器与客户端之间的网络通讯 当子进程结束时会产生SIGCHLD信号,利用该信号实现进程回收 服务端代码 ...

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

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

  8. Linux网络编程基础1(网络应用程序设计模式,分层模型,协议格式)

    Linux网络编程基础(网络应用程序设计模式,socket编程,inet_pton,inet_ntop,服务端创建连接的过程,客户端创建连接的过程,socket函数封装) 1. 网络应用程序设计模式 ...

  9. alin的学习之路(Linux网络编程:十)(http协议,BS模型)

    alin的学习之路(Linux网络编程:十)(http协议,BS模型) 需求:使用B/S模型来访问主机中的文件(包括目录) 0. B/S 模型 注意事项 1. 浏览器请求ico ​ 准备一个favic ...

最新文章

  1. Failed to open zip file Gradle dependency cache be corrupt
  2. Linux那些事儿 之 戏说USB(32)驱动的生命线(四)
  3. c#获取应用程序目录
  4. form 提交多个对象及springMVC接收
  5. python资料免费-python 资料
  6. android4.0 系统广播集
  7. DeepLearning:模型之间的相互转化(keras-hdf5→Tensorflow-pb文件)
  8. mysql深度解析_百万级数据下的mysql深度解析
  9. oracle查看角色内容,oracle创建,查看用户和角色,用户角色赋权
  10. PIL保存二维numpy数组(2,2)为灰度图和RGB图
  11. mysql row 日志格式_mysql row日志格式下 查看binlog sql语句
  12. 掌门教育微服务体系 Solar(中)
  13. AT24C02、DS1302、DS18B20等中文手册
  14. python3 txt 读写_Python3 读写txt文件
  15. FAN6921MRMY 带多种保护功能 电流模式PWM控制 功率因数校正 (PFC) 控制器
  16. python可以写外汇里的ea吗_小菜鸟教你们写外汇ea -
  17. linux下批量修改前缀,Linux 中批量修改后缀名
  18. idea的鼠标滚轮调整字体大小
  19. 恢复系统自带的office软件
  20. Androguard交叉引用Crossreferences(XREFs)

热门文章

  1. java切换系统输入法_java - 关于Android输入法切换的问题
  2. 交换二维数组元素c语言,二维数组中元素替换问题!
  3. dede问答模块 那个php文件相对重要,DEDE问答(ask)模块游客匿名提问和解答
  4. 打开有视频的文件夹~~当遇到某些特定的视屏格式就会出现Activemovie Window:Explorer.EXE-应用程序错误
  5. Ubuntu、Windows双系统为Ubuntu增加磁盘空间
  6. 2017年10月21日普及组 排名
  7. CSP-S2019游记
  8. rust服务器假人文件,rust游戏手机版-rust手游预约(腐蚀游戏手机版)-乐游网安卓...
  9. python正则表达式面试_【剑指offer】面试题19. 正则表达式匹配
  10. python定义一个矩形类_创建矩形类