1  .  Layered Model of Networking

Socket  编程的层次模型如下图所示,

 

最上面是应用层,应用层下面的是  SOCKET API  层,再下面是传输层和网络层……  实际上,  Sockets API  层并不是一个真正定义的网络层次,但却很好的描述了  Socket  编程所处的位置和所扮演的角色。

TCP  状态转换图

2  .什么是  SOCKET  ?

简单的,  Socket  可以被定义描述为两个应用通信通道的端点。一个Socket  端点可以用  Socket  地址来描述,  Socket  地址结构由  IP  地址,端口和使用协议组成(  TCP or UDP  )。

3  .  Socket  地址结构

网络中以主机  IP  、端口以及使用的协议表明一个网络应用。UNIX Socket  将它们组成一个结构,统称为  SOCKET  地址结构。

3.1  IPv4  对应的  SOCKET  地址结构

通常也称为“网际  SOCKET  地址结构”,以“  socketaddr_in  ”命名,定义在头文件  <netinet/in.h>  中。

所涉及到的数据类型:

3.2  IPv6  对应的  SOCKET  地址结构

3.3    通用地址结构

当地址结构作为传递给任何一个  SOCKET  函数的参数时,任意一个Socket  函数必须能处理每一种地址结构,为了解决这个问题,提出了使用通用套接口地址结构。当任何一个地址结构要作为指针参数传到套接口函数时,必须要显示转化为通用地址结构。

在  IPv4  应用中,使用的通用地址结构为  struct sockaddr, 定义在<sys/socket.h>  中,

例如:

在  IPv6  中,提出了一种新的通用地址结构:  struct sockaddr_storage 定义在<netinet/in.h>中。

struct sockaddr  和  struct sockaddr_storage 的区别

<!--[if !supportLists]-->a.<!--[endif]-->struct sockaddr_storage能提供严格的结构对齐

<!--[if !supportLists]-->b.  <!--[endif]-->struct sockaddr_storage能容纳系统支持的更大的地址结构

3.4  Socket  地址结构的比较

4  .  Client/Server Model

Client/Server 的网络通信模型是使用最广最为基础的通信模型。在Socket API  环境,其应用可以归纳为:

TCP  链接建立

根据  TCP/IP  协议,函数  connect()  激发  TCP  的三路握手过程。

客户端给服务器一个  SYN(J)  信号,服务器返回一个  ACK(J+1); 然后服务器给客户端一个  SYN(K),  客户端也同样给服务器一个  ACK(K+1),这样就算  connect  成功。

注意:服务器返回的  SYN(K)  和  ACK(J+1)  是放在同一个分节中发给客户端的,因此链路在建立连接时只用了三个分节,故称为三路握手。

TCP  链接终止

TCP  用三个分节建立一个链接,而终止连接时需要四个分节。原因在于被动关闭链接一方需要关闭处理时间,因此  ACK  和  FIN  不能同时发给主动关闭一方。

主动关闭一方在收到  ACK  后,在等待被动关闭方发  FIN  消息这一状态称为处于  TIME_WAIT 状态。

5 Socket API  描述

5.1  创建套接字——  socket  函数

应用程序在使用套接字前,必须拥有一个套接字,系统调用  socket()向应用程序提供

创建套接字的手段,其调用格式如下:

参数  family  指定通信发生的区域,  UNIX  系统支持的地址族有:AF_UNIX,AF_INET,AF_NS  等,而  DOS  、  WINDOWS  中仅支持  AF_INET  ,它是网际网区域。因此,地址族与协议族相同。

参数  type  描述要建立的套接字的类型。参数  protocol  说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为  0  ,使用默认的连接模式。根据这  3个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。因此,socket  ()系统调用实际上指定了  "  协议  "  。

5.2  指定本地址——  bind 函数

一个套接字用  socket  ()创建后,存在一个名字空间(地址族),但它没有被命名。  Bind  ()将套接字地址(包括本地主机地址和本断口地址)与所创建的套接字号联系起来,即将,名字赋予套接字,以指定本地半相关。其调用格式如下:

参数  socketfd  是由  socket()  调用返回的并且未作连接的套接字描述符(套接字号)。参数  myaddr  是赋给套接字  socketfd 的本地地址(名字),其长度可变,结构随通信域的不同而不同。  addrlen  表明了  name  的长度。

进程可以把一个特定的  IP  地址捆绑到它的套接口上,但此  IP  地址必须是主机的一个接口。对于  TCP  客户端,这就为在此套接口上发送的  IP  数据包分配了源  IP  地址。对于服务器端,这样做就限制了套接口只接收来自那些目的地址为此  IP  地址的客户链接。

对于  TCP  ,调用函数  bind  可以指定一个端口号,指定一个  IP  地址,可以两者都指定,也可以一个都不指定。对于服务器,一般指定众所周知的端口号。而不指定具体的  IP  地址。如果  TCP  服务器不把地址绑到套接口上,那么内核就把客户所发  SYN  所在分组的目的IP  地址作为服务器的源  IP  地址。

若指定端口号为  0  ,则调用函数  bind  时,内核选择一个临时端口;但若指定一个通配IP  地址,则直到套接口以连接  (TCP)  或数据报已在套接口上发出  (UDP),  内核才选择一个本地  IP  。

注意到在第四部分图中,客户端并没有调用  bind  函数,因为对于客户端来说,没有必要指定具体的  IP  和端口,如果需要,内核会选择一个源  IP  地址和一个临时的端口。

5.3 connect  函数

TCP  客户用  connect()  函数建立一个与  TCP  服务器的链接。Connect  ()的调用格式如下:

参数  socket  是欲建立连接的本地套接字描述符。参数  servaddr  指出说明对方套接字地址结构指针。对方套接字地址长度由  addrlen  说明。

根据  TCP  的状态转移图,函数  connect  导致从  CLOSED  状态  (  调用函数  socket创建套接口以后就一直处于此状态  )  转到  SYN_SENT  状态,若成功转到  ESTABLISHED状态。如果函数  connect  失败,则原先创建的套接口就不可再用,必须关闭。如要重新尝试,必须重新调用  socket  ,再  connect  。

5.4 listen  函数

函数  listen  仅被  TCP  服务器调用,它做两件事情:

<!--[if !supportLists]-->1.          <!--[endif]-->当函数socket创建一个套接口时,它被假设为一个主动套接口,也就是说,它是一个将调用connect发起链接的客户套接口。函数listen将未链接的套接口转换成被动套接口,告诉内核应接受指向此套接口的链接请求。根据TCP状态转移图,函数listen导致套接口状态从CLOSED转到LISTEN。

<!--[if !supportLists]-->2.          <!--[endif]-->函数的第二个参数规定了内核为此套接口排队的最大链接个数。

一般而言,此函数应该在  socket  和  bind  之后,调用函数  accept  之前调用。

参数  backlog  的解析: 

对于给定的监听套接口  (listen  之后  )  ,内核要维护两个队列:一个是处于三次握手过程中(即客户端调用  connect  ,服务器端收到  SYN  ,并返回  ACK  和  SYN  后,在等待客户端的  ACK  ),处于  SYN_RCVD  状态;另一个是从  connect  成功,处于  ESTABLISHED状态。

两个队列之和不能超过  backlog  。

5.5 accept  函数

Accept  函数由  TCP  服务器调用,从已完成连接队列头返回一个已完成的链接。若已完成队列为空,则进程睡眠(假定套接口为缺省的阻塞方式)。用于使服务器等待来自某客户进程的实际连接。

参数  cliaddr  和  addrlen  用来返回链接对方进程(客户端)的协议地址。

若函数成功返回,返回值是一个由内核自动生成的全新的描述字,代表与客户端的链接。当我们讨论函数  accept  时,常把它的第一个参数称为监听套接口描述字(由  socket  生成的描述字);把它的返回值称为已连接套接口描述字。

6 Reference

补上参考书目及一些好文章

1. Windows Sockets 网络程序设计大全 
    适合于WinSock编程入门。
2. Unix Networking Programming 3rd ed  
    很经典的书呀,如果你学习Unix Socket编程,你必须买的,学习WinSock也有作用的,因为WinSock是参考的Unix Socket。
3. Windows网络编程技术
    讲了Win2000下的WinSock编程,讲了TCP/IP, Netbios, IPX/SPX, ATM等在Windows下的编程,有很多代码,还有一个MS Platform SDK的东西,这可是很难得的。对了,还有QoS和Raw Socket编程的程序例子。

http://blog.163.com/jiams_wang/blog/static/30339149201242335530940/

UNIX SOCKET编程简介的更多相关文章

  1. UNIX网络编程---简介

    UNIX网络编程---简介 一.           概述 a)       在编写与计算机通信的程序时,首先要确定的就是和计算机通信的协议,从高层次来确定通信由哪个程序发起以及响应在合适产生.大多数 ...

  2. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  3. SOCKet 编程 简介

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  4. PYTHON SOCKET编程简介

    原文地址: PYTHON SOCKET编程详细介绍   Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...

  5. Linux Socket 编程简介

    在 TCP/IP 协议中,"IP地址 + TCP或UDP端口号" 可以唯一标识网络通讯中的一个进程,"IP地址+端口号" 就称为 socket.本文以一个简单的 ...

  6. Socket编程简介

    目录 背景 基础 流程 参考 本文系读书笔记,非深入研究,也无代码,如非所需,请见谅. 哦,这里有份不错的:Linux的SOCKET编程详解 背景 花了好久的时间(大约一周,我太垃圾)看完了一篇英文文 ...

  7. UNIX网络编程--简介(一)【转】

    本文转载自:http://blog.csdn.net/yusiguyuan/article/details/11760187 一.概述 a) 在编写与计算机通信的程序时,首先要确定的就是和计算机通信的 ...

  8. Socket 编程简介

    Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. 本章节我们为大家接收 Perl ...

  9. Go语言系列- Socket编程和Redis

    Socket编程 一.socket编程概述 什么是socket编程? socket编程是计算机PC机器上2个程序通过一个双向的通信连接实现数据的交互,这个连接的一端就是一个socket.socket的 ...

随机推荐

  1. CodeForcesGym 100735D Triangle Formation

    Triangle Formation Time Limit: Unknown ms Memory Limit: 65536KB This problem will be judged on CodeF ...

  2. Android第三方开源图片裁剪截取:cropper

     Android第三方开源图片裁剪截取:cropper 很多app都需要裁剪截取图片作为头像.logo之类,而cropper是github上的一个针对Android平台的.第三方开源图片裁剪截取项 ...

  3. 暑假集训D19总结

    考试 日常爆炸 T1   辣么简单,淼到极致的DP,我竟然打挂了= =,打挂了= =,只拿了75分啊,不能接受啊= = T2   随便找找规律,瞎XX模拟一下就能A的鬼东西,我竟然打了个暴力+Floy ...

  4. 网页title上面添加图片

    1.效果:

  5. 浅析gcc、arm-linux-gcc和arm-elf-gcc关系

    浅析gcc.arm-linux-gcc和arm-elf-gcc关系 一.GCC简介 The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,为什么是 ...

  6. 本地数据文件加载到hive表

    1.在test数据库下创建表格 hive> create table vod_record_all( > watch_time date, > device_id string, & ...

  7. 华为/H3C Syslog配置

    H3C交换机的设置举例1. 组网需求将系统的日志信息发送到 linux 日志主机:日志主机的IP 地址为1.2.0.1/16:信息级别高于等于 informational 的日志信息将会发送到日志主机 ...

  8. [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列

    理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...

  9. cogs 22. [HAOI2005] 路由选择问题

    22. [HAOI2005] 路由选择问题 ★★★   输入文件:route.in   输出文件:route.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] X城有一个 ...

  10. A*算法学习(转)

    A*启发式搜索算法详解 人工智能 1导言 1.1 算法 1.2 Dijkstra算法与最佳优先搜索 1.3 A*算法 2 启发式算法 2.1 A*对启发式函数的使用 2.2 速度还是精确度? 2.3  ...