Socket编程:基础部分

来源:互联网 发布:mac win10 iso 下载 编辑:程序博客网 时间:2024/05/17 01:40

       这一年多来的学习以及实习经历,特别多的涉及到进程间通信,而且特么的与Socket套接字相关。谈到对它的理解?好吧,只能说基本处在会用的水平。至于更深层次的挖掘工作,之前是一直忽略的。不过,手头全套Stevens的书,基本该翻的也都翻过了。所以反正现在也是闲着,对Socket的复习自然不在话下咧。


概述

 

      所谓的进程间通信(IPC),就是不同的进程之间的数据与信息交换。我们知道,进程之间是相互独立的,均有各自的进程空间。所以,它们之间的数据与信息交换就需要借助一定的方式。在Linux系统中,我们熟知的IPC方式有管道、系统IPC(包括消息队列、信号量以及共享内存)以及套接字Socket。但是,除了Socket方式以外,其他方式基本仅限于单机系统内的进程间通信,而一旦牵涉到网络间的进程通信,也就是不同主机间进程的通信问题,就只能呵呵了。这里主要需要解决的问题:

       其一,单机系统内独立进程可单独通过进程号识别,但不同主机间的进程却不行;

       其二,各主机的操作系统可能不同,支持的网络协议也不尽一致,即存在多重协议的识别问题;


Socket概念


端口:

       端口类似于文件描述符,每个端口拥有一个端口号,用于区别不同端口。端口的作用就是用来标识通信间的进程。进程通过系统调用(bind)与端口绑定,之后绑定进程的所有数据都从该端口接收或者发送。

       端口的分配方式有两种:一种是全局分配,一般用于标识服务器,比如一个标准服务器都会拥有一个全局知名端口,即使在不同的机器上,其端口号也相同;另一种是本地分配,多用于客户端,当客户端需要传输服务时,会向本地操作系统提出申请,操作系统则返回一个本地唯一的端口号。另外,TCP/UDP规定端口号小于256的作为保留端口。


套接字对:

       一个套接字对是一个定义Socket连接的两个端点的四元组:本地IP,本地端口,远程IP,远程端口。套接字对唯一标识一个网络中的连接。这样标识每个端点的两个值(IP与端口号)即称为一个套接字Socket。


网络字节序:

       不同计算机存放字节的顺序是不同的,在低地址存放高位字节的称为大端字节序,相反,低地址存放低位字节的称为小端字节序。而TCP/IP网络中的字节序是大端字节序。所以,为保证接收数据的正确性,必须保证计算机与网络中数据存储的字节序一致。


面向连接与无连接:

       面向连接就是每一次完整的数据传输都需要经过连接建立、使用、关闭过程,每个连接相当于一个管道,收发的数据顺序一致,内容相同;无连接则相反,不保证发送顺序,不保证传输的可靠性。TCP是面向连接的,UDP是无连接的。


缓存与带外数据:

       为了保证数据传输的正确性或者传输过程能够控制传输速率,都会进行缓存;而在传输过程中,如果希望能够不通过常规传输方式使用户进程处理某一类信息,例如linux中的Ctrl-C中断等信息,称为带外数据。


C/S模式:

       在TCP/IP网络中,通信的两个进程一般采用的模式就是C/S模式,即客户端想服务器发出请求,服务器响应请求,提供服务。之所以主要采用这种模式,是基于两点:

       1) 网络中软硬件资源、运算能力和信息不均等,需要共享,所以将拥有多资源的主机用以提供服务,资源较少的请求服务;

       2) 网络间通信属于异步通信,相互通信的进程不属于父子关系,且不拥有共享缓冲区,因此需要一种机制为二者的数据交换提供同步;


套接字类型:

       TCP/IP提供三种套接字类型,分别是流式套接字,数据报套接字,原始套接字。流式套接字提供可靠的面向连接服务,数据无差错、无重复,且按顺序发送,内设流量控制,避免数据流超限;数据报套接字提供了无连接服务,数据包以独立包形式发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱;原始套接字一般用于较底层接口(我没用过)。


Socket编程


       Socket中具体的每一个函数我就不详细笔记了,Socket编程的流程基本是固定的,以下简图就ok了。

       如下:


      



原创粉丝点击