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数作为一座公寓楼的大堂在个人邮箱。

时间: 2024-08-05 09:10:21

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

Linux网络编程——无连接和面向连接协议的区别

网络编程中最基本的概念就是面向连接(connection-oriented)和无连接(connectionless)协议.尽管本质上来说,两者之间的区别并不难理解,但对那些刚刚开始进行网络编程的人来说,却是个很容易混淆的问题.这个问题与上下文有些关联:很显然,如果两台计算机要进行通信,就必须以某种形式"连接"起来,那"无连接通信"又是什么意思呢? 答案是:面向连接和无连接指的都是协议.也就是说,这些术语指的并不是物理介质本身,而是用来说明如何在物理介质上传输数据的.

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

服务器端:server.c #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #include <unistd.h&

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

因特网使用的IP协议是无连接的,因此其传输是不可靠的.这样容易使人们感到因特网很不可靠,那为什么当初不直接把它设计为可靠的? 先打一个比方.邮局寄送的平信很像无连接的IP数据报.每封平信可能走不同的传送路径,同时平信也不保证不丢失.当我们发现收信人没有收到寄出的平信时,去找邮局索赔是没有用的.邮局会说:"平信不保证不丢失.怕丢失就请你寄挂号信".但是大家并不会将所有的信件都用挂号方式邮寄,这是因为邮局从来不会随意地将平信丢弃,而丢失平信的概率并不大,况且寄挂号信要多花些钱,还要去邮局排

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

很全的linux网络编程技巧

注:作者王晓,本人认为总结得很好,故记之,绝无侵权之意. 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考模型及TCP/IP参考模型 1 1.3. TCP协议 3 1.4. UDP协议 5 1.5. 协议的选择 6 2. 网络相关概念 6 2.1. socket概念 7 2.2. socket类型 8 2.3. socket信息数据结构 8 2.4. 数据存储优先顺序的转换 8 2.5. 地址格式转化 9 2.6. 名字地址转化 10 3. sock

Linux网络编程

第二章 Linux网络编程 2.1客户——服务器模型 目前大多数网络应用程序在编写时都采用客户—服务器模型,假设一端是客户,另一端是服务器,让服务器提供给客户一定的服务内容.它要求有一方(服务器方)在启动执行程序后(无限期地)等待其他客户端程序与之通信.这里可以再分为两种具体类型:并发型交互与重复型交互. (1)并发型交互.在并发型交互模式下,程序的主要运作步骤如下: ·等待一个客户请求的到来: ·生成一个新的进程或者任务来处理这个客户请求,同时这里还可以接收其他客户的请求,处理结束后,终止这个

Linux网络编程(一)

1.socket     int socket(int domain, int type,int protocol) domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等). AF_UNIX只能够用于单一的Unix系统进程间通信,而AF_INET是针对Internet的,因而可以允许在远程 主机之间通信(当我们 man socket时发现 domain可选项是 PF_*而不是AF_*,因为glibc是posix的实现 所以用PF代替了AF,不过我们都可以使用的

Linux网络编程入门 (转载)

http://www.cnblogs.com/RascallySnake/archive/2012/01/04/2312564.html (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端        在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一        个地方获取文件

Linux网络编程:客户端/服务器的简单实现

一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个Socket都一个半相关描述: {协议, 本地地址, 本地端口} 完整的Socket的描述: {协议, 本地地址, 本地端口, 远程地址, 远程端口} 2. Socket工作流程 面向连接(TCP)的Socket工作流程 UDP的socket工作流程 l 服务器端 首先,服务器应用程序用系统调用so