Linux网络编程——连接和面向连接的协议之间没有区别
网络编程中最重要的概念就是连接取向(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网络编程——连接和面向连接的协议之间没有区别的更多相关文章
- Linux网络编程之聊天程序(TCP协议之select)
服务器端:server.c #include <stdio.h> #include <stdlib.h> #include <errno.h> #include & ...
- linux网络编程中阻塞和非阻塞socket的区别
读操作 对于阻塞的socket,当socket的接收缓冲区中没有数据时,read调用会一直阻塞住,直到有数据到来才返 回.当socket缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数.当 ...
- linux网络编程_1
本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 【转】Linux网络编程入门
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 《转》Linux网络编程入门
原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...
- linux 网络编程
linux网络编程中主要分为服务器和客户端两部分,而网络编程中又分为TCP和UDP两种.TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. ...
- linux网络编程基础--(转自网络)
转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接 ...
随机推荐
- android-adb通用
- java单元测试(Junit)
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),供Java开发人员编写单元测试之用. 对不同性质的被 ...
- 采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址
采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址. Truelicense 它是一个开源java license ...
- 怎样配置git ssh连接,怎样在GitHub上加入协作开发人员,怎样配置gitignore和怎样在GitHub上删除资源库.
**********1.在运行git push origin master指令时报例如以下错误: iluckysi@ILUCKYSI-PC /d/ilucky/message/code (master ...
- HDU 1711 Number Sequence(算法验证)
该怎么做.每一个人的人生都应该自己掌握.你给不了别人一切.你也不懂别人的忧伤. 微笑不代表快乐.哭泣不一定悲伤 不努力怎么让关心你的人幸福.不努力怎么让看不起你的人绝望. 我用生命在奋斗--lx_Zz ...
- html/css获得第一章
1.基本教程来学习 大概3天课余时间阅读下面的两个教程. HTML文字教程 CSS文字教程 2.练习 看完教程后.做第一练习时,总结例如以下: 1)div居中 须要设置属性:margin-left:a ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...
- 无法使用SQL login去登陆SQL Server - 'Password did not match'
原文:无法使用SQL login去登陆SQL Server - 'Password did not match' 出自:http://blogs.msdn.com/b/apgcdsd/archive/ ...
- java内存分析总结
1.自带的jconsole工具. (1)假设是从命令行启动,使 JDK 在 PATH 上,执行 jconsole 就可以. (2)假设从 GUI shell 启动,找到 JDK 安装路径,打开 bin ...
- Android应用UI架构
这个标题听起来可能有点大.事实上这里主要就是讨论一个应用程序的UI组件,是全用Activity还是全用Fragment.或者是二者皆有.以及使用Activity和Fragment的一些注意事项. A ...