Socket API

理解 Socket 首先要熟悉 TCP/IP 协议簇,TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网间协议)定义了主机如何接入Internet 及数据如何传输的标准。

TCP/IP网络协议

TCP/IP 是 TCP 和 IP 协议的合称,但实际上 TCP/IP 协议是指 Internet 整个 TCP/IP 协议簇,不同于 ISO 七层模型的分层,TCP/IP 协议参考模型把所有 TCP/IP 系列协议归纳抽象为4层:

  • 应用层 协议:TFTP、HTTP、SNMP、FTP、SMTP、DNS、Telnet...
  • 传输层 协议:TCP、UDP
  • 网路层 协议:IP、ICMP、OSPF、EIGRP、IGMP
  • 数据链路层 协议:SLIP、CSLIP、PPP、MTU

TCP/IP是一种工业标准的协议集,为广域网 WAN 而设计。每一个抽象层建立在低一层所提供的服务上,并为高一层提供服务。

在 TCP/IP 协议中两个 Internet 主机通过路由器和对应的层连接,各主机上得应用通过数据通道相互执行读取操作。

TCP与IP

本地进程间通信

”进程通信“的概念最初来源于单机系统,由于每个进程都在自己地址范围内运行,为保证两个相互通信的进程之间互不干扰又协调一致的工作,操作系统为进程通信提供了相应的设施。

本地进程间通信IPC方式

  • 消息传递:管道、FIFO、消息队列
  • 同步:互斥量、条件变量、读写锁、文件和写记录锁、信号量
  • 共享内存:具名、匿名
  • 远程过程调用:RPC

网络进程间通信

本地进程可通过进程号(Process ID, PID)唯一标识,网络中进程间如何通信呢?首先要解决的问题是如何唯一标识一个进程,其实网络中TCP/IP已经解决了这个问题。

  • 网络层 IP地址可以唯一标识网络中的主机
  • 传输层 “协议+端口”可以唯一标识主机中的应用程序(进程)

“IP地址+协议+端口”可以标识网络的进程,网络中进程通信即可实现。

什么是Socket

Socket英文愿意是“插孔”或“插座”,作为BSD UNIX的进程通信机制后,取后一种意思,通常也被称为套接字。使用TCP/IP协议的应用程序通常采用的应用编程接是UNIX BSD的套接字Socket,来实现网络进程之间的通信。

Socket用于描述IP地址和端口,是一个通信链的句柄,用来实现不同虚拟机或物理机之间的通信。应用程序通过Socket向网络发出请求或应答请求。网络中两个进程通过一个双向的通信连接实现数据的交换,建立网络通信连接至少需要一对Socket,连接的一端称为一个Socket。

具有唯一标识的网络进程可利用 Socket 进行通信,而 Socket 是在应用层和传输层之间的一个抽象层,Socket把TCP/IP层复杂的操作抽象为简单的接口供应用层调用,以实现进程在网络中的通信。TCP/IP协议存在于操作系统中,网络服务是通过操作系统提供的,因此在操作系统中增加支持TCP/IP的系统调用Socket。

Socket 作为应用层与 TCP/IP 协议簇通信的中间软件抽象层,是一组接口。在设计模式中 Socket 其实就是一个门面模式,它将复杂的 TCP/IP 协议簇隐藏在 Socket 接口后面。对用户而言一组简单地接口就是全部,让 Socket 去组织数据已符合指定的协议。

Socket抽象层

Socket通信流程

Socket可理解为一种特殊的文件,在服务器和客户端各自维护一个文件,并使用SocketAPI函数对其进行文件操作。在建立连接打开后,可以向各自文件写入内容供对方读取或读取对方内容,通信结束时关闭文件。在UNIX哲学中“一切皆文件”,文件的操作模式基本为“打开-读写-关闭”三大步骤,Socket其实就是这个模式的一个实现。

Socket通信流程

服务器

  1. 服务器根据IP地址类型(IPv4/IPv6)、Socket 类型和协议创建套接字
  2. 服务端为 Socket 绑定 IP 地址和端口号
  3. 服务端 Socket 监听端口请求,随时准备接收客户端发来的连接,此时 socket 并未被打开。

客户端

  1. 客户端打开 Socket,根据服务器 IP 地址和端口试图连接服务端的Socket。
  2. 服务器Socket接收到客户端Socket请求,被动打开开始接收客户端请求,直到客户端返回连接信息,此时 Socket 进入阻塞状态。

交互过程

  1. 客户端连接成功向服务端发送连接状态信息
  2. 服务端 Accept 返回连接成功
  3. 客户端向 Socket 写入数据
  4. 服务端读取数据
  5. 客户端关闭

伯克利SocketAPI

历史

  • Berkeley sockets 也称为BSD Socket
  • 1983 BSD Socket4.
  • 1989 UNIX均采用
  • 2008 成为POSIX标准

头文件

  • sys/socket.h 函数和数据结构定义
  • netinet/in.h IPv4和IPv6xiangguan协议
  • sys/un.h UNIX机器间通信
  • arpa/inet.h 处理数字从操作系统字节序到网络字节序
  • netdb.h 映射服务到IP地址

SocketAPI函数

socket() 创建套接字,根据指定地址、数据类型、协议分配一个套接字的描述字及所用资源。

int socket(int domain, int type, int protocol)

参数:

  • domain
    协议簇/域,通常为AF_INET(IPv4)、AF_INET6(IPv6)
  • type
    套接字类型,主要是SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)
  • protocol
    通常为0

Socket有3种类型

  • 流式 SOCK_STREAM
    流失套接字提供可靠的、面向连接的通信流,使用TCP协议从而保证数据传输的正确性和顺序性。
  • 数据报SOCK_DGRAM
    数据包套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,不保证是可靠的无差错的,使用数据报协议UDP。
  • 原始SOCK_RAW
    原始套接字允许对底层协议如IP或ICMP进行直接访问,功能强大但使用不便,主要用于协议开发。

返回值:
成功时返回非负整数

  • bind() 绑定socket到IP地址和端口
  • listen() 服务器监听客户端的连接
  • connect() 客户端连接到服务器
  • accept() 应用程序接收完成3次握手的客户端连接
  • send()
  • recv()
  • write()
  • read()
  • close() 关闭socket
  • gethostbyname()IPv4专用
  • gethostbyaddr() IPv4专用
  • select()
  • poll() 处理多个连接的读写和错误状态
  • getsocketopt() 获得对应socket的选项值
  • setsocketopt() 设置对应socket的选项值
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • 1、TCP为什么需要3次握手,4次断开? “三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端...
    杰伦哎呦哎呦阅读 3,475评论 0 6
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,053评论 6 174
  • 参考:http://www.2cto.com/net/201611/569006.html TCP HTTP UD...
    F麦子阅读 2,946评论 0 14
  • 传输层提供的服务 传输层的功能 从通信和信息处理的角度看 ,传输层向它上面的应用层提供通信服务,它属于面向通信部分...
    CodeKing2017阅读 3,618评论 1 9
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,051评论 0 8