Socket通常称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通过套接字向网络发出请求或者应答网络请求。Socket即不是一个程序,也不是一个协议,其只是操作系统提供的通信层的一组抽象的API。

      由于Socket是开放的、透明的,一旦运行,任何操作Socket的语言都可以访问这个开放的服务。可以是Java、PHP、C、Python等任何提供SocketAPI的语言访问此服务。
提示Socket是一种服务,与其实现语言无关。基于这个性质,我们能实现不同服务之间、不同语言之间的互联互通。
 
 
进程通信相关概念
      进程难的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互相不替干扰双协调一致工作,操作系统为进程通信提供了相应设施,如UNIX BSD中的管道(pipe)、命名管道(named pipe)和软件中断信号(signal),以及UNIX System V的消息(message)、共享存储区(shared memory)和信号量(semaphore)等,但这些都仅限于用在本机进程之间的通信。网间进程通信要解决的是不同主机进程间的相互通信问题(可把同机通信看作是其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用唯一进程号(Process ID)标识。
      网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋予某进程号5,在B机中也可以存在5号进程,因此,“5号进程”就没有意义了。
     操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。
     为了解决上述问题,TCP/IP协议引入了下列概念。
 
1.端口
网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。
按照OSI七层协议的描述,传输层与网络层在功能上的最大区别就是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口(Protocal Port,简称端口)的概念,用于标识通信的进程。
 
      端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序(即进程)通过系统调用与某调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出。在TCP/IP协议的实现中,操作商品类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问。
      类似于文件描述符,每个端口都有一个端口号,都是整形标识符,用于区别不同端口。由于TCP/IP传输层的TCP协议和UDP协议是完全独立两个软件模块,因此各自的端口号也相互独立,如TCP有一个255端口,UDP也有一个255端口,二者并不冲突。TCP与UDP段结构中端口的地址都是16比特,有0~65535个端口号。
      对于这65535个端口号有以下使用规定:
      端口号小于256的定义为常用端口,服务器一般都是通过常用端口号识别。任何TCP/IP实现所提供的服务都用1~1023之间的端口号,这是由IANA管理的。
      客户端中需保证该端口号在本机上是唯一的。客户端口号因存在时间很短暂,又称为临时端口号。
      大多数TCP/IP实现给临时商品号分配1024~5000之间的端口号。大于5000的端口号为其他服务器预留的。
      常见的端口有FTP的21号端口,HTTP服务的80号端口,SMTP的25端口等。
 
2.地址
网络地址中通信的两个进程分别处在不同的机器上。遵循以下原则:
某台主机可与多个网络相连,必须指定一个特定网络地址。
网络上每台主机都应有其唯一的地址。
每台主机的每个进程应有在该主机的唯一标识符。
通常主机地址由网络ID和主机ID组成,在TCP/IP协议中用32位整数值表示;TCP和UDP均使用16位端口号标识用户进程。
 
3.连接
两个进程间的通信链路称为连接。连接表现为一些缓冲区和一组协议机制。
 
 
 
Socket函数原型
      Socket就是一种通信机制,类似于银行、电信这些部分的电话客服部门。打电话时,对方会分配一个坐席(客服)代表回答你的问题,客服部分就相当于Socket的服务器端,你就相当于客户端。通话结束前,如果有人想找到和通话的坐席代表是不可能的,因为你们正在通信,客服部门的电话交换机也不会重复分配。
Socket函数的原型定义如下:

SOCKET socket(int af, int type, int protocl);
该函数共有三个参数:
af : 指定应用程序使用的通信协议的协议族,对于TCP/IP协议族该参数置AF_INET,对于UNIX可建立本地Socket。
type:指定创建的Socket类型。有三种可选项。
流套接字类型(SOCK_STREAM):最常见的类型,基于TCP协议。
数据报套接字类型(SOCK_DGRAM):即UDP数据报。
原始套接字类型(SOCK_RAW):在IP层对套接字进行编程,实际上就是在IP层构造自己的IP包,然后再把这个IP包发送出去。
protocal:指定应用程序所使用的通信协议。最常用的是TCP协议与UDP协议。
同样,可以把TCP/UDP传输过来的包抓取过来并进行分析。流套接字不能完成的任务,可以在原始套接字中得以实现。所有语言提供的Socket API都是按照这个原型设计的。
提示 Socket从传输模式上又分为端对端和点对点的连接,流套接字和数据报套接字都属于端对端的连接,因此需要绑定端口号。原原始套接字是基于IP协议的,属于点对点传输模式,是没有端口这个概念的。比如常用的监测网络命令ping命令,就是基于ICMP协议的,它不存在端口概念。

Socket进程通信机制及应用的更多相关文章

  1. Socket进程通信机制

    1.Socket通常称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄. 2.应用程序通过套接字向网络发出请求或者应答网络请求. 3.Socket既不是一个程序,也不是一种协议,其只是操作系统 ...

  2. 图文详解 Android Binder跨进程通信机制 原理

    图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...

  3. Android 进程通信机制之 AIDL

    什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言.听起来很深奥,其实它的本质就是生成进程间通信接口的辅助工具.它的存在 ...

  4. Qt 的内部进程通信机制

    Qt 的内部进程通信机制 续欣 (xxin76@hotmail.com), 博士.大学讲师 2004 年 4 月 01 日 Qt 作为一种跨平台的基于 C++ 的 GUI 系统,能够提供给用户构造图形 ...

  5. http,socket,进程通信,网络通信(1)

    众所周知,网络通信本质上就是进程间通信,进程间通信有以下常见的通信方式: 1,管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常指父子进 ...

  6. Storm进程通信机制

    storm的worker进程之间消息传递机制图: 每个worker都有一个独立的监听进程,监听配置文件中配置过的端口列表supervisor.slots.ports,topology.receiver ...

  7. AIDL/IPC Android AIDL/IPC 进程通信机制——超具体解说及使用方法案例剖析(播放器)

    首先引申下AIDL.什么是AIDL呢?IPC? ------ Designing a Remote Interface Using AIDL 通常情况下,我们在同一进程内会使用Binder.Broad ...

  8. Socket的通信机制?

    套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议 ...

  9. IPC进程通信机制

    select.poll.epoll之间的区别总结[整理] 进程间通信---共享内存 信号量和互斥锁的区别 http://www.2cto.com/os/201510/445553.html http: ...

随机推荐

  1. Parsing error was found in mapping #{}. Check syntax #{property|(expression), var1=value1, var2=val错误

    xml中有一个语法错误,整个都错了, 虽然只调用了select查询的方法,但是update中也有语法错误

  2. Wpf窗口中打开WinForm窗口

    获取wpf窗口对应的句柄窗口 using System; using System.Windows; using System.Windows.Interop; using IWin32Window ...

  3. Mybatis第二天

    Mybatis第二天   框架课程 1. 课程计划 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If标签 b) Where标签 c) Sql片段 d) Fore ...

  4. 1003 Emergency Dijkstra

    这题做的心很累,我用的还是 1018的思路做的,但是 使用dfs 求最大人数对于某些有问题(现在也不知道错哪了), 看了别人的代码后才发现,其实完全不用这么麻烦,只需设置一个点的权重,一遍DJ(自创简 ...

  5. Solaris:你好奇的十件事

    想想你周围的人,看看他们正在使用的操作系统.绝大部分人的电脑都在用主流操作系统:Windows,MacOS,甚至是Ubuntu.当说到Solaris,Unix和BSD的时候,其他人还以为你说鸟语呢.除 ...

  6. mysql无密码登陆

    mysql登陆不上或者密码忘记可以尝试一下无密码登陆 以下一波神操作!! 首先关闭数据库服务(数据库在Centos7版本以上或者Redhat版本上被改名为mariadb) systemctl stop ...

  7. [转]Java工程师技术栈--成神之路

    一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133http://if ...

  8. Chrome 的 PNaCl 还活着么?

    WebAssembly Migration Guide Given the momentum of cross-browser WebAssembly support, we plan to focu ...

  9. Excel列A、B、C、D----与列序号的转换

    public static class ExcelConvert { public static int ToExcelIndex(this string columnName) { if (!Reg ...

  10. prime distance on a tree(点分治+fft)

    最裸的点分治+fft,调了好久,太菜了.... #include<iostream> #include<cstring> #include<cstdio> #inc ...