分享
 
 
 

socket 基础知识

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

进程通信的概念最初来源于单机系统,由于每个进程都在各自的地址范围内运行,为了保证两个相互通信的进程之间既不互相干扰,又协调一致的工作,操作系统为进程通信提供了相应设施,如UNIX BSD中的管道(pipe),有名管道(named pipe)和软中断信号(singal),UNIX system V的消息(message)、共享存储区(shared memory)和信号量(semaphore)等,但都局限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的通信问题(可把同机进程通信看作其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可以用进程号(pid)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如主机A赋予某进程号5,在B主机也可以存在5号进程,因此5号进程这句话就没有意义了。其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。为了解决上述问题,TCP/IP协议引入了下列几个概念。

端口

网络中可以被命名和寻址的通信端口是操作系统可分配的一种资源。按照OSI七层协议的描述,传输层与网络层最大的区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅是主机地址了,还包括可以描述进程的某种标识。为此TCP/IP协议提出了协议端口的概念,用于标识通信的进程。

端口是一种抽象的软件结构,包括一些数据结构和I/O缓冲区。应用程序即进程通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都从该端口输出。在TCP/IP协议的实现中,端口操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问。

类似于文件描述符,每个端口都拥有一个叫端口号的整数描述符,以区别不同端口。由于TCP/IP传输层的两个协议TCP和UDP是两个完全独立的软件模块,因此各自的端口号也相互独立。如TCP有一个255号端口,UDP也可以有一个255号端口,两者并不冲突。

端口号的分配是一个重要问题,有两种基本分配方式:第一种叫全局分配这是一种集中分配方式,由一个公认的中央机构根据用户需要尽行统一分配,并将结果公布于众,第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回本地唯一的端口号,进程再通过合适的系统调用,将自己和该端口连接起来(绑定)。TCP/IP端口号的分配综合了两种方式。TCP/IP将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。因此,每一个标准服务器都拥有一个全局公认的端口叫周知口,即使在不同的机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP和UDP规定,小于256的端口才能

作为保留端口。

地址

网络通信中的两个进程分别在两个不同的机器上。在互连网络中,两台机器可以位于不同的网络,这些网络通过网际互连设备(网关,网桥,路由器)连接。因此需要三级寻址。

1。某一主机与多个网络相连,必须指定一特定网络地址;

2。网络上美一台主机应有其唯一的地址;

3。美一主机上的每一进程应有在该主机上的唯一标识。

主机地址就是IP啦,不必多说。进程唯一标识符是十六位整数端口号。网络字节顺序不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节,有的则相反。为保证数据的正确性,在网络协议中需指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高价先存格式,他们均含在协议的头文件中。

连接

两个进程间的通信链路称为连接。连接在内部表现为一些缓冲区和一组协议机制,在外部表现出比无连接高的可靠性。

半相关

综上所述,网络中用一个三元组可以在全局中唯一标是一个进程:

(协议,本机地址,本地端口号)

这样一个三元组,叫做一个半相关,他指定连接的每半部分。

全相关

一个完整的网间进程通信需要有两个进程组成,并且只能使用同一种高层协议。也就是说TCP和UDP没法通信。因此一个完整的网间进程通信需要一个五元组来标识:

(协议,本机地址,本地端口号,远地地址,远地端口号)

这样一个五元组叫做一个全相关。

客户机/服务器模式

在TCP/IP网络应用中,通信的两个进程相互作用的主要模式是客户机/服务器模式,即客户端向服务器发出请求,服务器接收到请求后提供相应的服务客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软、硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立一种联系,为二者的数据交换提供同步,这就是基于客户机/服务器模式的TCP/IP。

客户机/服务器模式在操作过程中采取的是主动请求方式:

首先服务器方要启动,并根据请求提供相应服务:

1。打开一通信通道并告知本地主机,它愿意在某一公认地址端口上(周知口,如http为80)接受客户请求。

2。等待客户请求到达该端口。

3。接收到重复服务请求,处理该请求并发送应答信号。接收并发服务请求,要激活一新进程来处理这个客户请求。新进程处理此客户请求,并不需要对其他请求做出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。

4。返回第二步,等待另外的客户请求

5。关闭服务器。

客户方:

1。打开一通信通道,并连接到服务器所在主机的特定端口。

2。向服务器发出服务请求报文,等待并接收应答;继续提出请求。

3。请求结束后关闭通信通道并终止。

从上面的描述过程可知:

1。客户与服务器进程的作用是非对称的。因此编码不同。

2。服务进程一般是先于客户请求启动的。只要系统运行,该进程一直存在,直到正常终止或者强迫终止。

套接字SOCKET和perl的socket编程

在UNIX世界中,网络应用编程界面有两类:BSD的套接字SOCKET和SYSTEM V的TLI.由于Sun公司采用了支持TCP/IP的BSD系统,TCP/IP的应用有了更大发展其网络应用编程界面Socket在网络编程中已成为标准。并且也早已经进入了MS的世界。

TCP/IP的Socket提供下列三种类型的套接字

1。流式套接字(SOCKET_STREAM)

提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。FTP协议即采用流式套接字。

2。数据报式套接字(SOCKET_DGRAM)

提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序无序。网络文件系统NFS使用数据报式套接字。

3。原始式套接字(SOCKET_RAW)

该接口允许对较低层次协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。

基本套接字调用

创建套接字--socket();

绑定本机端口--bind();

建立连接--connect(),accept();

侦听端口--listen();

数据传输--send(),recv();

输入/输出多路复用--select();

关闭套接字--closesocket();

不论何种语言,和socket打交道都是这一组调用只是在格式上有一点点差别。我只使用过c和perl,再加上这里又不让出现与perl无关的东西,那下面就主要讨论PERL的socket编程啦:

创建建套接字:

socket(SOC_VARIABLE,DOMAIN_FLAG,connectType,num) #相应的C语言调用为so

ckid=socket(af,type,protocol)

参数含义如下:

SOC_VARIABLE是用于建立套接的句柄,相当于c里面的sockid号;

DOMAIN_FLAG叫域标记,在C里相当于af--address family,地址族。地址族和域是一个概念,其实就是平常所说的域。UNIX支持的域类型有

AF-UNIX; UNIX内部地址

AF-INET; TCP/IP地址

AF-NS; Xerox NS地址

AF-APPLETALK; Apple的Appletalk地址

而dos/windows支持的域地址族只有AF-INET.所以大部分的socket编程都只用到它。

connectType(c里的type)就是前面所说的三种socket类型。

num相当于c里面的protocol那大家一看就明白了这是协议号,用来指定SOCKET请求所希望的协议,这个参数不一定起作用,当前两个参数可以确定协议时可以取值为零。

所以,一个完整的PERL的建立socket如下

socket(THESCK,AF-INET,SOCKET_STREAM,getprotocolbyname('tcp'));

#c语言: int sockid;

# sockid = socket(AF-INET,SOCKET_STREAM,0);

补充:

Socket建立连接的过程

Linuxaid.com.cn 01-09-12 14:34 100p luster

--------------------------------------------------------------------------------

Socket建立连接的过程

建立过程如下:(connection-oriented)

server 方过程 client 方过程

socket() socket()

| |

bind() bind()

| |

listen() |

| |

accept()<------------------connect()

| |

recv()/send() <----------> send()/recv()

如果socket被置为block式,则connect()一直等到连接建立或出错返回,否则立即返回.

出错时返回-1, 错误码在errno中.

如果读写一个没有建立连接的socket则 返回-1, errno为EBADF.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有