Socket是什么

Socket

socket原意是“插座”或“插孔”,在网络中每台服务器相当于一间房子,房子中有着不同的插口,每个插口都有一个编号,且负责某个功能。例如充电插口、网线插口、电话插口等。也就是说,使用不同的插口连接到对应的插口,就可以获得对应的服务。其实,插口就是socket服务,插口的编号就是端口号,而插头也是一个socket服务。

socket

所以,socket的含义就是两个应用程序通过一个双向的通信连接实现数据的交换,连接的一段就是一个socket,又称为套接字。实现一个socket连接通信至少需要两个套接字,一个运行在服务端(插孔),一个运行在客户端(插头)。

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

C10K问题

C10K概念最早由Dan Kegel发布于个人站点,即单机1万个并发连接问题。互联网的基础就是网络通信,最初的服务器都是基于进程/线程模型的,新到来一个TCP连接就需要分配一个进程或线程。然而,进程又是操作系统最昂贵的资源,一台机器无法创建很多的进程。

C10K问题的最大特点是,设计不够良好的程序,其性能和连接数及机器性能的关系往往是非线性的。

C10K问题本质上是操作系统的问题,对于Web1.0/2.0时代的操作系统而言,传统的同步堵塞I/O模型都是一样的,处理的方式都是Requests Per Second,并发10K和100的区别关键在于CPU。创建的进程多了,数据拷贝频繁(缓存I/O、内核将数据拷贝到用户进程空间、堵塞),进程或线程上下文切换消耗大,导致操作系统崩溃,这就是C10K问题的本质。

从纯粹网络编程技术角度来看,解决C10K问题的主要思路有两点

  • 每个进程或线程处理一个连接,即一个是对于每个连接处理分配一个独立的线程或进程。
  • 用同一个进程或线程来同时处理若干个连接,即IO多路复用。

Socket通信

Socket是应用层与TCP/IP协议簇通信的中间抽象层,是一组接口。在设计模式中其实就是门面模式。Socket将复杂的TCP/IP协议簇隐藏在接口后面,对于用户而言,一组接口即可让Socket去组织数据,以符合指定的协议。

Socket在TCP/IP中的位置
  • TCP/IP
    传输控制协议/网间协议(Transmission Control Protocol/Internet Protocol)是一个工业标准的协议集,是为广域网WAN而设计的。
  • UDP
    用户数据报协议(User Data Protocol)是与TCP相对应的协议,属于TCP/IP协议簇中的一员。
  • HTTP
    超文本传输协议(Hypertext Transfer Protocol)是互联网的基础,也是手机网络协议之一,HTTP协议是建立在TCP协议之上的一种应用。
  • Socket
    套接字是对TCP/IP协议的封装,自身并非协议而是一套调用的接口规范(API)。通过套接字Socket,才能使用TCP/IP协议。

socket套接字作为网络底层核心,也是TCP/IP以及UDP底层协议的实现通道,它是计算机网络编程的基础,TCP/UDP收发消息都依靠它。例如web服务器底层依赖它、关系型数据库MySQL底层依赖它、微信即时通信依赖它、网络游戏依赖它...

Socket工作原理

生活场景

但你要打电话给朋友会先拨号,朋友听到电话铃声后会提起电话,此时你与朋友就建立了连接,就可以通话了。等交流完毕挂断电话结束这次交谈。

工作原理

服务端首先初始化Socketsocket(),然后与端口绑定bind(),再对端口进行监听listen(),接着调用accept()堵塞等待客户端连接。此时,若有一个客户端初始化了一个Socket,然后连接服务端connect()。若连接成功,此时客户端与服务端的连接就建立了。客户端发送请求write(),服务端接收请求并处理read(),然后将回应发送给客户端write(),客户端读取数据read(),最后关闭连接close(),一次交互结束。

socket工作原理

读写过程

当客户端和服务端使用TCP协议进行通信时,客户端封装一个请求对象req,将其序列化成为字节数组,然后通过套接字socket将字节数组发送到服务端,服务端通过套接字socket读取到字节数组,再反序列化成为请求对象req后进行处理,处理完毕后生成一个响应对应的res,将响应对象res序列化成字节数组,然后通过套接字将字节数组发送给客户端,客户端通过套接字socket读取到字节数组,再反序列化成为响应对象。

socket读写过程

平时使用的套接字其实只是一个引用(一个对象ID),这个套接字对象实际上是放在操作系统内核中。其内部有两个重要的缓冲结构,一个是读缓冲read buffer,一个是写缓存write buffer,他们都是有限大小的数组结构。

但对客户端的socket写入字节数组时,即序列化后的请求消息对象req,是将字节数组拷贝到内核区套接字对象的write buffer中,内核网络模块会有单独的线程负责不停地将write buffer的数据拷贝到网卡硬件,网卡硬件再将数据传送到网线,经过一系列路由器和交换机,最终送达服务器的网卡硬件中。

同样,服务端内核的网络模块也有单独的线程不停地接收到数据拷贝到套接字的read buffer中等待用户层来读取,最终服务端的用户进程通过socket引用的read()方法将read buffer中的数据拷贝到用户程序内部中,进行反序列化成请求对象req进行处理。然后服务端将处理后的相应对象,走一个相反的流程发送给客户端。

socket读写细节

Socket长连接

短连接一般都是单项请求数据,服务端不能主动将数据推送给客户端,而长连接即可利用后端与前端的技术结合,实现服务端的推送功能,若数据库有更新,后端程序即可立即将数据推送出来,无需多次反复请求、建立连接、断开连接。

长连接实质是指建立socket套接字连接后不断是否适用都保持连接,其安全性较差。而短连接指的是建立socket套接字连接后发送接收数据后马上断开连接。

长连接在基于TCP的通讯中,一直保持连接,不管当前是否发送或接收数据。而短连接只是在有数据传输的时候才进行连接,服务端和客户端通信与传输数据完毕后就关闭连接,例如在HTTP、CMPP等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容