1.系统调用
大多数操作系统使用系统调用(system call)的机制在应用程序和操作系统之间传递控制权。对程序员来说,每一个系统调用和一般程序设计中的函数调用非常相似,只是系统调用是将控制权传递给了操作系统。如下图所示(看了这个图,清晰多了,感谢谢希仁同志):
2.应用编程接口 API (Application Programming Interface)
如上图所示,当某个应用进程启动系统调用时,控制权就从应用进程传递给了系统调用接口。此接口再将控制权传递给计算机的操作系统。操作系统将此调用转给某个内部过程,并执行所请求的操作。内部过程一旦执行完毕,控制权就又通过系统调用接口返回给应用进程。
由上可知,系统调用接口实际上就是应用进程的控制权和操作系统的控制权进行转换的一个接口,即应用编程接口 API。(似乎,和平时api的概念不一样) 。
3.套接字的种类
我想套接字(Socket)就是由操作系统提供的一组有关TCP/IP的API,自然由于操作系统不同Socket也会有所差异。至少有如下几种:
Berkeley UNIX 操作系统定义了一种 API,它又称为套接字接口(socket interface)。(很贝哥哥啊,和黄帝大人的名字一个球样)
微软公司在其操作系统中采用了套接字接口 API,形成了一个稍有不同的 API,并称之为Windows Socket。
AT&T 为其 UNIX 系统 V 定义了一种 API,简写为 TLI (Transport Layer Interface)。
4.套接字(Socket)的作用
如下图所示,应用进程通过套接字接入到网络,那些抓包工具难道是自己实现的和Socket相似的功能吗[quest-?]?
4.1 套接字(Socket)工作原理
(1) 当应用进程需要使用网络进行通信时就发出系统调用,请求操作系统为其创建“套接字”,以便把网络通信所需要的系统资源分配给该应用进程。
(2) 操作系统为这些资源的总和用一个叫做套接字描述符的号码来表示,并把此号码返回给应用进程。应用进程所进行的网络操作都必须使用这个号码。
(3) 通信完毕后,应用进程通过一个关闭套接字的系统调用通知操作系统回收与该“号码”相关的所有资源。
4.1.1 调用 socket 创建套接字
4.1.2 连接建立阶段
(1) 当套接字被创建后,它的端口号和 IP 地址都是空的(如上图中套接字的数据结构所示),因此应用进程要调用 bind(绑定)来指明套接字的本地地址。例如,在服务器端调用 bind 时就是把熟知端口号和本地IP地址填写到已创建的套接字中。这就叫做把本地地址绑定到套接字。
(2) 服务器在调用 bind 后,还必须调用 listen(收听)把套接字设置为被动方式,以便随时接受客户的服务请求。UDP服务器由于只提供无连接服务,不使用 listen 系统调用。
(3) 服务器紧接着就调用 accept(接受),以便把远地客户进程发来的连接请求提取出来。系统调用 accept 的一个变量就是要指明从哪一个套接字发起的连接。
如下图所示,Socket的调用顺序如下:
4.1.3 服务器并发工作的原理
有点忘了,好像是这样的,一般Web服务器都在80端口创建了个套接字一直监听,有了新请求,就创建新线程(进程)和套接字以供服务器和客户端使用。如下图所示:
转自: http://hi.baidu.com/haifengjava/blog/item/385b841863f5420e34fa4103.html
相关文章
- socket()模块和套接字对象的内建方法
- 应用层-套接字(Socket)和应用程序的关系
- 通过服务器中的套接字和C中的客户端应用程序发送和接收JSON
- 最简单的实现TCP通信,利用Socket和ServerSocket套接字
- socket()模块和套接字对象的内建方法
- 如何在不关闭套接字的情况下多次调用Socket Send和Receive?
- 最简单的实现TCP通信,利用Socket和ServerSocket套接字
- Spark streaming不同数据来源(socket套接字、hdfs目录)和存储位置(hdfs、本地)的java代码
- 如何在不关闭套接字的情况下多次调用Socket Send和Receive?