Socket是什么

Socket

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

4933701-44d5e8058b788416.png
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去组织数据,以符合指定的协议。

4933701-86fb0abf8b306aa3.png
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(),一次交互结束。

4933701-588290cd2410cbac.png
socket工作原理

读写过程

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

4933701-ca4f378fae2b6350.gif
socket读写过程

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

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

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

4933701-069a7de9459ad414.gif
socket读写细节

Socket长连接

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值