Unix网络编程 之 socket简介

概述

Socket的英文原意是“孔”或“插座”,现在,作为Unix的进程通信机制,常常取“插座”这一意义。日常生活中常见的插座,有的是信号插座,有的是电源插座,有的可以接收信号或能量,有的可以发送信号或能量。举例来说,电话线与电话机之间需要一个插座(相当于两者之间的接口,这一部分装置物理上是存在的)。对于网络编程,socket就相当于电话线与电话机之间的插座。

将电话系统与面向连接的Socket机制相比,两者之间有着惊人的相似的地方。以一个国家的电话网为例。电话的通信双方相当于互相通信的两个进程;通话双方所在的地区(享有一个全局唯一的区号)相当于一个网络,区号即是其网络地址;区内的一个单位的交换机相当于一台主机,交换机分配给每个用户的局内号码就相当于主机运行中分配给进程的socket号。

任何用户在通话之前,首先应该有一部电话机,相当于申请一个socket号;同时,还必须直到对方的电话号码,此电话号码对应于对方的电话机,该电话机也必须申请一个socket号。申请socket号的过程就是将电话线插入电话机的通信串口的过程。然后,用户拨号呼叫对方,此时相当于发出连接请求(如果对方不在本地区,在对方电话号码前还应该附加上对方所在地区的区号,此区号相当于给出网络地址)。如果对方在电话机处并且空闲(相当于通信的目的主机开机且可以接受连接请求),拿起电话话筒,双方就可以正是通话,即连接成功。双方通话的过程,是电话机通过接口发送信号和从接口接收信号的过程,相当于向socket发送数据和从socket接收数据。当通话结束后,一方挂机,相当于接口阻塞,socket关闭,从而撤销连接。

在电话系统中,一般用户只能感受到本地电话机和对方电话号码的存在,建立通话的过程、话音传输的过程以及整个电话系统的技术细节对用户而言是封装的,不透明的,用户与用户之间的电话仅通过通信协议和电话号码实现。这一机制与socket机制非常相似。socket利用网络通信设施实现进程间通信,但它对于通信设施的具体细节并不关心,只要底层通信设施能够提供足够的通信能力,socket便能够进行基本的网络通信功能。

至此,我们队socket进行了直观的描述。抽象出来,socket实质上提供了进程间通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没法建立联系并相互通信的。正如电话系统一样,双方的通话是建立在通话双方均各自拥有一台电话机一样。

每一个socket都用一个半相关描述:

socket(通信协议,本地地址,本地端口);

一个完整的socket则用一个相关描述:

socket(通信协议,本地地址,本地端口,远程地址,远程端口);

每一个socket都有一个本地唯一的socket号,该socket号由操作系统进行分配和管理。

最重要的是,socket是面向客户端/服务器模型而设计的,针对客户端和服务器程序提供不同的socket系统调用。客户端随机申请一个socket号(相当于一个想打电话的人可以在任何一部入网的电话机上拨号呼叫);服务器拥有公认的socket,任何客户都可以向它发出连接请求和信心传输请求(相当于一个被叫电话拥有一个呼叫方知道的电话号码)。

Socket利用客户端/服务器模型巧妙地解决了进程之间建立通信连接的问题。服务器socket为众所周知且非常重要的。无论如何,通信双方至少有一方知道对方的socket信息(主要指网络地址和端口号)。

套接字的类型及对应流程

传输层协议主要分为TCP协议和UDP协议。由TCP向应用程序提供的服务不同于UDP提供的服务。

首先,TCP提供客户端和服务器之间的连接(connection)。TCP客户端先与某个给定服务器建立一个连接,再跨该连接与服务器交换数据,然后终止该连接。

其次,TCP提供可靠性(reliability)。当TCP向另一端发送数据时,它要求对端返回确认信息,如果没有收到确认,TCP就自动重传数据并等待更长时间。在数次重传失败后,TCP才放弃。

再则,TCP提供流量控制(flow control)

最后,TCP连接是全双工的,这意味着一个给定的连接上应用可以在任何时刻在进出两个方向上发送和接收数据。

套接字有三种类型:流式套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)和原始套接字。

       1、SOCK_STREAM(TCP适用)

流式套接字(SOCK_STREAM)提供可靠的、面向连接的通信。其使用了TCP协议。

其建立连接与传输的过程如下图:

       2、SOCK_DGRAM(UDP适用)

数据报套接字(SOCK_DGRAM)定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠性。

数据报套接字为什么“无连接”和“不可靠”?

*发送的数据报可能不会到达指定目的主机;

*数据报可能会以不同顺序到达;

*到达目的主机的数据报可能存在错误。

数据报套接字使用UDP协议。

其数据传输流程如下图:

       3、原始套接字

原始套接字主要用于一些协议的开发,可以进行比较底层的操作。它功能强大,但是没有上面介绍的两种套接字使用方便,一般的程序也涉及不到原始套接字。

套接字描述符

1、什么是套接字?

套接字是通过标准的unix文件描述符与其它的程序进行通信的一种方法(其它的进程间通信方法包括管道等)。

2、Socket描述符

在Unix系统中,任何对I/O的操作,都是通过读或写一个文件描述符来实现的。一个文件描述符只是一个简单的整形数值,代表一个被打开的文件(这里的文件是广义上的文件,并不只是代表磁盘文件,而且代表一个网络连接,一个先进先出的队列,一个终端显示屏幕以及其它的一切)。在Unix系统中,任何东西都是文件。

因此,在这里,我们应该建立这样一种概念,那就是socket是文件,socket描述符是文件描述符。

Unix网络编程 之 socket简介

时间: 2024-11-10 01:08:05

Unix网络编程 之 socket简介的相关文章

Unix网络编程 之 socket基础

基本结构 (这部分的地址均为网络地址<网络字节序>) 1.struct sockaddr:通用套接字地址结构 此结构用于存储通用套接字地址. 数据结构定义: typedef unsigned short sa_family_t; struct sockaddr { sa_family_t sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */ };    sa_fa

UNIX网络编程:socket套接字(TCP与UDP)

套接字简介: 套接字是网络编程中的一种通信机制,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行,Linux所提供的功能(如打印服务,ftp等)通常都是通过套接字来进行通信的,套接字的创建和使用与管道是有区别的,

【Unix网络编程】chapter1简介

1.1 概述 1.2一个简单的时间获取客户程序 网际套接字地址结构中IP地址和端口号这两个成员必须使用特定的格式,为此我们调用库函数htons("主机到网络端整数")去转换二进制端口号,又调用库函数inet_pton("呈现形式到数值")去把ASCII命令行参数转换为合适的格式. 1.3协议无关性 1.4 错误处理:包裹函数 1.5 一个简单的时间获取服务器程序 1:创建TCP套接字 2:吧服务器的众所周知端口捆绑到套接字 3:把套接字转换成监听套接字 4:接受客户

UNIX网络编程笔记(2)—套接字编程简介

套接字编程概述 说到网络编程一定都离不开套接字,以前用起来的时候大多靠记下来它的用法,这一次希望能理解一些更底层的东西,当然这些都是网络编程的基础- (1)套接字地址结构 大多说套接字函数都需要一个指向套接字地址结构的指针作为参数,每个协议族都定义它自己的套接字地址结构,这些结构都以sockadd_开头. IPV4套接字地址结构 IPv4套接字地址结构通常称为"网际套接字地址结构",以sockaddr_in命名,并定义在 /* Internet address. */ typedef

Unix网络编程--卷一:套接字联网API 读书笔记

UNIX网络编程--卷一:套接字联网API 本书面对的读者是那些希望自己编写的程序能够使用成为套接字(socket)的API进行彼此通信的人. 目录: 1.简介 2.传输层:TCP.UDP和SCTP 3.套接字编程简介 4.基本TCP套接字编程 5.TCP客户/服务器程序例子 6.I/O复用:select和poll函数 7.套接字选项 8.基本UDP套接字编程 9.基本SCTP套接字编程 10.SCTP客户/服务器程序例子 11.名字与地址转换 12.IPV4与IPV6互操作性 13.守护进程和

unix网络编程之基本套接口编程

第一章  套接口编程简介 IPv4套接口地址:"网际套接口地址结构" 通用套接口地址结构: 套接口函数被定义为采用指向通用套接口地址结构的指针,这要求对这些函数的任何调用都必须将指向特定于协议的套接口地址结构的指针类型转换成指向通用套接口地址结构的指针: 套接口地址结构的比较: 值-结果参数: 当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针. 1, 从进程到内核传递套接口地址结构有3个函数:bind.connect.sendto,这3个函数的一

UNIX网络编程笔记(1)—传输层协议

开始学习网络编程的经典<UNIX网络编程>(第3版)作为研究生阶段的副本练习吧,厚厚一本书,希望能坚持看下去,坚持做些笔记. 1.TCP/IP协议概述 IPv4 网际协议版本4(Internet Protocol version 4),32位地址,为TCP.UDP.SCTP.ICMP和IGMP提供分组递送服务. IPv6 网际协议版本6(Internet Protocol version 6).128位地址,为TCP.UDP.SCTP和ICMPv6提供分组递送服务. TCP 传输控制协议(Tr

UNIX网络编程入门——TCP客户/服务器程序详解

前言 最近刚开始看APUE和UNP来学习socket套接字编程,因为网络这方面我还没接触过,要等到下学期才上计算机网络这门课,所以我就找了本教材啃了一两天,也算是入了个门. 至于APUE和UNP这两本书,书是好书,网上也说这书是给进入unix网络编程领域初学者的圣经,这个不可置否,但这个初学者,我认为指的是接受过完整计算机本科教育的研究生初学者,需要具有完整计算机系统,体系结构,网络基础知识.基础没打好就上来啃书反而会适得其反,不过对于我来说也没什么关系,因为基础课也都上得差不多了,而且如果书读

UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 下面我会介绍同一个使用 TCP 协议的客户端程序的几个不同版本,分别是停等版本.select 加阻塞式 I/O 版本. 非阻塞式 I/O 版本.fork 版本.线程化版本.它们都由同一个 main 函数调用来实现同一个功能,即回射程序客户端. 它从标准输入读入一行文本,写到服务器上,读取服务器对该行的回射,并把回射行写到标准输出上. 其中,非阻塞式 I/O 版本是所有版本中执行速度最快的,