【1】Socket的功能

(1)Socket的英文原意就是“孔”或“插座”,现在,作为BSD UNIX的进程通讯机制,取其后一种意义。日常生活中常见的插座,有的是信号插座,有的是电源插座,有的可以接受信号(或能量),有的可以发送信号(或能量)。假如电话线与电话机之间安放一个插座(相当于二者之间的接口,这一部分装置物理上是存在的)则Socket非常相似于电话插座。

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

(3)任何用户在通话之前,首先要占有一部电话机,相当于申请一个Socket号;同时要知道对方的电话号码,相当于对方有一个 Socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是向电话机发出信号和从电话机接受信号的过程,相当于向Socket发送数据和从Socket接受数据。通话结束后,一方挂起电话机,相当于关闭Socket,撤消连接。

(4)在电话系统中,一般用户只能感受到本地电话机和对方电话号码的存在,建立通话的过程、话音传输的过程以及整个电话系统的技术细节对它都是透明的,这也与Socket机制非常相似。Socket利用网间网通信设施实现进程通信,但它对通信设施的细节毫不关心,只要通信设施能提供足够的通信能力,它就满足了。至此,我们对Socket进行了直观的描述。抽象出来,Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。

每一个Socket都用一个半相关描述:{协议,本地地址,本地端口}
一个完整的Socket则用一个相关描述:{协议,本地地址,本地端口,远程地址,远程端口}
每一个Socket有一个本地的唯一Socket号,由操作系统分配。

(5)最重要的是,Socket是面向客户-服务器模型而设计的,针对客户和服务器程序提供不同的Socket系统调用。客户随机申请一个 Socket号(相当于一个想打电话的人可以在任何一台入网的电话上拨叫呼叫);服务器拥有全局公认的Socket,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码) 。Socket 利用客户-服务器模式巧妙的解决了进程之间建立通信连接的问题。服务器Socket为全局所公认非常重要。两个完全随机的用户进程之间,因为没有任何一方的Socket是固定的,就像打电话却不知道别人的电话号码,要通话是不可能的。

【2】套接字的三种类型

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

1.流式套接字(SOCK_STREAM)

流式的套接字可以提供可靠的、面向连接的通讯流。如果你通过流式套接字发送了顺序的数据:“1”“2”,
那么数据到达远程时候的顺序也是“1”“2”。 流式套接字可以做什么呢?你听说过Telnet应用程序吗?听过
?哦,最常用的BBS服务,以及系统的远程登陆都是通过Telnet协议连接的。Telnet就是一个流式连接。你
是否希望你在Telnet应用程序上输入的字符(或汉字)在到达远程应用程序的时候是以你输入的顺序到达
的?答案应该是肯定的吧。还有WWW浏览器,它使用的HTTP协议也是通过流式套接字来获取网页的。
事实上,如果你Telnet到一个Web Site的80端口上,然后输入“GET网页路径名”然后按两下回车(或者是两
下 Ctrl+回车)然后你就得到了“网页路径名”所代表的网页!流式套接字是怎样保证这种应用层次上的数据传输质量呢?它使用了TCP(The Transmission Control P
rotocol)协议(可以参考RFC-793来得到TCP的细节)。TCP保证了你的数据传输是正确的,并且是顺序的
。TCP是经常出现的TCP/IP中的前半部分。IP代表Internet Protocol(因特网协议,参考RFC-791)IP只处
理网络路由。

2.数据报套接字(SOCK_DGRAM)

数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,
无差错。原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。数
据报套接字(Datagram Sockets)怎样呢?为什么它叫做“无连接”?应该怎样处理它们呢?为什么它们是不
可靠的?好的,这里有一些事实:
(1)如果你发送了一个数据报,它可能不会到达。
(2)它可能会以不同的顺序到达。
(3)如果它到达了,它包含的数据中可能存在错误。
数据报套接字也使用IP,但是它不使用TCP,它使用使用者数据报协议UDP(User Datagram Protocol可
以参考RFC 768)为什么说它们是“无连接”的呢?因为它(UDP)不像流式套接字那样维护一个打开的连
接,你只需要把数据打成一个包,把远程的IP贴上去,然后把这个包发送出去。这个过程是不需要建立连
接的。UDP的应用例子有:tftp, bootp等。
那么,数据包既然会丢失,怎样能保证程序能够正常工作呢?事实上,每个使用UDP的程序都要有自己的
对数据进行确认的协议。比如,TFTP协议定义了对于每一个发送出去的数据包,远程在接受到之后都
要回送一个数据包告诉本地程序:“我已经拿到了!(一个“ACK”包)。如果数据包发的送者在5秒内没有
的得到回应,它就会重新发送这个数据包直到数据包接受者回送了“ACK”信号。这些知识对编写一个
使用UDP协议的程序员来说是非常必要的。
无连接服务器一般都是面向事务处理的,一个请求一个应答就完成了客户程序与服务程序之间的相互
作用。面向连接服务器处理的请求往往比较复杂,不是一来一去的请求应答所能解决的,而且往往是并
发服务器。套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接字后就可调用connect()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接字。

3.原始套接字

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

Socket通信流程和套接字作用相关推荐

  1. 糖儿飞教你学C++ Socket网络编程——5.套接字编程步骤与函数

    TCP是一个面向连接的传输层协议,提供高可靠性的字节流传输服务,主要用于一次传输要交换大量报文的情形.为了维护传输的可靠性,TCP增加了许多开销:例如确认.流量控制.计时器以及连接管理等.TCP协议的 ...

  2. socket是什么?套接字是什么?

    网络编程就是编写程序使两台联网的计算机相互交换数据. 那么,这两台计算机之间用什么传输数据呢?首先你肯定先需要物理连接嘛. 在此基础上,只需要考虑如何编写数据传输程序.看似很麻烦,但实际上这点不用愁, ...

  3. 传奇世界服务器端口被占用,Windows socket error: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048), on API 'bi...

    Windows socket error: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次. (10048), on API 'bind' 你们的系统80%都是XP的,这个就是XP系统的不适 ...

  4. Linux环境SOCKET编程1:套接字

    一.socket运行过程 服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket,然 ...

  5. 关于.NET中socket中的异步套接字的研究二

    三 异步套接字 虽然还有许多别的方法解决同步套接字中的问题的方法,但是综合比较来看,异步套接字无疑是大多数情况下最好的解决办法,这个问题稍后讨论. 1 原理 首先来说一下异步的原理(根据自己的理解写的 ...

  6. c语言socket鉴权,建立套接字后进行socket.io身份验证

    小编典典 这实际上并不难,但是您正以错误的方式进行处理.几件事: 您不能使用socket.io 设置 cookie:但是,您可以随时获取任何已连接客户端的cookie值.为了设置cookie,您将必须 ...

  7. oracle socket读取超时,设置套接字操作超时

    使用Socket()构造函数和connect(SocketAddress endpoint, int timeout)方法代替. 在您的情况下,它将类似于: Socket socket = new S ...

  8. linux c 禁止对外通信,Linux C套接字:在recv调用时被阻止

    在我的应用程序中,我为简单的http服务器创建了一个线程,然后从我的应用程序中尝试连接到http服务器,但是在recv调用中控件被阻止/挂起. 但是,如果尝试使用linux GET命令连接到应用程序的 ...

  9. Socket编程实践(9) --套接字IO超时设置方法

    引:超时设置3种方案 1. alarm超时设置方法 //代码实现: 这种方式较少用 void sigHandlerForSigAlrm(int signo) {return ; }signal(SIG ...

最新文章

  1. 2015第22周六Java反射、泛型、容器简介
  2. Jerasure库接口简介及性能测试
  3. 服务器的硬盘功率,【群晖 DS916 NAS网络存储服务器使用体验】硬盘|系统|功耗_摘要频道_什么值得买...
  4. [svc]jdk+tomcat部署.jforum论坛部署
  5. 【Python学习】 - skimage包
  6. 关于RESTful一些注意事项,接口开发规范
  7. Spring的@Scheduled任务调度
  8. q learning简单理解_班级励志标语格言-生活其实很简单,过了今天就是明天
  9. SecureCRT学习之道:SecureCRT常用快捷键设置与字体设置方法
  10. 广发银行网上银行安全控件官方版
  11. 公式冒号是什么意思_冒号是什么意思
  12. 高并发中的 限流、熔断、降级、预热、背压你都知道是什么意思吗?
  13. 压缩包里面excel 导出 (跨行跨列)
  14. Kali忘记root密码强制更改办法
  15. vmware打开多台虚拟机之后导致主机蓝屏的解决方法
  16. android手机怎么装ios,如果你喜欢苹果手机用的却是安卓手机如何使安卓变iphone...
  17. EED电力设计端(电网规划)
  18. 系统设置——亮度调节
  19. <Java开发环境配置>6-SQLyog安装教程
  20. QFP PQFP LQFP TQFP封装形式及PCB详解!

热门文章

  1. 初入Java,安装jdk,ij编译,运行
  2. 禅道安装/禅道远程数据库连接
  3. Realtek WiFi concurrent 模式介绍
  4. 中国 IM 企业的新机会?揭秘融云全球通信云网络背后的技术 | 对话 WICC
  5. BeautifulSoup使用
  6. php inet_aton(),如何通过mysql 利用inet_aton和inet_ntoa来处理ip地址数据
  7. HTTPS 与 SSL
  8. Windows计划任务开机启动程序
  9. telnet 不是内部或外部命令,也不是可运行的程序解决方案
  10. ubuntu解决网络连接的优先级